xref: /freebsd-src/contrib/llvm-project/clang/lib/AST/Availability.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric //===- Availability.cpp --------------------------------------------------===//
2*0fca6ea1SDimitry Andric //
3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric //
7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric //
9*0fca6ea1SDimitry Andric // This file implements the Availability information for Decls.
10*0fca6ea1SDimitry Andric //
11*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
12*0fca6ea1SDimitry Andric 
13*0fca6ea1SDimitry Andric #include "clang/AST/Availability.h"
14*0fca6ea1SDimitry Andric #include "clang/AST/ASTContext.h"
15*0fca6ea1SDimitry Andric #include "clang/AST/Attr.h"
16*0fca6ea1SDimitry Andric #include "clang/AST/Decl.h"
17*0fca6ea1SDimitry Andric #include "clang/Basic/TargetInfo.h"
18*0fca6ea1SDimitry Andric 
19*0fca6ea1SDimitry Andric namespace clang {
20*0fca6ea1SDimitry Andric 
21*0fca6ea1SDimitry Andric AvailabilityInfo AvailabilityInfo::createFromDecl(const Decl *Decl) {
22*0fca6ea1SDimitry Andric   ASTContext &Context = Decl->getASTContext();
23*0fca6ea1SDimitry Andric   StringRef PlatformName = Context.getTargetInfo().getPlatformName();
24*0fca6ea1SDimitry Andric   AvailabilityInfo Availability;
25*0fca6ea1SDimitry Andric 
26*0fca6ea1SDimitry Andric   // Collect availability attributes from all redeclarations.
27*0fca6ea1SDimitry Andric   for (const auto *RD : Decl->redecls()) {
28*0fca6ea1SDimitry Andric     for (const auto *A : RD->specific_attrs<AvailabilityAttr>()) {
29*0fca6ea1SDimitry Andric       if (A->getPlatform()->getName() != PlatformName)
30*0fca6ea1SDimitry Andric         continue;
31*0fca6ea1SDimitry Andric       Availability = AvailabilityInfo(
32*0fca6ea1SDimitry Andric           A->getPlatform()->getName(), A->getIntroduced(), A->getDeprecated(),
33*0fca6ea1SDimitry Andric           A->getObsoleted(), A->getUnavailable(), false, false);
34*0fca6ea1SDimitry Andric       break;
35*0fca6ea1SDimitry Andric     }
36*0fca6ea1SDimitry Andric 
37*0fca6ea1SDimitry Andric     if (const auto *A = RD->getAttr<UnavailableAttr>())
38*0fca6ea1SDimitry Andric       if (!A->isImplicit())
39*0fca6ea1SDimitry Andric         Availability.UnconditionallyUnavailable = true;
40*0fca6ea1SDimitry Andric 
41*0fca6ea1SDimitry Andric     if (const auto *A = RD->getAttr<DeprecatedAttr>())
42*0fca6ea1SDimitry Andric       if (!A->isImplicit())
43*0fca6ea1SDimitry Andric         Availability.UnconditionallyDeprecated = true;
44*0fca6ea1SDimitry Andric   }
45*0fca6ea1SDimitry Andric   return Availability;
46*0fca6ea1SDimitry Andric }
47*0fca6ea1SDimitry Andric 
48*0fca6ea1SDimitry Andric } // namespace clang
49