Skip to content

Commit 20f589c

Browse files
authored
Merge pull request #79547 from rintaro/astgen-small-fixes2
2 parents af489ea + 2bf6974 commit 20f589c

File tree

5 files changed

+152
-27
lines changed

5 files changed

+152
-27
lines changed

include/swift/AST/ASTBridgingImpl.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,10 @@ swift::DeclAttributes BridgedDeclAttributes::unbridged() const {
282282
return attrs;
283283
}
284284

285+
//===----------------------------------------------------------------------===//
286+
// MARK: AvailabilityDomain
287+
//===----------------------------------------------------------------------===//
288+
285289
BridgedAvailabilityDomain::BridgedAvailabilityDomain(
286290
swift::AvailabilityDomain domain)
287291
: opaque(domain.getOpaqueValue()) {}
@@ -290,6 +294,23 @@ swift::AvailabilityDomain BridgedAvailabilityDomain::unbridged() const {
290294
return swift::AvailabilityDomain::fromOpaque(opaque);
291295
}
292296

297+
BridgedAvailabilityDomain BridgedAvailabilityDomain::forUniversal() {
298+
return swift::AvailabilityDomain::forUniversal();
299+
}
300+
BridgedAvailabilityDomain
301+
BridgedAvailabilityDomain::forPlatform(BridgedPlatformKind platformKind) {
302+
return swift::AvailabilityDomain::forPlatform(unbridge(platformKind));
303+
}
304+
BridgedAvailabilityDomain BridgedAvailabilityDomain::forSwiftLanguage() {
305+
return swift::AvailabilityDomain::forSwiftLanguage();
306+
}
307+
BridgedAvailabilityDomain BridgedAvailabilityDomain::forPackageDescription() {
308+
return swift::AvailabilityDomain::forPackageDescription();
309+
}
310+
BridgedAvailabilityDomain BridgedAvailabilityDomain::forEmbedded() {
311+
return swift::AvailabilityDomain::forEmbedded();
312+
}
313+
293314
//===----------------------------------------------------------------------===//
294315
// MARK: BridgedParamDecl
295316
//===----------------------------------------------------------------------===//

lib/AST/Bridging/AvailabilityBridging.cpp

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -152,24 +152,3 @@ BridgedSourceRange
152152
BridgedAvailabilitySpec_getVersionRange(BridgedAvailabilitySpec spec) {
153153
return spec.unbridged()->getVersionSrcRange();
154154
}
155-
156-
//===----------------------------------------------------------------------===//
157-
// MARK: AvailabilityDomain
158-
//===----------------------------------------------------------------------===//
159-
160-
BridgedAvailabilityDomain BridgedAvailabilityDomain::forUniversal() {
161-
return swift::AvailabilityDomain::forUniversal();
162-
}
163-
BridgedAvailabilityDomain
164-
BridgedAvailabilityDomain::forPlatform(BridgedPlatformKind platformKind) {
165-
return swift::AvailabilityDomain::forPlatform(unbridge(platformKind));
166-
}
167-
BridgedAvailabilityDomain BridgedAvailabilityDomain::forSwiftLanguage() {
168-
return swift::AvailabilityDomain::forSwiftLanguage();
169-
}
170-
BridgedAvailabilityDomain BridgedAvailabilityDomain::forPackageDescription() {
171-
return swift::AvailabilityDomain::forPackageDescription();
172-
}
173-
BridgedAvailabilityDomain BridgedAvailabilityDomain::forEmbedded() {
174-
return swift::AvailabilityDomain::forEmbedded();
175-
}

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ extension ASTGenVisitor {
187187
fatalError("unimplemented")
188188
case .unavailableFromAsync:
189189
return handle(self.generateUnavailableFromAsyncAttr(attribute: node)?.asDeclAttribute)
190+
case .none where attrName == "_unavailableInEmbedded":
191+
return handle(self.generateUnavailableInEmbeddedAttr(attribute: node)?.asDeclAttribute)
190192

191193
// Simple attributes.
192194
case .addressableSelf,
@@ -1778,6 +1780,30 @@ extension ASTGenVisitor {
17781780
)
17791781
}
17801782

