blob: 359a7bde1f7e365b023dddc6dc4b23330d5c6f32 [file] [log] [blame]
//===--- Attr.def - Swift Attributes Metaprogramming ------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 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 macros used for macro-metaprogramming with attributes.
//
//===----------------------------------------------------------------------===//
#ifndef DECL_ATTR
#define DECL_ATTR(SPELLING, CLASS, OPTIONS, CODE)
#endif
#ifndef SIMPLE_DECL_ATTR
#define SIMPLE_DECL_ATTR(X, CLASS, OPTIONS, CODE) DECL_ATTR(X, CLASS, OPTIONS, CODE)
#endif
#ifndef DECL_ATTR_ALIAS
#define DECL_ATTR_ALIAS(SPELLING, CLASS)
#endif
#ifndef TYPE_ATTR
#define TYPE_ATTR(X)
#endif
// Type attributes
TYPE_ATTR(autoclosure)
TYPE_ATTR(convention)
TYPE_ATTR(noreturn)
TYPE_ATTR(noescape)
TYPE_ATTR(escaping)
// SIL-specific attributes
TYPE_ATTR(block_storage)
TYPE_ATTR(box)
TYPE_ATTR(dynamic_self)
TYPE_ATTR(sil_unowned)
TYPE_ATTR(sil_unmanaged)
TYPE_ATTR(sil_weak)
TYPE_ATTR(error)
TYPE_ATTR(out)
TYPE_ATTR(in)
TYPE_ATTR(inout)
TYPE_ATTR(inout_aliasable)
TYPE_ATTR(in_guaranteed)
TYPE_ATTR(in_constant)
TYPE_ATTR(owned)
TYPE_ATTR(unowned_inner_pointer)
TYPE_ATTR(guaranteed)
TYPE_ATTR(autoreleased)
TYPE_ATTR(callee_owned)
TYPE_ATTR(callee_guaranteed)
TYPE_ATTR(objc_metatype)
TYPE_ATTR(opened)
TYPE_ATTR(pseudogeneric)
// SIL metatype attributes.
TYPE_ATTR(thin)
TYPE_ATTR(thick)
// Schema for DECL_ATTR:
//
// - Attribute name.
// - Class name without the 'Attr' suffix (ignored for
// - Options for the attribute, including:
// * the declarations the attribute can appear on
// * whether duplicates are allowed
// * whether the attribute is considered a decl modifier or not (no '@')
// - Unique attribute identifier used for serialization. This
// can never be changed.
//
// SIMPLE_DECL_ATTR is the same, but the class becomes
// SimpleDeclAttr<DAK_##NAME>.
//
DECL_ATTR(_silgen_name, SILGenName,
OnFunc | OnConstructor | OnDestructor | LongAttribute |
UserInaccessible, 0)
DECL_ATTR(available, Available,
OnFunc | OnStruct | OnEnum | OnClass | OnProtocol | OnVar |
OnConstructor | OnDestructor | OnTypeAlias | OnSubscript |
OnEnumElement | OnExtension | AllowMultipleAttributes | LongAttribute, 1)
SIMPLE_DECL_ATTR(final, Final,
OnClass | OnFunc | OnVar | OnSubscript|DeclModifier, 2)
DECL_ATTR(objc, ObjC,
OnFunc | OnClass | OnProtocol | OnExtension | OnVar | OnSubscript |
OnConstructor | OnDestructor | OnEnum | OnEnumElement, 3)
SIMPLE_DECL_ATTR(required, Required,
OnConstructor|DeclModifier, 4)
SIMPLE_DECL_ATTR(optional, Optional,
OnConstructor|OnFunc|OnVar|OnSubscript|DeclModifier, 5)
/// NOTE: 6 is unused
SIMPLE_DECL_ATTR(noreturn, NoReturn, OnFunc, 7)
SIMPLE_DECL_ATTR(_exported, Exported, OnImport | UserInaccessible, 8)
/// NOTE: 9 is unused.
SIMPLE_DECL_ATTR(NSCopying, NSCopying,
OnVar, 10)
SIMPLE_DECL_ATTR(IBAction, IBAction,
OnFunc, 11)
SIMPLE_DECL_ATTR(IBDesignable, IBDesignable,
OnClass | OnExtension, 12)
SIMPLE_DECL_ATTR(IBInspectable, IBInspectable,
OnVar, 13)
SIMPLE_DECL_ATTR(IBOutlet, IBOutlet,
OnVar, 14)
SIMPLE_DECL_ATTR(NSManaged, NSManaged, OnVar | OnFunc, 15)
SIMPLE_DECL_ATTR(lazy, Lazy, OnVar|DeclModifier, 16)
SIMPLE_DECL_ATTR(LLDBDebuggerFunction, LLDBDebuggerFunction, OnFunc |
UserInaccessible, 17)
SIMPLE_DECL_ATTR(UIApplicationMain, UIApplicationMain,
OnClass, 18)
SIMPLE_DECL_ATTR(unsafe_no_objc_tagged_pointer, UnsafeNoObjCTaggedPointer,
OnProtocol | UserInaccessible, 19)
DECL_ATTR(inline, Inline, OnFunc | OnConstructor, 20)
DECL_ATTR(_semantics, Semantics,
OnFunc | OnConstructor | OnDestructor | OnSubscript |
AllowMultipleAttributes | UserInaccessible, 21)
SIMPLE_DECL_ATTR(dynamic, Dynamic,
OnFunc | OnVar | OnSubscript | OnConstructor | DeclModifier, 22)
SIMPLE_DECL_ATTR(infix , Infix , OnFunc | OnOperator | DeclModifier, 23)
SIMPLE_DECL_ATTR(prefix , Prefix , OnFunc | OnOperator | DeclModifier, 24)
SIMPLE_DECL_ATTR(postfix, Postfix, OnFunc | OnOperator | DeclModifier, 25)
SIMPLE_DECL_ATTR(_transparent, Transparent,
OnFunc|OnConstructor|OnVar|UserInaccessible, 26)
SIMPLE_DECL_ATTR(requires_stored_property_inits, RequiresStoredPropertyInits,
OnClass, 27)
SIMPLE_DECL_ATTR(nonobjc, NonObjC,
OnExtension | OnFunc | OnVar | OnSubscript | OnConstructor, 30)
SIMPLE_DECL_ATTR(_fixed_layout, FixedLayout,
OnVar | OnClass | OnStruct | OnEnum | UserInaccessible, 31)
SIMPLE_DECL_ATTR(_inlineable, Inlineable,
OnVar | OnSubscript | OnFunc | OnConstructor | OnDestructor |
UserInaccessible, 32)
DECL_ATTR(_specialize, Specialize,
OnConstructor | OnFunc | AllowMultipleAttributes | LongAttribute
| UserInaccessible, 33)
SIMPLE_DECL_ATTR(objcMembers, ObjCMembers, OnClass, 34)
// Non-serialized attributes.
SIMPLE_DECL_ATTR(__consuming, Consuming, OnFunc | DeclModifier | NotSerialized,
/* Not serialized */ 40)
SIMPLE_DECL_ATTR(mutating, Mutating, OnFunc | DeclModifier | NotSerialized,
/* Not serialized */ 41)
SIMPLE_DECL_ATTR(nonmutating, NonMutating, OnFunc | DeclModifier | NotSerialized,
/* Not serialized */ 42)
SIMPLE_DECL_ATTR(convenience, Convenience,
OnConstructor|DeclModifier|NotSerialized, 43)
SIMPLE_DECL_ATTR(override, Override,
OnFunc | OnVar | OnSubscript | OnConstructor | DeclModifier |
NotSerialized,
/* Not serialized */44)
SIMPLE_DECL_ATTR(sil_stored, SILStored, OnVar | NotSerialized | SILOnly,
/* Not serialized */45)
DECL_ATTR(private, AccessControl,
OnFunc | OnExtension | OnTypeAlias | OnStruct | OnEnum |
OnClass | OnProtocol | OnVar | OnSubscript | OnConstructor |
DeclModifier | NotSerialized,
/* Not serialized */ 46)
DECL_ATTR_ALIAS(fileprivate, AccessControl)
DECL_ATTR_ALIAS(internal, AccessControl)
DECL_ATTR_ALIAS(public, AccessControl)
DECL_ATTR(__setter_access, SetterAccess,
OnVar | OnSubscript | DeclModifier | NotSerialized | RejectByParser,
/* Not serialized */ 47)
DECL_ATTR(__raw_doc_comment, RawDocComment, OnAnyDecl |
NotSerialized | RejectByParser, /* Not serialized */48)
// Also handles unowned and unowned(weak).
DECL_ATTR(weak, Ownership, OnVar | OnParam | DeclModifier | NotSerialized,
/* Not serialized */49)
DECL_ATTR_ALIAS(unowned, Ownership)
DECL_ATTR(effects, Effects, OnFunc | OnConstructor | OnDestructor |
UserInaccessible, 50)
DECL_ATTR(__objc_bridged, ObjCBridged, OnClass | NotSerialized | RejectByParser,
/* Not serialized */51)
SIMPLE_DECL_ATTR(NSApplicationMain, NSApplicationMain,
OnClass, 52)
SIMPLE_DECL_ATTR(objc_non_lazy_realization, ObjCNonLazyRealization,
OnClass, 53)
DECL_ATTR(__synthesized_protocol, SynthesizedProtocol,
OnStruct | OnEnum | OnClass | NotSerialized | RejectByParser,
/* Not serialized */54)
SIMPLE_DECL_ATTR(testable, Testable,
OnImport | NotSerialized | UserInaccessible,
/* Not serialized */ 55)
DECL_ATTR(_alignment, Alignment, OnStruct | OnEnum | UserInaccessible, 56)
SIMPLE_DECL_ATTR(rethrows, Rethrows,
OnFunc | OnConstructor | RejectByParser, 57)
DECL_ATTR(_swift_native_objc_runtime_base, SwiftNativeObjCRuntimeBase,
OnClass | UserInaccessible, 59)
SIMPLE_DECL_ATTR(indirect, Indirect,
OnEnum | OnEnumElement | DeclModifier,
60)
SIMPLE_DECL_ATTR(warn_unqualified_access, WarnUnqualifiedAccess,
OnFunc /*| OnVar*/ | LongAttribute, 61)
SIMPLE_DECL_ATTR(_show_in_interface, ShowInInterface,
OnProtocol | UserInaccessible, 62)
DECL_ATTR(_cdecl, CDecl,
OnFunc | LongAttribute | UserInaccessible, 63)
// A testing attribute for Library Evolution ("resilience").
// FIXME: Replace with improved @available attribute.
SIMPLE_DECL_ATTR(_versioned, Versioned,
OnFunc | OnVar | OnSubscript | OnConstructor |
OnStruct | OnEnum | OnClass | OnProtocol |
LongAttribute | UserInaccessible,
64)
SIMPLE_DECL_ATTR(discardableResult, DiscardableResult,
OnFunc | OnConstructor | LongAttribute, 65)
SIMPLE_DECL_ATTR(GKInspectable, GKInspectable, OnVar, 66)
DECL_ATTR(_implements, Implements,
OnFunc | OnVar | OnSubscript | OnTypeAlias
| NotSerialized | UserInaccessible,
/* Not serialized */ 67)
DECL_ATTR(_objcRuntimeName, ObjCRuntimeName,
OnClass | NotSerialized | UserInaccessible | RejectByParser,
/*Not serialized */ 68)
SIMPLE_DECL_ATTR(_staticInitializeObjCMetadata, StaticInitializeObjCMetadata,
OnClass | NotSerialized | LongAttribute | RejectByParser,
/*Not serialized */ 69)
DECL_ATTR(_restatedObjCConformance, RestatedObjCConformance,
OnProtocol | NotSerialized | LongAttribute | RejectByParser,
/*Not serialized */ 70)
// 70 is available; it was not a serialized attribute.
// HACK: Attribute needed to preserve source compatibility by downgrading errors
// due to an SDK change in Dispatch
SIMPLE_DECL_ATTR(_downgrade_exhaustivity_check, DowngradeExhaustivityCheck,
OnEnumElement | LongAttribute | UserInaccessible, 71)
#undef TYPE_ATTR
#undef DECL_ATTR_ALIAS
#undef SIMPLE_DECL_ATTR
#undef DECL_ATTR