Skip to content

Commit fe1d21d

Browse files
committed
Merge pull request swiftlang#1538 from ahoppen/ahoppen/source-alteration-fixes
Fix parser failures found by source alteration in test cases
1 parent b011378 commit fe1d21d

File tree

4 files changed

+81
-32
lines changed

4 files changed

+81
-32
lines changed

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ public let DECL_NODES: [Node] = [
332332
),
333333
Child(
334334
name: "Detail",
335-
kind: .token(choices: [.token(tokenKind: "IdentifierToken"), .keyword(text: "set")])
335+
kind: .token(choices: [.token(tokenKind: "IdentifierToken")])
336336
),
337337
Child(
338338
name: "RightParen",
@@ -348,7 +348,44 @@ public let DECL_NODES: [Node] = [
348348
children: [
349349
Child(
350350
name: "Name",
351-
kind: .token(choices: [.keyword(text: "class"), .keyword(text: "convenience"), .keyword(text: "dynamic"), .keyword(text: "final"), .keyword(text: "infix"), .keyword(text: "lazy"), .keyword(text: "optional"), .keyword(text: "override"), .keyword(text: "postfix"), .keyword(text: "prefix"), .keyword(text: "required"), .keyword(text: "static"), .keyword(text: "unowned"), .keyword(text: "weak"), .keyword(text: "private"), .keyword(text: "fileprivate"), .keyword(text: "internal"), .keyword(text: "public"), .keyword(text: "open"), .keyword(text: "mutating"), .keyword(text: "nonmutating"), .keyword(text: "indirect"), .keyword(text: "__consuming"), .keyword(text: "borrowing"), .keyword(text: "consuming"), .keyword(text: "actor"), .keyword(text: "async"), .keyword(text: "distributed"), .keyword(text: "isolated"), .keyword(text: "nonisolated"), .keyword(text: "_const"), .keyword(text: "_local"), .keyword(text: "package")]),
351+
kind: .token(choices: [
352+
.keyword(text: "__consuming"),
353+
.keyword(text: "__setter_access"),
354+
.keyword(text: "_const"),
355+
.keyword(text: "_local"),
356+
.keyword(text: "actor"),
357+
.keyword(text: "async"),
358+
.keyword(text: "borrowing"),
359+
.keyword(text: "class"),
360+
.keyword(text: "consuming"),
361+
.keyword(text: "convenience"),
362+
.keyword(text: "distributed"),
363+
.keyword(text: "dynamic"),
364+
.keyword(text: "fileprivate"),
365+
.keyword(text: "final"),
366+
.keyword(text: "indirect"),
367+
.keyword(text: "infix"),
368+
.keyword(text: "internal"),
369+
.keyword(text: "isolated"),
370+
.keyword(text: "lazy"),
371+
.keyword(text: "mutating"),
372+
.keyword(text: "nonisolated"),
373+
.keyword(text: "nonmutating"),
374+
.keyword(text: "open"),
375+
.keyword(text: "optional"),
376+
.keyword(text: "override"),
377+
.keyword(text: "package"),
378+
.keyword(text: "postfix"),
379+
.keyword(text: "prefix"),
380+
.keyword(text: "private"),
381+
.keyword(text: "public"),
382+
.keyword(text: "reasync"),
383+
.keyword(text: "required"),
384+
.keyword(text: "setter_access"),
385+
.keyword(text: "static"),
386+
.keyword(text: "unowned"),
387+
.keyword(text: "weak"),
388+
]),
352389
classification: "Attribute"
353390
),
354391
Child(

Sources/SwiftParser/Modifiers.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,12 @@ extension Parser {
9999
extension Parser {
100100
mutating func parseModifierDetail() -> RawDeclModifierDetailSyntax {
101101
let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen)
102-
let detailToken = self.consumeAnyToken()
102+
let (unexpectedBeforeDetailToken, detailToken) = self.expect(.identifier, TokenSpec(.set, remapping: .identifier), default: .identifier)
103103
let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
104104
return RawDeclModifierDetailSyntax(
105105
unexpectedBeforeLeftParen,
106106
leftParen: leftParen,
107+
unexpectedBeforeDetailToken,
107108
detail: detailToken,
108109
unexpectedBeforeRightParen,
109110
rightParen: rightParen,

Sources/SwiftParser/Specifiers.swift

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -412,11 +412,11 @@ extension RawAccessorEffectSpecifiersSyntax: RawEffectSpecifiersTrait {
412412
}
413413

414414
extension TokenConsumer {
415-
mutating func at<SpecSet1: TokenSpecSet, SpecSet2: TokenSpecSet>(anyIn specSet1: SpecSet1.Type, or specSet2: SpecSet2.Type) -> (TokenSpec, TokenConsumptionHandle)? {
415+
mutating func at<SpecSet1: TokenSpecSet, SpecSet2: TokenSpecSet>(anyIn specSet1: SpecSet1.Type, or specSet2: SpecSet2.Type) -> (spec: TokenSpec, handle: TokenConsumptionHandle, matchedSubset: Any.Type)? {
416416
if let (spec, handle) = self.at(anyIn: specSet1) {
417-
return (spec.spec, handle)
417+
return (spec.spec, handle, SpecSet1.self)
418418
} else if let (spec, handle) = self.at(anyIn: specSet2) {
419-
return (spec.spec, handle)
419+
return (spec.spec, handle, SpecSet2.self)
420420
} else {
421421
return nil
422422
}
@@ -470,14 +470,14 @@ extension Parser {
470470

471471
var unexpectedAfterThrowsLoopProgress = LoopProgressCondition()
472472
while unexpectedAfterThrowsLoopProgress.evaluate(self.currentToken) {
473-
if let (_, handle) = self.at(anyIn: S.MisspelledAsyncSpecifiers.self, or: S.CorrectAsyncTokenKinds.self) {
473+
if let (_, handle, _) = self.at(anyIn: S.MisspelledAsyncSpecifiers.self, or: S.CorrectAsyncTokenKinds.self) {
474474
let misspelledAsync = self.eat(handle)
475475
unexpectedAfterThrows.append(RawSyntax(misspelledAsync))
476476
if asyncKeyword == nil {
477477
// Handle `async` after `throws`
478478
asyncKeyword = missingToken(.keyword(.async))
479479
}
480-
} else if let (_, handle) = self.at(anyIn: S.MisspelledThrowsTokenKinds.self, or: S.CorrectThrowsTokenKinds.self) {
480+
} else if let (_, handle, _) = self.at(anyIn: S.MisspelledThrowsTokenKinds.self, or: S.CorrectThrowsTokenKinds.self) {
481481
let misspelledThrows = self.eat(handle)
482482
unexpectedAfterThrows.append(RawSyntax(misspelledThrows))
483483
} else {
@@ -521,17 +521,25 @@ extension Parser {
521521
var unexpected: [RawTokenSyntax] = []
522522
var loopProgress = LoopProgressCondition()
523523
while loopProgress.evaluate(self.currentToken) {
524-
if let (spec, handle) = self.at(anyIn: S.MisspelledAsyncSpecifiers.self, or: S.CorrectAsyncTokenKinds.self) {
524+
if let (spec, handle, matchedSubset) = self.at(anyIn: S.MisspelledAsyncSpecifiers.self, or: S.CorrectAsyncTokenKinds.self) {
525525
let misspelledAsync = self.eat(handle)
526526
unexpected.append(misspelledAsync)
527527
if effectSpecifiers?.asyncSpecifier == nil {
528-
synthesizedAsync = missingToken(spec)
528+
if matchedSubset == S.CorrectAsyncTokenKinds.self {
529+
synthesizedAsync = missingToken(spec)
530+
} else {
531+
synthesizedAsync = missingToken(.async)
532+
}
529533
}
530-
} else if let (spec, handle) = self.at(anyIn: S.MisspelledThrowsTokenKinds.self, or: S.CorrectThrowsTokenKinds.self) {
534+
} else if let (spec, handle, matchedSubset) = self.at(anyIn: S.MisspelledThrowsTokenKinds.self, or: S.CorrectThrowsTokenKinds.self) {
531535
let misspelledThrows = self.eat(handle)
532536
unexpected.append(misspelledThrows)
533537
if effectSpecifiers?.throwsSpecifier == nil {
534-
synthesizedThrows = missingToken(spec)
538+
if matchedSubset == S.CorrectThrowsTokenKinds.self {
539+
synthesizedThrows = missingToken(spec)
540+
} else {
541+
synthesizedThrows = missingToken(.throws)
542+
}
535543
}
536544
} else {
537545
break

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -807,39 +807,42 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
807807
assert(layout.count == 5)
808808
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
809809
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [
810+
.keyword("__consuming"),
811+
.keyword("__setter_access"),
812+
.keyword("_const"),
813+
.keyword("_local"),
814+
.keyword("actor"),
815+
.keyword("async"),
816+
.keyword("borrowing"),
810817
.keyword("class"),
818+
.keyword("consuming"),
811819
.keyword("convenience"),
820+
.keyword("distributed"),
812821
.keyword("dynamic"),
822+
.keyword("fileprivate"),
813823
.keyword("final"),
824+
.keyword("indirect"),
814825
.keyword("infix"),
826+
.keyword("internal"),
827+
.keyword("isolated"),
815828
.keyword("lazy"),
829+
.keyword("mutating"),
830+
.keyword("nonisolated"),
831+
.keyword("nonmutating"),
832+
.keyword("open"),
816833
.keyword("optional"),
817834
.keyword("override"),
835+
.keyword("package"),
818836
.keyword("postfix"),
819837
.keyword("prefix"),
838+
.keyword("private"),
839+
.keyword("public"),
840+
.keyword("reasync"),
820841
.keyword("required"),
842+
.keyword("setter_access"),
821843
.keyword("static"),
822844
.keyword("unowned"),
823-
.keyword("weak"),
824-
.keyword("private"),
825-
.keyword("fileprivate"),
826-
.keyword("internal"),
827-
.keyword("public"),
828-
.keyword("open"),
829-
.keyword("mutating"),
830-
.keyword("nonmutating"),
831-
.keyword("indirect"),
832-
.keyword("__consuming"),
833-
.keyword("borrowing"),
834-
.keyword("consuming"),
835-
.keyword("actor"),
836-
.keyword("async"),
837-
.keyword("distributed"),
838-
.keyword("isolated"),
839-
.keyword("nonisolated"),
840-
.keyword("_const"),
841-
.keyword("_local"),
842-
.keyword("package")
845+
.keyword("weak")
843846
]))
844847
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
845848
assertNoError(kind, 3, verify(layout[3], as: RawDeclModifierDetailSyntax?.self))

0 commit comments

Comments
 (0)