1783+
func generateUnavailableInEmbeddedAttr(attribute node: AttributeSyntax) -> BridgedAvailableAttr? {
1784+
if ctx.langOptsHasFeature(.Embedded) {
1785+
return BridgedAvailableAttr.createParsed(
1786+
self.ctx,
1787+
atLoc: self.generateSourceLoc(node.atSign),
1788+
range: self.generateAttrSourceRange(node),
1789+
domain: .forEmbedded(),
1790+
domainLoc: nil,
1791+
kind: .unavailable,
1792+
message: "unavailable in embedded Swift",
1793+
renamed: "",
1794+
introduced: BridgedVersionTuple(),
1795+
introducedRange: BridgedSourceRange(),
1796+
deprecated: BridgedVersionTuple(),
1797+
deprecatedRange: BridgedSourceRange(),
1798+
obsoleted: BridgedVersionTuple(),
1799+
obsoletedRange: BridgedSourceRange()
1800+
)
1801+
} else {
1802+
// For non-Embedded mode, ignore it.
1803+
return nil
1804+
}
1805+
}
1806+
17811807
func generateSimpleDeclAttr(attribute node: AttributeSyntax, kind: BridgedDeclAttrKind) -> BridgedDeclAttribute? {
17821808
// TODO: Diagnose extraneous arguments.
17831809
// TODO: Diagnose if `kind` is a modifier.
@@ -2040,17 +2066,18 @@ extension ASTGenVisitor {
20402066
kind = .weak
20412067
guard node.detail == nil else {
20422068
// TODO: Diagnose.
2043-
return nil
2069+
fatalError("invalid argument for 'weak' modifier")
20442070
}
20452071
case .unowned:
2046-
switch node.detail?.detail.keywordKind {
2047-
case .safe, nil:
2072+
switch node.detail?.detail.rawText {
2073+
case "safe", nil:
20482074
kind = .unowned
2049-
case .unsafe:
2075+
case "unsafe":
20502076
kind = .unmanaged
2051-
case _?:
2077+
case let text?:
20522078
// TODO: Diagnose
2053-
kind = .unowned
2079+
_ = text
2080+
fatalError("invalid argument for 'unowned' modifier")
20542081
}
20552082
default:
20562083
preconditionFailure("ReferenceOwnership modifier must be 'weak' or 'unowned'")

test/ASTGen/attrs.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,3 +227,10 @@ func testNonIsolated(actor: MyActor) {
227227
_ = actor.constFlag
228228
_ = actor.mutableFlag
229229
}
230+
231+
struct ReferenceOwnershipModifierTest<X: AnyObject> {
232+
weak var weakValue: X?
233+
unowned var unownedValue: X
234+
unowned(safe) var unownedSafeValue: X
235+
unowned(unsafe) var unmanagedValue: X
236+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// **Copied from test/embedded/availability.swift**
2+
// RUN: %target-typecheck-verify-swift -parse-stdlib -enable-experimental-feature Embedded -enable-experimental-feature ParserASTGen
3+
4+
// REQUIRES: swift_in_compiler
5+
// REQUIRES: swift_feature_Embedded
6+
// REQUIRES: swift_feature_ParserASTGen
7+
8+
@_unavailableInEmbedded
9+
public struct UnavailableInEmbedded {}
10+
// expected-note@-1 {{'UnavailableInEmbedded' has been explicitly marked unavailable here}}
11+
12+
@available(*, unavailable, message: "always unavailable")
13+
public struct UniverallyUnavailable {}
14+
// expected-note@-1 {{'UniverallyUnavailable' has been explicitly marked unavailable here}}
15+
16+
@_unavailableInEmbedded
17+
public func unavailable_in_embedded() { }
18+
// expected-note@-1 {{'unavailable_in_embedded()' has been explicitly marked unavailable here}}
19+
20+
@available(*, unavailable, message: "always unavailable")
21+
public func universally_unavailable() { }
22+
// expected-note@-1 4 {{'universally_unavailable()' has been explicitly marked unavailable here}}
23+
24+
@_unavailableInEmbedded
25+
public func unused() { } // no error
26+
27+
public struct S1 {} // expected-note 2 {{found this candidate}}
28+
public struct S2 {} // expected-note 2 {{found this candidate}}
29+
30+
@_unavailableInEmbedded
31+
public func has_unavailable_in_embedded_overload(_ s1: S1) { }
32+
33+
public func has_unavailable_in_embedded_overload(_ s2: S2) { }
34+
35+
@available(*, unavailable)
36+
public func has_universally_unavailable_overload(_ s1: S1) { }
37+
38+
public func has_universally_unavailable_overload(_ s2: S2) { }
39+
40+
public struct Available {}
41+
42+
@_unavailableInEmbedded
43+
extension Available {
44+
public func unavailable_in_embedded_method( // expected-note {{'unavailable_in_embedded_method' has been explicitly marked unavailable here}}
45+
_ uie: UnavailableInEmbedded,
46+
_ uu: UniverallyUnavailable,
47+
_ a: Available,
48+
) {
49+
unavailable_in_embedded()
50+
universally_unavailable() // expected-error {{'universally_unavailable()' is unavailable: always unavailable}}
51+
a.unavailable_in_embedded_method(uie, uu, a)
52+
}
53+
}
54+
55+
public func available(
56+
_ uie: UnavailableInEmbedded, // expected-error {{'UnavailableInEmbedded' is unavailable: unavailable in embedded Swift}}
57+
_ uu: UniverallyUnavailable, // expected-error {{'UniverallyUnavailable' is unavailable: always unavailable}}
58+
_ a: Available,
59+
) {
60+
unavailable_in_embedded() // expected-error {{'unavailable_in_embedded()' is unavailable: unavailable in embedded Swift}}
61+
universally_unavailable() // expected-error {{'universally_unavailable()' is unavailable: always unavailable}}
62+
a.unavailable_in_embedded_method(uie, uu, a) // expected-error {{'unavailable_in_embedded_method' is unavailable: unavailable in embedded Swift}}
63+
has_unavailable_in_embedded_overload(.init())
64+
has_universally_unavailable_overload(.init()) // not ambiguous, selects available overload
65+
}
66+
67+
@_unavailableInEmbedded
68+
public func also_unavailable_in_embedded(
69+
_ uie: UnavailableInEmbedded, // OK
70+
_ uu: UniverallyUnavailable, // OK
71+
_ a: Available,
72+
) {
73+
unavailable_in_embedded() // OK
74+
universally_unavailable() // expected-error {{'universally_unavailable()' is unavailable: always unavailable}}
75+
a.unavailable_in_embedded_method(uie, uu, a)
76+
has_unavailable_in_embedded_overload(.init()) // expected-error {{ambiguous use of 'init()'}}
77+
has_universally_unavailable_overload(.init()) // not ambiguous, selects available overload
78+
}
79+
80+
@available(*, unavailable)
81+
public func also_universally_unavailable(
82+
_ uie: UnavailableInEmbedded, // OK
83+
_ uu: UniverallyUnavailable, // OK
84+
_ a: Available,
85+
) {
86+
unavailable_in_embedded()
87+
universally_unavailable() // expected-error {{'universally_unavailable()' is unavailable: always unavailable}}
88+
a.unavailable_in_embedded_method(uie, uu, a)
89+
has_unavailable_in_embedded_overload(.init()) // expected-error {{ambiguous use of 'init()'}}
90+
has_universally_unavailable_overload(.init()) // not ambiguous, selects available overload
91+
}

0 commit comments

Comments
 (0)