Skip to content

Commit 2d9da4d

Browse files
committed
[ASTGen] Generate "nonisolated" decl modifier
1 parent bdf2294 commit 2d9da4d

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,6 +1965,8 @@ extension ASTGenVisitor {
19651965
return self.generateAccessControlAttr(declModifier: node, level: .public)
19661966
case .open:
19671967
return self.generateAccessControlAttr(declModifier: node, level: .open)
1968+
case .nonisolated:
1969+
return self.generateNonisolatedAttr(declModifier: node)?.asDeclAttribute
19681970
case .weak, .unowned:
19691971
return self.generateReferenceOwnershipAttr(declModifier: node)?.asDeclAttribute
19701972
default:
@@ -2001,6 +2003,27 @@ extension ASTGenVisitor {
20012003
}
20022004
}
20032005

2006+
func generateNonisolatedAttr(declModifier node: DeclModifierSyntax) -> BridgedNonisolatedAttr? {
2007+
let isUnsafe: Bool
2008+
switch node.detail?.detail.rawText {
2009+
case "unsafe":
2010+
isUnsafe = true
2011+
case nil:
2012+
isUnsafe = false
2013+
case let text?:
2014+
// TODO: Diagnose
2015+
_ = text
2016+
fatalError("invalid argument for nonisolated modifier")
2017+
}
2018+
2019+
return BridgedNonisolatedAttr.createParsed(
2020+
self.ctx,
2021+
atLoc: nil,
2022+
range: self.generateSourceRange(node),
2023+
isUnsafe: isUnsafe
2024+
)
2025+
}
2026+
20042027
func generateReferenceOwnershipAttr(declModifier node: DeclModifierSyntax) -> BridgedReferenceOwnershipAttr? {
20052028
// 'weak' -> .weak
20062029
// 'weak(<unexpected>)' -> .weak (with diagnostics)

test/ASTGen/attrs.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,12 @@ struct NE : ~Escapable {}
215215
}
216216
@lifetime(borrow borrow) func testNameConflict(_ borrow: E) -> NE { NE() }
217217
@lifetime(result: source) func testTarget(_ result: inout NE, _ source: consuming NE) { result = source }
218+
219+
actor MyActor {
220+
nonisolated let constFlag: Bool = false
221+
nonisolated(unsafe) var mutableFlag: Bool = false
222+
}
223+
func testNonIsolated(actor: MyActor) {
224+
_ = actor.constFlag
225+
_ = actor.mutableFlag
226+
}

0 commit comments

Comments
 (0)