22struct AvailabilitySet {
23 bool UnconditionallyDeprecated =
false;
24 bool UnconditionallyUnavailable =
false;
26 void insert(clang::AvailabilityInfo &&Availability) {
27 auto *
Found = getForPlatform(Availability.Domain);
29 Found->mergeWith(std::move(Availability));
31 Availabilities.emplace_back(std::move(Availability));
34 clang::AvailabilityInfo *getForPlatform(llvm::StringRef Domain) {
35 auto *It = llvm::find_if(Availabilities,
36 [Domain](
const clang::AvailabilityInfo &Info) {
39 return It == Availabilities.end() ?
nullptr : It;
43 llvm::SmallVector<clang::AvailabilityInfo> Availabilities;
46static void createInfoForDecl(
const clang::Decl *Decl,
47 AvailabilitySet &Availabilities) {
49 for (
const auto *RD :
Decl->redecls()) {
50 for (
const auto *A : RD->specific_attrs<clang::AvailabilityAttr>()) {
52 A->getPlatform()->getName(), A->getIntroduced(), A->getDeprecated(),
53 A->getObsoleted(), A->getUnavailable(),
false,
false));
56 if (
const auto *A = RD->getAttr<clang::UnavailableAttr>())
58 Availabilities.UnconditionallyUnavailable =
true;
60 if (
const auto *A = RD->getAttr<clang::DeprecatedAttr>())
62 Availabilities.UnconditionallyDeprecated =
true;
98 AvailabilitySet Availabilities;
101 for (
const auto *Ctx = D; Ctx;
102 Ctx = llvm::cast_or_null<Decl>(Ctx->getDeclContext()))
103 createInfoForDecl(Ctx, Availabilities);
105 if (
auto *Avail = Availabilities.getForPlatform(
107 Avail->UnconditionallyDeprecated = Availabilities.UnconditionallyDeprecated;
108 Avail->UnconditionallyUnavailable =
109 Availabilities.UnconditionallyUnavailable;
110 return std::move(*Avail);
Defines the clang::ASTContext interface.
const TargetInfo & getTargetInfo() const
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
StringRef getPlatformName() const
Retrieve the name of the platform as it is used in the availability attribute.
Defines the clang::TargetInfo interface.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
nullptr
This class represents a compute construct, representing a 'Kind' of βparallelβ, 'serial',...
@ Other
Other implicit parameter.
Storage of availability attributes for a declaration.
llvm::SmallString< 32 > Domain
The domain is the platform for which this availability info applies to.
AvailabilityInfo()=default
bool isDefault() const
Determine if this AvailabilityInfo represents the default availability.
void mergeWith(AvailabilityInfo Other)
Augments the existing information with additional constraints provided by Other.
bool UnconditionallyDeprecated
static AvailabilityInfo createFromDecl(const Decl *Decl)
bool UnconditionallyUnavailable