Skip to content

Commit 9343496

Browse files
committed
Replace IncrementalParseReusedNodeDelegate with ReusedNodeCallback
1 parent b0f8e70 commit 9343496

File tree

3 files changed

+15
-39
lines changed

3 files changed

+15
-39
lines changed

Sources/SwiftParser/IncrementalParseTransition.swift

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -43,36 +43,15 @@ extension Parser {
4343
///
4444
/// This is also used for testing purposes to ensure incremental reparsing
4545
/// worked as expected.
46-
public protocol IncrementalParseReusedNodeDelegate {
47-
/// Accepts ``Syntax`` node of skipped source region.
48-
///
49-
/// - Parameters:
50-
/// - previousNode: The node from the previous tree that is associated with
51-
/// the skipped source region.
52-
func parserReusedNode(previousNode: Syntax)
53-
}
54-
55-
/// An implementation of `IncrementalParseReusedNodeDelegate` that just collects
56-
/// the range and re-used node into an array.
57-
public final class IncrementalParseReusedNodeCollector:
58-
IncrementalParseReusedNodeDelegate
59-
{
60-
public var nodes: [Syntax] = []
61-
62-
public init() {}
63-
64-
public func parserReusedNode(previousNode: Syntax) {
65-
nodes.append(previousNode)
66-
}
67-
}
46+
public typealias ReusedNodeCallback = (_ nodes: Syntax) -> ()
6847

6948
/// Keeps track of a previously parsed syntax tree and the source edits that
7049
/// occurred since it was created.
7150
public final class IncrementalParseTransition {
7251
fileprivate let previousTree: SourceFileSyntax
7352
fileprivate let edits: ConcurrentEdits
7453
fileprivate let lookaheadRanges: LookaheadRanges
75-
fileprivate let reusedDelegate: IncrementalParseReusedNodeDelegate?
54+
fileprivate let reusedNodeCallback: ReusedNodeCallback?
7655

7756
/// - Parameters:
7857
/// - previousTree: The previous tree to do lookups on.
@@ -84,12 +63,12 @@ public final class IncrementalParseTransition {
8463
previousTree: SourceFileSyntax,
8564
edits: ConcurrentEdits,
8665
lookaheadRanges: LookaheadRanges,
87-
reusedNodeDelegate: IncrementalParseReusedNodeDelegate? = nil
66+
reusedNodeCallback: ReusedNodeCallback? = nil
8867
) {
8968
self.previousTree = previousTree
9069
self.edits = edits
9170
self.lookaheadRanges = lookaheadRanges
92-
self.reusedDelegate = reusedNodeDelegate
71+
self.reusedNodeCallback = reusedNodeCallback
9372
}
9473
}
9574

@@ -110,8 +89,8 @@ struct IncrementalParseLookup {
11089
return transition.edits
11190
}
11291

113-
fileprivate var reusedDelegate: IncrementalParseReusedNodeDelegate? {
114-
return transition.reusedDelegate
92+
fileprivate var reusedCallback: ReusedNodeCallback? {
93+
return transition.reusedNodeCallback
11594
}
11695

11796
/// Does a lookup to see if the current source `offset` should be associated
@@ -132,10 +111,8 @@ struct IncrementalParseLookup {
132111
}
133112
let prevPosition = AbsolutePosition(utf8Offset: prevOffset)
134113
let node = cursorLookup(prevPosition: prevPosition, kind: kind)
135-
if let delegate = reusedDelegate, let node {
136-
delegate.parserReusedNode(
137-
previousNode: node
138-
)
114+
if let node {
115+
reusedCallback?(node)
139116
}
140117
return node
141118
}

Sources/_SwiftSyntaxTestSupport/IncrementalParseTestUtils.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ public func assertIncrementalParse(
3232

3333
let (originalTree, lookaheadRanges) = Parser.parseIncrementally(source: originalString, parseTransition: nil)
3434

35-
let reusedNodesCollector = IncrementalParseReusedNodeCollector()
35+
var reusedNodes: [Syntax] = []
3636
let transition = IncrementalParseTransition(
3737
previousTree: originalTree,
3838
edits: concurrentEdits,
3939
lookaheadRanges: lookaheadRanges,
40-
reusedNodeDelegate: reusedNodesCollector
40+
reusedNodeCallback: { reusedNodes.append($0) }
4141
)
4242

4343
let newTree = Parser.parse(source: editedString)
@@ -66,11 +66,11 @@ public func assertIncrementalParse(
6666
}
6767

6868
// Re-used nodes
69-
if reusedNodesCollector.nodes.count != expectedReusedNodes.count {
69+
if reusedNodes.count != expectedReusedNodes.count {
7070
XCTFail(
7171
"""
72-
Expected \(expectedReusedNodes.count) re-used nodes but received \(reusedNodesCollector.nodes.count):
73-
\(reusedNodesCollector.nodes.map {$0.description}.joined(separator: "\n"))
72+
Expected \(expectedReusedNodes.count) re-used nodes but received \(reusedNodes.count):
73+
\(reusedNodes.map {$0.description}.joined(separator: "\n"))
7474
""",
7575
file: file,
7676
line: line
@@ -84,11 +84,11 @@ public func assertIncrementalParse(
8484
continue
8585
}
8686

87-
guard let reusedNode = reusedNodesCollector.nodes.first(where: { $0.byteRangeAfterTrimmingTrivia == range }) else {
87+
guard let reusedNode = reusedNodes.first(where: { $0.byteRangeAfterTrimmingTrivia == range }) else {
8888
XCTFail(
8989
"""
9090
Fail to match the range of \(expectedReusedNode.source) in:
91-
\(reusedNodesCollector.nodes.map({"\($0.byteRangeAfterTrimmingTrivia): \($0.description)"}).joined(separator: "\n"))
91+
\(reusedNodes.map({"\($0.byteRangeAfterTrimmingTrivia): \($0.description)"}).joined(separator: "\n"))
9292
""",
9393
file: expectedReusedNode.file,
9494
line: expectedReusedNode.line

Tests/SwiftParserTest/IncrementalParsingTests.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ public class IncrementalParsingTests: XCTestCase {
162162
}
163163

164164
public func testMultiEditMapping() throws {
165-
try XCTSkipIf(true, "Swift parser does not handle node reuse yet")
166165
assertIncrementalParse(
167166
"""
168167
let one: Int;let two: Int; let three: Int; ⏩️⏸️ ⏪️⏩️⏸️ ⏪️let found: Int;let five: Int;

0 commit comments

Comments
 (0)