clang 20.0.0git
APINotesYAMLCompiler.cpp
Go to the documentation of this file.
1//===-- APINotesYAMLCompiler.cpp - API Notes YAML Format Reader -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// The types defined locally are designed to represent the YAML state, which
10// adds an additional bit of state: e.g. a tri-state boolean attribute (yes, no,
11// not applied) becomes a tri-state boolean + present. As a result, while these
12// enumerations appear to be redefining constants from the attributes table
13// data, they are distinct.
14//
15
19#include "clang/Basic/LLVM.h"
21#include "llvm/ADT/StringSet.h"
22#include "llvm/Support/SourceMgr.h"
23#include "llvm/Support/VersionTuple.h"
24#include "llvm/Support/YAMLTraits.h"
25#include <optional>
26#include <vector>
27
28using namespace clang;
29using namespace api_notes;
30
31namespace {
32enum class APIAvailability {
33 Available = 0,
34 None,
35 NonSwift,
36};
37} // namespace
38
39namespace llvm {
40namespace yaml {
41template <> struct ScalarEnumerationTraits<APIAvailability> {
42 static void enumeration(IO &IO, APIAvailability &AA) {
43 IO.enumCase(AA, "none", APIAvailability::None);
44 IO.enumCase(AA, "nonswift", APIAvailability::NonSwift);
45 IO.enumCase(AA, "available", APIAvailability::Available);
46 }
47};
48} // namespace yaml
49} // namespace llvm
50
51namespace {
52enum class MethodKind {
53 Class,
54 Instance,
55};
56} // namespace
57
58namespace llvm {
59namespace yaml {
60template <> struct ScalarEnumerationTraits<MethodKind> {
61 static void enumeration(IO &IO, MethodKind &MK) {
62 IO.enumCase(MK, "Class", MethodKind::Class);
63 IO.enumCase(MK, "Instance", MethodKind::Instance);
64 }
65};
66} // namespace yaml
67} // namespace llvm
68
69namespace {
70struct Param {
71 unsigned Position;
72 std::optional<bool> NoEscape = false;
73 std::optional<NullabilityKind> Nullability;
74 std::optional<RetainCountConventionKind> RetainCountConvention;
75 StringRef Type;
76};
77
78typedef std::vector<Param> ParamsSeq;
79} // namespace
80
81LLVM_YAML_IS_SEQUENCE_VECTOR(Param)
82LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(NullabilityKind)
83
84namespace llvm {
85namespace yaml {
86template <> struct ScalarEnumerationTraits<NullabilityKind> {
87 static void enumeration(IO &IO, NullabilityKind &NK) {
88 IO.enumCase(NK, "Nonnull", NullabilityKind::NonNull);
89 IO.enumCase(NK, "Optional", NullabilityKind::Nullable);
90 IO.enumCase(NK, "Unspecified", NullabilityKind::Unspecified);
91 IO.enumCase(NK, "NullableResult", NullabilityKind::NullableResult);
92 // TODO: Mapping this to it's own value would allow for better cross
93 // checking. Also the default should be Unknown.
94 IO.enumCase(NK, "Scalar", NullabilityKind::Unspecified);
95
96 // Aliases for compatibility with existing APINotes.
97 IO.enumCase(NK, "N", NullabilityKind::NonNull);
98 IO.enumCase(NK, "O", NullabilityKind::Nullable);
99 IO.enumCase(NK, "U", NullabilityKind::Unspecified);
100 IO.enumCase(NK, "S", NullabilityKind::Unspecified);
101 }
102};
103
104template <> struct ScalarEnumerationTraits<RetainCountConventionKind> {
105 static void enumeration(IO &IO, RetainCountConventionKind &RCCK) {
106 IO.enumCase(RCCK, "none", RetainCountConventionKind::None);
107 IO.enumCase(RCCK, "CFReturnsRetained",
108 RetainCountConventionKind::CFReturnsRetained);
109 IO.enumCase(RCCK, "CFReturnsNotRetained",
110 RetainCountConventionKind::CFReturnsNotRetained);
111 IO.enumCase(RCCK, "NSReturnsRetained",
112 RetainCountConventionKind::NSReturnsRetained);
113 IO.enumCase(RCCK, "NSReturnsNotRetained",
114 RetainCountConventionKind::NSReturnsNotRetained);
115 }
116};
117
118template <> struct MappingTraits<Param> {
119 static void mapping(IO &IO, Param &P) {
120 IO.mapRequired("Position", P.Position);
121 IO.mapOptional("Nullability", P.Nullability, std::nullopt);
122 IO.mapOptional("RetainCountConvention", P.RetainCountConvention);
123 IO.mapOptional("NoEscape", P.NoEscape);
124 IO.mapOptional("Type", P.Type, StringRef(""));
125 }
126};
127} // namespace yaml
128} // namespace llvm
129
130namespace {
131typedef std::vector<NullabilityKind> NullabilitySeq;
132
133struct AvailabilityItem {
134 APIAvailability Mode = APIAvailability::Available;
135 StringRef Msg;
136};
137
138/// Old attribute deprecated in favor of SwiftName.
139enum class FactoryAsInitKind {
140 /// Infer based on name and type (the default).
141 Infer,
142 /// Treat as a class method.
143 AsClassMethod,
144 /// Treat as an initializer.
145 AsInitializer,
146};
147
148struct Method {
149 StringRef Selector;
150 MethodKind Kind;
151 ParamsSeq Params;
152 NullabilitySeq Nullability;
153 std::optional<NullabilityKind> NullabilityOfRet;
154 std::optional<RetainCountConventionKind> RetainCountConvention;
155 AvailabilityItem Availability;
156 std::optional<bool> SwiftPrivate;
157 StringRef SwiftName;
158 FactoryAsInitKind FactoryAsInit = FactoryAsInitKind::Infer;
159 bool DesignatedInit = false;
160 bool Required = false;
161 StringRef ResultType;
162};
163
164typedef std::vector<Method> MethodsSeq;
165} // namespace
166
167LLVM_YAML_IS_SEQUENCE_VECTOR(Method)
168
169namespace llvm {
170namespace yaml {
171template <> struct ScalarEnumerationTraits<FactoryAsInitKind> {
172 static void enumeration(IO &IO, FactoryAsInitKind &FIK) {
173 IO.enumCase(FIK, "A", FactoryAsInitKind::Infer);
174 IO.enumCase(FIK, "C", FactoryAsInitKind::AsClassMethod);
175 IO.enumCase(FIK, "I", FactoryAsInitKind::AsInitializer);
176 }
177};
178
179template <> struct MappingTraits<Method> {
180 static void mapping(IO &IO, Method &M) {
181 IO.mapRequired("Selector", M.Selector);
182 IO.mapRequired("MethodKind", M.Kind);
183 IO.mapOptional("Parameters", M.Params);
184 IO.mapOptional("Nullability", M.Nullability);
185 IO.mapOptional("NullabilityOfRet", M.NullabilityOfRet, std::nullopt);
186 IO.mapOptional("RetainCountConvention", M.RetainCountConvention);
187 IO.mapOptional("Availability", M.Availability.Mode,
188 APIAvailability::Available);
189 IO.mapOptional("AvailabilityMsg", M.Availability.Msg, StringRef(""));
190 IO.mapOptional("SwiftPrivate", M.SwiftPrivate);
191 IO.mapOptional("SwiftName", M.SwiftName, StringRef(""));
192 IO.mapOptional("FactoryAsInit", M.FactoryAsInit, FactoryAsInitKind::Infer);
193 IO.mapOptional("DesignatedInit", M.DesignatedInit, false);
194 IO.mapOptional("Required", M.Required, false);
195 IO.mapOptional("ResultType", M.ResultType, StringRef(""));
196 }
197};
198} // namespace yaml
199} // namespace llvm
200
201namespace {
202struct Property {
203 StringRef Name;
204 std::optional<MethodKind> Kind;
205 std::optional<NullabilityKind> Nullability;
206 AvailabilityItem Availability;
207 std::optional<bool> SwiftPrivate;
208 StringRef SwiftName;
209 std::optional<bool> SwiftImportAsAccessors;
210 StringRef Type;
211};
212
213typedef std::vector<Property> PropertiesSeq;
214} // namespace
215
216LLVM_YAML_IS_SEQUENCE_VECTOR(Property)
217
218namespace llvm {
219namespace yaml {
220template <> struct MappingTraits<Property> {
221 static void mapping(IO &IO, Property &P) {
222 IO.mapRequired("Name", P.Name);
223 IO.mapOptional("PropertyKind", P.Kind);
224 IO.mapOptional("Nullability", P.Nullability, std::nullopt);
225 IO.mapOptional("Availability", P.Availability.Mode,
226 APIAvailability::Available);
227 IO.mapOptional("AvailabilityMsg", P.Availability.Msg, StringRef(""));
228 IO.mapOptional("SwiftPrivate", P.SwiftPrivate);
229 IO.mapOptional("SwiftName", P.SwiftName, StringRef(""));
230 IO.mapOptional("SwiftImportAsAccessors", P.SwiftImportAsAccessors);
231 IO.mapOptional("Type", P.Type, StringRef(""));
232 }
233};
234} // namespace yaml
235} // namespace llvm
236
237namespace {
238struct Class {
239 StringRef Name;
240 bool AuditedForNullability = false;
241 AvailabilityItem Availability;
242 std::optional<bool> SwiftPrivate;
243 StringRef SwiftName;
244 std::optional<StringRef> SwiftBridge;
245 std::optional<StringRef> NSErrorDomain;
246 std::optional<bool> SwiftImportAsNonGeneric;
247 std::optional<bool> SwiftObjCMembers;
248 MethodsSeq Methods;
249 PropertiesSeq Properties;
250};
251
252typedef std::vector<Class> ClassesSeq;
253} // namespace
254
255LLVM_YAML_IS_SEQUENCE_VECTOR(Class)
256
257namespace llvm {
258namespace yaml {
259template <> struct MappingTraits<Class> {
260 static void mapping(IO &IO, Class &C) {
261 IO.mapRequired("Name", C.Name);
262 IO.mapOptional("AuditedForNullability", C.AuditedForNullability, false);
263 IO.mapOptional("Availability", C.Availability.Mode,
264 APIAvailability::Available);
265 IO.mapOptional("AvailabilityMsg", C.Availability.Msg, StringRef(""));
266 IO.mapOptional("SwiftPrivate", C.SwiftPrivate);
267 IO.mapOptional("SwiftName", C.SwiftName, StringRef(""));
268 IO.mapOptional("SwiftBridge", C.SwiftBridge);
269 IO.mapOptional("NSErrorDomain", C.NSErrorDomain);
270 IO.mapOptional("SwiftImportAsNonGeneric", C.SwiftImportAsNonGeneric);
271 IO.mapOptional("SwiftObjCMembers", C.SwiftObjCMembers);
272 IO.mapOptional("Methods", C.Methods);
273 IO.mapOptional("Properties", C.Properties);
274 }
275};
276} // namespace yaml
277} // namespace llvm
278
279namespace {
280struct Function {
281 StringRef Name;
282 ParamsSeq Params;
283 NullabilitySeq Nullability;
284 std::optional<NullabilityKind> NullabilityOfRet;
285 std::optional<api_notes::RetainCountConventionKind> RetainCountConvention;
286 AvailabilityItem Availability;
287 std::optional<bool> SwiftPrivate;
288 StringRef SwiftName;
289 StringRef Type;
290 StringRef ResultType;
291};
292
293typedef std::vector<Function> FunctionsSeq;
294} // namespace
295
296LLVM_YAML_IS_SEQUENCE_VECTOR(Function)
297
298namespace llvm {
299namespace yaml {
300template <> struct MappingTraits<Function> {
301 static void mapping(IO &IO, Function &F) {
302 IO.mapRequired("Name", F.Name);
303 IO.mapOptional("Parameters", F.Params);
304 IO.mapOptional("Nullability", F.Nullability);
305 IO.mapOptional("NullabilityOfRet", F.NullabilityOfRet, std::nullopt);
306 IO.mapOptional("RetainCountConvention", F.RetainCountConvention);
307 IO.mapOptional("Availability", F.Availability.Mode,
308 APIAvailability::Available);
309 IO.mapOptional("AvailabilityMsg", F.Availability.Msg, StringRef(""));
310 IO.mapOptional("SwiftPrivate", F.SwiftPrivate);
311 IO.mapOptional("SwiftName", F.SwiftName, StringRef(""));
312 IO.mapOptional("ResultType", F.ResultType, StringRef(""));
313 }
314};
315} // namespace yaml
316} // namespace llvm
317
318namespace {
319struct GlobalVariable {
320 StringRef Name;
321 std::optional<NullabilityKind> Nullability;
322 AvailabilityItem Availability;
323 std::optional<bool> SwiftPrivate;
324 StringRef SwiftName;
325 StringRef Type;
326};
327
328typedef std::vector<GlobalVariable> GlobalVariablesSeq;
329} // namespace
330
331LLVM_YAML_IS_SEQUENCE_VECTOR(GlobalVariable)
332
333namespace llvm {
334namespace yaml {
335template <> struct MappingTraits<GlobalVariable> {
336 static void mapping(IO &IO, GlobalVariable &GV) {
337 IO.mapRequired("Name", GV.Name);
338 IO.mapOptional("Nullability", GV.Nullability, std::nullopt);
339 IO.mapOptional("Availability", GV.Availability.Mode,
340 APIAvailability::Available);
341 IO.mapOptional("AvailabilityMsg", GV.Availability.Msg, StringRef(""));
342 IO.mapOptional("SwiftPrivate", GV.SwiftPrivate);
343 IO.mapOptional("SwiftName", GV.SwiftName, StringRef(""));
344 IO.mapOptional("Type", GV.Type, StringRef(""));
345 }
346};
347} // namespace yaml
348} // namespace llvm
349
350namespace {
351struct EnumConstant {
352 StringRef Name;
353 AvailabilityItem Availability;
354 std::optional<bool> SwiftPrivate;
355 StringRef SwiftName;
356};
357
358typedef std::vector<EnumConstant> EnumConstantsSeq;
359} // namespace
360
361LLVM_YAML_IS_SEQUENCE_VECTOR(EnumConstant)
362
363namespace llvm {
364namespace yaml {
365template <> struct MappingTraits<EnumConstant> {
366 static void mapping(IO &IO, EnumConstant &EC) {
367 IO.mapRequired("Name", EC.Name);
368 IO.mapOptional("Availability", EC.Availability.Mode,
369 APIAvailability::Available);
370 IO.mapOptional("AvailabilityMsg", EC.Availability.Msg, StringRef(""));
371 IO.mapOptional("SwiftPrivate", EC.SwiftPrivate);
372 IO.mapOptional("SwiftName", EC.SwiftName, StringRef(""));
373 }
374};
375} // namespace yaml
376} // namespace llvm
377
378namespace {
379/// Syntactic sugar for EnumExtensibility and FlagEnum
380enum class EnumConvenienceAliasKind {
381 /// EnumExtensibility: none, FlagEnum: false
382 None,
383 /// EnumExtensibility: open, FlagEnum: false
384 CFEnum,
385 /// EnumExtensibility: open, FlagEnum: true
386 CFOptions,
387 /// EnumExtensibility: closed, FlagEnum: false
388 CFClosedEnum
389};
390} // namespace
391
392namespace llvm {
393namespace yaml {
394template <> struct ScalarEnumerationTraits<EnumConvenienceAliasKind> {
395 static void enumeration(IO &IO, EnumConvenienceAliasKind &ECAK) {
396 IO.enumCase(ECAK, "none", EnumConvenienceAliasKind::None);
397 IO.enumCase(ECAK, "CFEnum", EnumConvenienceAliasKind::CFEnum);
398 IO.enumCase(ECAK, "NSEnum", EnumConvenienceAliasKind::CFEnum);
399 IO.enumCase(ECAK, "CFOptions", EnumConvenienceAliasKind::CFOptions);
400 IO.enumCase(ECAK, "NSOptions", EnumConvenienceAliasKind::CFOptions);
401 IO.enumCase(ECAK, "CFClosedEnum", EnumConvenienceAliasKind::CFClosedEnum);
402 IO.enumCase(ECAK, "NSClosedEnum", EnumConvenienceAliasKind::CFClosedEnum);
403 }
404};
405} // namespace yaml
406} // namespace llvm
407
408namespace {
409struct Tag;
410typedef std::vector<Tag> TagsSeq;
411
412struct Tag {
413 StringRef Name;
414 AvailabilityItem Availability;
415 StringRef SwiftName;
416 std::optional<bool> SwiftPrivate;
417 std::optional<StringRef> SwiftBridge;
418 std::optional<StringRef> NSErrorDomain;
419 std::optional<std::string> SwiftImportAs;
420 std::optional<std::string> SwiftRetainOp;
421 std::optional<std::string> SwiftReleaseOp;
422 std::optional<EnumExtensibilityKind> EnumExtensibility;
423 std::optional<bool> FlagEnum;
424 std::optional<EnumConvenienceAliasKind> EnumConvenienceKind;
425 std::optional<bool> SwiftCopyable;
426 FunctionsSeq Methods;
427
428 /// Tags that are declared within the current tag. Only the tags that have
429 /// corresponding API Notes will be listed.
430 TagsSeq Tags;
431};
432} // namespace
433
434LLVM_YAML_IS_SEQUENCE_VECTOR(Tag)
435
436namespace llvm {
437namespace yaml {
438template <> struct ScalarEnumerationTraits<EnumExtensibilityKind> {
439 static void enumeration(IO &IO, EnumExtensibilityKind &EEK) {
440 IO.enumCase(EEK, "none", EnumExtensibilityKind::None);
441 IO.enumCase(EEK, "open", EnumExtensibilityKind::Open);
442 IO.enumCase(EEK, "closed", EnumExtensibilityKind::Closed);
443 }
444};
445
446template <> struct MappingTraits<Tag> {
447 static void mapping(IO &IO, Tag &T) {
448 IO.mapRequired("Name", T.Name);
449 IO.mapOptional("Availability", T.Availability.Mode,
450 APIAvailability::Available);
451 IO.mapOptional("AvailabilityMsg", T.Availability.Msg, StringRef(""));
452 IO.mapOptional("SwiftPrivate", T.SwiftPrivate);
453 IO.mapOptional("SwiftName", T.SwiftName, StringRef(""));
454 IO.mapOptional("SwiftBridge", T.SwiftBridge);
455 IO.mapOptional("NSErrorDomain", T.NSErrorDomain);
456 IO.mapOptional("SwiftImportAs", T.SwiftImportAs);
457 IO.mapOptional("SwiftReleaseOp", T.SwiftReleaseOp);
458 IO.mapOptional("SwiftRetainOp", T.SwiftRetainOp);
459 IO.mapOptional("EnumExtensibility", T.EnumExtensibility);
460 IO.mapOptional("FlagEnum", T.FlagEnum);
461 IO.mapOptional("EnumKind", T.EnumConvenienceKind);
462 IO.mapOptional("SwiftCopyable", T.SwiftCopyable);
463 IO.mapOptional("Methods", T.Methods);
464 IO.mapOptional("Tags", T.Tags);
465 }
466};
467} // namespace yaml
468} // namespace llvm
469
470namespace {
471struct Typedef {
472 StringRef Name;
473 AvailabilityItem Availability;
474 StringRef SwiftName;
475 std::optional<bool> SwiftPrivate;
476 std::optional<StringRef> SwiftBridge;
477 std::optional<StringRef> NSErrorDomain;
478 std::optional<SwiftNewTypeKind> SwiftType;
479};
480
481typedef std::vector<Typedef> TypedefsSeq;
482} // namespace
483
484LLVM_YAML_IS_SEQUENCE_VECTOR(Typedef)
485
486namespace llvm {
487namespace yaml {
488template <> struct ScalarEnumerationTraits<SwiftNewTypeKind> {
489 static void enumeration(IO &IO, SwiftNewTypeKind &SWK) {
490 IO.enumCase(SWK, "none", SwiftNewTypeKind::None);
491 IO.enumCase(SWK, "struct", SwiftNewTypeKind::Struct);
492 IO.enumCase(SWK, "enum", SwiftNewTypeKind::Enum);
493 }
494};
495
496template <> struct MappingTraits<Typedef> {
497 static void mapping(IO &IO, Typedef &T) {
498 IO.mapRequired("Name", T.Name);
499 IO.mapOptional("Availability", T.Availability.Mode,
500 APIAvailability::Available);
501 IO.mapOptional("AvailabilityMsg", T.Availability.Msg, StringRef(""));
502 IO.mapOptional("SwiftPrivate", T.SwiftPrivate);
503 IO.mapOptional("SwiftName", T.SwiftName, StringRef(""));
504 IO.mapOptional("SwiftBridge", T.SwiftBridge);
505 IO.mapOptional("NSErrorDomain", T.NSErrorDomain);
506 IO.mapOptional("SwiftWrapper", T.SwiftType);
507 }
508};
509} // namespace yaml
510} // namespace llvm
511
512namespace {
513struct Namespace;
514typedef std::vector<Namespace> NamespacesSeq;
515
516struct TopLevelItems {
517 ClassesSeq Classes;
518 ClassesSeq Protocols;
519 FunctionsSeq Functions;
520 GlobalVariablesSeq Globals;
521 EnumConstantsSeq EnumConstants;
522 TagsSeq Tags;
523 TypedefsSeq Typedefs;
524 NamespacesSeq Namespaces;
525};
526} // namespace
527
528namespace llvm {
529namespace yaml {
530static void mapTopLevelItems(IO &IO, TopLevelItems &TLI) {
531 IO.mapOptional("Classes", TLI.Classes);
532 IO.mapOptional("Protocols", TLI.Protocols);
533 IO.mapOptional("Functions", TLI.Functions);
534 IO.mapOptional("Globals", TLI.Globals);
535 IO.mapOptional("Enumerators", TLI.EnumConstants);
536 IO.mapOptional("Tags", TLI.Tags);
537 IO.mapOptional("Typedefs", TLI.Typedefs);
538 IO.mapOptional("Namespaces", TLI.Namespaces);
539}
540} // namespace yaml
541} // namespace llvm
542
543namespace {
544struct Namespace {
545 StringRef Name;
546 AvailabilityItem Availability;
547 StringRef SwiftName;
548 std::optional<bool> SwiftPrivate;
549 TopLevelItems Items;
550};
551} // namespace
552
553LLVM_YAML_IS_SEQUENCE_VECTOR(Namespace)
554
555namespace llvm {
556namespace yaml {
557template <> struct MappingTraits<Namespace> {
558 static void mapping(IO &IO, Namespace &T) {
559 IO.mapRequired("Name", T.Name);
560 IO.mapOptional("Availability", T.Availability.Mode,
561 APIAvailability::Available);
562 IO.mapOptional("AvailabilityMsg", T.Availability.Msg, StringRef(""));
563 IO.mapOptional("SwiftPrivate", T.SwiftPrivate);
564 IO.mapOptional("SwiftName", T.SwiftName, StringRef(""));
565 mapTopLevelItems(IO, T.Items);
566 }
567};
568} // namespace yaml
569} // namespace llvm
570
571namespace {
572struct Versioned {
573 VersionTuple Version;
574 TopLevelItems Items;
575};
576
577typedef std::vector<Versioned> VersionedSeq;
578} // namespace
579
580LLVM_YAML_IS_SEQUENCE_VECTOR(Versioned)
581
582namespace llvm {
583namespace yaml {
584template <> struct MappingTraits<Versioned> {
585 static void mapping(IO &IO, Versioned &V) {
586 IO.mapRequired("Version", V.Version);
587 mapTopLevelItems(IO, V.Items);
588 }
589};
590} // namespace yaml
591} // namespace llvm
592
593namespace {
594struct Module {
595 StringRef Name;
596 AvailabilityItem Availability;
597 TopLevelItems TopLevel;
598 VersionedSeq SwiftVersions;
599
600 std::optional<bool> SwiftInferImportAsMember;
601
602#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
603 LLVM_DUMP_METHOD void dump() /*const*/;
604#endif
605};
606} // namespace
607
608namespace llvm {
609namespace yaml {
610template <> struct MappingTraits<Module> {
611 static void mapping(IO &IO, Module &M) {
612 IO.mapRequired("Name", M.Name);
613 IO.mapOptional("Availability", M.Availability.Mode,
614 APIAvailability::Available);
615 IO.mapOptional("AvailabilityMsg", M.Availability.Msg, StringRef(""));
616 IO.mapOptional("SwiftInferImportAsMember", M.SwiftInferImportAsMember);
617 mapTopLevelItems(IO, M.TopLevel);
618 IO.mapOptional("SwiftVersions", M.SwiftVersions);
619 }
620};
621} // namespace yaml
622} // namespace llvm
623
624#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
625LLVM_DUMP_METHOD void Module::dump() {
626 llvm::yaml::Output OS(llvm::errs());
627 OS << *this;
628}
629#endif
630
631namespace {
632bool parseAPINotes(StringRef YI, Module &M, llvm::SourceMgr::DiagHandlerTy Diag,
633 void *DiagContext) {
634 llvm::yaml::Input IS(YI, nullptr, Diag, DiagContext);
635 IS >> M;
636 return static_cast<bool>(IS.error());
637}
638} // namespace
639
641 llvm::raw_ostream &OS) {
642 Module M;
643 if (parseAPINotes(YI, M, nullptr, nullptr))
644 return true;
645
646 llvm::yaml::Output YOS(OS);
647 YOS << M;
648
649 return false;
650}
651
652namespace {
653using namespace api_notes;
654
655class YAMLConverter {
656 const Module &M;
657 APINotesWriter Writer;
658 llvm::raw_ostream &OS;
659 llvm::SourceMgr::DiagHandlerTy DiagHandler;
660 void *DiagHandlerCtxt;
661 bool ErrorOccured;
662
663 /// Emit a diagnostic
664 bool emitError(llvm::Twine Message) {
665 DiagHandler(
666 llvm::SMDiagnostic("", llvm::SourceMgr::DK_Error, Message.str()),
667 DiagHandlerCtxt);
668 ErrorOccured = true;
669 return true;
670 }
671
672public:
673 YAMLConverter(const Module &TheModule, const FileEntry *SourceFile,
674 llvm::raw_ostream &OS,
675 llvm::SourceMgr::DiagHandlerTy DiagHandler,
676 void *DiagHandlerCtxt)
677 : M(TheModule), Writer(TheModule.Name, SourceFile), OS(OS),
678 DiagHandler(DiagHandler), DiagHandlerCtxt(DiagHandlerCtxt),
679 ErrorOccured(false) {}
680
681 void convertAvailability(const AvailabilityItem &Availability,
682 CommonEntityInfo &CEI, llvm::StringRef APIName) {
683 // Populate the unavailability information.
684 CEI.Unavailable = (Availability.Mode == APIAvailability::None);
685 CEI.UnavailableInSwift = (Availability.Mode == APIAvailability::NonSwift);
686 if (CEI.Unavailable || CEI.UnavailableInSwift) {
687 CEI.UnavailableMsg = std::string(Availability.Msg);
688 } else {
689 if (!Availability.Msg.empty())
690 emitError(llvm::Twine("availability message for available API '") +
691 APIName + "' will not be used");
692 }
693 }
694
695 void convertParams(const ParamsSeq &Params, FunctionInfo &OutInfo) {
696 for (const auto &P : Params) {
697 ParamInfo PI;
698 if (P.Nullability)
699 PI.setNullabilityAudited(*P.Nullability);
700 PI.setNoEscape(P.NoEscape);
701 PI.setType(std::string(P.Type));
702 PI.setRetainCountConvention(P.RetainCountConvention);
703 if (OutInfo.Params.size() <= P.Position)
704 OutInfo.Params.resize(P.Position + 1);
705 OutInfo.Params[P.Position] |= PI;
706 }
707 }
708
709 void convertNullability(const NullabilitySeq &Nullability,
710 std::optional<NullabilityKind> ReturnNullability,
711 FunctionInfo &OutInfo, llvm::StringRef APIName) {
713 emitError(llvm::Twine("nullability info for '") + APIName +
714 "' does not fit");
715 return;
716 }
717
718 bool audited = false;
719 unsigned int idx = 1;
720 for (const auto &N : Nullability)
721 OutInfo.addTypeInfo(idx++, N);
722 audited = Nullability.size() > 0 || ReturnNullability;
723 if (audited)
724 OutInfo.addTypeInfo(0, ReturnNullability ? *ReturnNullability
725 : NullabilityKind::NonNull);
726 if (!audited)
727 return;
728 OutInfo.NullabilityAudited = audited;
729 OutInfo.NumAdjustedNullable = idx;
730 }
731
732 /// Convert the common parts of an entity from YAML.
733 template <typename T>
734 void convertCommonEntity(const T &Common, CommonEntityInfo &Info,
735 StringRef APIName) {
736 convertAvailability(Common.Availability, Info, APIName);
737 Info.setSwiftPrivate(Common.SwiftPrivate);
738 Info.SwiftName = std::string(Common.SwiftName);
739 }
740
741 /// Convert the common parts of a type entity from YAML.
742 template <typename T>
743 void convertCommonType(const T &Common, CommonTypeInfo &Info,
744 StringRef APIName) {
745 convertCommonEntity(Common, Info, APIName);
746 if (Common.SwiftBridge)
747 Info.setSwiftBridge(std::string(*Common.SwiftBridge));
748 Info.setNSErrorDomain(Common.NSErrorDomain);
749 }
750
751 // Translate from Method into ObjCMethodInfo and write it out.
752 void convertMethod(const Method &M, ContextID ClassID, StringRef ClassName,
753 VersionTuple SwiftVersion) {
755 convertCommonEntity(M, MI, M.Selector);
756
757 // Check if the selector ends with ':' to determine if it takes arguments.
758 bool takesArguments = M.Selector.ends_with(":");
759
760 // Split the selector into pieces.
762 M.Selector.split(Args, ":", /*MaxSplit*/ -1, /*KeepEmpty*/ false);
763 if (!takesArguments && Args.size() > 1) {
764 emitError("selector '" + M.Selector + "' is missing a ':' at the end");
765 return;
766 }
767
768 // Construct ObjCSelectorRef.
770 Selector.NumArgs = !takesArguments ? 0 : Args.size();
771 Selector.Identifiers = Args;
772
773 // Translate the initializer info.
774 MI.DesignatedInit = M.DesignatedInit;
775 MI.RequiredInit = M.Required;
776 if (M.FactoryAsInit != FactoryAsInitKind::Infer)
777 emitError("'FactoryAsInit' is no longer valid; use 'SwiftName' instead");
778
779 MI.ResultType = std::string(M.ResultType);
780
781 // Translate parameter information.
782 convertParams(M.Params, MI);
783
784 // Translate nullability info.
785 convertNullability(M.Nullability, M.NullabilityOfRet, MI, M.Selector);
786
787 MI.setRetainCountConvention(M.RetainCountConvention);
788
789 // Write it.
790 Writer.addObjCMethod(ClassID, Selector, M.Kind == MethodKind::Instance, MI,
791 SwiftVersion);
792 }
793
794 void convertContext(std::optional<ContextID> ParentContextID, const Class &C,
795 ContextKind Kind, VersionTuple SwiftVersion) {
796 // Write the class.
797 ContextInfo CI;
798 convertCommonType(C, CI, C.Name);
799
800 if (C.AuditedForNullability)
801 CI.setDefaultNullability(NullabilityKind::NonNull);
802 if (C.SwiftImportAsNonGeneric)
803 CI.setSwiftImportAsNonGeneric(*C.SwiftImportAsNonGeneric);
804 if (C.SwiftObjCMembers)
805 CI.setSwiftObjCMembers(*C.SwiftObjCMembers);
806
807 ContextID CtxID =
808 Writer.addContext(ParentContextID, C.Name, Kind, CI, SwiftVersion);
809
810 // Write all methods.
811 llvm::StringMap<std::pair<bool, bool>> KnownMethods;
812 for (const auto &method : C.Methods) {
813 // Check for duplicate method definitions.
814 bool IsInstanceMethod = method.Kind == MethodKind::Instance;
815 bool &Known = IsInstanceMethod ? KnownMethods[method.Selector].first
816 : KnownMethods[method.Selector].second;
817 if (Known) {
818 emitError(llvm::Twine("duplicate definition of method '") +
819 (IsInstanceMethod ? "-" : "+") + "[" + C.Name + " " +
820 method.Selector + "]'");
821 continue;
822 }
823 Known = true;
824
825 convertMethod(method, CtxID, C.Name, SwiftVersion);
826 }
827
828 // Write all properties.
829 llvm::StringSet<> KnownInstanceProperties;
830 llvm::StringSet<> KnownClassProperties;
831 for (const auto &Property : C.Properties) {
832 // Check for duplicate property definitions.
833 if ((!Property.Kind || *Property.Kind == MethodKind::Instance) &&
834 !KnownInstanceProperties.insert(Property.Name).second) {
835 emitError(llvm::Twine("duplicate definition of instance property '") +
836 C.Name + "." + Property.Name + "'");
837 continue;
838 }
839
840 if ((!Property.Kind || *Property.Kind == MethodKind::Class) &&
841 !KnownClassProperties.insert(Property.Name).second) {
842 emitError(llvm::Twine("duplicate definition of class property '") +
843 C.Name + "." + Property.Name + "'");
844 continue;
845 }
846
847 // Translate from Property into ObjCPropertyInfo.
849 convertAvailability(Property.Availability, PI, Property.Name);
850 PI.setSwiftPrivate(Property.SwiftPrivate);
851 PI.SwiftName = std::string(Property.SwiftName);
852 if (Property.Nullability)
853 PI.setNullabilityAudited(*Property.Nullability);
854 if (Property.SwiftImportAsAccessors)
855 PI.setSwiftImportAsAccessors(*Property.SwiftImportAsAccessors);
856 PI.setType(std::string(Property.Type));
857
858 // Add both instance and class properties with this name.
859 if (Property.Kind) {
860 Writer.addObjCProperty(CtxID, Property.Name,
861 *Property.Kind == MethodKind::Instance, PI,
862 SwiftVersion);
863 } else {
864 Writer.addObjCProperty(CtxID, Property.Name, true, PI, SwiftVersion);
865 Writer.addObjCProperty(CtxID, Property.Name, false, PI, SwiftVersion);
866 }
867 }
868 }
869
870 void convertNamespaceContext(std::optional<ContextID> ParentContextID,
871 const Namespace &TheNamespace,
872 VersionTuple SwiftVersion) {
873 // Write the namespace.
874 ContextInfo CI;
875 convertCommonEntity(TheNamespace, CI, TheNamespace.Name);
876
877 ContextID CtxID =
878 Writer.addContext(ParentContextID, TheNamespace.Name,
879 ContextKind::Namespace, CI, SwiftVersion);
880
881 convertTopLevelItems(Context(CtxID, ContextKind::Namespace),
882 TheNamespace.Items, SwiftVersion);
883 }
884
885 void convertFunction(const Function &Function, FunctionInfo &FI) {
886 convertAvailability(Function.Availability, FI, Function.Name);
887 FI.setSwiftPrivate(Function.SwiftPrivate);
888 FI.SwiftName = std::string(Function.SwiftName);
889 convertParams(Function.Params, FI);
890 convertNullability(Function.Nullability, Function.NullabilityOfRet, FI,
891 Function.Name);
892 FI.ResultType = std::string(Function.ResultType);
893 FI.setRetainCountConvention(Function.RetainCountConvention);
894 }
895
896 void convertTagContext(std::optional<Context> ParentContext, const Tag &T,
897 VersionTuple SwiftVersion) {
898 TagInfo TI;
899 std::optional<ContextID> ParentContextID =
900 ParentContext ? std::optional<ContextID>(ParentContext->id)
901 : std::nullopt;
902 convertCommonType(T, TI, T.Name);
903
904 if ((T.SwiftRetainOp || T.SwiftReleaseOp) && !T.SwiftImportAs) {
905 emitError(llvm::Twine("should declare SwiftImportAs to use "
906 "SwiftRetainOp and SwiftReleaseOp (for ") +
907 T.Name + ")");
908 return;
909 }
910 if (T.SwiftReleaseOp.has_value() != T.SwiftRetainOp.has_value()) {
911 emitError(llvm::Twine("should declare both SwiftReleaseOp and "
912 "SwiftRetainOp (for ") +
913 T.Name + ")");
914 return;
915 }
916
917 if (T.SwiftImportAs)
918 TI.SwiftImportAs = T.SwiftImportAs;
919 if (T.SwiftRetainOp)
920 TI.SwiftRetainOp = T.SwiftRetainOp;
921 if (T.SwiftReleaseOp)
922 TI.SwiftReleaseOp = T.SwiftReleaseOp;
923
924 if (T.SwiftCopyable)
925 TI.setSwiftCopyable(T.SwiftCopyable);
926
927 if (T.EnumConvenienceKind) {
928 if (T.EnumExtensibility) {
929 emitError(
930 llvm::Twine("cannot mix EnumKind and EnumExtensibility (for ") +
931 T.Name + ")");
932 return;
933 }
934 if (T.FlagEnum) {
935 emitError(llvm::Twine("cannot mix EnumKind and FlagEnum (for ") +
936 T.Name + ")");
937 return;
938 }
939 switch (*T.EnumConvenienceKind) {
940 case EnumConvenienceAliasKind::None:
941 TI.EnumExtensibility = EnumExtensibilityKind::None;
942 TI.setFlagEnum(false);
943 break;
944 case EnumConvenienceAliasKind::CFEnum:
945 TI.EnumExtensibility = EnumExtensibilityKind::Open;
946 TI.setFlagEnum(false);
947 break;
948 case EnumConvenienceAliasKind::CFOptions:
949 TI.EnumExtensibility = EnumExtensibilityKind::Open;
950 TI.setFlagEnum(true);
951 break;
952 case EnumConvenienceAliasKind::CFClosedEnum:
953 TI.EnumExtensibility = EnumExtensibilityKind::Closed;
954 TI.setFlagEnum(false);
955 break;
956 }
957 } else {
958 TI.EnumExtensibility = T.EnumExtensibility;
959 TI.setFlagEnum(T.FlagEnum);
960 }
961
962 Writer.addTag(ParentContext, T.Name, TI, SwiftVersion);
963
964 ContextInfo CI;
965 auto TagCtxID = Writer.addContext(ParentContextID, T.Name, ContextKind::Tag,
966 CI, SwiftVersion);
967 Context TagCtx(TagCtxID, ContextKind::Tag);
968
969 for (const auto &CXXMethod : T.Methods) {
970 CXXMethodInfo MI;
971 convertFunction(CXXMethod, MI);
972 Writer.addCXXMethod(TagCtxID, CXXMethod.Name, MI, SwiftVersion);
973 }
974
975 // Convert nested tags.
976 for (const auto &Tag : T.Tags)
977 convertTagContext(TagCtx, Tag, SwiftVersion);
978 }
979
980 void convertTopLevelItems(std::optional<Context> Ctx,
981 const TopLevelItems &TLItems,
982 VersionTuple SwiftVersion) {
983 std::optional<ContextID> CtxID =
984 Ctx ? std::optional(Ctx->id) : std::nullopt;
985
986 // Write all classes.
987 llvm::StringSet<> KnownClasses;
988 for (const auto &Class : TLItems.Classes) {
989 // Check for duplicate class definitions.
990 if (!KnownClasses.insert(Class.Name).second) {
991 emitError(llvm::Twine("multiple definitions of class '") + Class.Name +
992 "'");
993 continue;
994 }
995
996 convertContext(CtxID, Class, ContextKind::ObjCClass, SwiftVersion);
997 }
998
999 // Write all protocols.
1000 llvm::StringSet<> KnownProtocols;
1001 for (const auto &Protocol : TLItems.Protocols) {
1002 // Check for duplicate protocol definitions.
1003 if (!KnownProtocols.insert(Protocol.Name).second) {
1004 emitError(llvm::Twine("multiple definitions of protocol '") +
1005 Protocol.Name + "'");
1006 continue;
1007 }
1008
1009 convertContext(CtxID, Protocol, ContextKind::ObjCProtocol, SwiftVersion);
1010 }
1011
1012 // Write all namespaces.
1013 llvm::StringSet<> KnownNamespaces;
1014 for (const auto &Namespace : TLItems.Namespaces) {
1015 // Check for duplicate namespace definitions.
1016 if (!KnownNamespaces.insert(Namespace.Name).second) {
1017 emitError(llvm::Twine("multiple definitions of namespace '") +
1018 Namespace.Name + "'");
1019 continue;
1020 }
1021
1022 convertNamespaceContext(CtxID, Namespace, SwiftVersion);
1023 }
1024
1025 // Write all global variables.
1026 llvm::StringSet<> KnownGlobals;
1027 for (const auto &Global : TLItems.Globals) {
1028 // Check for duplicate global variables.
1029 if (!KnownGlobals.insert(Global.Name).second) {
1030 emitError(llvm::Twine("multiple definitions of global variable '") +
1031 Global.Name + "'");
1032 continue;
1033 }
1034
1036 convertAvailability(Global.Availability, GVI, Global.Name);
1037 GVI.setSwiftPrivate(Global.SwiftPrivate);
1038 GVI.SwiftName = std::string(Global.SwiftName);
1039 if (Global.Nullability)
1040 GVI.setNullabilityAudited(*Global.Nullability);
1041 GVI.setType(std::string(Global.Type));
1042 Writer.addGlobalVariable(Ctx, Global.Name, GVI, SwiftVersion);
1043 }
1044
1045 // Write all global functions.
1046 llvm::StringSet<> KnownFunctions;
1047 for (const auto &Function : TLItems.Functions) {
1048 // Check for duplicate global functions.
1049 if (!KnownFunctions.insert(Function.Name).second) {
1050 emitError(llvm::Twine("multiple definitions of global function '") +
1051 Function.Name + "'");
1052 continue;
1053 }
1054
1056 convertFunction(Function, GFI);
1057 Writer.addGlobalFunction(Ctx, Function.Name, GFI, SwiftVersion);
1058 }
1059
1060 // Write all enumerators.
1061 llvm::StringSet<> KnownEnumConstants;
1062 for (const auto &EnumConstant : TLItems.EnumConstants) {
1063 // Check for duplicate enumerators
1064 if (!KnownEnumConstants.insert(EnumConstant.Name).second) {
1065 emitError(llvm::Twine("multiple definitions of enumerator '") +
1066 EnumConstant.Name + "'");
1067 continue;
1068 }
1069
1070 EnumConstantInfo ECI;
1071 convertAvailability(EnumConstant.Availability, ECI, EnumConstant.Name);
1072 ECI.setSwiftPrivate(EnumConstant.SwiftPrivate);
1073 ECI.SwiftName = std::string(EnumConstant.SwiftName);
1074 Writer.addEnumConstant(EnumConstant.Name, ECI, SwiftVersion);
1075 }
1076
1077 // Write all tags.
1078 llvm::StringSet<> KnownTags;
1079 for (const auto &Tag : TLItems.Tags) {
1080 // Check for duplicate tag definitions.
1081 if (!KnownTags.insert(Tag.Name).second) {
1082 emitError(llvm::Twine("multiple definitions of tag '") + Tag.Name +
1083 "'");
1084 continue;
1085 }
1086
1087 convertTagContext(Ctx, Tag, SwiftVersion);
1088 }
1089
1090 // Write all typedefs.
1091 llvm::StringSet<> KnownTypedefs;
1092 for (const auto &Typedef : TLItems.Typedefs) {
1093 // Check for duplicate typedef definitions.
1094 if (!KnownTypedefs.insert(Typedef.Name).second) {
1095 emitError(llvm::Twine("multiple definitions of typedef '") +
1096 Typedef.Name + "'");
1097 continue;
1098 }
1099
1100 TypedefInfo TInfo;
1101 convertCommonType(Typedef, TInfo, Typedef.Name);
1102 TInfo.SwiftWrapper = Typedef.SwiftType;
1103
1104 Writer.addTypedef(Ctx, Typedef.Name, TInfo, SwiftVersion);
1105 }
1106 }
1107
1108 bool convertModule() {
1109 // Write the top-level items.
1110 convertTopLevelItems(/* context */ std::nullopt, M.TopLevel,
1111 VersionTuple());
1112
1113 // Convert the versioned information.
1114 for (const auto &Versioned : M.SwiftVersions)
1115 convertTopLevelItems(/* context */ std::nullopt, Versioned.Items,
1116 Versioned.Version);
1117
1118 if (!ErrorOccured)
1119 Writer.writeToStream(OS);
1120
1121 return ErrorOccured;
1122 }
1123};
1124} // namespace
1125
1126static bool compile(const Module &M, const FileEntry *SourceFile,
1127 llvm::raw_ostream &OS,
1128 llvm::SourceMgr::DiagHandlerTy DiagHandler,
1129 void *DiagHandlerCtxt) {
1130 YAMLConverter C(M, SourceFile, OS, DiagHandler, DiagHandlerCtxt);
1131 return C.convertModule();
1132}
1133
1134/// Simple diagnostic handler that prints diagnostics to standard error.
1135static void printDiagnostic(const llvm::SMDiagnostic &Diag, void *Context) {
1136 Diag.print(nullptr, llvm::errs());
1137}
1138
1139bool api_notes::compileAPINotes(StringRef YAMLInput,
1140 const FileEntry *SourceFile,
1141 llvm::raw_ostream &OS,
1142 llvm::SourceMgr::DiagHandlerTy DiagHandler,
1143 void *DiagHandlerCtxt) {
1144 Module TheModule;
1145
1146 if (!DiagHandler)
1147 DiagHandler = &printDiagnostic;
1148
1149 if (parseAPINotes(YAMLInput, TheModule, DiagHandler, DiagHandlerCtxt))
1150 return true;
1151
1152 return compile(TheModule, SourceFile, OS, DiagHandler, DiagHandlerCtxt);
1153}
static void printDiagnostic(const llvm::SMDiagnostic &Diag, void *Context)
Simple diagnostic handler that prints diagnostics to standard error.
static bool compile(const Module &M, const FileEntry *SourceFile, llvm::raw_ostream &OS, llvm::SourceMgr::DiagHandlerTy DiagHandler, void *DiagHandlerCtxt)
#define V(N, I)
Definition: ASTContext.h:3338
StringRef P
enum clang::sema::@1651::IndirectLocalPathEntry::EntryKind Kind
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines various enumerations that describe declaration and type specifiers.
Cached information about one file (either on disk or in the virtual file system).
Definition: FileEntry.h:300
Describes a module or submodule.
Definition: Module.h:105
std::string Name
The name of this module.
Definition: Module.h:108
void dump() const
Dump the contents of this module to the given output stream.
Smart pointer class that efficiently represents Objective-C method names.
The base class of the type hierarchy.
Definition: Type.h:1829
A class that writes API notes data to a binary representation that can be read by the APINotesReader.
void addObjCMethod(ContextID CtxID, ObjCSelectorRef Selector, bool IsInstanceMethod, const ObjCMethodInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a specific Objective-C method.
void addEnumConstant(llvm::StringRef Name, const EnumConstantInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about an enumerator.
ContextID addContext(std::optional< ContextID > ParentCtxID, llvm::StringRef Name, ContextKind Kind, const ContextInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a specific Objective-C class or protocol or a C++ namespace.
void addGlobalFunction(std::optional< Context > Ctx, llvm::StringRef Name, const GlobalFunctionInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a global function.
void addObjCProperty(ContextID CtxID, llvm::StringRef Name, bool IsInstanceProperty, const ObjCPropertyInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a specific Objective-C property.
void addGlobalVariable(std::optional< Context > Ctx, llvm::StringRef Name, const GlobalVariableInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a global variable.
void addTypedef(std::optional< Context > Ctx, llvm::StringRef Name, const TypedefInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a typedef.
void writeToStream(llvm::raw_ostream &OS)
void addCXXMethod(ContextID CtxID, llvm::StringRef Name, const CXXMethodInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a specific C++ method.
void addTag(std::optional< Context > Ctx, llvm::StringRef Name, const TagInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a tag (struct/union/enum/C++ class).
Describes API notes data for a C++ method.
Definition: Types.h:660
Describes API notes data for any entity.
Definition: Types.h:52
unsigned UnavailableInSwift
Whether this entity is marked unavailable in Swift.
Definition: Types.h:63
unsigned Unavailable
Whether this entity is marked unavailable.
Definition: Types.h:59
std::string SwiftName
Swift name of this entity.
Definition: Types.h:76
void setSwiftPrivate(std::optional< bool > Private)
Definition: Types.h:87
std::string UnavailableMsg
Message to use when this entity is unavailable.
Definition: Types.h:55
Describes API notes for types.
Definition: Types.h:135
void setNSErrorDomain(const std::optional< std::string > &Domain)
Definition: Types.h:159
void setSwiftBridge(std::optional< std::string > SwiftType)
Definition: Types.h:151
Opaque context ID used to refer to an Objective-C class or protocol or a C++ namespace.
Definition: Types.h:787
Describes API notes data for an Objective-C class or protocol or a C++ namespace.
Definition: Types.h:197
void setDefaultNullability(NullabilityKind Kind)
Set the default nullability for properties and methods of this class.
Definition: Types.h:239
void setSwiftObjCMembers(std::optional< bool > Value)
Definition: Types.h:261
void setSwiftImportAsNonGeneric(std::optional< bool > Value)
Definition: Types.h:252
Describes API notes data for an enumerator.
Definition: Types.h:666
API notes for a function or method.
Definition: Types.h:489
void addTypeInfo(unsigned index, NullabilityKind kind)
Definition: Types.h:532
void setRetainCountConvention(std::optional< RetainCountConventionKind > Value)
Definition: Types.h:572
std::vector< ParamInfo > Params
The function parameters.
Definition: Types.h:522
unsigned NumAdjustedNullable
Number of types whose nullability is encoded with the NullabilityPayload.
Definition: Types.h:506
std::string ResultType
The result type of this function, as a C type.
Definition: Types.h:519
static unsigned getMaxNullabilityIndex()
Definition: Types.h:528
unsigned NullabilityAudited
Whether the signature has been audited with respect to nullability.
Definition: Types.h:503
Describes API notes data for a global function.
Definition: Types.h:654
Describes API notes data for a global variable.
Definition: Types.h:648
Describes API notes data for an Objective-C method.
Definition: Types.h:609
unsigned DesignatedInit
Whether this is a designated initializer of its class.
Definition: Types.h:613
unsigned RequiredInit
Whether this is a required initializer.
Definition: Types.h:617
Describes API notes data for an Objective-C property.
Definition: Types.h:361
void setSwiftImportAsAccessors(std::optional< bool > Value)
Definition: Types.h:376
Describes a function or method parameter.
Definition: Types.h:419
void setNoEscape(std::optional< bool > Value)
Definition: Types.h:442
void setRetainCountConvention(std::optional< RetainCountConventionKind > Value)
Definition: Types.h:453
Describes API notes data for a tag.
Definition: Types.h:672
std::optional< std::string > SwiftReleaseOp
Definition: Types.h:686
std::optional< std::string > SwiftRetainOp
Definition: Types.h:685
std::optional< std::string > SwiftImportAs
Definition: Types.h:684
std::optional< EnumExtensibilityKind > EnumExtensibility
Definition: Types.h:688
void setSwiftCopyable(std::optional< bool > Value)
Definition: Types.h:708
void setFlagEnum(std::optional< bool > Value)
Definition: Types.h:699
Describes API notes data for a typedef.
Definition: Types.h:755
std::optional< SwiftNewTypeKind > SwiftWrapper
Definition: Types.h:757
void setNullabilityAudited(NullabilityKind kind)
Definition: Types.h:326
void setType(const std::string &type)
Definition: Types.h:332
RetainCountConventionKind
Definition: Types.h:25
bool compileAPINotes(llvm::StringRef YAMLInput, const FileEntry *SourceFile, llvm::raw_ostream &OS, llvm::SourceMgr::DiagHandlerTy DiagHandler=nullptr, void *DiagHandlerCtxt=nullptr)
Converts API notes from YAML format to binary format.
SwiftNewTypeKind
The kind of a swift_wrapper/swift_newtype.
Definition: Types.h:43
EnumExtensibilityKind
The payload for an enum_extensibility attribute.
Definition: Types.h:36
bool parseAndDumpAPINotes(llvm::StringRef YI, llvm::raw_ostream &OS)
Parses the APINotes YAML content and writes the representation back to the specified stream.
The JSON file list parser is used to communicate input to InstallAPI.
NullabilityKind
Describes the nullability of a particular type.
Definition: Specifiers.h:333
@ Property
The type of a property.
const FunctionProtoType * T
@ Class
The "class" keyword introduces the elaborated-type-specifier.
static void mapTopLevelItems(IO &IO, TopLevelItems &TLI)
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
#define false
Definition: stdbool.h:26
A temporary reference to an Objective-C selector, suitable for referencing selector data on the stack...
Definition: Types.h:814
static void mapping(IO &IO, Class &C)
static void mapping(IO &IO, EnumConstant &EC)
static void mapping(IO &IO, Function &F)
static void mapping(IO &IO, GlobalVariable &GV)
static void mapping(IO &IO, Method &M)
static void mapping(IO &IO, Module &M)
static void mapping(IO &IO, Namespace &T)
static void mapping(IO &IO, Param &P)
static void mapping(IO &IO, Property &P)
static void mapping(IO &IO, Tag &T)
static void mapping(IO &IO, Typedef &T)
static void mapping(IO &IO, Versioned &V)
static void enumeration(IO &IO, APIAvailability &AA)
static void enumeration(IO &IO, EnumConvenienceAliasKind &ECAK)
static void enumeration(IO &IO, EnumExtensibilityKind &EEK)
static void enumeration(IO &IO, FactoryAsInitKind &FIK)
static void enumeration(IO &IO, NullabilityKind &NK)
static void enumeration(IO &IO, RetainCountConventionKind &RCCK)
static void enumeration(IO &IO, SwiftNewTypeKind &SWK)