clang 19.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 {
410 StringRef Name;
411 AvailabilityItem Availability;
412 StringRef SwiftName;
413 std::optional<bool> SwiftPrivate;
414 std::optional<StringRef> SwiftBridge;
415 std::optional<StringRef> NSErrorDomain;
416 std::optional<std::string> SwiftImportAs;
417 std::optional<std::string> SwiftRetainOp;
418 std::optional<std::string> SwiftReleaseOp;
419 std::optional<EnumExtensibilityKind> EnumExtensibility;
420 std::optional<bool> FlagEnum;
421 std::optional<EnumConvenienceAliasKind> EnumConvenienceKind;
422 std::optional<bool> SwiftCopyable;
423};
424
425typedef std::vector<Tag> TagsSeq;
426} // namespace
427
428LLVM_YAML_IS_SEQUENCE_VECTOR(Tag)
429
430namespace llvm {
431namespace yaml {
432template <> struct ScalarEnumerationTraits<EnumExtensibilityKind> {
433 static void enumeration(IO &IO, EnumExtensibilityKind &EEK) {
434 IO.enumCase(EEK, "none", EnumExtensibilityKind::None);
435 IO.enumCase(EEK, "open", EnumExtensibilityKind::Open);
436 IO.enumCase(EEK, "closed", EnumExtensibilityKind::Closed);
437 }
438};
439
440template <> struct MappingTraits<Tag> {
441 static void mapping(IO &IO, Tag &T) {
442 IO.mapRequired("Name", T.Name);
443 IO.mapOptional("Availability", T.Availability.Mode,
444 APIAvailability::Available);
445 IO.mapOptional("AvailabilityMsg", T.Availability.Msg, StringRef(""));
446 IO.mapOptional("SwiftPrivate", T.SwiftPrivate);
447 IO.mapOptional("SwiftName", T.SwiftName, StringRef(""));
448 IO.mapOptional("SwiftBridge", T.SwiftBridge);
449 IO.mapOptional("NSErrorDomain", T.NSErrorDomain);
450 IO.mapOptional("SwiftImportAs", T.SwiftImportAs);
451 IO.mapOptional("SwiftReleaseOp", T.SwiftReleaseOp);
452 IO.mapOptional("SwiftRetainOp", T.SwiftRetainOp);
453 IO.mapOptional("EnumExtensibility", T.EnumExtensibility);
454 IO.mapOptional("FlagEnum", T.FlagEnum);
455 IO.mapOptional("EnumKind", T.EnumConvenienceKind);
456 IO.mapOptional("SwiftCopyable", T.SwiftCopyable);
457 }
458};
459} // namespace yaml
460} // namespace llvm
461
462namespace {
463struct Typedef {
464 StringRef Name;
465 AvailabilityItem Availability;
466 StringRef SwiftName;
467 std::optional<bool> SwiftPrivate;
468 std::optional<StringRef> SwiftBridge;
469 std::optional<StringRef> NSErrorDomain;
470 std::optional<SwiftNewTypeKind> SwiftType;
471};
472
473typedef std::vector<Typedef> TypedefsSeq;
474} // namespace
475
476LLVM_YAML_IS_SEQUENCE_VECTOR(Typedef)
477
478namespace llvm {
479namespace yaml {
480template <> struct ScalarEnumerationTraits<SwiftNewTypeKind> {
481 static void enumeration(IO &IO, SwiftNewTypeKind &SWK) {
482 IO.enumCase(SWK, "none", SwiftNewTypeKind::None);
483 IO.enumCase(SWK, "struct", SwiftNewTypeKind::Struct);
484 IO.enumCase(SWK, "enum", SwiftNewTypeKind::Enum);
485 }
486};
487
488template <> struct MappingTraits<Typedef> {
489 static void mapping(IO &IO, Typedef &T) {
490 IO.mapRequired("Name", T.Name);
491 IO.mapOptional("Availability", T.Availability.Mode,
492 APIAvailability::Available);
493 IO.mapOptional("AvailabilityMsg", T.Availability.Msg, StringRef(""));
494 IO.mapOptional("SwiftPrivate", T.SwiftPrivate);
495 IO.mapOptional("SwiftName", T.SwiftName, StringRef(""));
496 IO.mapOptional("SwiftBridge", T.SwiftBridge);
497 IO.mapOptional("NSErrorDomain", T.NSErrorDomain);
498 IO.mapOptional("SwiftWrapper", T.SwiftType);
499 }
500};
501} // namespace yaml
502} // namespace llvm
503
504namespace {
505struct Namespace;
506typedef std::vector<Namespace> NamespacesSeq;
507
508struct TopLevelItems {
509 ClassesSeq Classes;
510 ClassesSeq Protocols;
511 FunctionsSeq Functions;
512 GlobalVariablesSeq Globals;
513 EnumConstantsSeq EnumConstants;
514 TagsSeq Tags;
515 TypedefsSeq Typedefs;
516 NamespacesSeq Namespaces;
517};
518} // namespace
519
520namespace llvm {
521namespace yaml {
522static void mapTopLevelItems(IO &IO, TopLevelItems &TLI) {
523 IO.mapOptional("Classes", TLI.Classes);
524 IO.mapOptional("Protocols", TLI.Protocols);
525 IO.mapOptional("Functions", TLI.Functions);
526 IO.mapOptional("Globals", TLI.Globals);
527 IO.mapOptional("Enumerators", TLI.EnumConstants);
528 IO.mapOptional("Tags", TLI.Tags);
529 IO.mapOptional("Typedefs", TLI.Typedefs);
530 IO.mapOptional("Namespaces", TLI.Namespaces);
531}
532} // namespace yaml
533} // namespace llvm
534
535namespace {
536struct Namespace {
537 StringRef Name;
538 AvailabilityItem Availability;
539 StringRef SwiftName;
540 std::optional<bool> SwiftPrivate;
541 TopLevelItems Items;
542};
543} // namespace
544
545LLVM_YAML_IS_SEQUENCE_VECTOR(Namespace)
546
547namespace llvm {
548namespace yaml {
549template <> struct MappingTraits<Namespace> {
550 static void mapping(IO &IO, Namespace &T) {
551 IO.mapRequired("Name", T.Name);
552 IO.mapOptional("Availability", T.Availability.Mode,
553 APIAvailability::Available);
554 IO.mapOptional("AvailabilityMsg", T.Availability.Msg, StringRef(""));
555 IO.mapOptional("SwiftPrivate", T.SwiftPrivate);
556 IO.mapOptional("SwiftName", T.SwiftName, StringRef(""));
557 mapTopLevelItems(IO, T.Items);
558 }
559};
560} // namespace yaml
561} // namespace llvm
562
563namespace {
564struct Versioned {
565 VersionTuple Version;
566 TopLevelItems Items;
567};
568
569typedef std::vector<Versioned> VersionedSeq;
570} // namespace
571
572LLVM_YAML_IS_SEQUENCE_VECTOR(Versioned)
573
574namespace llvm {
575namespace yaml {
576template <> struct MappingTraits<Versioned> {
577 static void mapping(IO &IO, Versioned &V) {
578 IO.mapRequired("Version", V.Version);
579 mapTopLevelItems(IO, V.Items);
580 }
581};
582} // namespace yaml
583} // namespace llvm
584
585namespace {
586struct Module {
587 StringRef Name;
588 AvailabilityItem Availability;
589 TopLevelItems TopLevel;
590 VersionedSeq SwiftVersions;
591
592 std::optional<bool> SwiftInferImportAsMember;
593
594#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
595 LLVM_DUMP_METHOD void dump() /*const*/;
596#endif
597};
598} // namespace
599
600namespace llvm {
601namespace yaml {
602template <> struct MappingTraits<Module> {
603 static void mapping(IO &IO, Module &M) {
604 IO.mapRequired("Name", M.Name);
605 IO.mapOptional("Availability", M.Availability.Mode,
606 APIAvailability::Available);
607 IO.mapOptional("AvailabilityMsg", M.Availability.Msg, StringRef(""));
608 IO.mapOptional("SwiftInferImportAsMember", M.SwiftInferImportAsMember);
609 mapTopLevelItems(IO, M.TopLevel);
610 IO.mapOptional("SwiftVersions", M.SwiftVersions);
611 }
612};
613} // namespace yaml
614} // namespace llvm
615
616#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
617LLVM_DUMP_METHOD void Module::dump() {
618 llvm::yaml::Output OS(llvm::errs());
619 OS << *this;
620}
621#endif
622
623namespace {
624bool parseAPINotes(StringRef YI, Module &M, llvm::SourceMgr::DiagHandlerTy Diag,
625 void *DiagContext) {
626 llvm::yaml::Input IS(YI, nullptr, Diag, DiagContext);
627 IS >> M;
628 return static_cast<bool>(IS.error());
629}
630} // namespace
631
633 llvm::raw_ostream &OS) {
634 Module M;
635 if (parseAPINotes(YI, M, nullptr, nullptr))
636 return true;
637
638 llvm::yaml::Output YOS(OS);
639 YOS << M;
640
641 return false;
642}
643
644namespace {
645using namespace api_notes;
646
647class YAMLConverter {
648 const Module &M;
649 APINotesWriter Writer;
650 llvm::raw_ostream &OS;
651 llvm::SourceMgr::DiagHandlerTy DiagHandler;
652 void *DiagHandlerCtxt;
653 bool ErrorOccured;
654
655 /// Emit a diagnostic
656 bool emitError(llvm::Twine Message) {
657 DiagHandler(
658 llvm::SMDiagnostic("", llvm::SourceMgr::DK_Error, Message.str()),
659 DiagHandlerCtxt);
660 ErrorOccured = true;
661 return true;
662 }
663
664public:
665 YAMLConverter(const Module &TheModule, const FileEntry *SourceFile,
666 llvm::raw_ostream &OS,
667 llvm::SourceMgr::DiagHandlerTy DiagHandler,
668 void *DiagHandlerCtxt)
669 : M(TheModule), Writer(TheModule.Name, SourceFile), OS(OS),
670 DiagHandler(DiagHandler), DiagHandlerCtxt(DiagHandlerCtxt),
671 ErrorOccured(false) {}
672
673 void convertAvailability(const AvailabilityItem &Availability,
674 CommonEntityInfo &CEI, llvm::StringRef APIName) {
675 // Populate the unavailability information.
676 CEI.Unavailable = (Availability.Mode == APIAvailability::None);
677 CEI.UnavailableInSwift = (Availability.Mode == APIAvailability::NonSwift);
678 if (CEI.Unavailable || CEI.UnavailableInSwift) {
679 CEI.UnavailableMsg = std::string(Availability.Msg);
680 } else {
681 if (!Availability.Msg.empty())
682 emitError(llvm::Twine("availability message for available API '") +
683 APIName + "' will not be used");
684 }
685 }
686
687 void convertParams(const ParamsSeq &Params, FunctionInfo &OutInfo) {
688 for (const auto &P : Params) {
689 ParamInfo PI;
690 if (P.Nullability)
691 PI.setNullabilityAudited(*P.Nullability);
692 PI.setNoEscape(P.NoEscape);
693 PI.setType(std::string(P.Type));
694 PI.setRetainCountConvention(P.RetainCountConvention);
695 if (OutInfo.Params.size() <= P.Position)
696 OutInfo.Params.resize(P.Position + 1);
697 OutInfo.Params[P.Position] |= PI;
698 }
699 }
700
701 void convertNullability(const NullabilitySeq &Nullability,
702 std::optional<NullabilityKind> ReturnNullability,
703 FunctionInfo &OutInfo, llvm::StringRef APIName) {
705 emitError(llvm::Twine("nullability info for '") + APIName +
706 "' does not fit");
707 return;
708 }
709
710 bool audited = false;
711 unsigned int idx = 1;
712 for (const auto &N : Nullability)
713 OutInfo.addTypeInfo(idx++, N);
714 audited = Nullability.size() > 0 || ReturnNullability;
715 if (audited)
716 OutInfo.addTypeInfo(0, ReturnNullability ? *ReturnNullability
717 : NullabilityKind::NonNull);
718 if (!audited)
719 return;
720 OutInfo.NullabilityAudited = audited;
721 OutInfo.NumAdjustedNullable = idx;
722 }
723
724 /// Convert the common parts of an entity from YAML.
725 template <typename T>
726 void convertCommonEntity(const T &Common, CommonEntityInfo &Info,
727 StringRef APIName) {
728 convertAvailability(Common.Availability, Info, APIName);
729 Info.setSwiftPrivate(Common.SwiftPrivate);
730 Info.SwiftName = std::string(Common.SwiftName);
731 }
732
733 /// Convert the common parts of a type entity from YAML.
734 template <typename T>
735 void convertCommonType(const T &Common, CommonTypeInfo &Info,
736 StringRef APIName) {
737 convertCommonEntity(Common, Info, APIName);
738 if (Common.SwiftBridge)
739 Info.setSwiftBridge(std::string(*Common.SwiftBridge));
740 Info.setNSErrorDomain(Common.NSErrorDomain);
741 }
742
743 // Translate from Method into ObjCMethodInfo and write it out.
744 void convertMethod(const Method &M, ContextID ClassID, StringRef ClassName,
745 VersionTuple SwiftVersion) {
747 convertCommonEntity(M, MI, M.Selector);
748
749 // Check if the selector ends with ':' to determine if it takes arguments.
750 bool takesArguments = M.Selector.ends_with(":");
751
752 // Split the selector into pieces.
754 M.Selector.split(Args, ":", /*MaxSplit*/ -1, /*KeepEmpty*/ false);
755 if (!takesArguments && Args.size() > 1) {
756 emitError("selector '" + M.Selector + "' is missing a ':' at the end");
757 return;
758 }
759
760 // Construct ObjCSelectorRef.
762 Selector.NumArgs = !takesArguments ? 0 : Args.size();
763 Selector.Identifiers = Args;
764
765 // Translate the initializer info.
766 MI.DesignatedInit = M.DesignatedInit;
767 MI.RequiredInit = M.Required;
768 if (M.FactoryAsInit != FactoryAsInitKind::Infer)
769 emitError("'FactoryAsInit' is no longer valid; use 'SwiftName' instead");
770
771 MI.ResultType = std::string(M.ResultType);
772
773 // Translate parameter information.
774 convertParams(M.Params, MI);
775
776 // Translate nullability info.
777 convertNullability(M.Nullability, M.NullabilityOfRet, MI, M.Selector);
778
779 MI.setRetainCountConvention(M.RetainCountConvention);
780
781 // Write it.
782 Writer.addObjCMethod(ClassID, Selector, M.Kind == MethodKind::Instance, MI,
783 SwiftVersion);
784 }
785
786 void convertContext(std::optional<ContextID> ParentContextID, const Class &C,
787 ContextKind Kind, VersionTuple SwiftVersion) {
788 // Write the class.
790 convertCommonType(C, CI, C.Name);
791
792 if (C.AuditedForNullability)
793 CI.setDefaultNullability(NullabilityKind::NonNull);
794 if (C.SwiftImportAsNonGeneric)
795 CI.setSwiftImportAsNonGeneric(*C.SwiftImportAsNonGeneric);
796 if (C.SwiftObjCMembers)
797 CI.setSwiftObjCMembers(*C.SwiftObjCMembers);
798
799 ContextID CtxID =
800 Writer.addObjCContext(ParentContextID, C.Name, Kind, CI, SwiftVersion);
801
802 // Write all methods.
803 llvm::StringMap<std::pair<bool, bool>> KnownMethods;
804 for (const auto &method : C.Methods) {
805 // Check for duplicate method definitions.
806 bool IsInstanceMethod = method.Kind == MethodKind::Instance;
807 bool &Known = IsInstanceMethod ? KnownMethods[method.Selector].first
808 : KnownMethods[method.Selector].second;
809 if (Known) {
810 emitError(llvm::Twine("duplicate definition of method '") +
811 (IsInstanceMethod ? "-" : "+") + "[" + C.Name + " " +
812 method.Selector + "]'");
813 continue;
814 }
815 Known = true;
816
817 convertMethod(method, CtxID, C.Name, SwiftVersion);
818 }
819
820 // Write all properties.
821 llvm::StringSet<> KnownInstanceProperties;
822 llvm::StringSet<> KnownClassProperties;
823 for (const auto &Property : C.Properties) {
824 // Check for duplicate property definitions.
825 if ((!Property.Kind || *Property.Kind == MethodKind::Instance) &&
826 !KnownInstanceProperties.insert(Property.Name).second) {
827 emitError(llvm::Twine("duplicate definition of instance property '") +
828 C.Name + "." + Property.Name + "'");
829 continue;
830 }
831
832 if ((!Property.Kind || *Property.Kind == MethodKind::Class) &&
833 !KnownClassProperties.insert(Property.Name).second) {
834 emitError(llvm::Twine("duplicate definition of class property '") +
835 C.Name + "." + Property.Name + "'");
836 continue;
837 }
838
839 // Translate from Property into ObjCPropertyInfo.
841 convertAvailability(Property.Availability, PI, Property.Name);
842 PI.setSwiftPrivate(Property.SwiftPrivate);
843 PI.SwiftName = std::string(Property.SwiftName);
844 if (Property.Nullability)
845 PI.setNullabilityAudited(*Property.Nullability);
846 if (Property.SwiftImportAsAccessors)
847 PI.setSwiftImportAsAccessors(*Property.SwiftImportAsAccessors);
848 PI.setType(std::string(Property.Type));
849
850 // Add both instance and class properties with this name.
851 if (Property.Kind) {
852 Writer.addObjCProperty(CtxID, Property.Name,
853 *Property.Kind == MethodKind::Instance, PI,
854 SwiftVersion);
855 } else {
856 Writer.addObjCProperty(CtxID, Property.Name, true, PI, SwiftVersion);
857 Writer.addObjCProperty(CtxID, Property.Name, false, PI, SwiftVersion);
858 }
859 }
860 }
861
862 void convertNamespaceContext(std::optional<ContextID> ParentContextID,
863 const Namespace &TheNamespace,
864 VersionTuple SwiftVersion) {
865 // Write the namespace.
867 convertCommonEntity(TheNamespace, CI, TheNamespace.Name);
868
869 ContextID CtxID =
870 Writer.addObjCContext(ParentContextID, TheNamespace.Name,
871 ContextKind::Namespace, CI, SwiftVersion);
872
873 convertTopLevelItems(Context(CtxID, ContextKind::Namespace),
874 TheNamespace.Items, SwiftVersion);
875 }
876
877 void convertTopLevelItems(std::optional<Context> Ctx,
878 const TopLevelItems &TLItems,
879 VersionTuple SwiftVersion) {
880 std::optional<ContextID> CtxID =
881 Ctx ? std::optional(Ctx->id) : std::nullopt;
882
883 // Write all classes.
884 llvm::StringSet<> KnownClasses;
885 for (const auto &Class : TLItems.Classes) {
886 // Check for duplicate class definitions.
887 if (!KnownClasses.insert(Class.Name).second) {
888 emitError(llvm::Twine("multiple definitions of class '") + Class.Name +
889 "'");
890 continue;
891 }
892
893 convertContext(CtxID, Class, ContextKind::ObjCClass, SwiftVersion);
894 }
895
896 // Write all protocols.
897 llvm::StringSet<> KnownProtocols;
898 for (const auto &Protocol : TLItems.Protocols) {
899 // Check for duplicate protocol definitions.
900 if (!KnownProtocols.insert(Protocol.Name).second) {
901 emitError(llvm::Twine("multiple definitions of protocol '") +
902 Protocol.Name + "'");
903 continue;
904 }
905
906 convertContext(CtxID, Protocol, ContextKind::ObjCProtocol, SwiftVersion);
907 }
908
909 // Write all namespaces.
910 llvm::StringSet<> KnownNamespaces;
911 for (const auto &Namespace : TLItems.Namespaces) {
912 // Check for duplicate namespace definitions.
913 if (!KnownNamespaces.insert(Namespace.Name).second) {
914 emitError(llvm::Twine("multiple definitions of namespace '") +
915 Namespace.Name + "'");
916 continue;
917 }
918
919 convertNamespaceContext(CtxID, Namespace, SwiftVersion);
920 }
921
922 // Write all global variables.
923 llvm::StringSet<> KnownGlobals;
924 for (const auto &Global : TLItems.Globals) {
925 // Check for duplicate global variables.
926 if (!KnownGlobals.insert(Global.Name).second) {
927 emitError(llvm::Twine("multiple definitions of global variable '") +
928 Global.Name + "'");
929 continue;
930 }
931
933 convertAvailability(Global.Availability, GVI, Global.Name);
934 GVI.setSwiftPrivate(Global.SwiftPrivate);
935 GVI.SwiftName = std::string(Global.SwiftName);
936 if (Global.Nullability)
937 GVI.setNullabilityAudited(*Global.Nullability);
938 GVI.setType(std::string(Global.Type));
939 Writer.addGlobalVariable(Ctx, Global.Name, GVI, SwiftVersion);
940 }
941
942 // Write all global functions.
943 llvm::StringSet<> KnownFunctions;
944 for (const auto &Function : TLItems.Functions) {
945 // Check for duplicate global functions.
946 if (!KnownFunctions.insert(Function.Name).second) {
947 emitError(llvm::Twine("multiple definitions of global function '") +
948 Function.Name + "'");
949 continue;
950 }
951
953 convertAvailability(Function.Availability, GFI, Function.Name);
954 GFI.setSwiftPrivate(Function.SwiftPrivate);
955 GFI.SwiftName = std::string(Function.SwiftName);
956 convertParams(Function.Params, GFI);
957 convertNullability(Function.Nullability, Function.NullabilityOfRet, GFI,
958 Function.Name);
959 GFI.ResultType = std::string(Function.ResultType);
960 GFI.setRetainCountConvention(Function.RetainCountConvention);
961 Writer.addGlobalFunction(Ctx, Function.Name, GFI, SwiftVersion);
962 }
963
964 // Write all enumerators.
965 llvm::StringSet<> KnownEnumConstants;
966 for (const auto &EnumConstant : TLItems.EnumConstants) {
967 // Check for duplicate enumerators
968 if (!KnownEnumConstants.insert(EnumConstant.Name).second) {
969 emitError(llvm::Twine("multiple definitions of enumerator '") +
970 EnumConstant.Name + "'");
971 continue;
972 }
973
975 convertAvailability(EnumConstant.Availability, ECI, EnumConstant.Name);
976 ECI.setSwiftPrivate(EnumConstant.SwiftPrivate);
977 ECI.SwiftName = std::string(EnumConstant.SwiftName);
978 Writer.addEnumConstant(EnumConstant.Name, ECI, SwiftVersion);
979 }
980
981 // Write all tags.
982 llvm::StringSet<> KnownTags;
983 for (const auto &Tag : TLItems.Tags) {
984 // Check for duplicate tag definitions.
985 if (!KnownTags.insert(Tag.Name).second) {
986 emitError(llvm::Twine("multiple definitions of tag '") + Tag.Name +
987 "'");
988 continue;
989 }
990
991 TagInfo TI;
992 convertCommonType(Tag, TI, Tag.Name);
993
994 if ((Tag.SwiftRetainOp || Tag.SwiftReleaseOp) && !Tag.SwiftImportAs) {
995 emitError(llvm::Twine("should declare SwiftImportAs to use "
996 "SwiftRetainOp and SwiftReleaseOp (for ") +
997 Tag.Name + ")");
998 continue;
999 }
1000 if (Tag.SwiftReleaseOp.has_value() != Tag.SwiftRetainOp.has_value()) {
1001 emitError(llvm::Twine("should declare both SwiftReleaseOp and "
1002 "SwiftRetainOp (for ") +
1003 Tag.Name + ")");
1004 continue;
1005 }
1006
1007 if (Tag.SwiftImportAs)
1008 TI.SwiftImportAs = Tag.SwiftImportAs;
1009 if (Tag.SwiftRetainOp)
1010 TI.SwiftRetainOp = Tag.SwiftRetainOp;
1011 if (Tag.SwiftReleaseOp)
1012 TI.SwiftReleaseOp = Tag.SwiftReleaseOp;
1013
1014 if (Tag.SwiftCopyable)
1015 TI.setSwiftCopyable(Tag.SwiftCopyable);
1016
1017 if (Tag.EnumConvenienceKind) {
1018 if (Tag.EnumExtensibility) {
1019 emitError(
1020 llvm::Twine("cannot mix EnumKind and EnumExtensibility (for ") +
1021 Tag.Name + ")");
1022 continue;
1023 }
1024 if (Tag.FlagEnum) {
1025 emitError(llvm::Twine("cannot mix EnumKind and FlagEnum (for ") +
1026 Tag.Name + ")");
1027 continue;
1028 }
1029 switch (*Tag.EnumConvenienceKind) {
1030 case EnumConvenienceAliasKind::None:
1031 TI.EnumExtensibility = EnumExtensibilityKind::None;
1032 TI.setFlagEnum(false);
1033 break;
1034 case EnumConvenienceAliasKind::CFEnum:
1035 TI.EnumExtensibility = EnumExtensibilityKind::Open;
1036 TI.setFlagEnum(false);
1037 break;
1038 case EnumConvenienceAliasKind::CFOptions:
1039 TI.EnumExtensibility = EnumExtensibilityKind::Open;
1040 TI.setFlagEnum(true);
1041 break;
1042 case EnumConvenienceAliasKind::CFClosedEnum:
1043 TI.EnumExtensibility = EnumExtensibilityKind::Closed;
1044 TI.setFlagEnum(false);
1045 break;
1046 }
1047 } else {
1048 TI.EnumExtensibility = Tag.EnumExtensibility;
1049 TI.setFlagEnum(Tag.FlagEnum);
1050 }
1051
1052 Writer.addTag(Ctx, Tag.Name, TI, SwiftVersion);
1053 }
1054
1055 // Write all typedefs.
1056 llvm::StringSet<> KnownTypedefs;
1057 for (const auto &Typedef : TLItems.Typedefs) {
1058 // Check for duplicate typedef definitions.
1059 if (!KnownTypedefs.insert(Typedef.Name).second) {
1060 emitError(llvm::Twine("multiple definitions of typedef '") +
1061 Typedef.Name + "'");
1062 continue;
1063 }
1064
1065 TypedefInfo TInfo;
1066 convertCommonType(Typedef, TInfo, Typedef.Name);
1067 TInfo.SwiftWrapper = Typedef.SwiftType;
1068
1069 Writer.addTypedef(Ctx, Typedef.Name, TInfo, SwiftVersion);
1070 }
1071 }
1072
1073 bool convertModule() {
1074 // Write the top-level items.
1075 convertTopLevelItems(/* context */ std::nullopt, M.TopLevel,
1076 VersionTuple());
1077
1078 // Convert the versioned information.
1079 for (const auto &Versioned : M.SwiftVersions)
1080 convertTopLevelItems(/* context */ std::nullopt, Versioned.Items,
1081 Versioned.Version);
1082
1083 if (!ErrorOccured)
1084 Writer.writeToStream(OS);
1085
1086 return ErrorOccured;
1087 }
1088};
1089} // namespace
1090
1091static bool compile(const Module &M, const FileEntry *SourceFile,
1092 llvm::raw_ostream &OS,
1093 llvm::SourceMgr::DiagHandlerTy DiagHandler,
1094 void *DiagHandlerCtxt) {
1095 YAMLConverter C(M, SourceFile, OS, DiagHandler, DiagHandlerCtxt);
1096 return C.convertModule();
1097}
1098
1099/// Simple diagnostic handler that prints diagnostics to standard error.
1100static void printDiagnostic(const llvm::SMDiagnostic &Diag, void *Context) {
1101 Diag.print(nullptr, llvm::errs());
1102}
1103
1104bool api_notes::compileAPINotes(StringRef YAMLInput,
1105 const FileEntry *SourceFile,
1106 llvm::raw_ostream &OS,
1107 llvm::SourceMgr::DiagHandlerTy DiagHandler,
1108 void *DiagHandlerCtxt) {
1109 Module TheModule;
1110
1111 if (!DiagHandler)
1112 DiagHandler = &printDiagnostic;
1113
1114 if (parseAPINotes(YAMLInput, TheModule, DiagHandler, DiagHandlerCtxt))
1115 return true;
1116
1117 return compile(TheModule, SourceFile, OS, DiagHandler, DiagHandlerCtxt);
1118}
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:3284
StringRef P
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:1813
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.
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)
ContextID addObjCContext(std::optional< ContextID > ParentCtxID, llvm::StringRef Name, ContextKind Kind, const ObjCContextInfo &Info, llvm::VersionTuple SwiftVersion)
Add information about a specific Objective-C class or protocol or a C++ namespace.
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 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 enumerator.
Definition: Types.h:666
API notes for a function or method.
Definition: Types.h:495
void addTypeInfo(unsigned index, NullabilityKind kind)
Definition: Types.h:538
void setRetainCountConvention(std::optional< RetainCountConventionKind > Value)
Definition: Types.h:578
std::vector< ParamInfo > Params
The function parameters.
Definition: Types.h:528
unsigned NumAdjustedNullable
Number of types whose nullability is encoded with the NullabilityPayload.
Definition: Types.h:512
std::string ResultType
The result type of this function, as a C type.
Definition: Types.h:525
static unsigned getMaxNullabilityIndex()
Definition: Types.h:534
unsigned NullabilityAudited
Whether the signature has been audited with respect to nullability.
Definition: Types.h:509
Describes API notes data for a global function.
Definition: Types.h:660
Describes API notes data for a global variable.
Definition: Types.h:654
Describes API notes data for an Objective-C class or protocol.
Definition: Types.h:196
void setSwiftObjCMembers(std::optional< bool > Value)
Definition: Types.h:260
void setSwiftImportAsNonGeneric(std::optional< bool > Value)
Definition: Types.h:251
void setDefaultNullability(NullabilityKind Kind)
Set the default nullability for properties and methods of this class.
Definition: Types.h:238
Describes API notes data for an Objective-C method.
Definition: Types.h:615
unsigned DesignatedInit
Whether this is a designated initializer of its class.
Definition: Types.h:619
unsigned RequiredInit
Whether this is a required initializer.
Definition: Types.h:623
Describes API notes data for an Objective-C property.
Definition: Types.h:367
void setSwiftImportAsAccessors(std::optional< bool > Value)
Definition: Types.h:382
Describes a function or method parameter.
Definition: Types.h:425
void setNoEscape(std::optional< bool > Value)
Definition: Types.h:448
void setRetainCountConvention(std::optional< RetainCountConventionKind > Value)
Definition: Types.h:459
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:332
void setType(const std::string &type)
Definition: Types.h:338
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
Definition: Format.h:5394
#define false
Definition: stdbool.h:22
A temporary reference to an Objective-C selector, suitable for referencing selector data on the stack...
Definition: Types.h:813
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)