Skip to content

Commit 559c79a

Browse files
committed
WIP: Hard code first potential token of children of FunctionCallExpr
1 parent ae8283c commit 559c79a

File tree

4 files changed

+47
-5
lines changed

4 files changed

+47
-5
lines changed

Sources/SwiftParser/Parser.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,11 +633,27 @@ extension Parser {
633633

634634
var lookUpHelper = IncrementalParseLookup(transition: parseTransition)
635635
let currentOffset = self.lexemes.getOffsetToStart(self.currentToken)
636-
if let node = lookUpHelper.lookUp(currentOffset, kind: kind) {
636+
if let node = lookUpHelper.lookUp(currentOffset, kind: kind),
637+
nodeCanBeReused(node: node) == true {
638+
// for test
639+
lookUpHelper.registerReusedNode(node, offset: currentOffset)
637640
self.lexemes.advance(by: node.byteSize, currentToken: &self.currentToken)
638641
return node
639642
}
640643

641644
return nil
642645
}
646+
647+
func nodeCanBeReused(node: Syntax) -> Bool {
648+
var lookahead = self.lookahead()
649+
lookahead.lexemes.advance(by: node.byteSize, currentToken: &lookahead.currentToken)
650+
651+
if let codeBlockItem = node.as(CodeBlockItemSyntax.self),
652+
let internalItem = codeBlockItem.item.as(FunctionCallExprSyntax.self),
653+
let nextPotentialToken = internalItem.nextPotentialTokenChoices?.decomposeToRaw().rawKind {
654+
return lookahead.currentToken.rawTokenKind != nextPotentialToken
655+
}
656+
657+
return true
658+
}
643659
}

Sources/SwiftSyntax/IncrementalParseTransition.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,13 +240,16 @@ public struct IncrementalParseLookup {
240240
}
241241
let prevPosition = AbsolutePosition(utf8Offset: prevOffset)
242242
let node = cursorLookup(prevPosition: prevPosition, kind: kind)
243-
if let delegate = reusedDelegate, let node {
243+
return node
244+
}
245+
246+
public func registerReusedNode(_ node: Syntax, offset: Int) {
247+
if let delegate = reusedDelegate {
244248
delegate.parserReusedNode(
245-
range: ByteSourceRange(offset: newOffset, length: node.byteSizeAfterTrimmingTrivia),
249+
range: ByteSourceRange(offset: offset, length: node.byteSizeAfterTrimmingTrivia),
246250
previousNode: node
247251
)
248252
}
249-
return node
250253
}
251254

252255
mutating fileprivate func cursorLookup(

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxExprNodes.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2378,6 +2378,30 @@ public struct FunctionCallExprSyntax: ExprSyntaxProtocol, SyntaxHashable {
23782378
\Self.unexpectedAfterAdditionalTrailingClosures
23792379
])
23802380
}
2381+
2382+
public var nextPotentialTokenChoices: TokenKind? {
2383+
if let children = self.raw.layoutView?.children,
2384+
let lastNonNilChildIdx = children.lastIndex(where: {$0 != nil}),
2385+
lastNonNilChildIdx != children.endIndex {
2386+
var targetIntIndex = children.distance(from: children.startIndex, to: children.index(after: lastNonNilChildIdx))
2387+
// Unexpected Nodes
2388+
if targetIntIndex % 2 == 0 {
2389+
targetIntIndex += 1
2390+
}
2391+
2392+
switch targetIntIndex {
2393+
case 1: return .identifier("")
2394+
case 3: return .leftParen
2395+
case 5: return .identifier("")
2396+
case 7: return .rightParen
2397+
case 9: return .leftBrace
2398+
case 11: return .identifier("")
2399+
default: break
2400+
}
2401+
}
2402+
2403+
return nil
2404+
}
23812405
}
23822406

23832407
// MARK: - IdentifierExprSyntax

Tests/SwiftParserTest/IncrementalParsingTests.swift

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

4141
public func testTrailingClosure() {
42-
XCTExpectFailure("WIP: Add lookahead for incremental parse")
4342
assertIncrementalParse(
4443
"""
4544
foo() {}

0 commit comments

Comments
 (0)