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>()) {
51 const auto *Eff = A->getEffectiveAttr();
53 Eff->getPlatform()->getName(), Eff->getIntroduced(),
54 Eff->getDeprecated(), Eff->getObsoleted(), Eff->getUnavailable(),
58 if (
const auto *A = RD->getAttr<clang::UnavailableAttr>())
60 Availabilities.UnconditionallyUnavailable =
true;
62 if (
const auto *A = RD->getAttr<clang::DeprecatedAttr>())
64 Availabilities.UnconditionallyDeprecated =
true;
100 AvailabilitySet Availabilities;
103 for (
const auto *Ctx = D; Ctx;
104 Ctx = llvm::cast_or_null<Decl>(Ctx->getDeclContext()))
105 createInfoForDecl(Ctx, Availabilities);
107 if (
auto *Avail = Availabilities.getForPlatform(
109 Avail->UnconditionallyDeprecated = Availabilities.UnconditionallyDeprecated;
110 Avail->UnconditionallyUnavailable =
111 Availabilities.UnconditionallyUnavailable;
112 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