Skip to content

Commit 66f2fc7

Browse files
committed
Move children accessors from RawSyntax to RawSyntaxLayoutView
1 parent a15e00d commit 66f2fc7

20 files changed

+2950
-1864
lines changed

Sources/SwiftSyntax/Raw/RawSyntax.swift

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -142,31 +142,6 @@ extension RawSyntax {
142142
kind.isUnknown
143143
}
144144

145-
/// Child nodes.
146-
var children: RawSyntaxBuffer {
147-
switch rawData.payload {
148-
case .parsedToken(_),
149-
.materializedToken(_):
150-
return .init(start: nil, count: 0)
151-
case .layout(let dat):
152-
return dat.layout
153-
}
154-
}
155-
156-
func child(at index: Int) -> RawSyntax? {
157-
guard hasChild(at: index) else { return nil }
158-
return children[index]
159-
}
160-
161-
func hasChild(at index: Int) -> Bool {
162-
children[index] != nil
163-
}
164-
165-
/// The number of children, `present` or `missing`, in this node.
166-
var numberOfChildren: Int {
167-
return children.count
168-
}
169-
170145
/// Total number of nodes in this sub-tree, including `self` node.
171146
var totalNodes: Int {
172147
switch rawData.payload {
@@ -226,7 +201,7 @@ extension RawSyntax {
226201
trailingTrivia: tokenView.formTrailingTrivia(),
227202
arena: arena)
228203
case .layout(let layoutView):
229-
for (index, child) in children.enumerated() {
204+
for (index, child) in layoutView.children.enumerated() {
230205
if let replaced = child?.withLeadingTrivia(leadingTrivia) {
231206
return layoutView.replacingChild(at: index, with: replaced, arena: arena)
232207
}
@@ -248,22 +223,14 @@ extension RawSyntax {
248223
trailingTrivia: trailingTrivia,
249224
arena: arena)
250225
case .layout(let layoutView):
251-
for (index, child) in children.enumerated().reversed() {
226+
for (index, child) in layoutView.children.enumerated().reversed() {
252227
if let replaced = child?.withTrailingTrivia(trailingTrivia) {
253228
return layoutView.replacingChild(at: index, with: replaced, arena: arena)
254229
}
255230
}
256231
return nil
257232
}
258233
}
259-
260-
/// Returns the child at the provided cursor in the layout.
261-
/// - Parameter index: The index of the child you're accessing.
262-
/// - Returns: The child at the provided index.
263-
subscript<CursorType: RawRepresentable>(_ index: CursorType) -> RawSyntax?
264-
where CursorType.RawValue == Int {
265-
return child(at: index.rawValue)
266-
}
267234
}
268235

269236
extension RawSyntax {
@@ -313,8 +280,8 @@ extension RawSyntax {
313280
switch view {
314281
case .token(let tokenView):
315282
return tokenView
316-
case .layout:
317-
for child in children {
283+
case .layout(let layoutView):
284+
for child in layoutView.children {
318285
if let token = child?.firstToken(viewMode: viewMode) {
319286
return token
320287
}
@@ -329,8 +296,8 @@ extension RawSyntax {
329296
switch view {
330297
case .token(let tokenView):
331298
return tokenView
332-
case .layout:
333-
for child in children.reversed() {
299+
case .layout(let layoutView):
300+
for child in layoutView.children.reversed() {
334301
if let token = child?.lastToken(viewMode: viewMode) {
335302
return token
336303
}
@@ -628,8 +595,15 @@ extension RawSyntax: CustomDebugStringConvertible {
628595

629596
extension RawSyntax: CustomReflectable {
630597
public var customMirror: Mirror {
631-
let mirrorChildren: [Any] = children.map {
632-
child in child ?? (nil as Any?) as Any
598+
599+
let mirrorChildren: [Any]
600+
switch view {
601+
case .token:
602+
mirrorChildren = []
603+
case .layout(let layoutView):
604+
mirrorChildren = layoutView.children.map {
605+
child in child ?? (nil as Any?) as Any
606+
}
633607
}
634608
return Mirror(self, unlabeledChildren: mirrorChildren)
635609
}

Sources/SwiftSyntax/Raw/RawSyntaxLayoutView.swift

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ struct RawSyntaxLayoutView {
5555
at index: Int,
5656
arena: SyntaxArena
5757
) -> RawSyntax {
58-
precondition(raw.children.count >= index)
58+
precondition(children.count >= index)
5959
return .makeLayout(kind: raw.kind,
60-
uninitializedCount: raw.children.count + 1,
60+
uninitializedCount: children.count + 1,
6161
arena: arena) { buffer in
62-
var childIterator = raw.children.makeIterator()
62+
var childIterator = children.makeIterator()
6363
let base = buffer.baseAddress!
6464
for i in 0..<buffer.count {
6565
base.advanced(by: i)
@@ -72,27 +72,27 @@ struct RawSyntaxLayoutView {
7272
at index: Int,
7373
arena: SyntaxArena
7474
) -> RawSyntax {
75-
precondition(raw.children.count > index)
76-
let count = raw.children.count - 1
75+
precondition(children.count > index)
76+
let count = children.count - 1
7777
return .makeLayout(kind: raw.kind,
7878
uninitializedCount: count,
7979
arena: arena) { buffer in
8080
if buffer.isEmpty { return }
8181
let newBase = buffer.baseAddress!
82-
let oldBase = raw.children.baseAddress!
82+
let oldBase = children.baseAddress!
8383

8484
// Copy elements up to the index.
8585
newBase.initialize(from: oldBase, count: index)
8686

8787
// Copy elements from the index + 1.
8888
newBase.advanced(by: index)
8989
.initialize(from: oldBase.advanced(by: index + 1),
90-
count: raw.children.count - index - 1)
90+
count: children.count - index - 1)
9191
}
9292
}
9393

9494
func appending(_ newChild: RawSyntax?, arena: SyntaxArena) -> RawSyntax {
95-
insertingChild(newChild, at: raw.children.count, arena: arena)
95+
insertingChild(newChild, at: children.count, arena: arena)
9696
}
9797

9898
func replacingChildSubrange<C: Collection>(
@@ -101,22 +101,22 @@ struct RawSyntaxLayoutView {
101101
arena: SyntaxArena
102102
) -> RawSyntax where C.Element == RawSyntax? {
103103
precondition(!raw.isToken)
104-
let newCount = raw.children.count - range.count + elements.count
104+
let newCount = children.count - range.count + elements.count
105105
return .makeLayout(kind: raw.kind,
106106
uninitializedCount: newCount,
107107
arena: arena) { buffer in
108108
if buffer.isEmpty { return }
109109
var current = buffer.baseAddress!
110110

111111
// Intialize
112-
current.initialize(from: raw.children.baseAddress!, count: range.lowerBound)
112+
current.initialize(from: children.baseAddress!, count: range.lowerBound)
113113
current = current.advanced(by: range.lowerBound)
114114
for elem in elements {
115115
current.initialize(to: elem)
116116
current += 1
117117
}
118-
current.initialize(from: raw.children.baseAddress!.advanced(by: range.upperBound),
119-
count: raw.children.count - range.upperBound)
118+
current.initialize(from: children.baseAddress!.advanced(by: range.upperBound),
119+
count: children.count - range.upperBound)
120120
}
121121
}
122122

@@ -125,17 +125,50 @@ struct RawSyntaxLayoutView {
125125
with newChild: RawSyntax?,
126126
arena: SyntaxArena
127127
) -> RawSyntax {
128-
precondition(!raw.isToken && raw.children.count > index)
128+
precondition(!raw.isToken && children.count > index)
129129
return .makeLayout(kind: raw.kind,
130-
uninitializedCount: raw.children.count,
130+
uninitializedCount: children.count,
131131
arena: arena) { buffer in
132-
_ = buffer.initialize(from: raw.children)
132+
_ = buffer.initialize(from: children)
133133
buffer[index] = newChild
134134
}
135135
}
136136

137137
func formLayoutArray() -> [RawSyntax?] {
138-
Array(raw.children)
138+
Array(children)
139+
}
140+
141+
/// Child nodes.
142+
var children: RawSyntaxBuffer {
143+
switch raw.rawData.payload {
144+
case .parsedToken(_),
145+
.materializedToken(_):
146+
preconditionFailure("RawSyntax must be a layout")
147+
case .layout(let dat):
148+
return dat.layout
149+
}
150+
}
151+
152+
func child(at index: Int) -> RawSyntax? {
153+
guard hasChild(at: index) else { return nil }
154+
return children[index]
155+
}
156+
157+
func hasChild(at index: Int) -> Bool {
158+
children[index] != nil
159+
}
160+
161+
/// Returns the child at the provided cursor in the layout.
162+
/// - Parameter index: The index of the child you're accessing.
163+
/// - Returns: The child at the provided index.
164+
subscript<CursorType: RawRepresentable>(_ index: CursorType) -> RawSyntax?
165+
where CursorType.RawValue == Int {
166+
return child(at: index.rawValue)
167+
}
168+
169+
/// The number of children, `present` or `missing`, in this node.
170+
var numberOfChildren: Int {
171+
return children.count
139172
}
140173
}
141174

Sources/SwiftSyntax/Raw/RawSyntaxNodes.swift.gyb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ public protocol Raw${node.name}NodeProtocol: Raw${node.base_type}NodeProtocol {}
2929

3030
@_spi(RawSyntax)
3131
public struct Raw${node.name}: Raw${node.name if node.is_base() else node.base_type}NodeProtocol {
32+
var layoutView: RawSyntaxLayoutView {
33+
return raw.layoutView!
34+
}
35+
3236
public static func isKindOf(_ raw: RawSyntax) -> Bool {
3337
% if node.is_base():
3438
% sub_kinds = ['.' + n.swift_syntax_kind for n in SYNTAX_NODES if n.base_kind == node.syntax_kind]
@@ -65,7 +69,7 @@ public struct Raw${node.name}: Raw${node.name if node.is_base() else node.base_t
6569
}
6670

6771
public var elements: [Raw${node.collection_element_type}] {
68-
raw.children.map { Raw${node.collection_element_type}(raw: $0!) }
72+
layoutView.children.map { Raw${node.collection_element_type}(raw: $0!) }
6973
}
7074
% end
7175
%
@@ -100,9 +104,9 @@ public struct Raw${node.name}: Raw${node.name if node.is_base() else node.base_t
100104
% iuo_mark = "!" if not child.is_optional else ""
101105
public var ${child.swift_name}: Raw${child.type_name + optional_mark} {
102106
% if child.type_name == "Syntax":
103-
raw.children[${idx}]${iuo_mark}
107+
layoutView.children[${idx}]${iuo_mark}
104108
% else:
105-
raw.children[${idx}].map(Raw${child.type_name}.init(raw:))${iuo_mark}
109+
layoutView.children[${idx}].map(Raw${child.type_name}.init(raw:))${iuo_mark}
106110
% end
107111
}
108112
% end

0 commit comments

Comments
 (0)