Skip to content

Commit e71453d

Browse files
authored
Merge pull request #1900 from StevenWong12/replace_delegate_with_closure
Replace `IncrementalParseReusedNodeDelegate` with `ReusedNodeCallback`
2 parents 3481566 + 0e5a32e commit e71453d

File tree

3 files changed

+17
-42
lines changed

3 files changed

+17
-42
lines changed

Sources/SwiftParser/IncrementalParseTransition.swift

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -35,61 +35,39 @@ extension Parser {
3535
}
3636
}
3737

38-
/// Accepts the re-used ``Syntax`` nodes that `IncrementalParseTransition`
38+
/// Accepts a re-used ``Syntax`` node that `IncrementalParseTransition`
3939
/// determined they should be re-used for a parse invocation.
4040
///
4141
/// The client can use this information to potentially avoid unnecessary work
4242
/// for regions of the source that have not changed.
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 = (_ node: 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.
7958
/// - edits: The edits that have occurred since the last parse that resulted
8059
/// in the new source that is about to be parsed.
81-
/// - reusedNodeDelegate: Optional delegate to accept information about the
82-
/// reused regions and nodes.
60+
/// - reusedNodeCallback: Optional closure to accept information about the re-used node. For each node that gets re-used `reusedNodeCallback` is called.
8361
public init(
8462
previousTree: SourceFileSyntax,
8563
edits: ConcurrentEdits,
8664
lookaheadRanges: LookaheadRanges,
87-
reusedNodeDelegate: IncrementalParseReusedNodeDelegate? = nil
65+
reusedNodeCallback: ReusedNodeCallback? = nil
8866
) {
8967
self.previousTree = previousTree
9068
self.edits = edits
9169
self.lookaheadRanges = lookaheadRanges
92-
self.reusedDelegate = reusedNodeDelegate
70+
self.reusedNodeCallback = reusedNodeCallback
9371
}
9472
}
9573

@@ -110,8 +88,8 @@ struct IncrementalParseLookup {
11088
return transition.edits
11189
}
11290

113-
fileprivate var reusedDelegate: IncrementalParseReusedNodeDelegate? {
114-
return transition.reusedDelegate
91+
fileprivate var reusedCallback: ReusedNodeCallback? {
92+
return transition.reusedNodeCallback
11593
}
11694

11795
/// Does a lookup to see if the current source `offset` should be associated
@@ -132,10 +110,8 @@ struct IncrementalParseLookup {
132110
}
133111
let prevPosition = AbsolutePosition(utf8Offset: prevOffset)
134112
let node = cursorLookup(prevPosition: prevPosition, kind: kind)
135-
if let delegate = reusedDelegate, let node {
136-
delegate.parserReusedNode(
137-
previousNode: node
138-
)
113+
if let node {
114+
reusedCallback?(node)
139115
}
140116
return node
141117
}

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)