@@ -85,7 +85,7 @@ fileprivate enum RawSyntaxData {
8585/// Represents the raw tree structure underlying the syntax tree. These nodes
8686/// have no notion of identity and only provide structure to the tree. They
8787/// are immutable and can be freely shared between syntax nodes.
88- struct RawSyntax : Codable {
88+ struct RawSyntax {
8989 fileprivate let data : RawSyntaxData
9090 let presence : SourcePresence
9191
@@ -198,61 +198,6 @@ struct RawSyntax: Codable {
198198 case nodeLookupFailed( SyntaxNodeId )
199199 }
200200
201- /// Creates a RawSyntax from the provided Foundation Decoder.
202- init ( from decoder: Decoder ) throws {
203- let container = try decoder. container ( keyedBy: CodingKeys . self)
204- let id = try container. decodeIfPresent ( SyntaxNodeId . self, forKey: . id)
205- let omitted = try container. decodeIfPresent ( Bool . self, forKey: . omitted) ?? false
206-
207- if omitted {
208- guard let id = id else {
209- throw IncrementalDecodingError . omittedNodeHasNoId
210- }
211- guard let lookupFunc = decoder. userInfo [ . omittedNodeLookupFunction] as?
212- ( SyntaxNodeId ) -> RawSyntax ? else {
213- throw IncrementalDecodingError . noLookupFunctionPassed
214- }
215- guard let lookupNode = lookupFunc ( id) else {
216- throw IncrementalDecodingError . nodeLookupFailed ( id)
217- }
218- self = lookupNode
219- return
220- }
221-
222- let presence = try container. decode ( SourcePresence . self, forKey: . presence)
223- if let kind = try container. decodeIfPresent ( SyntaxKind . self, forKey: . kind) {
224- let layout = try container. decode ( [ RawSyntax ? ] . self, forKey: . layout)
225- self . init ( kind: kind, layout: layout, presence: presence, id: id)
226- } else {
227- let kind = try container. decode ( TokenKind . self, forKey: . tokenKind)
228- let leadingTrivia = try container. decode ( Trivia . self, forKey: . leadingTrivia)
229- let trailingTrivia = try container. decode ( Trivia . self, forKey: . trailingTrivia)
230- self . init ( kind: kind, leadingTrivia: leadingTrivia,
231- trailingTrivia: trailingTrivia, presence: presence, id: id)
232- }
233- if let callback = decoder. userInfo [ . rawSyntaxDecodedCallback] as?
234- ( RawSyntax ) -> Void {
235- callback ( self )
236- }
237- }
238-
239- /// Encodes the RawSyntax to the provided Foundation Encoder.
240- func encode( to encoder: Encoder ) throws {
241- var container = encoder. container ( keyedBy: CodingKeys . self)
242- switch self . data {
243- case let . node( kind, layout) :
244- try container. encode ( id, forKey: . id)
245- try container. encode ( kind, forKey: . kind)
246- try container. encode ( layout, forKey: . layout)
247- case let . token( kind, leadingTrivia, trailingTrivia) :
248- try container. encode ( id, forKey: . id)
249- try container. encode ( kind, forKey: . tokenKind)
250- try container. encode ( leadingTrivia, forKey: . leadingTrivia)
251- try container. encode ( trailingTrivia, forKey: . trailingTrivia)
252- }
253- try container. encode ( presence, forKey: . presence)
254- }
255-
256201 /// Creates a RawSyntax node that's marked missing in the source with the
257202 /// provided kind and layout.
258203 /// - Parameters:
@@ -389,6 +334,63 @@ extension RawSyntax {
389334 }
390335}
391336
337+ extension RawSyntax : Codable {
338+ /// Creates a RawSyntax from the provided Foundation Decoder.
339+ init ( from decoder: Decoder ) throws {
340+ let container = try decoder. container ( keyedBy: CodingKeys . self)
341+ let id = try container. decodeIfPresent ( SyntaxNodeId . self, forKey: . id)
342+ let omitted = try container. decodeIfPresent ( Bool . self, forKey: . omitted) ?? false
343+
344+ if omitted {
345+ guard let id = id else {
346+ throw IncrementalDecodingError . omittedNodeHasNoId
347+ }
348+ guard let lookupFunc = decoder. userInfo [ . omittedNodeLookupFunction] as?
349+ ( SyntaxNodeId ) -> RawSyntax ? else {
350+ throw IncrementalDecodingError . noLookupFunctionPassed
351+ }
352+ guard let lookupNode = lookupFunc ( id) else {
353+ throw IncrementalDecodingError . nodeLookupFailed ( id)
354+ }
355+ self = lookupNode
356+ return
357+ }
358+
359+ let presence = try container. decode ( SourcePresence . self, forKey: . presence)
360+ if let kind = try container. decodeIfPresent ( SyntaxKind . self, forKey: . kind) {
361+ let layout = try container. decode ( [ RawSyntax ? ] . self, forKey: . layout)
362+ self . init ( kind: kind, layout: layout, presence: presence, id: id)
363+ } else {
364+ let kind = try container. decode ( TokenKind . self, forKey: . tokenKind)
365+ let leadingTrivia = try container. decode ( Trivia . self, forKey: . leadingTrivia)
366+ let trailingTrivia = try container. decode ( Trivia . self, forKey: . trailingTrivia)
367+ self . init ( kind: kind, leadingTrivia: leadingTrivia,
368+ trailingTrivia: trailingTrivia, presence: presence, id: id)
369+ }
370+ if let callback = decoder. userInfo [ . rawSyntaxDecodedCallback] as?
371+ ( RawSyntax ) -> Void {
372+ callback ( self )
373+ }
374+ }
375+
376+ /// Encodes the RawSyntax to the provided Foundation Encoder.
377+ func encode( to encoder: Encoder ) throws {
378+ var container = encoder. container ( keyedBy: CodingKeys . self)
379+ switch self . data {
380+ case let . node( kind, layout) :
381+ try container. encode ( id, forKey: . id)
382+ try container. encode ( kind, forKey: . kind)
383+ try container. encode ( layout, forKey: . layout)
384+ case let . token( kind, leadingTrivia, trailingTrivia) :
385+ try container. encode ( id, forKey: . id)
386+ try container. encode ( kind, forKey: . tokenKind)
387+ try container. encode ( leadingTrivia, forKey: . leadingTrivia)
388+ try container. encode ( trailingTrivia, forKey: . trailingTrivia)
389+ }
390+ try container. encode ( presence, forKey: . presence)
391+ }
392+ }
393+
392394extension RawSyntax : ByteTreeObjectDecodable {
393395 enum SyntaxType : UInt8 , ByteTreeScalarDecodable {
394396 case token = 0
0 commit comments