From 05de293cc214df55217d2f2d052eb0cf7f6b35bd Mon Sep 17 00:00:00 2001 From: Sophia Poirier Date: Tue, 7 Nov 2023 11:40:52 -0800 Subject: [PATCH] reject invalid arguments to nonisolated contextual keyword --- Sources/SwiftParser/Modifiers.swift | 19 +++++++++++++++---- Tests/SwiftParserTest/DeclarationTests.swift | 18 +++++++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Sources/SwiftParser/Modifiers.swift b/Sources/SwiftParser/Modifiers.swift index 39588f47b95..ee773fc56b1 100644 --- a/Sources/SwiftParser/Modifiers.swift +++ b/Sources/SwiftParser/Modifiers.swift @@ -99,9 +99,9 @@ extension Parser { } extension Parser { - mutating func parseModifierDetail(_ keyword: Keyword) -> RawDeclModifierDetailSyntax { + mutating func parseModifierDetail() -> RawDeclModifierDetailSyntax { let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen) - let (unexpectedBeforeDetailToken, detailToken) = self.expect(.identifier, TokenSpec(keyword, remapping: .identifier), default: .identifier) + let (unexpectedBeforeDetailToken, detailToken) = self.expect(.identifier, TokenSpec(.set, remapping: .identifier), default: .identifier) let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen) return RawDeclModifierDetailSyntax( unexpectedBeforeLeftParen, @@ -119,7 +119,7 @@ extension Parser { let detail: RawDeclModifierDetailSyntax? if self.at(.leftParen) { - detail = self.parseModifierDetail(.set) + detail = self.parseModifierDetail() } else { detail = nil } @@ -224,7 +224,18 @@ extension Parser { let detail: RawDeclModifierDetailSyntax? if self.at(.leftParen) { - detail = self.parseModifierDetail(.unsafe) + let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen) + let (unexpectedBeforeDetailToken, detailToken) = self.expect(TokenSpec(.unsafe, remapping: .identifier)) + let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen) + detail = RawDeclModifierDetailSyntax( + unexpectedBeforeLeftParen, + leftParen: leftParen, + unexpectedBeforeDetailToken, + detail: detailToken, + unexpectedBeforeRightParen, + rightParen: rightParen, + arena: self.arena + ) } else { detail = nil } diff --git a/Tests/SwiftParserTest/DeclarationTests.swift b/Tests/SwiftParserTest/DeclarationTests.swift index fb51eef4973..4f1b951b7ff 100644 --- a/Tests/SwiftParserTest/DeclarationTests.swift +++ b/Tests/SwiftParserTest/DeclarationTests.swift @@ -248,8 +248,24 @@ final class DeclarationTests: ParserTestCase { struct A { nonisolated(unsafe) let b = 0 nonisolated(unsafe) var c: Int { 0 } + nonisolated(1️⃣safe) let d = 0 } - """ + """, + diagnostics: [ + DiagnosticSpec( + message: "expected 'unsafe' in modifier", + fixIts: ["replace 'safe' with 'unsafe'"] + ) + ], + fixedSource: """ + nonisolated(unsafe) let a = 0 + + struct A { + nonisolated(unsafe) let b = 0 + nonisolated(unsafe) var c: Int { 0 } + nonisolated(unsafe) let d = 0 + } + """ ) }