[Github] Label lldb-dap PRs (#125139)
[llvm-project.git] / clang / docs / APINotes.rst
blobd20c4f9b5ba84303b15d79fe4c640250100e0ae7
1 ================================================
2 API Notes: Annotations Without Modifying Headers
3 ================================================
5 **The Problem:** You have headers you want to use, but you also want to add
6 extra information to the API. You don't want to put that information in the
7 headers themselves --- perhaps because you want to keep them clean for other
8 clients, or perhaps because they're from some open source project and you don't
9 want to modify them at all.
11 **Incomplete solution:** Redeclare all the interesting parts of the API in your
12 own header and add the attributes you want. Unfortunately, this:
14 * doesn't work with attributes that must be present on a definition
15 * doesn't allow changing the definition in other ways
16 * requires your header to be included in any client code to take effect
18 **Better solution:** Provide a "sidecar" file with the information you want to
19 add, and have that automatically get picked up by the module-building logic in
20 the compiler.
22 That's API notes.
24 API notes use a YAML-based file format. YAML is a format best explained by
25 example, so here is a `small example
26 <https://github.com/llvm/llvm-project/blob/main/clang/test/APINotes/Inputs/Frameworks/SomeKit.framework/Headers/SomeKit.apinotes>`_
27 from the compiler test suite of API
28 notes for a hypothetical "SomeKit" framework.
31 Usage
32 =====
34 API notes files are found relative to the module map that defines a module,
35 under the name "SomeKit.apinotes" for a module named "SomeKit". Additionally, a
36 file named "SomeKit_private.apinotes" will also be picked up to go with a
37 private module map. For bare modules these two files will be in the same
38 directory as the corresponding module map; for framework modules, they should
39 be placed in the Headers and PrivateHeaders directories, respectively. The
40 module map for a private top-level framework module should be placed in the
41 PrivateHeaders directory as well, though it does not need an additional
42 "_private" suffix on its name.
44 Clang will search for API notes files next to module maps only when passed the
45 ``-fapi-notes-modules`` option.
48 Limitations
49 ===========
51 - Since they're identified by module name, API notes cannot be used to modify
52   arbitrary textual headers.
55 "Versioned" API Notes
56 =====================
58 Many API notes affect how a C API is imported into Swift. In order to change
59 that behavior while still remaining backwards-compatible, API notes can be
60 selectively applied based on the Swift compatibility version provided to the
61 compiler (e.g. ``-fapi-notes-swift-version=5``). The rule is that an
62 explicitly-versioned API note applies to that version *and all earlier
63 versions,* and any applicable explicitly-versioned API note takes precedence
64 over an unversioned API note.
67 Reference
68 =========
70 An API notes file contains a YAML dictionary with the following top-level
71 entries:
73 :Name:
75   The name of the module (the framework name, for frameworks). Note that this
76   is always the name of a top-level module, even within a private API notes
77   file.
79   ::
81     Name: MyFramework
83 :Classes, Protocols, Tags, Typedefs, Globals, Enumerators, Functions, Namespaces:
85   Arrays of top-level declarations. Each entry in the array must have a
86   'Name' key with its Objective-C or C++ name. "Tags" refers to structs,
87   C++ classes, enums, and unions; "Classes" refers to Objective-C classes;
88   "Enumerators" refers to enum cases.
90   ::
92     Classes:
93     - Name: MyController
94       …
95     - Name: MyView
96       …
98 :SwiftVersions:
100   Contains explicit information for backwards compatibility. Each entry in
101   the array contains a 'Version' key, which should be set to '4' for
102   annotations that only apply to Swift 4 mode and earlier. The other entries
103   in this dictionary are the same declaration entries as at the top level:
104   Classes, Protocols, Tags, Typedefs, Globals, Enumerators, and Functions.
106   ::
108     SwiftVersions:
109     - Version: 4
110       Classes: …
111       Protocols: …
113 Each entry under 'Classes' and 'Protocols' can contain "Methods" and
114 "Properties" arrays, in addition to the attributes described below:
116 :Methods:
118   Identified by 'Selector' and 'MethodKind'; the MethodKind is either
119   "Instance" or "Class".
121   ::
123     Classes:
124     - Name: UIViewController
125       Methods:
126       - Selector: "presentViewController:animated:"
127         MethodKind: Instance
128         …
130 :Properties:
132   Identified by 'Name' and 'PropertyKind'; the PropertyKind is also either
133   "Instance" or "Class".
135   ::
137     Classes:
138     - Name: UIView
139       Properties:
140       - Name: subviews
141         PropertyKind: Instance
142         …
144 Each declaration supports the following annotations (if relevant to that
145 declaration kind), all of which are optional:
147 :SwiftName:
149   Equivalent to ``NS_SWIFT_NAME``. For a method, must include the full Swift name
150   with all arguments. Use "_" to omit an argument label.
152   ::
154     - Selector: "presentViewController:animated:"
155       MethodKind: Instance
156       SwiftName: "present(_:animated:)"
158     - Class: NSBundle
159       SwiftName: Bundle
161 :SwiftImportAs:
163   For a class, possible values are ``owned`` (equivalent to
164   ``SWIFT_SELF_CONTAINED``) or ``reference`` (equivalent to
165   ``SWIFT_SHARED_REFERENCE``, also requires specifying ``SwiftReleaseOp`` and
166   ``SwiftRetainOp``).
168   For a method, possible values are ``unsafe`` (equivalent
169   to ``SWIFT_RETURNS_INDEPENDENT_VALUE``) or ``computed_property`` (equivalent to
170   ``SWIFT_COMPUTED_PROPERTY``).
172   ::
174     Tags:
175     - Name: OwnedStorage
176       SwiftImportAs: owned
178 :SwiftRetainOp, SwiftReleaseOp:
180   Controls the lifetime operations of a class which uses custom reference
181   counting. The class must be annotated as a reference type using
182   ``SwiftImportAs: reference``. The values are either names of global functions,
183   each taking a single parameter of a pointer type, or ``immortal`` for a type
184   that is considered alive for the duration of the program.
186   ::
188     Tags:
189     - Name: RefCountedStorage
190       SwiftImportAs: reference
191       SwiftReleaseOp: RCRelease
192       SwiftRetainOp: RCRetain
193     - Name: ImmortalSingleton
194       SwiftImportAs: reference
195       SwiftReleaseOp: immortal
196       SwiftRetainOp: immortal
198 :SwiftCopyable:
200   Allows annotating a C++ class as non-copyable in Swift. Equivalent to
201   ``SWIFT_NONCOPYABLE``, or to an explicit conformance ``: ~Copyable``.
203   ::
205     Tags:
206     - Name: tzdb
207       SwiftCopyable: false
209 :SwiftConformsTo:
211   Allows annotating a C++ class as conforming to a Swift protocol. Equivalent
212   to ``SWIFT_CONFORMS_TO_PROTOCOL``. The value is a module-qualified name of a
213   Swift protocol.
215   ::
217     Tags:
218     - Name: vector
219       SwiftConformsTo: Cxx.CxxSequence
221 :Availability, AvailabilityMsg:
223   A value of "nonswift" is equivalent to ``NS_SWIFT_UNAVAILABLE``. A value of
224   "available" can be used in the "SwiftVersions" section to undo the effect of
225   "nonswift".
227   ::
229     - Selector: "dealloc"
230       MethodKind: Instance
231       Availability: nonswift
232       AvailabilityMsg: "prefer 'deinit'"
234 :SwiftPrivate:
236   Equivalent to NS_REFINED_FOR_SWIFT.
238   ::
240     - Name: CGColorEqualToColor
241       SwiftPrivate: true
243 :Nullability:
245   Used for properties and globals. There are four options, identified by their
246   initials:
248   - ``Nonnull`` or ``N`` (corresponding to ``_Nonnull``)
249   - ``Optional`` or ``O`` (corresponding to ``_Nullable``)
250   - ``Unspecified`` or ``U`` (corresponding to ``_Null_unspecified``)
251   - ``Scalar`` or ``S`` (deprecated)
253   Note that 'Nullability' is overridden by 'Type', even in a "SwiftVersions"
254   section.
256   .. note::
258     'Nullability' can also be used to describe the argument types of methods
259     and functions, but this usage is deprecated in favor of 'Parameters' (see
260     below).
262   ::
264     - Name: dataSource
265       Nullability: O
267 :NullabilityOfRet:
269   Used for methods and functions. Describes the nullability of the return type.
271   Note that 'NullabilityOfRet' is overridden by 'ResultType', even in a
272   "SwiftVersions" section.
274   .. warning::
276     Due to a compiler bug, 'NullabilityOfRet' may change nullability of the
277     parameters as well (rdar://30544062). Avoid using it and instead use
278     'ResultType' and specify the return type along with a nullability
279     annotation (see documentation for 'ResultType').
281   ::
283     - Selector: superclass
284       MethodKind: Class
285       NullabilityOfRet: O
287 :Type:
289   Used for properties and globals. This completely overrides the type of the
290   declaration; it should ideally only be used for Swift backwards
291   compatibility, when existing type information has been made more precise in a
292   header. Prefer 'Nullability' and other annotations when possible.
294   We parse the specified type as if it appeared at the location of the
295   declaration whose type is being modified.  Macros are not available and
296   nullability must be applied explicitly (even in an ``NS_ASSUME_NONNULL_BEGIN``
297   section).
299   ::
301     - Name: delegate
302       PropertyKind: Instance
303       Type: "id"
305 :ResultType:
307   Used for methods and functions. This completely overrides the return type; it
308   should ideally only be used for Swift backwards compatibility, when existing
309   type information has been made more precise in a header.
311   We parse the specified type as if it appeared at the location of the
312   declaration whose type is being modified.  Macros are not available and
313   nullability must be applied explicitly (even in an ``NS_ASSUME_NONNULL_BEGIN``
314   section).
316   ::
318     - Selector: "subviews"
319       MethodKind: Instance
320       ResultType: "NSArray * _Nonnull"
322 :SwiftImportAsAccessors:
324   Used for properties. If true, the property will be exposed in Swift as its
325   accessor methods, rather than as a computed property using ``var``.
327   ::
329     - Name: currentContext
330       PropertyKind: Class
331       SwiftImportAsAccessors: true
333 :NSErrorDomain:
335   Used for ``NSError`` code enums. The value is the name of the associated
336   domain ``NSString`` constant; an empty string (``""``) means the enum is a
337   normal enum rather than an error code.
339   ::
341     - Name: MKErrorCode
342       NSErrorDomain: MKErrorDomain
344 :SwiftWrapper:
346   Controls ``NS_STRING_ENUM`` and ``NS_EXTENSIBLE_STRING_ENUM``. There are three
347   options:
349   - "struct" (extensible)
350   - "enum"
351   - "none"
353   Note that even an "enum" wrapper is still presented as a struct in Swift;
354   it's just a "more enum-like" struct.
356   ::
358     - Name: AVMediaType
359       SwiftWrapper: none
361 :EnumKind:
363   Has the same effect as ``NS_ENUM`` and ``NS_OPTIONS``. There are four options:
365   - "NSEnum" / "CFEnum"
366   - "NSClosedEnum" / "CFClosedEnum"
367   - "NSOptions" / "CFOptions"
368   - "none"
370   ::
372     - Name: GKPhotoSize
373       EnumKind: none
375 :Parameters:
377   Used for methods and functions. Parameters are identified by a 0-based
378   'Position' and support the 'Nullability', 'NoEscape', and 'Type' keys.
380   .. note::
382     Using 'Parameters' within a parameter entry to describe the parameters of a
383     block is not implemented. Use 'Type' on the entire parameter instead.
385   ::
387     - Selector: "isEqual:"
388       MethodKind: Instance
389       Parameters:
390       - Position: 0
391         Nullability: O
393 :NoEscape:
395   Used only for block parameters. Equivalent to ``NS_NOESCAPE``.
397   ::
399     - Name: dispatch_sync
400       Parameters:
401       - Position: 0
402         NoEscape: true
404 :SwiftBridge:
406   Used for Objective-C class types bridged to Swift value types. An empty
407   string ("") means a type is not bridged. Not supported outside of Apple
408   frameworks (the Swift side of it requires conforming to implementation-detail
409   protocols that are subject to change).
411   ::
413     - Name: NSIndexSet
414       SwiftBridge: IndexSet
416 :DesignatedInit:
418   Used for init methods. Equivalent to ``NS_DESIGNATED_INITIALIZER``.
420   ::
422     - Selector: "initWithFrame:"
423       MethodKind: Instance
424       DesignatedInit: true