Skip to content

Commit

Permalink
Merge pull request swiftlang#2306 from sophiapoirier/globals_strict_c…
Browse files Browse the repository at this point in the history
…oncurrency_opt_out_nonisolated_unsafe

nonisolated(unsafe) to opt out of strict concurrency static checking for global variables
  • Loading branch information
sophiapoirier committed Oct 26, 2023
2 parents 18c5bce + 8fb1309 commit e5962c4
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 8 deletions.
8 changes: 4 additions & 4 deletions Sources/SwiftParser/Declarations.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ extension DeclarationModifier {
switch self {
case .__consuming, .__setter_access, ._const, ._local, .async,
.borrowing, .class, .consuming, .convenience, .distributed, .dynamic,
.final, .indirect, .infix, .isolated, .lazy, .mutating, .nonisolated,
.nonmutating, .optional, .override, .postfix, .prefix, .reasync,
.required, .rethrows, .static, .weak:
.final, .indirect, .infix, .isolated, .lazy, .mutating, .nonmutating,
.optional, .override, .postfix, .prefix, .reasync, .required,
.rethrows, .static, .weak:
return false
case .fileprivate, .internal, .package, .open, .private,
case .fileprivate, .internal, .nonisolated, .package, .open, .private,
.public, .unowned:
return true
}
Expand Down
27 changes: 23 additions & 4 deletions Sources/SwiftParser/Modifiers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ extension Parser {
}
case (.declarationModifier(.unowned), let handle)?:
elements.append(self.parseUnownedModifier(handle))
case (.declarationModifier(.nonisolated), let handle)?:
elements.append(parseNonisolatedModifier(handle))
case (.declarationModifier(.final), let handle)?,
(.declarationModifier(.required), let handle)?,
(.declarationModifier(.optional), let handle)?,
Expand All @@ -79,7 +81,6 @@ extension Parser {
(.declarationModifier(.indirect), let handle)?,
(.declarationModifier(.isolated), let handle)?,
(.declarationModifier(.async), let handle)?,
(.declarationModifier(.nonisolated), let handle)?,
(.declarationModifier(.distributed), let handle)?,
(.declarationModifier(._const), let handle)?,
(.declarationModifier(._local), let handle)?,
Expand All @@ -98,9 +99,9 @@ extension Parser {
}

extension Parser {
mutating func parseModifierDetail() -> RawDeclModifierDetailSyntax {
mutating func parseModifierDetail(_ keyword: Keyword) -> RawDeclModifierDetailSyntax {
let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen)
let (unexpectedBeforeDetailToken, detailToken) = self.expect(.identifier, TokenSpec(.set, remapping: .identifier), default: .identifier)
let (unexpectedBeforeDetailToken, detailToken) = self.expect(.identifier, TokenSpec(keyword, remapping: .identifier), default: .identifier)
let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
return RawDeclModifierDetailSyntax(
unexpectedBeforeLeftParen,
Expand All @@ -118,7 +119,7 @@ extension Parser {

let detail: RawDeclModifierDetailSyntax?
if self.at(.leftParen) {
detail = self.parseModifierDetail()
detail = self.parseModifierDetail(.set)
} else {
detail = nil
}
Expand Down Expand Up @@ -217,4 +218,22 @@ extension Parser {
arena: self.arena
)
}

mutating func parseNonisolatedModifier(_ handle: RecoveryConsumptionHandle) -> RawDeclModifierSyntax {
let (unexpectedBeforeKeyword, keyword) = self.eat(handle)

let detail: RawDeclModifierDetailSyntax?
if self.at(.leftParen) {
detail = self.parseModifierDetail(.unsafe)
} else {
detail = nil
}

return RawDeclModifierSyntax(
unexpectedBeforeKeyword,
name: keyword,
detail: detail,
arena: self.arena
)
}
}
13 changes: 13 additions & 0 deletions Tests/SwiftParserTest/DeclarationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,19 @@ final class DeclarationTests: ParserTestCase {
)
}

func testNonisolatedUnsafeParsing() {
assertParse(
"""
nonisolated(unsafe) let a = 0
struct A {
nonisolated(unsafe) let b = 0
nonisolated(unsafe) var c: Int { 0 }
}
"""
)
}

func testProtocolParsing() {
assertParse("protocol Foo {}")

Expand Down

0 comments on commit e5962c4

Please sign in to comment.