Skip to content

Commit 0380245

Browse files
committed
Pass SyntaxData to RawSyntax initializer
1 parent deefc62 commit 0380245

File tree

13 files changed

+2259
-4312
lines changed

13 files changed

+2259
-4312
lines changed

CodeGeneration/Sources/generate-swift-syntax/templates/swiftsyntax/SyntaxNodesFile.swift

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,22 @@ func syntaxNode(nodesStartingWith: [Character]) -> SourceFileSyntax {
9393
)
9494
)
9595
)
96-
let layoutList = ArrayExprSyntax {
97-
for child in node.children {
98-
ArrayElementSyntax(
99-
expression: MemberAccessExprSyntax(
100-
base: child.buildableType.optionalChained(expr: ExprSyntax("\(child.varOrCaseName.backtickedIfNeeded)")),
101-
period: .periodToken(),
102-
name: "raw"
103-
)
104-
)
105-
}
106-
}
96+
VariableDeclSyntax(
97+
.let,
98+
name: "nodes",
99+
type: TypeAnnotationSyntax(type: TypeSyntax("[SyntaxData?]")),
100+
initializer: InitializerClauseSyntax(
101+
value: ArrayExprSyntax {
102+
for child in node.children {
103+
if child.isOptional {
104+
ArrayElementSyntax(expression: ExprSyntax("\(child.varOrCaseName.backtickedIfNeeded)?.data"))
105+
} else {
106+
ArrayElementSyntax(expression: ExprSyntax("\(child.varOrCaseName.backtickedIfNeeded).data"))
107+
}
108+
}
109+
}
110+
)
111+
)
107112

108113
let initializer = FunctionCallExprSyntax(
109114
calledExpression: ExprSyntax("withExtendedLifetime"),
@@ -116,12 +121,11 @@ func syntaxNode(nodesStartingWith: [Character]) -> SourceFileSyntax {
116121
if node.children.isEmpty {
117122
DeclSyntax("let raw = RawSyntax.makeEmptyLayout(kind: SyntaxKind.\(node.varOrCaseName), arena: arena)")
118123
} else {
119-
DeclSyntax("let layout: [RawSyntax?] = \(layoutList)")
120124
DeclSyntax(
121125
"""
122126
let raw = RawSyntax.makeLayout(
123127
kind: SyntaxKind.\(node.varOrCaseName),
124-
from: layout,
128+
from: nodes,
125129
arena: arena,
126130
leadingTrivia: leadingTrivia,
127131
trailingTrivia: trailingTrivia
@@ -145,21 +149,6 @@ func syntaxNode(nodesStartingWith: [Character]) -> SourceFileSyntax {
145149
initializer: InitializerClauseSyntax(value: initializer)
146150
)
147151

148-
VariableDeclSyntax(
149-
.let,
150-
name: "nodes",
151-
initializer: InitializerClauseSyntax(
152-
value: ArrayExprSyntax {
153-
for child in node.children {
154-
if child.isOptional {
155-
ArrayElementSyntax(expression: ExprSyntax("\(child.varOrCaseName.backtickedIfNeeded)?.data"))
156-
} else {
157-
ArrayElementSyntax(expression: ExprSyntax("\(child.varOrCaseName.backtickedIfNeeded).data"))
158-
}
159-
}
160-
}
161-
)
162-
)
163152
ExprSyntax("data.setSyntaxTrackingOfTree(SyntaxTracking(tracking: nodes))")
164153

165154
ExprSyntax("self.init(data)")
@@ -226,7 +215,7 @@ func syntaxNode(nodesStartingWith: [Character]) -> SourceFileSyntax {
226215
collection = col.layoutView!.appending(element.raw, arena: arena)
227216
} else {
228217
collection = RawSyntax.makeLayout(kind: SyntaxKind.\(childNode.varOrCaseName),
229-
from: [element.raw], arena: arena)
218+
from: [element.data], arena: arena)
230219
}
231220
let newData = data.replacingChild(at: \(raw: index), with: collection, rawNodeArena: arena, allocationArena: arena)
232221
return \(node.kind.syntaxType)(newData)

Sources/SwiftSyntax/Raw/RawSyntax.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -820,13 +820,13 @@ extension RawSyntax {
820820

821821
static func makeLayout(
822822
kind: SyntaxKind,
823-
from collection: some Collection<RawSyntax?>,
823+
from collection: some Collection<SyntaxData?>,
824824
arena: __shared SyntaxArena,
825825
leadingTrivia: Trivia? = nil,
826826
trailingTrivia: Trivia? = nil
827827
) -> RawSyntax {
828828
if leadingTrivia != nil || trailingTrivia != nil {
829-
var layout = Array(collection)
829+
var layout = collection.map { $0?.raw }
830830
if let leadingTrivia = leadingTrivia,
831831
// Find the index of the first non-empty node so we can attach the trivia to it.
832832
let idx = layout.firstIndex(where: { $0 != nil && ($0!.isToken || $0!.totalNodes > 1) })
@@ -839,11 +839,13 @@ extension RawSyntax {
839839
{
840840
layout[idx] = layout[idx]!.withTrailingTrivia((layout[idx]?.formTrailingTrivia() ?? []) + trailingTrivia, arena: arena)
841841
}
842-
return .makeLayout(kind: kind, from: layout, arena: arena)
842+
return .makeLayout(kind: kind, uninitializedCount: collection.count, arena: arena) {
843+
_ = $0.initialize(from: layout)
844+
}
843845
}
844846

845847
return .makeLayout(kind: kind, uninitializedCount: collection.count, arena: arena) {
846-
_ = $0.initialize(from: collection)
848+
_ = $0.initialize(from: collection.lazy.map { $0?.raw })
847849
}
848850
}
849851
}

Sources/SwiftSyntax/SyntaxCollection.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ extension SyntaxCollection {
5252
let raw = withExtendedLifetime(children) {
5353
RawSyntax.makeLayout(
5454
kind: Self.syntaxKind,
55-
from: children.map { $0.raw },
55+
from: children.map { $0.data },
5656
arena: arena
5757
)
5858
}

Sources/SwiftSyntax/SyntaxData.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ struct SyntaxData {
331331
/// has a chance to retain it.
332332
static func forRoot(_ raw: RawSyntax, rawNodeArena: SyntaxArena) -> SyntaxData {
333333
precondition(rawNodeArena === raw.arena)
334-
return SyntaxData(raw, info: .root(Wrapper(Info.Root(arena: rawNodeArena,syntaxTracking: nil))))
334+
return SyntaxData(raw, info: .root(Wrapper(Info.Root(arena: rawNodeArena, syntaxTracking: nil))))
335335
}
336336

337337
/// Returns the child data at the provided index in this data's layout.

0 commit comments

Comments
 (0)