Skip to content

Commit a619daf

Browse files
authored
Merge pull request #79125 from rintaro/astgen-available-attr
[ASTGen] Generate AvailableAttr
2 parents 99b3e9f + df2ada3 commit a619daf

30 files changed

+1311
-193
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 174 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ template<typename T> class ArrayRef;
3333
}
3434

3535
namespace swift {
36+
class AvailabilityDomain;
3637
class Argument;
3738
class ASTContext;
3839
struct ASTNode;
@@ -65,6 +66,23 @@ class BridgedCanType;
6566
class BridgedASTContext;
6667
struct BridgedSubstitutionMap;
6768
class BridgedParameterList;
69+
enum BridgedPlatformKind : size_t;
70+
71+
// Forward declare the underlying AST node type for each wrapper.
72+
namespace swift {
73+
#define AST_BRIDGING_WRAPPER(Name) class Name;
74+
#include "swift/AST/ASTBridgingWrappers.def"
75+
} // end namespace swift
76+
77+
// Define the bridging wrappers for each AST node.
78+
#define AST_BRIDGING_WRAPPER(Name) BRIDGING_WRAPPER_NONNULL(swift::Name, Name)
79+
#include "swift/AST/ASTBridgingWrappers.def"
80+
81+
// For nullable nodes, also define a nullable variant.
82+
#define AST_BRIDGING_WRAPPER_NULLABLE(Name) \
83+
BRIDGING_WRAPPER_NULLABLE(swift::Name, Name)
84+
#define AST_BRIDGING_WRAPPER_NONNULL(Name)
85+
#include "swift/AST/ASTBridgingWrappers.def"
6886

6987
//===----------------------------------------------------------------------===//
7088
// MARK: Identifier
@@ -282,6 +300,10 @@ SWIFT_NAME("BridgedASTContext.langOptsGetCompilerVersion(self:_:)")
282300
SwiftInt BridgedASTContext_langOptsGetCompilerVersion(BridgedASTContext cContext,
283301
SwiftInt* _Nullable * _Nonnull cComponents);
284302

303+
SWIFT_NAME("getter:BridgedASTContext.availabilityMacroMap(self:)")
304+
BridgedAvailabilityMacroMap
305+
BridgedASTContext_getAvailabilityMacroMap(BridgedASTContext cContext);
306+
285307
/* Deallocate an array of Swift int values that was allocated in C++. */
286308
void deallocateIntBuffer(SwiftInt * _Nullable cComponents);
287309

@@ -354,22 +376,6 @@ struct BridgedASTNode {
354376
BRIDGED_INLINE swift::ASTNode unbridged() const;
355377
};
356378

357-
// Forward declare the underlying AST node type for each wrapper.
358-
namespace swift {
359-
#define AST_BRIDGING_WRAPPER(Name) class Name;
360-
#include "swift/AST/ASTBridgingWrappers.def"
361-
} // end namespace swift
362-
363-
// Define the bridging wrappers for each AST node.
364-
#define AST_BRIDGING_WRAPPER(Name) BRIDGING_WRAPPER_NONNULL(swift::Name, Name)
365-
#include "swift/AST/ASTBridgingWrappers.def"
366-
367-
// For nullable nodes, also define a nullable variant.
368-
#define AST_BRIDGING_WRAPPER_NULLABLE(Name) \
369-
BRIDGING_WRAPPER_NULLABLE(swift::Name, Name)
370-
#define AST_BRIDGING_WRAPPER_NONNULL(Name)
371-
#include "swift/AST/ASTBridgingWrappers.def"
372-
373379
// Declare `.asDecl` on each BridgedXXXDecl type, which upcasts a wrapper for
374380
// a Decl subclass to a BridgedDecl.
375381
#define DECL(Id, Parent) \
@@ -565,6 +571,120 @@ SWIFT_NAME("getter:BridgedClosureExpr.asDeclContext(self:)")
565571
BridgedDeclContext
566572
BridgedClosureExpr_asDeclContext(BridgedClosureExpr cClosure);
567573

574+
//===----------------------------------------------------------------------===//
575+
// MARK: Availability
576+
//===----------------------------------------------------------------------===//
577+
578+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedPlatformKind : size_t {
579+
BridgedPlatformKind_None,
580+
#define AVAILABILITY_PLATFORM(X, PrettyName) BridgedPlatformKind_##X,
581+
#include "swift/AST/PlatformKinds.def"
582+
};
583+
584+
SWIFT_NAME("BridgedPlatformKind.init(from:)")
585+
BridgedPlatformKind BridgedPlatformKind_fromString(BridgedStringRef cStr);
586+
587+
SWIFT_NAME("BridgedAvailabilityMacroMap.has(self:name:)")
588+
bool BridgedAvailabilityMacroMap_hasName(BridgedAvailabilityMacroMap map,
589+
BridgedStringRef name);
590+
591+
SWIFT_NAME("BridgedAvailabilityMacroMap.has(self:name:version:)")
592+
bool BridgedAvailabilityMacroMap_hasNameAndVersion(
593+
BridgedAvailabilityMacroMap map, BridgedStringRef name,
594+
BridgedVersionTuple version);
595+
596+
SWIFT_NAME("BridgedAvailabilityMacroMap.get(self:name:version:)")
597+
BridgedArrayRef
598+
BridgedAvailabilityMacroMap_getSpecs(BridgedAvailabilityMacroMap map,
599+
BridgedStringRef name,
600+
BridgedVersionTuple version);
601+
602+
struct BridgedAvailabilityMacroDefinition {
603+
BridgedStringRef name;
604+
BridgedVersionTuple version;
605+
BridgedArrayRef specs;
606+
};
607+
608+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAvailabilitySpecKind {
609+
BridgedAvailabilitySpecKindPlatformVersionConstraint,
610+
BridgedAvailabilitySpecKindOtherPlatform,
611+
BridgedAvailabilitySpecKindLanguageVersionConstraint,
612+
BridgedAvailabilitySpecKindPackageDescriptionVersionConstraint,
613+
};
614+
615+
struct BridgedAvailabilityDomain;
616+
617+
SWIFT_NAME("getter:BridgedAvailabilitySpec.sourceRange(self:)")
618+
BridgedSourceRange
619+
BridgedAvailabilitySpec_getSourceRange(BridgedAvailabilitySpec spec);
620+
621+
SWIFT_NAME("getter:BridgedAvailabilitySpec.domain(self:)")
622+
BridgedAvailabilityDomain
623+
BridgedAvailabilitySpec_getDomain(BridgedAvailabilitySpec spec);
624+
625+
SWIFT_NAME("getter:BridgedAvailabilitySpec.version(self:)")
626+
BridgedVersionTuple
627+
BridgedAvailabilitySpec_getVersion(BridgedAvailabilitySpec spec);
628+
629+
SWIFT_NAME("getter:BridgedAvailabilitySpec.versionRange(self:)")
630+
BridgedSourceRange
631+
BridgedAvailabilitySpec_getVersionRange(BridgedAvailabilitySpec spec);
632+
633+
SWIFT_NAME("BridgedPlatformVersionConstraintAvailabilitySpec.createParsed(_:"
634+
"platform:platformLoc:version:runtimeVersion:versionRange:)")
635+
BridgedPlatformVersionConstraintAvailabilitySpec
636+
BridgedPlatformVersionConstraintAvailabilitySpec_createParsed(
637+
BridgedASTContext cContext, BridgedPlatformKind cPlatform,
638+
BridgedSourceLoc cPlatformLoc, BridgedVersionTuple cVersion,
639+
BridgedVersionTuple cRuntimeVersion, BridgedSourceRange cVersionSrcRange);
640+
641+
SWIFT_NAME("BridgedPlatformAgnosticVersionConstraintAvailabilitySpec."
642+
"createParsed(_:kind:nameLoc:version:versionRange:)")
643+
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec
644+
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec_createParsed(
645+
BridgedASTContext cContext, BridgedAvailabilitySpecKind cKind,
646+
BridgedSourceLoc cNameLoc, BridgedVersionTuple cVersion,
647+
BridgedSourceRange cVersionSrcRange);
648+
649+
SWIFT_NAME("BridgedOtherPlatformAvailabilitySpec.createParsed(_:loc:)")
650+
BridgedOtherPlatformAvailabilitySpec
651+
BridgedOtherPlatformAvailabilitySpec_createParsed(BridgedASTContext cContext,
652+
BridgedSourceLoc cLoc);
653+
654+
SWIFT_NAME("getter:BridgedPlatformVersionConstraintAvailabilitySpec."
655+
"asAvailabilitySpec(self:)")
656+
BridgedAvailabilitySpec
657+
BridgedPlatformVersionConstraintAvailabilitySpec_asAvailabilitySpec(
658+
BridgedPlatformVersionConstraintAvailabilitySpec spec);
659+
660+
SWIFT_NAME("getter:BridgedPlatformAgnosticVersionConstraintAvailabilitySpec."
661+
"asAvailabilitySpec(self:)")
662+
BridgedAvailabilitySpec
663+
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec_asAvailabilitySpec(
664+
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec spec);
665+
666+
SWIFT_NAME(
667+
"getter:BridgedOtherPlatformAvailabilitySpec.asAvailabilitySpec(self:)")
668+
BridgedAvailabilitySpec BridgedOtherPlatformAvailabilitySpec_asAvailabilitySpec(
669+
BridgedOtherPlatformAvailabilitySpec spec);
670+
671+
struct BridgedAvailabilityDomain {
672+
void *_Nullable opaque;
673+
674+
BridgedAvailabilityDomain() : opaque(nullptr) {};
675+
BRIDGED_INLINE BridgedAvailabilityDomain(swift::AvailabilityDomain domain);
676+
BRIDGED_INLINE swift::AvailabilityDomain unbridged() const;
677+
678+
BRIDGED_INLINE static BridgedAvailabilityDomain forUniversal();
679+
BRIDGED_INLINE static BridgedAvailabilityDomain
680+
forPlatform(BridgedPlatformKind platformKind);
681+
BRIDGED_INLINE static BridgedAvailabilityDomain forSwiftLanguage();
682+
BRIDGED_INLINE static BridgedAvailabilityDomain forPackageDescription();
683+
BRIDGED_INLINE static BridgedAvailabilityDomain forEmbedded();
684+
685+
bool isNull() const { return opaque == nullptr; };
686+
};
687+
568688
//===----------------------------------------------------------------------===//
569689
// MARK: DeclAttributes
570690
//===----------------------------------------------------------------------===//
@@ -581,7 +701,7 @@ BridgedDeclAttrKind BridgedDeclAttrKind_fromString(BridgedStringRef cStr);
581701
struct BridgedDeclAttributes {
582702
BridgedNullableDeclAttribute chain;
583703

584-
BridgedDeclAttributes() : chain(nullptr){};
704+
BridgedDeclAttributes() : chain(nullptr) {};
585705

586706
BRIDGED_INLINE BridgedDeclAttributes(swift::DeclAttributes attrs);
587707

@@ -598,9 +718,43 @@ BridgedDeclAttribute BridgedDeclAttribute_createSimple(
598718
BridgedSourceLoc cAtLoc, BridgedSourceLoc cNameLoc);
599719

600720
SWIFT_NAME("BridgedABIAttr.createParsed(_:atLoc:range:abiDecl:)")
601-
BridgedABIAttr BridgedABIAttr_createParsed(
602-
BridgedASTContext cContext, BridgedSourceLoc atLoc,
603-
BridgedSourceRange range, BridgedNullableDecl abiDecl);
721+
BridgedABIAttr BridgedABIAttr_createParsed(BridgedASTContext cContext,
722+
BridgedSourceLoc atLoc,
723+
BridgedSourceRange range,
724+
BridgedNullableDecl abiDecl);
725+
726+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAvailableAttrKind {
727+
BridgedAvailableAttrKindDefault,
728+
BridgedAvailableAttrKindDeprecated,
729+
BridgedAvailableAttrKindUnavailable,
730+
BridgedAvailableAttrKindNoAsync,
731+
};
732+
733+
SWIFT_NAME(
734+
"BridgedAvailableAttr.createParsed(_:atLoc:range:domain:domainLoc:kind:message:"
735+
"renamed:introduced:introducedRange:deprecated:deprecatedRange:"
736+
"obsoleted:obsoletedRange:)")
737+
BridgedAvailableAttr BridgedAvailableAttr_createParsed(
738+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
739+
BridgedSourceRange cRange, BridgedAvailabilityDomain cDomain, BridgedSourceLoc cDomainLoc,
740+
BridgedAvailableAttrKind cKind, BridgedStringRef cMessage,
741+
BridgedStringRef cRenamed, BridgedVersionTuple cIntroduced,
742+
BridgedSourceRange cIntroducedRange, BridgedVersionTuple cDeprecated,
743+
BridgedSourceRange cDeprecatedRange, BridgedVersionTuple cObsoleted,
744+
BridgedSourceRange cObsoletedRange);
745+
746+
SWIFT_NAME(
747+
"BridgedAvailableAttr.createParsed(_:atLoc:range:domainString:domainLoc:kind:message:"
748+
"renamed:introduced:introducedRange:deprecated:deprecatedRange:"
749+
"obsoleted:obsoletedRange:)")
750+
BridgedAvailableAttr BridgedAvailableAttr_createParsedStr(
751+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
752+
BridgedSourceRange cRange, BridgedStringRef cDomainString, BridgedSourceLoc cDomainLoc,
753+
BridgedAvailableAttrKind cKind, BridgedStringRef cMessage,
754+
BridgedStringRef cRenamed, BridgedVersionTuple cIntroduced,
755+
BridgedSourceRange cIntroducedRange, BridgedVersionTuple cDeprecated,
756+
BridgedSourceRange cDeprecatedRange, BridgedVersionTuple cObsoleted,
757+
BridgedSourceRange cObsoletedRange);
604758

605759
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedExecutionKind {
606760
BridgedExecutionKindConcurrent,

include/swift/AST/ASTBridgingImpl.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "swift/AST/ASTContext.h"
1717
#include "swift/AST/ArgumentList.h"
18+
#include "swift/AST/AvailabilityDomain.h"
1819
#include "swift/AST/Decl.h"
1920
#include "swift/AST/Expr.h"
2021
#include "swift/AST/IfConfigClauseRangeInfo.h"
@@ -236,6 +237,14 @@ swift::DeclAttributes BridgedDeclAttributes::unbridged() const {
236237
return attrs;
237238
}
238239

240+
BridgedAvailabilityDomain::BridgedAvailabilityDomain(
241+
swift::AvailabilityDomain domain)
242+
: opaque(domain.getOpaqueValue()) {}
243+
244+
swift::AvailabilityDomain BridgedAvailabilityDomain::unbridged() const {
245+
return swift::AvailabilityDomain::fromOpaque(opaque);
246+
}
247+
239248
//===----------------------------------------------------------------------===//
240249
// MARK: BridgedParamDecl
241250
//===----------------------------------------------------------------------===//

include/swift/AST/ASTBridgingWrappers.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ AST_BRIDGING_WRAPPER_NULLABLE(CustomAttributeInitializer)
8787
AST_BRIDGING_WRAPPER_NONNULL(TypeAttributes)
8888
AST_BRIDGING_WRAPPER_NONNULL(CustomAttribute)
8989
AST_BRIDGING_WRAPPER_NULLABLE(ArgumentList)
90+
AST_BRIDGING_WRAPPER_NULLABLE(AvailabilitySpec)
91+
AST_BRIDGING_WRAPPER_NULLABLE(PlatformVersionConstraintAvailabilitySpec)
92+
AST_BRIDGING_WRAPPER_NULLABLE(PlatformAgnosticVersionConstraintAvailabilitySpec)
93+
AST_BRIDGING_WRAPPER_NULLABLE(OtherPlatformAvailabilitySpec)
94+
AST_BRIDGING_WRAPPER_NONNULL(AvailabilityMacroMap)
9095

9196
// Non-AST types to generate wrappers for.
9297
AST_BRIDGING_WRAPPER_NULLABLE(DiagnosticEngine)

include/swift/AST/ASTContext.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -996,11 +996,8 @@ class ASTContext final {
996996
return getMultiPayloadEnumTagSinglePayloadAvailability();
997997
}
998998

999-
/// Cache of the availability macros parsed from the command line arguments.
1000-
///
1001-
/// This is an implementation detail, access via
1002-
/// \c Parser::parseAllAvailabilityMacroArguments.
1003-
AvailabilityMacroMap &getAvailabilityMacroCache() const;
999+
/// Availability macros parsed from the command line arguments.
1000+
const AvailabilityMacroMap &getAvailabilityMacroMap() const;
10041001

10051002
/// Test support utility for loading a platform remap file
10061003
/// in case an SDK is not specified to the compilation.

include/swift/AST/AvailabilityDomain.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,6 @@ class AvailabilityDomain final {
112112

113113
AvailabilityDomain(Storage storage) : storage(storage) {};
114114

115-
static AvailabilityDomain fromOpaque(void *opaque) {
116-
return AvailabilityDomain(Storage::getFromOpaqueValue(opaque));
117-
}
118-
119-
void *getOpaqueValue() const { return storage.getOpaqueValue(); }
120-
121115
std::optional<InlineDomain> getInlineDomain() const {
122116
return storage.is<InlineDomainPtr>()
123117
? static_cast<std::optional<InlineDomain>>(
@@ -161,6 +155,12 @@ class AvailabilityDomain final {
161155
static std::optional<AvailabilityDomain>
162156
builtinDomainForString(StringRef string, const DeclContext *declContext);
163157

158+
static AvailabilityDomain fromOpaque(void *opaque) {
159+
return AvailabilityDomain(Storage::getFromOpaqueValue(opaque));
160+
}
161+
162+
void *getOpaqueValue() const { return storage.getOpaqueValue(); }
163+
164164
Kind getKind() const {
165165
if (auto inlineDomain = getInlineDomain())
166166
return inlineDomain->getKind();

include/swift/AST/AvailabilitySpec.h

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717
#ifndef SWIFT_AST_AVAILABILITY_SPEC_H
1818
#define SWIFT_AST_AVAILABILITY_SPEC_H
1919

20+
#include "swift/AST/ASTAllocated.h"
2021
#include "swift/AST/Identifier.h"
2122
#include "swift/AST/PlatformKind.h"
2223
#include "swift/Basic/SourceLoc.h"
2324
#include "llvm/ADT/DenseMap.h"
25+
#include "llvm/ADT/StringMap.h"
2426
#include "llvm/Support/VersionTuple.h"
2527

2628
namespace swift {
2729
class ASTContext;
30+
class AvailabilityDomain;
2831

2932
enum class VersionComparison { GreaterThanEqual };
3033

@@ -54,6 +57,12 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
5457
AvailabilitySpecKind getKind() const { return Kind; }
5558

5659
SourceRange getSourceRange() const;
60+
61+
std::optional<AvailabilityDomain> getDomain() const;
62+
63+
llvm::VersionTuple getVersion() const;
64+
65+
SourceRange getVersionSrcRange() const;
5766
};
5867

5968
/// An availability specification that guards execution based on the
@@ -222,11 +231,40 @@ class OtherPlatformAvailabilitySpec : public AvailabilitySpec {
222231
/// parsing a version tuple.
223232
class AvailabilityMacroMap {
224233
public:
225-
typedef llvm::DenseMap<llvm::VersionTuple,
226-
SmallVector<AvailabilitySpec *, 4>> VersionEntry;
234+
typedef llvm::DenseMap<llvm::VersionTuple, SmallVector<AvailabilitySpec *, 4>>
235+
VersionEntry;
236+
llvm::StringMap<VersionEntry> Impl;
237+
238+
bool hasMacroName(StringRef name) const {
239+
return Impl.find(name) != Impl.end();
240+
}
227241

228-
bool WasParsed = false;
229-
llvm::DenseMap<StringRef, VersionEntry> Impl;
242+
bool hasMacroNameVersion(StringRef name, llvm::VersionTuple version) const {
243+
auto entry = Impl.find(name);
244+
if (entry == Impl.end()) {
245+
return false;
246+
}
247+
return entry->second.find(version) != entry->second.end();
248+
}
249+
250+
void addEntry(StringRef name, llvm::VersionTuple version,
251+
ArrayRef<AvailabilitySpec *> specs) {
252+
assert(!hasMacroNameVersion(name, version));
253+
Impl[name][version].assign(specs.begin(), specs.end());
254+
}
255+
256+
ArrayRef<AvailabilitySpec *> getEntry(StringRef name,
257+
llvm::VersionTuple version) {
258+
auto versions = Impl.find(name);
259+
if (versions == Impl.end()) {
260+
return {};
261+
}
262+
auto entry = versions->second.find(version);
263+
if (entry == versions->second.end()) {
264+
return {};
265+
}
266+
return entry->second;
267+
}
230268
};
231269

232270
} // end namespace swift

0 commit comments

Comments
 (0)