//===--- AttrKind.h - Enumerate attribute kinds ----------------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2025 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // This file defines enumerations related to declaration attributes. // //===----------------------------------------------------------------------===// #ifndef SWIFT_ATTRKIND_H #define SWIFT_ATTRKIND_H /// `AttrKind.h` is imported into Swift. Be *very* careful with what you /// include here and keep these includes minimal! /// /// See include guidelines and caveats in `BasicBridging.h`. #include "swift/Basic/SwiftBridging.h" #include namespace llvm { class StringRef; } namespace swift { /// The associativity of a binary operator. enum class ENUM_EXTENSIBILITY_ATTR(closed) Associativity : uint8_t { /// Non-associative operators cannot be written next to other /// operators with the same precedence. Relational operators are /// typically non-associative. None SWIFT_NAME("none"), /// Left-associative operators associate to the left if written next /// to other left-associative operators of the same precedence. Left SWIFT_NAME("left"), /// Right-associative operators associate to the right if written /// next to other right-associative operators of the same precedence. Right SWIFT_NAME("right") }; /// Returns the in-source spelling of the given associativity. SWIFT_UNAVAILABLE("Unavailable in Swift") llvm::StringRef getAssociativitySpelling(Associativity value); /// Access control levels. // These are used in diagnostics and with < and similar operations, // so please do not reorder existing values. enum class ENUM_EXTENSIBILITY_ATTR(closed) AccessLevel : uint8_t { /// Private access is limited to the current scope. Private SWIFT_NAME("private") = 0, /// File-private access is limited to the current file. FilePrivate SWIFT_NAME("fileprivate"), /// Internal access is limited to the current module. Internal SWIFT_NAME("internal"), /// Package access is not limited, but some capabilities may be /// restricted outside of the current package containing modules. /// It's similar to Public in that it's accessible from other modules /// and subclassable only within the defining module as long as /// the modules are in the same package. Package SWIFT_NAME("package"), /// Public access is not limited, but some capabilities may be /// restricted outside of the current module. Public SWIFT_NAME("public"), /// Open access is not limited, and all capabilities are unrestricted. Open SWIFT_NAME("open"), }; /// Returns the in-source spelling of the given access level. SWIFT_UNAVAILABLE("Unavailable in Swift") llvm::StringRef getAccessLevelSpelling(AccessLevel value); enum class ENUM_EXTENSIBILITY_ATTR(closed) InlineKind : uint8_t { Never SWIFT_NAME("never") = 0, Always SWIFT_NAME("always") = 1, Last_InlineKind = Always }; /// This enum represents the possible values of the @_effects attribute. /// These values are ordered from the strongest guarantee to the weakest, /// so please do not reorder existing values. enum class ENUM_EXTENSIBILITY_ATTR(closed) EffectsKind : uint8_t { ReadNone SWIFT_NAME("readnone"), ReadOnly SWIFT_NAME("readonly"), ReleaseNone SWIFT_NAME("releasenone"), ReadWrite SWIFT_NAME("readwrite"), Unspecified SWIFT_NAME("unspecified"), Custom SWIFT_NAME("custom"), Last_EffectsKind = Custom }; /// This enum represents the possible values of the @_expose attribute. enum class ENUM_EXTENSIBILITY_ATTR(closed) ExposureKind : uint8_t { Cxx SWIFT_NAME("cxx"), NotCxx SWIFT_NAME("notcxx"), Wasm SWIFT_NAME("wasm"), Last_ExposureKind = Wasm }; /// This enum represents the possible values of the @_extern attribute. enum class ENUM_EXTENSIBILITY_ATTR(closed) ExternKind : uint8_t { /// Reference an externally defined C function. /// The imported function has C function pointer representation, /// and is called using the C calling convention. C SWIFT_NAME("c"), /// Reference an externally defined function through WebAssembly's /// import mechanism. /// This does not specify the calling convention and can be used /// with other extern kinds together. /// Effectively, this is no-op on non-WebAssembly targets. Wasm SWIFT_NAME("wasm"), Last_ExternKind = Wasm }; enum class ENUM_EXTENSIBILITY_ATTR(closed) NonIsolatedModifier : uint8_t { None SWIFT_NAME("none") = 0, Unsafe SWIFT_NAME("unsafe"), NonSending SWIFT_NAME("nonsending"), Last_NonIsolatedModifier = NonSending }; enum class ENUM_EXTENSIBILITY_ATTR(closed) InheritActorContextModifier : uint8_t { /// Inherit the actor execution context if the isolated parameter was /// captured by the closure, context is nonisolated or isolated to a /// global actor. None SWIFT_NAME("none") = 0, /// Always inherit the actor context, even when the isolated parameter /// for the context is not closed over explicitly. Always SWIFT_NAME("always"), Last_InheritActorContextKind = Always }; enum class ENUM_EXTENSIBILITY_ATTR(closed) NonexhaustiveMode : uint8_t { Error SWIFT_NAME("error") = 0, Warning SWIFT_NAME("warning") = 1, Last_NonexhaustiveMode = Warning }; enum class ENUM_EXTENSIBILITY_ATTR(closed) DeclAttrKind : unsigned { #define DECL_ATTR(_, CLASS, ...) CLASS, #define LAST_DECL_ATTR(CLASS) Last_DeclAttr = CLASS, #include "swift/AST/DeclAttr.def" }; SWIFT_UNAVAILABLE("Unavailable in Swift") llvm::StringRef getDeclAttrKindID(DeclAttrKind kind); enum : unsigned { NumDeclAttrKinds = static_cast(DeclAttrKind::Last_DeclAttr) + 1 }; // Define enumerators for each type attribute, e.g. TypeAttrKind::Weak. enum class ENUM_EXTENSIBILITY_ATTR(closed) TypeAttrKind { #define TYPE_ATTR(_, CLASS) CLASS, #define LAST_TYPE_ATTR(CLASS) Last_TypeAttr = CLASS, #include "swift/AST/TypeAttr.def" }; enum : unsigned { NumTypeAttrKinds = static_cast(TypeAttrKind::Last_TypeAttr) + 1 }; } // end namespace swift #endif