Viewing file: Availability.h (4.19 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===--- Availability.h - Classes for availability --------------*- C++ -*-===// // // 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 files defines some classes that implement availability checking. // //===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_AST_AVAILABILITY_H #define LLVM_CLANG_AST_AVAILABILITY_H
#include "clang/Basic/SourceLocation.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/VersionTuple.h"
namespace clang {
/// One specifier in an @available expression. /// /// \code /// @available(macos 10.10, *) /// \endcode /// /// Here, 'macos 10.10' and '*' both map to an instance of this type. /// class AvailabilitySpec { /// Represents the version that this specifier requires. If the host OS /// version is greater than or equal to Version, the @available will evaluate /// to true. VersionTuple Version;
/// Name of the platform that Version corresponds to. StringRef Platform;
SourceLocation BeginLoc, EndLoc;
public: AvailabilitySpec(VersionTuple Version, StringRef Platform, SourceLocation BeginLoc, SourceLocation EndLoc) : Version(Version), Platform(Platform), BeginLoc(BeginLoc), EndLoc(EndLoc) {}
/// This constructor is used when representing the '*' case. AvailabilitySpec(SourceLocation StarLoc) : BeginLoc(StarLoc), EndLoc(StarLoc) {}
VersionTuple getVersion() const { return Version; } StringRef getPlatform() const { return Platform; } SourceLocation getBeginLoc() const { return BeginLoc; } SourceLocation getEndLoc() const { return EndLoc; }
/// Returns true when this represents the '*' case. bool isOtherPlatformSpec() const { return Version.empty(); } };
class Decl;
/// Storage of availability attributes for a declaration. struct AvailabilityInfo { /// The domain is the platform for which this availability info applies to. llvm::SmallString<32> Domain; VersionTuple Introduced; VersionTuple Deprecated; VersionTuple Obsoleted; bool Unavailable = false; bool UnconditionallyDeprecated = false; bool UnconditionallyUnavailable = false;
AvailabilityInfo() = default;
/// Determine if this AvailabilityInfo represents the default availability. bool isDefault() const { return *this == AvailabilityInfo(); }
/// Check if the symbol has been obsoleted. bool isObsoleted() const { return !Obsoleted.empty(); }
/// Check if the symbol is unavailable unconditionally or /// on the active platform and os version. bool isUnavailable() const { return Unavailable || isUnconditionallyUnavailable(); }
/// Check if the symbol is unconditionally deprecated. /// /// i.e. \code __attribute__((deprecated)) \endcode bool isUnconditionallyDeprecated() const { return UnconditionallyDeprecated; }
/// Check if the symbol is unconditionally unavailable. /// /// i.e. \code __attribute__((unavailable)) \endcode bool isUnconditionallyUnavailable() const { return UnconditionallyUnavailable; }
AvailabilityInfo(StringRef Domain, VersionTuple I, VersionTuple D, VersionTuple O, bool U, bool UD, bool UU) : Domain(Domain), Introduced(I), Deprecated(D), Obsoleted(O), Unavailable(U), UnconditionallyDeprecated(UD), UnconditionallyUnavailable(UU) {}
friend bool operator==(const AvailabilityInfo &Lhs, const AvailabilityInfo &Rhs);
public: static AvailabilityInfo createFromDecl(const Decl *Decl); };
inline bool operator==(const AvailabilityInfo &Lhs, const AvailabilityInfo &Rhs) { return std::tie(Lhs.Introduced, Lhs.Deprecated, Lhs.Obsoleted, Lhs.Unavailable, Lhs.UnconditionallyDeprecated, Lhs.UnconditionallyUnavailable) == std::tie(Rhs.Introduced, Rhs.Deprecated, Rhs.Obsoleted, Rhs.Unavailable, Rhs.UnconditionallyDeprecated, Rhs.UnconditionallyUnavailable); }
} // end namespace clang
#endif
|