Skip to content

Commit 66388d3

Browse files
authored
Merge pull request #4 from ahoppen/rawsyntax-codable-conformance-extension
Extract Codable conformance of RawSyntax into an extension
2 parents 239c66a + 9682018 commit 66388d3

File tree

1 file changed

+58
-56
lines changed

1 file changed

+58
-56
lines changed

Sources/SwiftSyntax/RawSyntax.swift

Lines changed: 58 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
392394
extension RawSyntax: ByteTreeObjectDecodable {
393395
enum SyntaxType: UInt8, ByteTreeScalarDecodable {
394396
case token = 0

0 commit comments

Comments
 (0)