Skip to content

Commit 30be52d

Browse files
authored
Merge pull request #79821 from rintaro/astgen-available-domain-or-identifier
[ASTGen] Adopt AvailabilityDomainOrIdentifier scheme
2 parents 5d92f79 + c669004 commit 30be52d

File tree

11 files changed

+212
-206
lines changed

11 files changed

+212
-206
lines changed

include/swift/AST/ASTBridging.h

+55-47
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ template<typename T> class ArrayRef;
3434

3535
namespace swift {
3636
enum class AccessorKind;
37-
class AvailabilityDomain;
37+
class AvailabilityDomainOrIdentifier;
3838
class Argument;
3939
class ASTContext;
4040
struct ASTNode;
@@ -678,6 +678,10 @@ enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedPlatformKind : size_t {
678678
SWIFT_NAME("BridgedPlatformKind.init(from:)")
679679
BridgedPlatformKind BridgedPlatformKind_fromString(BridgedStringRef cStr);
680680

681+
SWIFT_NAME("BridgedPlatformKind.init(from:)")
682+
BridgedPlatformKind
683+
BridgedPlatformKind_fromIdentifier(BridgedIdentifier cIdent);
684+
681685
swift::PlatformKind unbridge(BridgedPlatformKind cPlatform);
682686

683687
SWIFT_NAME("BridgedAvailabilityMacroMap.has(self:name:)")
@@ -701,19 +705,48 @@ struct BridgedAvailabilityMacroDefinition {
701705
BridgedArrayRef specs;
702706
};
703707

704-
struct BridgedAvailabilityDomain;
708+
struct BridgedAvailabilityDomainOrIdentifier {
709+
void *_Nullable opaque;
710+
711+
BridgedAvailabilityDomainOrIdentifier() : opaque(nullptr) {};
712+
BRIDGED_INLINE BridgedAvailabilityDomainOrIdentifier(
713+
swift::AvailabilityDomainOrIdentifier domain);
714+
BRIDGED_INLINE swift::AvailabilityDomainOrIdentifier unbridged() const;
715+
};
716+
717+
SWIFT_NAME("getter:BridgedAvailabilityDomainOrIdentifier.isDomain(self:)")
718+
BRIDGED_INLINE bool BridgedAvailabilityDomainOrIdentifier_isDomain(
719+
BridgedAvailabilityDomainOrIdentifier cVal);
720+
721+
SWIFT_NAME("getter:BridgedAvailabilityDomainOrIdentifier.asIdentifier(self:)")
722+
BRIDGED_INLINE BridgedIdentifier
723+
BridgedAvailabilityDomainOrIdentifier_getAsIdentifier(
724+
BridgedAvailabilityDomainOrIdentifier cVal);
705725

706726
SWIFT_NAME("BridgedAvailabilitySpec.createWildcard(_:loc:)")
707727
BridgedAvailabilitySpec
708728
BridgedAvailabilitySpec_createWildcard(BridgedASTContext cContext,
709729
BridgedSourceLoc cLoc);
710730

711-
SWIFT_NAME("BridgedAvailabilitySpec.create(_:domain:nameLoc:version:"
712-
"versionRange:)")
713-
BridgedAvailabilitySpec BridgedAvailabilitySpec_createForDomain(
714-
BridgedASTContext cContext, BridgedAvailabilityDomain cDomain,
715-
BridgedSourceLoc cLoc, BridgedVersionTuple cVersion,
716-
BridgedSourceRange cVersionRange);
731+
SWIFT_NAME(
732+
"BridgedAvailabilitySpec.createForDomainIdentifier(_:name:nameLoc:version:"
733+
"versionRange:)")
734+
BridgedAvailabilitySpec BridgedAvailabilitySpec_createForDomainIdentifier(
735+
BridgedASTContext cContext, BridgedIdentifier cName, BridgedSourceLoc cLoc,
736+
BridgedVersionTuple cVersion, BridgedSourceRange cVersionRange);
737+
738+
SWIFT_NAME("BridgedAvailabilitySpec.clone(self:_:)")
739+
BridgedAvailabilitySpec
740+
BridgedAvailabilitySpec_clone(BridgedAvailabilitySpec spec,
741+
BridgedASTContext cContext);
742+
743+
SWIFT_NAME("BridgedAvailabilitySpec.setMacroLoc(self:_:)")
744+
void BridgedAvailabilitySpec_setMacroLoc(BridgedAvailabilitySpec spec,
745+
BridgedSourceLoc cLoc);
746+
747+
SWIFT_NAME("getter:BridgedAvailabilitySpec.domainOrIdentifier(self:)")
748+
BridgedAvailabilityDomainOrIdentifier
749+
BridgedAvailabilitySpec_getDomainOrIdentifier(BridgedAvailabilitySpec spec);
717750

718751
SWIFT_NAME("getter:BridgedAvailabilitySpec.sourceRange(self:)")
719752
BridgedSourceRange
@@ -722,14 +755,6 @@ BridgedAvailabilitySpec_getSourceRange(BridgedAvailabilitySpec spec);
722755
SWIFT_NAME("getter:BridgedAvailabilitySpec.isWildcard(self:)")
723756
bool BridgedAvailabilitySpec_isWildcard(BridgedAvailabilitySpec spec);
724757

725-
SWIFT_NAME("getter:BridgedAvailabilitySpec.domain(self:)")
726-
BridgedAvailabilityDomain
727-
BridgedAvailabilitySpec_getDomain(BridgedAvailabilitySpec spec);
728-
729-
SWIFT_NAME("getter:BridgedAvailabilitySpec.platform(self:)")
730-
BridgedPlatformKind
731-
BridgedAvailabilitySpec_getPlatform(BridgedAvailabilitySpec spec);
732-
733758
SWIFT_NAME("getter:BridgedAvailabilitySpec.rawVersion(self:)")
734759
BridgedVersionTuple
735760
BridgedAvailabilitySpec_getRawVersion(BridgedAvailabilitySpec spec);
@@ -738,23 +763,6 @@ SWIFT_NAME("getter:BridgedAvailabilitySpec.versionRange(self:)")
738763
BridgedSourceRange
739764
BridgedAvailabilitySpec_getVersionRange(BridgedAvailabilitySpec spec);
740765

741-
struct BridgedAvailabilityDomain {
742-
void *_Nullable opaque;
743-
744-
BridgedAvailabilityDomain() : opaque(nullptr) {};
745-
BRIDGED_INLINE BridgedAvailabilityDomain(swift::AvailabilityDomain domain);
746-
BRIDGED_INLINE swift::AvailabilityDomain unbridged() const;
747-
748-
BRIDGED_INLINE static BridgedAvailabilityDomain forUniversal();
749-
BRIDGED_INLINE static BridgedAvailabilityDomain
750-
forPlatform(BridgedPlatformKind platformKind);
751-
BRIDGED_INLINE static BridgedAvailabilityDomain forSwiftLanguage();
752-
BRIDGED_INLINE static BridgedAvailabilityDomain forPackageDescription();
753-
BRIDGED_INLINE static BridgedAvailabilityDomain forEmbedded();
754-
755-
bool isNull() const { return opaque == nullptr; };
756-
};
757-
758766
//===----------------------------------------------------------------------===//
759767
// MARK: AutoDiff
760768
//===----------------------------------------------------------------------===//
@@ -856,23 +864,10 @@ enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAvailableAttrKind {
856864
BridgedAvailableAttrKindNoAsync,
857865
};
858866

859-
SWIFT_NAME(
860-
"BridgedAvailableAttr.createParsed(_:atLoc:range:domain:domainLoc:kind:message:"
861-
"renamed:introduced:introducedRange:deprecated:deprecatedRange:"
862-
"obsoleted:obsoletedRange:)")
863-
BridgedAvailableAttr BridgedAvailableAttr_createParsed(
864-
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
865-
BridgedSourceRange cRange, BridgedAvailabilityDomain cDomain, BridgedSourceLoc cDomainLoc,
866-
BridgedAvailableAttrKind cKind, BridgedStringRef cMessage,
867-
BridgedStringRef cRenamed, BridgedVersionTuple cIntroduced,
868-
BridgedSourceRange cIntroducedRange, BridgedVersionTuple cDeprecated,
869-
BridgedSourceRange cDeprecatedRange, BridgedVersionTuple cObsoleted,
870-
BridgedSourceRange cObsoletedRange);
871-
872867
SWIFT_NAME("BridgedAvailableAttr.createParsed(_:atLoc:range:domainIdentifier:"
873868
"domainLoc:kind:message:renamed:introduced:introducedRange:"
874869
"deprecated:deprecatedRange:obsoleted:obsoletedRange:)")
875-
BridgedAvailableAttr BridgedAvailableAttr_createParsedIdentifier(
870+
BridgedAvailableAttr BridgedAvailableAttr_createParsed(
876871
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
877872
BridgedSourceRange cRange, BridgedIdentifier cDomainIdentifier,
878873
BridgedSourceLoc cDomainLoc, BridgedAvailableAttrKind cKind,
@@ -881,6 +876,19 @@ BridgedAvailableAttr BridgedAvailableAttr_createParsedIdentifier(
881876
BridgedVersionTuple cDeprecated, BridgedSourceRange cDeprecatedRange,
882877
BridgedVersionTuple cObsoleted, BridgedSourceRange cObsoletedRange);
883878

879+
SWIFT_NAME("BridgedAvailableAttr.createUnavailableInEmbedded(_:atLoc:range:)")
880+
BridgedAvailableAttr
881+
BridgedAvailableAttr_createUnavailableInEmbedded(BridgedASTContext cContext,
882+
BridgedSourceLoc cAtLoc,
883+
BridgedSourceRange cRange);
884+
885+
SWIFT_NAME("BridgedAvailableAttr.setIsGroupMember(self:)")
886+
void BridgedAvailableAttr_setIsGroupMember(BridgedAvailableAttr cAttr);
887+
SWIFT_NAME("BridgedAvailableAttr.setIsGroupedWithWildcard(self:)")
888+
void BridgedAvailableAttr_setIsGroupedWithWildcard(BridgedAvailableAttr cAttr);
889+
SWIFT_NAME("BridgedAvailableAttr.setIsGroupTerminator(self:)")
890+
void BridgedAvailableAttr_setIsGroupTerminator(BridgedAvailableAttr cAttr);
891+
884892
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedExecutionKind {
885893
BridgedExecutionKindConcurrent,
886894
BridgedExecutionKindCaller,

include/swift/AST/ASTBridgingImpl.h

+16-20
Original file line numberDiff line numberDiff line change
@@ -283,32 +283,28 @@ swift::DeclAttributes BridgedDeclAttributes::unbridged() const {
283283
}
284284

285285
//===----------------------------------------------------------------------===//
286-
// MARK: AvailabilityDomain
286+
// MARK: AvailabilityDomainOrIdentifier
287287
//===----------------------------------------------------------------------===//
288288

289-
BridgedAvailabilityDomain::BridgedAvailabilityDomain(
290-
swift::AvailabilityDomain domain)
291-
: opaque(domain.getOpaqueValue()) {}
289+
BridgedAvailabilityDomainOrIdentifier::BridgedAvailabilityDomainOrIdentifier(
290+
swift::AvailabilityDomainOrIdentifier domainOrIdentifier)
291+
: opaque(domainOrIdentifier.getOpaqueValue()) {}
292292

293-
swift::AvailabilityDomain BridgedAvailabilityDomain::unbridged() const {
294-
return swift::AvailabilityDomain::fromOpaque(opaque);
293+
swift::AvailabilityDomainOrIdentifier
294+
BridgedAvailabilityDomainOrIdentifier::unbridged() const {
295+
return swift::AvailabilityDomainOrIdentifier::fromOpaque(opaque);
295296
}
296297

297-
BridgedAvailabilityDomain BridgedAvailabilityDomain::forUniversal() {
298-
return swift::AvailabilityDomain::forUniversal();
298+
bool BridgedAvailabilityDomainOrIdentifier_isDomain(
299+
BridgedAvailabilityDomainOrIdentifier cVal) {
300+
return cVal.unbridged().isDomain();
299301
}
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();
302+
303+
BridgedIdentifier BridgedAvailabilityDomainOrIdentifier_getAsIdentifier(
304+
BridgedAvailabilityDomainOrIdentifier cVal) {
305+
if (auto ident = cVal.unbridged().getAsIdentifier())
306+
return *ident;
307+
return swift::Identifier();
312308
}
313309

314310
//===----------------------------------------------------------------------===//

include/swift/AST/Attr.h

+5
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,11 @@ class AvailableAttr : public DeclAttribute {
888888
llvm::VersionTuple Introduced, llvm::VersionTuple Deprecated,
889889
llvm::VersionTuple Obsoleted);
890890

891+
/// Create an `AvailableAttr` for `@_unavailableInEmbedded`.
892+
static AvailableAttr *createUnavailableInEmbedded(ASTContext &ctx,
893+
SourceLoc AtLoc,
894+
SourceRange Range);
895+
891896
AvailableAttr *clone(ASTContext &C, bool implicit) const;
892897
AvailableAttr *clone(ASTContext &C) const {
893898
return clone(C, isImplicit());

include/swift/AST/AvailabilityDomain.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,6 @@ class AvailabilityDomainOrIdentifier {
334334

335335
AvailabilityDomainOrIdentifier(Storage storage) : storage(storage) {}
336336

337-
static AvailabilityDomainOrIdentifier fromOpaque(void *opaque) {
338-
return AvailabilityDomainOrIdentifier(Storage::getFromOpaqueValue(opaque));
339-
}
340-
341337
std::optional<AvailabilityDomain>
342338
lookUpInDeclContext(SourceLoc loc, const DeclContext *declContext) const;
343339

@@ -397,6 +393,12 @@ class AvailabilityDomainOrIdentifier {
397393
/// different than the context that the original was created for.
398394
AvailabilityDomainOrIdentifier copy(ASTContext &ctx) const;
399395

396+
static AvailabilityDomainOrIdentifier fromOpaque(void *opaque) {
397+
return AvailabilityDomainOrIdentifier(Storage::getFromOpaqueValue(opaque));
398+
}
399+
400+
void *getOpaqueValue() const { return storage.getOpaqueValue(); }
401+
400402
void print(llvm::raw_ostream &os) const;
401403
};
402404

lib/AST/ASTDumper.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -4945,8 +4945,18 @@ class PrintAttribute : public AttributeVisitor<PrintAttribute, void, Label>,
49454945
void visitAvailableAttr(AvailableAttr *Attr, Label label) {
49464946
printCommon(Attr, "available_attr", label);
49474947

4948-
printFieldRaw([&](auto &out) { Attr->getDomainOrIdentifier().print(out); },
4949-
Label::always("domain"));
4948+
printFlag(Attr->isGroupMember(), "group_member");
4949+
printFlag(Attr->isGroupedWithWildcard(), "group_with_wildcard");
4950+
printFlag(Attr->isGroupTerminator(), "group_terminator");
4951+
4952+
auto domainOrIdentifier = Attr->getDomainOrIdentifier();
4953+
if (domainOrIdentifier.isDomain()) {
4954+
printFieldRaw([&](auto &out) { domainOrIdentifier.getAsDomain()->print(out); },
4955+
Label::always("domain"));
4956+
} else {
4957+
printFlag(domainOrIdentifier.isResolved(), "resolved");
4958+
printField(*domainOrIdentifier.getAsIdentifier(), Label::always("domainIdentifier"));
4959+
}
49504960

49514961
switch (Attr->getKind()) {
49524962
case swift::AvailableAttr::Kind::Default:

lib/AST/Attr.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -2208,6 +2208,19 @@ AvailableAttr *AvailableAttr::createPlatformVersioned(
22082208
/*SPI=*/false);
22092209
}
22102210

2211+
AvailableAttr *AvailableAttr::createUnavailableInEmbedded(ASTContext &C,
2212+
SourceLoc AtLoc,
2213+
SourceRange Range) {
2214+
return new (C) AvailableAttr(
2215+
AtLoc, Range, AvailabilityDomain::forEmbedded(), SourceLoc(),
2216+
AvailableAttr::Kind::Unavailable, "unavailable in embedded Swift",
2217+
/*Rename=*/StringRef(),
2218+
/*Introduced=*/llvm::VersionTuple(), /*IntroducedRange=*/{},
2219+
/*Deprecated=*/llvm::VersionTuple(), /*DeprecatedRange=*/{},
2220+
/*Obsoleted=*/llvm::VersionTuple(), /*ObsoletedRange=*/{},
2221+
/*Implicit=*/false, /*IsSPI=*/false);
2222+
}
2223+
22112224
bool BackDeployedAttr::isActivePlatform(const ASTContext &ctx,
22122225
bool forTargetVariant) const {
22132226
return isPlatformActive(Platform, ctx.LangOpts, forTargetVariant);

lib/AST/Bridging/AvailabilityBridging.cpp

+26-36
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ BridgedPlatformKind BridgedPlatformKind_fromString(BridgedStringRef cStr) {
5858
}
5959
}
6060

61+
BridgedPlatformKind
62+
BridgedPlatformKind_fromIdentifier(BridgedIdentifier cIdent) {
63+
return BridgedPlatformKind_fromString(cIdent.unbridged().str());
64+
}
65+
6166
PlatformKind unbridge(BridgedPlatformKind platform) {
6267
switch (platform) {
6368
case BridgedPlatformKind_None:
@@ -70,18 +75,6 @@ PlatformKind unbridge(BridgedPlatformKind platform) {
7075
llvm_unreachable("unhandled enum value");
7176
}
7277

73-
static BridgedPlatformKind bridge(PlatformKind platform) {
74-
switch (platform) {
75-
case PlatformKind::none:
76-
return BridgedPlatformKind_None;
77-
#define AVAILABILITY_PLATFORM(X, PrettyName) \
78-
case PlatformKind::X: \
79-
return BridgedPlatformKind_##X;
80-
#include "swift/AST/PlatformKinds.def"
81-
}
82-
llvm_unreachable("unhandled enum value");
83-
}
84-
8578
//===----------------------------------------------------------------------===//
8679
// MARK: AvailabilitySpec
8780
//===----------------------------------------------------------------------===//
@@ -93,15 +86,30 @@ BridgedAvailabilitySpec_createWildcard(BridgedASTContext cContext,
9386
cLoc.unbridged());
9487
}
9588

96-
BridgedAvailabilitySpec BridgedAvailabilitySpec_createForDomain(
97-
BridgedASTContext cContext, BridgedAvailabilityDomain cDomain,
98-
BridgedSourceLoc cLoc, BridgedVersionTuple cVersion,
99-
BridgedSourceRange cVersionRange) {
100-
return AvailabilitySpec::createForDomain(
101-
cContext.unbridged(), cDomain.unbridged(), cLoc.unbridged(),
89+
BridgedAvailabilitySpec BridgedAvailabilitySpec_createForDomainIdentifier(
90+
BridgedASTContext cContext, BridgedIdentifier cName, BridgedSourceLoc cLoc,
91+
BridgedVersionTuple cVersion, BridgedSourceRange cVersionRange) {
92+
return AvailabilitySpec::createForDomainIdentifier(
93+
cContext.unbridged(), cName.unbridged(), cLoc.unbridged(),
10294
cVersion.unbridged(), cVersionRange.unbridged());
10395
}
10496

97+
BridgedAvailabilitySpec
98+
BridgedAvailabilitySpec_clone(BridgedAvailabilitySpec spec,
99+
BridgedASTContext cContext) {
100+
return spec.unbridged()->clone(cContext.unbridged());
101+
}
102+
103+
void BridgedAvailabilitySpec_setMacroLoc(BridgedAvailabilitySpec spec,
104+
BridgedSourceLoc cLoc) {
105+
spec.unbridged()->setMacroLoc(cLoc.unbridged());
106+
}
107+
108+
BridgedAvailabilityDomainOrIdentifier
109+
BridgedAvailabilitySpec_getDomainOrIdentifier(BridgedAvailabilitySpec spec) {
110+
return spec.unbridged()->getDomainOrIdentifier();
111+
}
112+
105113
BridgedSourceRange
106114
BridgedAvailabilitySpec_getSourceRange(BridgedAvailabilitySpec spec) {
107115
return spec.unbridged()->getSourceRange();
@@ -111,24 +119,6 @@ bool BridgedAvailabilitySpec_isWildcard(BridgedAvailabilitySpec spec) {
111119
return spec.unbridged()->isWildcard();
112120
}
113121

114-
// FIXME: [availability] Remove this (re-implement ASTGen to match ParseDecl)
115-
BridgedAvailabilityDomain
116-
BridgedAvailabilitySpec_getDomain(BridgedAvailabilitySpec spec) {
117-
auto domain = spec.unbridged()->getDomainOrIdentifier().getAsDomain();
118-
if (domain)
119-
return *domain;
120-
return BridgedAvailabilityDomain();
121-
}
122-
123-
// FIXME: [availability] Remove this (re-implement ASTGen to match ParseDecl)
124-
BridgedPlatformKind
125-
BridgedAvailabilitySpec_getPlatform(BridgedAvailabilitySpec spec) {
126-
auto domain = spec.unbridged()->getDomainOrIdentifier().getAsDomain();
127-
if (domain)
128-
return bridge(domain->getPlatformKind());
129-
return bridge(PlatformKind::none);
130-
}
131-
132122
BridgedVersionTuple
133123
BridgedAvailabilitySpec_getRawVersion(BridgedAvailabilitySpec spec) {
134124
return spec.unbridged()->getRawVersion();

0 commit comments

Comments
 (0)