Skip to content

Commit e72a277

Browse files
committed
Parse "unsafe" as part of for..in statement
1 parent 93d82ca commit e72a277

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

Sources/SwiftParser/Statements.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,16 @@ extension Parser {
570570
let tryKeyword = self.consume(if: .keyword(.try))
571571
let awaitKeyword = self.consume(if: .keyword(.await))
572572

573+
let unsafeKeyword: RawTokenSyntax?
574+
if let modifierKeyword = ExpressionModifierKeyword(
575+
lexeme: self.currentToken,
576+
experimentalFeatures: self.experimentalFeatures
577+
), modifierKeyword == .unsafe, !self.peek(isAt: .keyword(.in)) {
578+
unsafeKeyword = self.consumeAnyToken()
579+
} else {
580+
unsafeKeyword = nil
581+
}
582+
573583
// Parse the pattern. This is either 'case <refutable pattern>' or just a
574584
// normal pattern.
575585
let caseKeyword = self.consume(if: .keyword(.case))
@@ -624,6 +634,7 @@ extension Parser {
624634
forKeyword: forKeyword,
625635
tryKeyword: tryKeyword,
626636
awaitKeyword: awaitKeyword,
637+
unsafeKeyword: unsafeKeyword,
627638
caseKeyword: caseKeyword,
628639
pattern: pattern,
629640
typeAnnotation: type,

Tests/SwiftParserTest/StatementTests.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,4 +957,16 @@ final class StatementTests: ParserTestCase {
957957
]
958958
)
959959
}
960+
961+
func testForUnsafeStatement() {
962+
assertParse(
963+
"for try await unsafe x in e { }",
964+
experimentalFeatures: [.unsafeExpression]
965+
)
966+
967+
assertParse(
968+
"for try await unsafe in e { }",
969+
experimentalFeatures: [.unsafeExpression]
970+
)
971+
}
960972
}

0 commit comments

Comments
 (0)