Skip to content

Commit f783d3d

Browse files
authored
Merge pull request #867 from ahoppen/ahoppen/skip-subtrees-without-sequence-expr
Don’t visit parts of the syntax tree that don’t contain any `SequenceExpr` in `SequenceFolder`
2 parents 2a65025 + 2d3fb1e commit f783d3d

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

Sources/SwiftOperators/OperatorTable+Folding.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,15 @@ extension OperatorTable {
435435
self.errorHandler = errorHandler
436436
}
437437

438+
override func visitAny(_ node: Syntax) -> Syntax? {
439+
/// Return a non-nil value from `visitAny` to indicate to the SyntaxRewriter
440+
/// that it shouldn't visit any of these node's children.
441+
if !node.hasSequenceExpr {
442+
return node
443+
}
444+
return nil
445+
}
446+
438447
override func visit(_ node: SequenceExprSyntax) -> ExprSyntax {
439448
// If the error handler threw in response to an error, don't
440449
// continue folding.

Sources/SwiftSyntax/Raw/RawSyntax.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ struct RecursiveRawSyntaxFlags: OptionSet {
2525

2626
/// Whether the tree contained by this layout has any missing or unexpected nodes.
2727
static let hasError = RecursiveRawSyntaxFlags(rawValue: 1 << 0)
28+
static let hasSequenceExpr = RecursiveRawSyntaxFlags(rawValue: 1 << 1)
2829
}
2930

3031
/// Node data for RawSyntax tree. Tagged union plus common data.
@@ -612,8 +613,12 @@ extension RawSyntax {
612613
) -> RawSyntax {
613614
validateLayout(layout: layout, as: kind)
614615
let payload = RawSyntaxData.Layout(
615-
kind: kind, layout: layout,
616-
byteLength: byteLength, descendantCount: descendantCount, recursiveFlags: recursiveFlags)
616+
kind: kind,
617+
layout: layout,
618+
byteLength: byteLength,
619+
descendantCount: descendantCount,
620+
recursiveFlags: recursiveFlags
621+
)
617622
return RawSyntax(arena: arena, payload: .layout(payload))
618623
}
619624

@@ -647,6 +652,9 @@ extension RawSyntax {
647652
recursiveFlags.insert(node.recursiveFlags)
648653
arena.addChild(node.arenaReference)
649654
}
655+
if kind == .sequenceExpr {
656+
recursiveFlags.insert(.hasSequenceExpr)
657+
}
650658
return .layout(
651659
kind: kind,
652660
layout: RawSyntaxBuffer(layoutBuffer),

Sources/SwiftSyntax/Syntax.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,11 @@ public extension SyntaxProtocol {
192192
return raw.recursiveFlags.contains(.hasError)
193193
}
194194

195+
/// Whether this tree contains a missing token or unexpected node.
196+
var hasSequenceExpr: Bool {
197+
return raw.recursiveFlags.contains(.hasSequenceExpr)
198+
}
199+
195200
/// The parent of this syntax node, or `nil` if this node is the root.
196201
var parent: Syntax? {
197202
return data.parent.map(Syntax.init(_:))

0 commit comments

Comments
 (0)