llvm-project/clang/lib/AST/Availability.cpp
Cyndy Ishida e606dc1daf
[clang] Move AvailabilityInfo into AST library (#81897)
Previously this class was only used by ExtractAPI, but it will soon also
be needed by InstallAPI. This patch should not change availability
behavior but just centralizes the information next to what already is
captured about availability for AST traversal.
2024-02-15 17:14:54 -08:00

49 lines
1.7 KiB
C++

//===- Availability.cpp --------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements the Availability information for Decls.
//
//===----------------------------------------------------------------------===//
#include "clang/AST/Availability.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/Basic/TargetInfo.h"
namespace clang {
AvailabilityInfo AvailabilityInfo::createFromDecl(const Decl *Decl) {
ASTContext &Context = Decl->getASTContext();
StringRef PlatformName = Context.getTargetInfo().getPlatformName();
AvailabilityInfo Availability;
// Collect availability attributes from all redeclarations.
for (const auto *RD : Decl->redecls()) {
for (const auto *A : RD->specific_attrs<AvailabilityAttr>()) {
if (A->getPlatform()->getName() != PlatformName)
continue;
Availability =
AvailabilityInfo(A->getPlatform()->getName(), A->getIntroduced(),
A->getDeprecated(), A->getObsoleted(), false, false);
break;
}
if (const auto *A = RD->getAttr<UnavailableAttr>())
if (!A->isImplicit())
Availability.UnconditionallyUnavailable = true;
if (const auto *A = RD->getAttr<DeprecatedAttr>())
if (!A->isImplicit())
Availability.UnconditionallyDeprecated = true;
}
return Availability;
}
} // namespace clang