Skip to content

Commit a7a0354

Browse files
committed
Don’t override exising unexpected tokens when parsing remainder in SyntaxParsable
1 parent 02da1a1 commit a7a0354

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

Sources/SwiftParser/generated/Parser+Entry.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,15 @@ fileprivate extension Parser {
151151
return into
152152
}
153153

154-
let unexpected = RawUnexpectedNodesSyntax(elements: remainingTokens, arena: self.arena)
154+
let existingUnexpected: [RawSyntax]
155+
if let unexpectedNode = layout.children[layout.children.count - 1] {
156+
assert(unexpectedNode.is(RawUnexpectedNodesSyntax.self))
157+
existingUnexpected = unexpectedNode.as(RawUnexpectedNodesSyntax.self).elements
158+
} else {
159+
existingUnexpected = []
160+
}
161+
let unexpected = RawUnexpectedNodesSyntax(elements: existingUnexpected + remainingTokens, arena: self.arena)
162+
155163
let withUnexpected = layout.replacingChild(at: layout.children.count - 1, with: unexpected.raw, arena: self.arena)
156164
return R.init(withUnexpected)!
157165
}

Tests/SwiftParserTest/Parser+EntryTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,25 @@ public class EntryTests: XCTestCase {
4444
diagnostics: [DiagnosticSpec(message: "unexpected code 'other tokens' in function")]
4545
)
4646
}
47+
48+
func testRemainderUnexpectedDoesntOverrideExistingUnexpected() throws {
49+
AssertParse(
50+
"operator 1️⃣test 2️⃣{} other tokens",
51+
{ DeclSyntax.parse(from: &$0) },
52+
substructure: Syntax(
53+
UnexpectedNodesSyntax([
54+
TokenSyntax.leftBraceToken(),
55+
PrecedenceGroupAttributeListSyntax([]),
56+
TokenSyntax.rightBraceToken(),
57+
TokenSyntax.identifier("other"),
58+
TokenSyntax.identifier("tokens"),
59+
])
60+
),
61+
substructureAfterMarker: "2️⃣",
62+
diagnostics: [
63+
DiagnosticSpec(locationMarker: "1️⃣", message: "'test' is considered an identifier and must not appear within an operator name"),
64+
DiagnosticSpec(locationMarker: "2️⃣", message: "operator should not be declared with body"),
65+
]
66+
)
67+
}
4768
}

0 commit comments

Comments
 (0)