Skip to content

Commit a5d60ce

Browse files
committed
AST/Sema: Resolve AvailabilityDomain in SemanticAvailableAttrRequest.
Look up the AvailabilityDomain given its name during type checking, instead of parsing.
1 parent 7b8cbd7 commit a5d60ce

File tree

5 files changed

+42
-2
lines changed

5 files changed

+42
-2
lines changed

include/swift/AST/Attr.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,12 @@ class AvailableAttr : public DeclAttribute {
912912
private:
913913
friend class SemanticAvailableAttrRequest;
914914

915+
void setCachedDomain(AvailabilityDomain domain) {
916+
assert(!Bits.AvailableAttr.HasDomain);
917+
Domain = domain;
918+
Bits.AvailableAttr.HasDomain = true;
919+
}
920+
915921
bool hasComputedSemanticAttr() const {
916922
return Bits.AvailableAttr.HasComputedSemanticAttr;
917923
}

include/swift/AST/AvailabilityDomain.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ class AvailabilityDomain final {
140140
return AvailabilityDomain(Kind::Embedded);
141141
}
142142

143+
/// Returns the built-in availability domain identified by the given string.
144+
static std::optional<AvailabilityDomain>
145+
builtinDomainForString(StringRef string);
146+
143147
Kind getKind() const {
144148
if (auto inlineDomain = getInlineDomain())
145149
return inlineDomain->getKind();

lib/AST/AvailabilityDomain.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,28 @@
1313
#include "swift/AST/AvailabilityDomain.h"
1414
#include "swift/AST/ASTContext.h"
1515
#include "swift/AST/Decl.h"
16+
#include "llvm/ADT/StringSwitch.h"
1617

1718
using namespace swift;
1819

20+
std::optional<AvailabilityDomain>
21+
AvailabilityDomain::builtinDomainForString(StringRef string) {
22+
auto domain = llvm::StringSwitch<std::optional<AvailabilityDomain>>(string)
23+
.Case("*", AvailabilityDomain::forUniversal())
24+
.Case("swift", AvailabilityDomain::forSwiftLanguage())
25+
.Case("_PackageDescription",
26+
AvailabilityDomain::forPackageDescription())
27+
.Default(std::nullopt);
28+
29+
if (domain)
30+
return domain;
31+
32+
if (auto platformKind = platformFromString(string))
33+
return AvailabilityDomain::forPlatform(*platformKind);
34+
35+
return std::nullopt;
36+
}
37+
1938
bool AvailabilityDomain::isActive(const ASTContext &ctx) const {
2039
switch (getKind()) {
2140
case Kind::Universal:

lib/Parse/ParseDecl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -628,8 +628,8 @@ ParserResult<AvailableAttr> Parser::parseExtendedAvailabilitySpecList(
628628
}
629629

630630
auto Attr = new (Context) AvailableAttr(
631-
AtLoc, SourceRange(AttrLoc, Tok.getLoc()), Domain, PlatformLoc, AttrKind,
632-
Message, Renamed, Introduced.Version, Introduced.Range,
631+
AtLoc, SourceRange(AttrLoc, Tok.getLoc()), Platform, PlatformLoc,
632+
AttrKind, Message, Renamed, Introduced.Version, Introduced.Range,
633633
Deprecated.Version, Deprecated.Range, Obsoleted.Version, Obsoleted.Range,
634634
/*Implicit=*/false, AttrName == SPI_AVAILABLE_ATTRNAME);
635635
return makeParserResult(Attr);

lib/Sema/TypeCheckAttr.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8270,6 +8270,17 @@ std::optional<SemanticAvailableAttr>
82708270
SemanticAvailableAttrRequest::evaluate(swift::Evaluator &evaluator,
82718271
const AvailableAttr *attr,
82728272
const Decl *decl) const {
8273+
if (attr->hasCachedDomain())
8274+
return SemanticAvailableAttr(attr);
8275+
8276+
auto string = attr->getDomainString();
8277+
ASSERT(string);
8278+
8279+
auto domain = AvailabilityDomain::builtinDomainForString(*string);
8280+
if (!domain)
8281+
return std::nullopt;
8282+
8283+
const_cast<AvailableAttr *>(attr)->setCachedDomain(*domain);
82738284
return SemanticAvailableAttr(attr);
82748285
}
82758286

0 commit comments

Comments
 (0)