clang  19.0.0git
API.h
Go to the documentation of this file.
1 //===- ExtractAPI/API.h -----------------------------------------*- 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 /// \file
10 /// This file defines the APIRecord-based structs and the APISet class.
11 ///
12 /// Clang ExtractAPI is a tool to collect API information from a given set of
13 /// header files. The structures in this file describe data representations of
14 /// the API information collected for various kinds of symbols.
15 ///
16 //===----------------------------------------------------------------------===//
17 
18 #ifndef LLVM_CLANG_EXTRACTAPI_API_H
19 #define LLVM_CLANG_EXTRACTAPI_API_H
20 
21 #include "clang/AST/Availability.h"
22 #include "clang/AST/Decl.h"
23 #include "clang/AST/DeclBase.h"
24 #include "clang/AST/DeclObjC.h"
27 #include "clang/Basic/Specifiers.h"
29 #include "llvm/ADT/ArrayRef.h"
30 #include "llvm/ADT/MapVector.h"
31 #include "llvm/ADT/StringRef.h"
32 #include "llvm/Support/Allocator.h"
33 #include "llvm/Support/Casting.h"
34 #include "llvm/Support/Compiler.h"
35 #include "llvm/Support/ErrorHandling.h"
36 #include "llvm/Support/raw_ostream.h"
37 #include "llvm/TargetParser/Triple.h"
38 #include <cstddef>
39 #include <iterator>
40 #include <memory>
41 #include <optional>
42 #include <type_traits>
43 
44 namespace clang {
45 namespace extractapi {
46 
47 class Template {
48  struct TemplateParameter {
49  // "class", "typename", or concept name
50  std::string Type;
51  std::string Name;
52  unsigned int Index;
53  unsigned int Depth;
54  bool IsParameterPack;
55 
56  TemplateParameter(std::string Type, std::string Name, unsigned int Index,
57  unsigned int Depth, bool IsParameterPack)
58  : Type(Type), Name(Name), Index(Index), Depth(Depth),
59  IsParameterPack(IsParameterPack) {}
60  };
61 
62  struct TemplateConstraint {
63  // type name of the constraint, if it has one
64  std::string Type;
65  std::string Kind;
66  std::string LHS, RHS;
67  };
70 
71 public:
72  Template() = default;
73 
75  for (auto *const Parameter : *Decl->getTemplateParameters()) {
76  const auto *Param = dyn_cast<TemplateTypeParmDecl>(Parameter);
77  if (!Param) // some params are null
78  continue;
79  std::string Type;
80  if (Param->hasTypeConstraint())
81  Type = Param->getTypeConstraint()->getNamedConcept()->getName().str();
82  else if (Param->wasDeclaredWithTypename())
83  Type = "typename";
84  else
85  Type = "class";
86 
87  addTemplateParameter(Type, Param->getName().str(), Param->getIndex(),
88  Param->getDepth(), Param->isParameterPack());
89  }
90  }
91 
93  for (auto *const Parameter : *Decl->getTemplateParameters()) {
94  const auto *Param = dyn_cast<TemplateTypeParmDecl>(Parameter);
95  if (!Param) // some params are null
96  continue;
97  std::string Type;
98  if (Param->hasTypeConstraint())
99  Type = Param->getTypeConstraint()->getNamedConcept()->getName().str();
100  else if (Param->wasDeclaredWithTypename())
101  Type = "typename";
102  else
103  Type = "class";
104 
105  addTemplateParameter(Type, Param->getName().str(), Param->getIndex(),
106  Param->getDepth(), Param->isParameterPack());
107  }
108  }
109 
111  for (auto *const Parameter : *Decl->getTemplateParameters()) {
112  const auto *Param = dyn_cast<TemplateTypeParmDecl>(Parameter);
113  if (!Param) // some params are null
114  continue;
115  std::string Type;
116  if (Param->hasTypeConstraint())
117  Type = Param->getTypeConstraint()->getNamedConcept()->getName().str();
118  else if (Param->wasDeclaredWithTypename())
119  Type = "typename";
120  else
121  Type = "class";
122 
123  addTemplateParameter(Type, Param->getName().str(), Param->getIndex(),
124  Param->getDepth(), Param->isParameterPack());
125  }
126  }
127 
129  return Parameters;
130  }
131 
133  return Constraints;
134  }
135 
136  void addTemplateParameter(std::string Type, std::string Name,
137  unsigned int Index, unsigned int Depth,
138  bool IsParameterPack) {
139  Parameters.emplace_back(Type, Name, Index, Depth, IsParameterPack);
140  }
141 
142  bool empty() const { return Parameters.empty() && Constraints.empty(); }
143 };
144 
145 /// DocComment is a vector of RawComment::CommentLine.
146 ///
147 /// Each line represents one line of striped documentation comment,
148 /// with source range information. This simplifies calculating the source
149 /// location of a character in the doc comment for pointing back to the source
150 /// file.
151 /// e.g.
152 /// \code
153 /// /// This is a documentation comment
154 /// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' First line.
155 /// /// with multiple lines.
156 /// ^~~~~~~~~~~~~~~~~~~~~~~' Second line.
157 /// \endcode
158 using DocComment = std::vector<RawComment::CommentLine>;
159 
160 struct APIRecord;
161 
162 // This represents a reference to another symbol that might come from external
163 /// sources.
165  StringRef Name;
166  StringRef USR;
167 
168  /// The source project/module/product of the referred symbol.
169  StringRef Source;
170 
171  // A Pointer to the APIRecord for this reference if known
172  const APIRecord *Record = nullptr;
173 
174  SymbolReference() = default;
175  SymbolReference(StringRef Name, StringRef USR, StringRef Source = "")
176  : Name(Name), USR(USR), Source(Source) {}
177  SymbolReference(const APIRecord *R);
178 
179  /// Determine if this SymbolReference is empty.
180  ///
181  /// \returns true if and only if all \c Name, \c USR, and \c Source is empty.
182  bool empty() const { return Name.empty() && USR.empty() && Source.empty(); }
183 };
184 
185 class RecordContext;
186 
187 // Concrete classes deriving from APIRecord need to have a construct with first
188 // arguments USR, and Name, in that order. This is so that they
189 // are compatible with `APISet::createRecord`.
190 // When adding a new kind of record don't forget to update APIRecords.inc!
191 /// The base representation of an API record. Holds common symbol information.
192 struct APIRecord {
193  /// Discriminator for LLVM-style RTTI (dyn_cast<> et al.)
194  enum RecordKind {
196  // If adding a record context record kind here make sure to update
197  // RecordContext::classof if needed and add a RECORD_CONTEXT entry to
198  // APIRecords.inc
239  };
240 
241  StringRef USR;
242  StringRef Name;
243 
245 
249 
250  /// Documentation comment lines attached to this symbol declaration.
252 
253  /// Declaration fragments of this symbol declaration.
255 
256  /// SubHeading provides a more detailed representation than the plain
257  /// declaration name.
258  ///
259  /// SubHeading is an array of declaration fragments of tagged declaration
260  /// name, with potentially more tokens (for example the \c +/- symbol for
261  /// Objective-C class/instance methods).
263 
264  /// Whether the symbol was defined in a system header.
266 
268 
270 
271 private:
272  const RecordKind Kind;
273  friend class RecordContext;
274  // Used to store the next child record in RecordContext. This works because
275  // APIRecords semantically only have one parent.
276  mutable APIRecord *NextInContext = nullptr;
277 
278 public:
279  APIRecord *getNextInContext() const { return NextInContext; }
280 
281  RecordKind getKind() const { return Kind; }
283 
284  static APIRecord *castFromRecordContext(const RecordContext *Ctx);
286 
287  APIRecord() = delete;
288 
289  APIRecord(RecordKind Kind, StringRef USR, StringRef Name,
295  : USR(USR), Name(Name), Parent(std::move(Parent)), Location(Location),
300 
301  APIRecord(RecordKind Kind, StringRef USR, StringRef Name)
303 
304  // Pure virtual destructor to make APIRecord abstract
305  virtual ~APIRecord() = 0;
306  static bool classof(const APIRecord *Record) { return true; }
307  static bool classofKind(RecordKind K) { return true; }
308  static bool classof(const RecordContext *Ctx) { return true; }
309 };
310 
311 /// Base class used for specific record types that have children records this is
312 /// analogous to the DeclContext for the AST
314 public:
315  static bool classof(const APIRecord *Record) {
316  return classofKind(Record->getKind());
317  }
321  }
322 
323  static bool classof(const RecordContext *Context) { return true; }
324 
325  RecordContext(APIRecord::RecordKind Kind) : Kind(Kind) {}
326 
327  /// Append \p Other children chain into ours and empty out Other's record
328  /// chain.
329  void stealRecordChain(RecordContext &Other);
330 
331  APIRecord::RecordKind getKind() const { return Kind; }
332 
334  private:
335  APIRecord *Current = nullptr;
336 
337  public:
339  using reference = const value_type &;
340  using pointer = const value_type *;
341  using iterator_category = std::forward_iterator_tag;
343 
344  record_iterator() = default;
345  explicit record_iterator(value_type R) : Current(R) {}
346  reference operator*() const { return Current; }
347  // This doesn't strictly meet the iterator requirements, but it's the
348  // behavior we want here.
349  value_type operator->() const { return Current; }
351  Current = Current->getNextInContext();
352  return *this;
353  }
355  record_iterator tmp(*this);
356  ++(*this);
357  return tmp;
358  }
359 
361  return x.Current == y.Current;
362  }
364  return x.Current != y.Current;
365  }
366  };
367 
368  using record_range = llvm::iterator_range<record_iterator>;
371  }
372  record_iterator records_begin() const { return record_iterator(First); };
374  bool records_empty() const { return First == nullptr; };
375 
376 private:
378  mutable APIRecord *First = nullptr;
379  mutable APIRecord *Last = nullptr;
380  bool IsWellFormed() const;
381 
382 protected:
383  friend class APISet;
384  void addToRecordChain(APIRecord *) const;
385 };
386 
397 
398  static bool classof(const APIRecord *Record) {
399  return classofKind(Record->getKind());
400  }
401  static bool classofKind(RecordKind K) { return K == RK_Namespace; }
402 };
403 
404 /// This holds information associated with global functions.
407 
417  Signature(Signature) {}
418 
419  GlobalFunctionRecord(RecordKind Kind, StringRef USR, StringRef Name,
422  const DocComment &Comment,
426  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
429  Signature(Signature) {}
430 
431  static bool classof(const APIRecord *Record) {
432  return classofKind(Record->getKind());
433  }
434  static bool classofKind(RecordKind K) { return K == RK_GlobalFunction; }
435 
436 private:
437  virtual void anchor();
438 };
439 
442 
443  GlobalFunctionTemplateRecord(StringRef USR, StringRef Name,
450  bool IsFromSystemHeader)
452  std::move(Availability), Linkage, Comment,
455  Templ(Template) {}
456 
457  static bool classof(const APIRecord *Record) {
458  return classofKind(Record->getKind());
459  }
460  static bool classofKind(RecordKind K) {
461  return K == RK_GlobalFunctionTemplate;
462  }
463 };
464 
467  StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc,
471  bool IsFromSystemHeader)
473  Parent, Loc, std::move(Availability), Linkage,
476 
477  static bool classof(const APIRecord *Record) {
478  return classofKind(Record->getKind());
479  }
480  static bool classofKind(RecordKind K) {
482  }
483 };
484 
485 /// This holds information associated with global functions.
496 
497  GlobalVariableRecord(RecordKind Kind, StringRef USR, StringRef Name,
500  const DocComment &Comment,
503  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
506  RecordContext(Kind) {}
507 
508  static bool classof(const APIRecord *Record) {
509  return classofKind(Record->getKind());
510  }
511  static bool classofKind(RecordKind K) {
512  return K == RK_GlobalVariable || K == RK_GlobalVariableTemplate ||
515  }
516 
517 private:
518  virtual void anchor();
519 };
520 
523 
524  GlobalVariableTemplateRecord(StringRef USR, StringRef Name,
532  std::move(Availability), Linkage, Comment,
534  Templ(Template) {}
535 
536  static bool classof(const APIRecord *Record) {
537  return classofKind(Record->getKind());
538  }
539  static bool classofKind(RecordKind K) {
540  return K == RK_GlobalVariableTemplate;
541  }
542 };
543 
546  StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc,
551  Parent, Loc, std::move(Availability), Linkage,
554 
555  static bool classof(const APIRecord *Record) {
556  return classofKind(Record->getKind());
557  }
558  static bool classofKind(RecordKind K) {
560  }
561 };
562 
566 
568  StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc,
572  bool IsFromSystemHeader)
574  USR, Name, Parent, Loc, std::move(Availability),
577  Templ(Template) {}
578 
579  static bool classof(const APIRecord *Record) {
580  return classofKind(Record->getKind());
581  }
582  static bool classofKind(RecordKind K) {
584  }
585 };
586 
587 /// This holds information associated with enum constants.
591  const DocComment &Comment,
595  std::move(Availability), LinkageInfo::none(), Comment,
597 
598  static bool classof(const APIRecord *Record) {
599  return classofKind(Record->getKind());
600  }
601  static bool classofKind(RecordKind K) { return K == RK_EnumConstant; }
602 
603 private:
604  virtual void anchor();
605 };
606 
608  TagRecord(RecordKind Kind, StringRef USR, StringRef Name,
614  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
616  IsFromSystemHeader, std::move(Access)),
617  RecordContext(Kind),
619 
620  static bool classof(const APIRecord *Record) {
621  return classofKind(Record->getKind());
622  }
623  static bool classofKind(RecordKind K) {
624  return K == RK_Struct || K == RK_Union || K == RK_Enum;
625  }
626 
628 
629  virtual ~TagRecord() = 0;
630 };
631 
632 /// This holds information associated with enums.
634  EnumRecord(StringRef USR, StringRef Name, SymbolReference Parent,
643 
644  static bool classof(const APIRecord *Record) {
645  return classofKind(Record->getKind());
646  }
647 
648  static bool classofKind(RecordKind K) { return K == RK_Enum; }
649 
650 private:
651  virtual void anchor();
652 };
653 
654 /// This holds information associated with struct or union fields fields.
656  RecordFieldRecord(RecordKind Kind, StringRef USR, StringRef Name,
661  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
664  RecordContext(Kind) {}
665 
666  static bool classof(const APIRecord *Record) {
667  return classofKind(Record->getKind());
668  }
669  static bool classofKind(RecordKind K) {
670  return K == RK_StructField || K == RK_UnionField;
671  }
672 
673  virtual ~RecordFieldRecord() = 0;
674 };
675 
676 /// This holds information associated with structs and unions.
678  RecordRecord(RecordKind Kind, StringRef USR, StringRef Name,
685  : TagRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
688 
689  static bool classof(const APIRecord *Record) {
690  return classofKind(Record->getKind());
691  }
692  static bool classofKind(RecordKind K) {
693  return K == RK_Struct || K == RK_Union;
694  }
695 
696  bool isAnonymousWithNoTypedef() { return Name.empty(); }
697 
698  virtual ~RecordRecord() = 0;
699 };
700 
709 
710  static bool classof(const APIRecord *Record) {
711  return classofKind(Record->getKind());
712  }
713  static bool classofKind(RecordKind K) { return K == RK_StructField; }
714 
715 private:
716  virtual void anchor();
717 };
718 
720  StructRecord(StringRef USR, StringRef Name, SymbolReference Parent,
728 
729  static bool classof(const APIRecord *Record) {
730  return classofKind(Record->getKind());
731  }
732  static bool classofKind(RecordKind K) { return K == RK_Struct; }
733 
734 private:
735  virtual void anchor();
736 };
737 
746 
747  static bool classof(const APIRecord *Record) {
748  return classofKind(Record->getKind());
749  }
750  static bool classofKind(RecordKind K) { return K == RK_UnionField; }
751 
752 private:
753  virtual void anchor();
754 };
755 
757  UnionRecord(StringRef USR, StringRef Name, SymbolReference Parent,
765 
766  static bool classof(const APIRecord *Record) {
767  return classofKind(Record->getKind());
768  }
769  static bool classofKind(RecordKind K) { return K == RK_Union; }
770 
771 private:
772  virtual void anchor();
773 };
774 
780  bool IsFromSystemHeader)
783  IsFromSystemHeader, std::move(Access)),
785 
786  CXXFieldRecord(RecordKind Kind, StringRef USR, StringRef Name,
791  bool IsFromSystemHeader)
792  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
794  IsFromSystemHeader, std::move(Access)),
795  RecordContext(Kind) {}
796 
797  static bool classof(const APIRecord *Record) {
798  return classofKind(Record->getKind());
799  }
800  static bool classofKind(RecordKind K) {
801  return K == RK_CXXField || K == RK_CXXFieldTemplate || K == RK_StaticField;
802  }
803 
804 private:
805  virtual void anchor();
806 };
807 
810 
813  const DocComment &Comment,
820  Templ(Template) {}
821 
822  static bool classof(const APIRecord *Record) {
823  return classofKind(Record->getKind());
824  }
825  static bool classofKind(RecordKind K) { return K == RK_CXXFieldTemplate; }
826 };
827 
830 
831  CXXMethodRecord() = delete;
832 
833  CXXMethodRecord(RecordKind Kind, StringRef USR, StringRef Name,
839  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
841  IsFromSystemHeader, std::move(Access)),
842  Signature(Signature) {}
843 
844  virtual ~CXXMethodRecord() = 0;
845 };
846 
850  const DocComment &Comment,
854  bool IsFromSystemHeader)
857  SubHeading, Signature, std::move(Access),
859  static bool classof(const APIRecord *Record) {
860  return classofKind(Record->getKind());
861  }
862  static bool classofKind(RecordKind K) { return K == RK_CXXConstructorMethod; }
863 
864 private:
865  virtual void anchor();
866 };
867 
871  const DocComment &Comment,
875  bool IsFromSystemHeader)
878  SubHeading, Signature, std::move(Access),
880  static bool classof(const APIRecord *Record) {
881  return classofKind(Record->getKind());
882  }
883  static bool classofKind(RecordKind K) { return K == RK_CXXDestructorMethod; }
884 
885 private:
886  virtual void anchor();
887 };
888 
892  const DocComment &Comment,
896  bool IsFromSystemHeader)
899  SubHeading, Signature, std::move(Access),
901  static bool classof(const APIRecord *Record) {
902  return classofKind(Record->getKind());
903  }
904  static bool classofKind(RecordKind K) { return K == RK_CXXStaticMethod; }
905 
906 private:
907  virtual void anchor();
908 };
909 
913  const DocComment &Comment,
917  bool IsFromSystemHeader)
920  SubHeading, Signature, std::move(Access),
922 
923  static bool classof(const APIRecord *Record) {
924  return classofKind(Record->getKind());
925  }
926  static bool classofKind(RecordKind K) { return K == RK_CXXInstanceMethod; }
927 
928 private:
929  virtual void anchor();
930 };
931 
934 
937  const DocComment &Comment,
944  SubHeading, Signature, std::move(Access),
946  Templ(Template) {}
947 
948  static bool classof(const APIRecord *Record) {
949  return classofKind(Record->getKind());
950  }
951  static bool classofKind(RecordKind K) { return K == RK_CXXMethodTemplate; }
952 };
953 
956  StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc,
960  bool IsFromSystemHeader)
963  SubHeading, Signature, std::move(Access),
965 
966  static bool classof(const APIRecord *Record) {
967  return classofKind(Record->getKind());
968  }
969  static bool classofKind(RecordKind K) {
971  }
972 };
973 
974 /// This holds information associated with Objective-C properties.
976  /// The attributes associated with an Objective-C property.
977  enum AttributeKind : unsigned {
978  NoAttr = 0,
979  ReadOnly = 1,
980  Dynamic = 1 << 2,
981  };
982 
984  StringRef GetterName;
985  StringRef SetterName;
987 
988  ObjCPropertyRecord(RecordKind Kind, StringRef USR, StringRef Name,
993  StringRef GetterName, StringRef SetterName,
994  bool IsOptional, bool IsFromSystemHeader)
995  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
1000 
1001  bool isReadOnly() const { return Attributes & ReadOnly; }
1002  bool isDynamic() const { return Attributes & Dynamic; }
1003 
1004  virtual ~ObjCPropertyRecord() = 0;
1005 };
1006 
1009  StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc,
1012  AttributeKind Attributes, StringRef GetterName, StringRef SetterName,
1013  bool IsOptional, bool IsFromSystemHeader)
1018 
1019  static bool classof(const APIRecord *Record) {
1020  return classofKind(Record->getKind());
1021  }
1022  static bool classofKind(RecordKind K) { return K == RK_ObjCInstanceProperty; }
1023 
1024 private:
1025  virtual void anchor();
1026 };
1027 
1031  const DocComment &Comment,
1034  AttributeKind Attributes, StringRef GetterName,
1035  StringRef SetterName, bool IsOptional,
1036  bool IsFromSystemHeader)
1041 
1042  static bool classof(const APIRecord *Record) {
1043  return classofKind(Record->getKind());
1044  }
1045  static bool classofKind(RecordKind K) { return K == RK_ObjCClassProperty; }
1046 
1047 private:
1048  virtual void anchor();
1049 };
1050 
1051 /// This holds information associated with Objective-C instance variables.
1053  ObjCInstanceVariableRecord(StringRef USR, StringRef Name,
1056  const DocComment &Comment,
1059  bool IsFromSystemHeader)
1062  IsFromSystemHeader) {}
1063 
1064  static bool classof(const APIRecord *Record) {
1065  return classofKind(Record->getKind());
1066  }
1067  static bool classofKind(RecordKind K) { return K == RK_ObjCIvar; }
1068 
1069 private:
1070  virtual void anchor();
1071 };
1072 
1073 /// This holds information associated with Objective-C methods.
1076 
1077  ObjCMethodRecord() = delete;
1078 
1079  ObjCMethodRecord(RecordKind Kind, StringRef USR, StringRef Name,
1084  bool IsFromSystemHeader)
1085  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
1088  Signature(Signature) {}
1089 
1090  virtual ~ObjCMethodRecord() = 0;
1091 };
1092 
1094  ObjCInstanceMethodRecord(StringRef USR, StringRef Name,
1097  const DocComment &Comment,
1104  static bool classof(const APIRecord *Record) {
1105  return classofKind(Record->getKind());
1106  }
1107  static bool classofKind(RecordKind K) { return K == RK_ObjCInstanceMethod; }
1108 
1109 private:
1110  virtual void anchor();
1111 };
1112 
1116  const DocComment &Comment,
1123 
1124  static bool classof(const APIRecord *Record) {
1125  return classofKind(Record->getKind());
1126  }
1127  static bool classofKind(RecordKind K) { return K == RK_ObjCClassMethod; }
1128 
1129 private:
1130  virtual void anchor();
1131 };
1132 
1139  bool IsFromSystemHeader)
1143 
1144  static bool classof(const APIRecord *Record) {
1145  return classofKind(Record->getKind());
1146  }
1147  static bool classofKind(RecordKind K) { return K == RK_StaticField; }
1148 };
1149 
1150 /// The base representation of an Objective-C container record. Holds common
1151 /// information associated with Objective-C containers.
1154 
1156 
1157  ObjCContainerRecord(RecordKind Kind, StringRef USR, StringRef Name,
1160  const DocComment &Comment,
1163  : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
1166  RecordContext(Kind) {}
1167 
1168  virtual ~ObjCContainerRecord() = 0;
1169 };
1170 
1173 
1179  bool IsEmbeddedInVarDeclarator = false)
1180  : RecordRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
1183 
1184  static bool classof(const APIRecord *Record) {
1185  return classofKind(Record->getKind());
1186  }
1187  static bool classofKind(RecordKind K) {
1188  return K == RK_CXXClass || K == RK_ClassTemplate ||
1191  }
1192 
1193 private:
1194  virtual void anchor();
1195 };
1196 
1199 
1202  const DocComment &Comment,
1208  std::move(Access), IsFromSystemHeader),
1209  Templ(Template) {}
1210 
1211  static bool classof(const APIRecord *Record) {
1212  return classofKind(Record->getKind());
1213  }
1214  static bool classofKind(RecordKind K) { return K == RK_ClassTemplate; }
1215 };
1216 
1219  StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc,
1226 
1227  static bool classof(const APIRecord *Record) {
1228  return classofKind(Record->getKind());
1229  }
1230  static bool classofKind(RecordKind K) {
1231  return K == RK_ClassTemplateSpecialization;
1232  }
1233 };
1234 
1238  StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc,
1246  Templ(Template) {}
1247 
1248  static bool classof(const APIRecord *Record) {
1249  return classofKind(Record->getKind());
1250  }
1251  static bool classofKind(RecordKind K) {
1253  }
1254 };
1255 
1258 
1263  bool IsFromSystemHeader)
1267  Templ(Template) {}
1268 
1269  static bool classof(const APIRecord *Record) {
1270  return classofKind(Record->getKind());
1271  }
1272  static bool classofKind(RecordKind K) { return K == RK_Concept; }
1273 };
1274 
1275 /// This holds information associated with Objective-C categories.
1278 
1281  const DocComment &Comment,
1284  bool IsFromSystemHeader)
1286  std::move(Availability), LinkageInfo::none(),
1289  Interface(Interface) {}
1290 
1291  static bool classof(const APIRecord *Record) {
1292  return classofKind(Record->getKind());
1293  }
1294  static bool classofKind(RecordKind K) { return K == RK_ObjCCategory; }
1295 
1296  bool isExtendingExternalModule() const { return !Interface.Source.empty(); }
1297 
1298  std::optional<StringRef> getExtendedExternalModule() const {
1300  return {};
1301  return Interface.Source;
1302  }
1303 
1304 private:
1305  virtual void anchor();
1306 };
1307 
1308 /// This holds information associated with Objective-C interfaces/classes.
1311 
1319  std::move(Availability), Linkage, Comment,
1322 
1323  static bool classof(const APIRecord *Record) {
1324  return classofKind(Record->getKind());
1325  }
1326  static bool classofKind(RecordKind K) { return K == RK_ObjCInterface; }
1327 
1328 private:
1329  virtual void anchor();
1330 };
1331 
1332 /// This holds information associated with Objective-C protocols.
1336  const DocComment &Comment,
1340  std::move(Availability), LinkageInfo::none(),
1342  IsFromSystemHeader) {}
1343 
1344  static bool classof(const APIRecord *Record) {
1345  return classofKind(Record->getKind());
1346  }
1347  static bool classofKind(RecordKind K) { return K == RK_ObjCProtocol; }
1348 
1349 private:
1350  virtual void anchor();
1351 };
1352 
1353 /// This holds information associated with macro definitions.
1358  bool IsFromSystemHeader)
1362 
1363  static bool classof(const APIRecord *Record) {
1364  return classofKind(Record->getKind());
1365  }
1366  static bool classofKind(RecordKind K) { return K == RK_MacroDefinition; }
1367 
1368 private:
1369  virtual void anchor();
1370 };
1371 
1372 /// This holds information associated with typedefs.
1373 ///
1374 /// Note: Typedefs for anonymous enums and structs typically don't get emitted
1375 /// by the serializers but still get a TypedefRecord. Instead we use the
1376 /// typedef name as a name for the underlying anonymous struct or enum.
1379 
1384  bool IsFromSystemHeader)
1389 
1390  static bool classof(const APIRecord *Record) {
1391  return classofKind(Record->getKind());
1392  }
1393  static bool classofKind(RecordKind K) { return K == RK_Typedef; }
1394 
1395 private:
1396  virtual void anchor();
1397 };
1398 
1399 /// APISet holds the set of API records collected from given inputs.
1400 class APISet {
1401 public:
1402  /// Get the target triple for the ExtractAPI invocation.
1403  const llvm::Triple &getTarget() const { return Target; }
1404 
1405  /// Get the language used by the APIs.
1406  Language getLanguage() const { return Lang; }
1407 
1408  /// Finds the APIRecord for a given USR.
1409  ///
1410  /// \returns a pointer to the APIRecord associated with that USR or nullptr.
1411  APIRecord *findRecordForUSR(StringRef USR) const;
1412 
1413  /// Copy \p String into the Allocator in this APISet.
1414  ///
1415  /// \returns a StringRef of the copied string in APISet::Allocator.
1416  StringRef copyString(StringRef String);
1417 
1418  SymbolReference createSymbolReference(StringRef Name, StringRef USR,
1419  StringRef Source = "");
1420 
1421  /// Create a subclass of \p APIRecord and store it in the APISet.
1422  ///
1423  /// \returns A pointer to the created record or the already existing record
1424  /// matching this USR.
1425  template <typename RecordTy, typename... CtorArgsContTy>
1426  typename std::enable_if_t<std::is_base_of_v<APIRecord, RecordTy>, RecordTy> *
1427  createRecord(StringRef USR, StringRef Name, CtorArgsContTy &&...CtorArgs);
1428 
1430  return TopLevelRecords;
1431  }
1432 
1433  APISet(const llvm::Triple &Target, Language Lang,
1434  const std::string &ProductName)
1435  : Target(Target), Lang(Lang), ProductName(ProductName) {}
1436 
1437  // Prevent moves and copies
1438  APISet(const APISet &Other) = delete;
1439  APISet &operator=(const APISet &Other) = delete;
1440  APISet(APISet &&Other) = delete;
1441  APISet &operator=(APISet &&Other) = delete;
1442 
1443 private:
1444  /// BumpPtrAllocator that serves as the memory arena for the allocated objects
1445  llvm::BumpPtrAllocator Allocator;
1446 
1447  const llvm::Triple Target;
1448  const Language Lang;
1449 
1450  struct APIRecordDeleter {
1451  void operator()(APIRecord *Record) { Record->~APIRecord(); }
1452  };
1453 
1454  // Ensure that the destructor of each record is called when the LookupTable is
1455  // destroyed without calling delete operator as the memory for the record
1456  // lives in the BumpPtrAllocator.
1457  using APIRecordStoredPtr = std::unique_ptr<APIRecord, APIRecordDeleter>;
1458  llvm::DenseMap<StringRef, APIRecordStoredPtr> USRBasedLookupTable;
1459  std::vector<const APIRecord *> TopLevelRecords;
1460 
1461 public:
1462  const std::string ProductName;
1463 };
1464 
1465 template <typename RecordTy, typename... CtorArgsContTy>
1466 typename std::enable_if_t<std::is_base_of_v<APIRecord, RecordTy>, RecordTy> *
1467 APISet::createRecord(StringRef USR, StringRef Name,
1468  CtorArgsContTy &&...CtorArgs) {
1469  // Ensure USR refers to a String stored in the allocator.
1470  auto USRString = copyString(USR);
1471  auto Result = USRBasedLookupTable.insert({USRString, nullptr});
1472  RecordTy *Record;
1473 
1474  // Create the record if it does not already exist
1475  if (Result.second) {
1476  Record = new (Allocator) RecordTy(
1477  USRString, copyString(Name), std::forward<CtorArgsContTy>(CtorArgs)...);
1478  // Store the record in the record lookup map
1479  Result.first->second = APIRecordStoredPtr(Record);
1480 
1481  if (auto *ParentContext =
1482  dyn_cast_if_present<RecordContext>(Record->Parent.Record))
1483  ParentContext->addToRecordChain(Record);
1484  else
1485  TopLevelRecords.push_back(Record);
1486  } else {
1487  Record = dyn_cast<RecordTy>(Result.first->second.get());
1488  }
1489 
1490  return Record;
1491 }
1492 
1493 // Helper type for implementing casting to RecordContext pointers.
1494 // Selected when FromTy not a known subclass of RecordContext.
1495 template <typename FromTy,
1496  bool IsKnownSubType = std::is_base_of_v<RecordContext, FromTy>>
1498  static_assert(std::is_base_of_v<APIRecord, FromTy>,
1499  "Can only cast APIRecord and derived classes to RecordContext");
1500 
1501  static bool isPossible(FromTy *From) { return RecordContext::classof(From); }
1502 
1503  static RecordContext *doCast(FromTy *From) {
1504  return APIRecord::castToRecordContext(From);
1505  }
1506 };
1507 
1508 // Selected when FromTy is a known subclass of RecordContext.
1509 template <typename FromTy> struct ToRecordContextCastInfoWrapper<FromTy, true> {
1510  static_assert(std::is_base_of_v<APIRecord, FromTy>,
1511  "Can only cast APIRecord and derived classes to RecordContext");
1512  static bool isPossible(const FromTy *From) { return true; }
1513  static RecordContext *doCast(FromTy *From) {
1514  return static_cast<RecordContext *>(From);
1515  }
1516 };
1517 
1518 // Helper type for implementing casting to RecordContext pointers.
1519 // Selected when ToTy isn't a known subclass of RecordContext
1520 template <typename ToTy,
1521  bool IsKnownSubType = std::is_base_of_v<RecordContext, ToTy>>
1523  static_assert(
1524  std::is_base_of_v<APIRecord, ToTy>,
1525  "Can only class RecordContext to APIRecord and derived classes");
1526 
1527  static bool isPossible(RecordContext *Ctx) {
1528  return ToTy::classofKind(Ctx->getKind());
1529  }
1530 
1531  static ToTy *doCast(RecordContext *Ctx) {
1533  }
1534 };
1535 
1536 // Selected when ToTy is a known subclass of RecordContext.
1537 template <typename ToTy> struct FromRecordContextCastInfoWrapper<ToTy, true> {
1538  static_assert(
1539  std::is_base_of_v<APIRecord, ToTy>,
1540  "Can only class RecordContext to APIRecord and derived classes");
1541  static bool isPossible(RecordContext *Ctx) {
1542  return ToTy::classof(Ctx->getKind());
1543  }
1545  return static_cast<ToTy *>(Ctx);
1546  }
1547 };
1548 
1549 } // namespace extractapi
1550 } // namespace clang
1551 
1552 // Implement APIRecord (and derived classes) to and from RecordContext
1553 // conversions
1554 namespace llvm {
1555 
1556 template <typename FromTy>
1557 struct CastInfo<::clang::extractapi::RecordContext, FromTy *>
1558  : public NullableValueCastFailed<::clang::extractapi::RecordContext *>,
1559  public DefaultDoCastIfPossible<
1560  ::clang::extractapi::RecordContext *, FromTy *,
1561  CastInfo<::clang::extractapi::RecordContext, FromTy *>> {
1562  static inline bool isPossible(FromTy *From) {
1563  return ::clang::extractapi::ToRecordContextCastInfoWrapper<
1564  FromTy>::isPossible(From);
1565  }
1566 
1567  static inline ::clang::extractapi::RecordContext *doCast(FromTy *From) {
1568  return ::clang::extractapi::ToRecordContextCastInfoWrapper<FromTy>::doCast(
1569  From);
1570  }
1571 };
1572 
1573 template <typename FromTy>
1574 struct CastInfo<::clang::extractapi::RecordContext, const FromTy *>
1576  ::clang::extractapi::RecordContext, const FromTy *,
1577  CastInfo<::clang::extractapi::RecordContext, FromTy *>> {};
1578 
1579 template <typename ToTy>
1580 struct CastInfo<ToTy, ::clang::extractapi::RecordContext *>
1581  : public NullableValueCastFailed<ToTy *>,
1582  public DefaultDoCastIfPossible<
1583  ToTy *, ::clang::extractapi::RecordContext *,
1584  CastInfo<ToTy, ::clang::extractapi::RecordContext *>> {
1585  static inline bool isPossible(::clang::extractapi::RecordContext *Ctx) {
1586  return ::clang::extractapi::FromRecordContextCastInfoWrapper<
1587  ToTy>::isPossible(Ctx);
1588  }
1589 
1590  static inline ToTy *doCast(::clang::extractapi::RecordContext *Ctx) {
1591  return ::clang::extractapi::FromRecordContextCastInfoWrapper<ToTy>::doCast(
1592  Ctx);
1593  }
1594 };
1595 
1596 template <typename ToTy>
1597 struct CastInfo<ToTy, const ::clang::extractapi::RecordContext *>
1599  ToTy, const ::clang::extractapi::RecordContext *,
1600  CastInfo<ToTy, ::clang::extractapi::RecordContext *>> {};
1601 
1602 } // namespace llvm
1603 
1604 #endif // LLVM_CLANG_EXTRACTAPI_API_H
int Depth
Definition: ASTDiff.cpp:190
This file defines the Declaration Fragments related classes.
llvm::MachO::Target Target
Definition: MachO.h:50
llvm::MachO::Record Record
Definition: MachO.h:31
SourceLocation Loc
Definition: SemaObjC.cpp:755
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
__PTRDIFF_TYPE__ ptrdiff_t
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Represents an unpacked "presumed" location which can be presented to the user.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Definition: DeclTemplate.h:394
The base class of the type hierarchy.
Definition: Type.h:1813
APISet holds the set of API records collected from given inputs.
Definition: API.h:1400
std::enable_if_t< std::is_base_of_v< APIRecord, RecordTy >, RecordTy > * createRecord(StringRef USR, StringRef Name, CtorArgsContTy &&...CtorArgs)
Create a subclass of APIRecord and store it in the APISet.
Definition: API.h:1467
SymbolReference createSymbolReference(StringRef Name, StringRef USR, StringRef Source="")
Definition: API.cpp:113
Language getLanguage() const
Get the language used by the APIs.
Definition: API.h:1406
ArrayRef< const APIRecord * > getTopLevelRecords() const
Definition: API.h:1429
const std::string ProductName
Definition: API.h:1462
APISet(const APISet &Other)=delete
StringRef copyString(StringRef String)
Copy String into the Allocator in this APISet.
Definition: API.cpp:100
APISet(APISet &&Other)=delete
APISet & operator=(APISet &&Other)=delete
const llvm::Triple & getTarget() const
Get the target triple for the ExtractAPI invocation.
Definition: API.h:1403
APIRecord * findRecordForUSR(StringRef USR) const
Finds the APIRecord for a given USR.
Definition: API.cpp:89
APISet & operator=(const APISet &Other)=delete
APISet(const llvm::Triple &Target, Language Lang, const std::string &ProductName)
Definition: API.h:1433
DeclarationFragments is a vector of tagged important parts of a symbol's declaration.
Store function signature information with DeclarationFragments of the return type and parameters.
Base class used for specific record types that have children records this is analogous to the DeclCon...
Definition: API.h:313
record_iterator records_begin() const
Definition: API.h:372
bool records_empty() const
Definition: API.h:374
static bool classof(const RecordContext *Context)
Definition: API.h:323
llvm::iterator_range< record_iterator > record_range
Definition: API.h:368
APIRecord::RecordKind getKind() const
Definition: API.h:331
record_range records() const
Definition: API.h:369
void stealRecordChain(RecordContext &Other)
Append Other children chain into ours and empty out Other's record chain.
Definition: API.cpp:62
record_iterator records_end() const
Definition: API.h:373
static bool classofKind(APIRecord::RecordKind K)
Definition: API.h:318
void addToRecordChain(APIRecord *) const
Definition: API.cpp:77
RecordContext(APIRecord::RecordKind Kind)
Definition: API.h:325
static bool classof(const APIRecord *Record)
Definition: API.h:315
void addTemplateParameter(std::string Type, std::string Name, unsigned int Index, unsigned int Depth, bool IsParameterPack)
Definition: API.h:136
const llvm::SmallVector< TemplateParameter > & getParameters() const
Definition: API.h:128
Template(const TemplateDecl *Decl)
Definition: API.h:74
const llvm::SmallVector< TemplateConstraint > & getConstraints() const
Definition: API.h:132
Template(const VarTemplatePartialSpecializationDecl *Decl)
Definition: API.h:110
Template(const ClassTemplatePartialSpecializationDecl *Decl)
Definition: API.h:92
bool empty() const
Definition: API.h:142
std::vector< RawComment::CommentLine > DocComment
DocComment is a vector of RawComment::CommentLine.
Definition: API.h:158
The JSON file list parser is used to communicate input to InstallAPI.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition: Linkage.h:24
Language
The language for the input, used to select and validate the language standard and possible actions.
Definition: LangStandard.h:23
@ Parameter
The parameter type of a method or function.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
Definition: DeclTemplate.h:65
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
Definition: Format.h:5433
#define true
Definition: stdbool.h:25
Storage of availability attributes for a declaration.
Definition: Availability.h:64
The base representation of an API record. Holds common symbol information.
Definition: API.h:192
RecordKind getKind() const
Definition: API.h:281
APIRecord(RecordKind Kind, StringRef USR, StringRef Name)
Definition: API.h:301
APIRecord * getNextInContext() const
Definition: API.h:279
DocComment Comment
Documentation comment lines attached to this symbol declaration.
Definition: API.h:251
AvailabilityInfo Availability
Definition: API.h:247
DeclarationFragments Declaration
Declaration fragments of this symbol declaration.
Definition: API.h:254
RecordKind getKindForDisplay() const
Definition: API.h:282
RecordKind KindForDisplay
Definition: API.h:269
APIRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Location, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader, AccessControl Access=AccessControl())
Definition: API.h:289
LinkageInfo Linkage
Definition: API.h:248
virtual ~APIRecord()=0
Definition: API.cpp:118
DeclarationFragments SubHeading
SubHeading provides a more detailed representation than the plain declaration name.
Definition: API.h:262
static APIRecord * castFromRecordContext(const RecordContext *Ctx)
Definition: API.cpp:29
AccessControl Access
Definition: API.h:267
PresumedLoc Location
Definition: API.h:246
static bool classofKind(RecordKind K)
Definition: API.h:307
RecordKind
Discriminator for LLVM-style RTTI (dyn_cast<> et al.)
Definition: API.h:194
@ RK_GlobalFunctionTemplateSpecialization
Definition: API.h:223
@ RK_GlobalVariableTemplatePartialSpecialization
Definition: API.h:219
@ RK_GlobalVariableTemplateSpecialization
Definition: API.h:218
@ RK_ClassTemplatePartialSpecialization
Definition: API.h:210
static RecordContext * castToRecordContext(const APIRecord *Record)
Definition: API.cpp:42
SymbolReference Parent
Definition: API.h:244
static bool classof(const RecordContext *Ctx)
Definition: API.h:308
bool IsFromSystemHeader
Whether the symbol was defined in a system header.
Definition: API.h:265
static bool classof(const APIRecord *Record)
Definition: API.h:306
SmallVector< SymbolReference > Bases
Definition: API.h:1172
static bool classofKind(RecordKind K)
Definition: API.h:1187
static bool classof(const APIRecord *Record)
Definition: API.h:1184
CXXClassRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, RecordKind Kind, AccessControl Access, bool IsFromSystemHeader, bool IsEmbeddedInVarDeclarator=false)
Definition: API.h:1174
CXXConstructorRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:848
static bool classof(const APIRecord *Record)
Definition: API.h:859
static bool classofKind(RecordKind K)
Definition: API.h:862
CXXDestructorRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:869
static bool classofKind(RecordKind K)
Definition: API.h:883
static bool classof(const APIRecord *Record)
Definition: API.h:880
CXXFieldRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:776
static bool classofKind(RecordKind K)
Definition: API.h:800
static bool classof(const APIRecord *Record)
Definition: API.h:797
CXXFieldRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:786
static bool classof(const APIRecord *Record)
Definition: API.h:822
static bool classofKind(RecordKind K)
Definition: API.h:825
CXXFieldTemplateRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, Template Template, bool IsFromSystemHeader)
Definition: API.h:811
static bool classof(const APIRecord *Record)
Definition: API.h:923
static bool classofKind(RecordKind K)
Definition: API.h:926
CXXInstanceMethodRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:911
CXXMethodRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:833
FunctionSignature Signature
Definition: API.h:829
static bool classofKind(RecordKind K)
Definition: API.h:951
static bool classof(const APIRecord *Record)
Definition: API.h:948
CXXMethodTemplateRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, Template Template, bool IsFromSystemHeader)
Definition: API.h:935
static bool classof(const APIRecord *Record)
Definition: API.h:966
CXXMethodTemplateSpecializationRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:955
static bool classof(const APIRecord *Record)
Definition: API.h:901
CXXStaticMethodRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:890
static bool classofKind(RecordKind K)
Definition: API.h:904
ClassTemplatePartialSpecializationRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:1237
static bool classof(const APIRecord *Record)
Definition: API.h:1248
static bool classof(const APIRecord *Record)
Definition: API.h:1211
ClassTemplateRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:1200
static bool classofKind(RecordKind K)
Definition: API.h:1214
ClassTemplateSpecializationRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:1218
static bool classof(const APIRecord *Record)
Definition: API.h:1227
ConceptRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, bool IsFromSystemHeader)
Definition: API.h:1259
static bool classof(const APIRecord *Record)
Definition: API.h:1269
static bool classofKind(RecordKind K)
Definition: API.h:1272
This holds information associated with enum constants.
Definition: API.h:588
EnumConstantRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:589
static bool classofKind(RecordKind K)
Definition: API.h:601
static bool classof(const APIRecord *Record)
Definition: API.h:598
This holds information associated with enums.
Definition: API.h:633
static bool classof(const APIRecord *Record)
Definition: API.h:644
EnumRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader, bool IsEmbeddedInVarDeclarator, AccessControl Access=AccessControl())
Definition: API.h:634
static bool classofKind(RecordKind K)
Definition: API.h:648
static RecordContext * doCast(RecordContext *Ctx)
Definition: API.h:1544
static ToTy * doCast(RecordContext *Ctx)
Definition: API.h:1531
static bool isPossible(RecordContext *Ctx)
Definition: API.h:1527
This holds information associated with global functions.
Definition: API.h:405
GlobalFunctionRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader)
Definition: API.h:419
static bool classof(const APIRecord *Record)
Definition: API.h:431
static bool classofKind(RecordKind K)
Definition: API.h:434
GlobalFunctionRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader)
Definition: API.h:408
GlobalFunctionTemplateRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, Template Template, bool IsFromSystemHeader)
Definition: API.h:443
static bool classofKind(RecordKind K)
Definition: API.h:460
static bool classof(const APIRecord *Record)
Definition: API.h:457
static bool classof(const APIRecord *Record)
Definition: API.h:477
GlobalFunctionTemplateSpecializationRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader)
Definition: API.h:466
This holds information associated with global functions.
Definition: API.h:486
static bool classof(const APIRecord *Record)
Definition: API.h:508
GlobalVariableRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:497
static bool classofKind(RecordKind K)
Definition: API.h:511
GlobalVariableRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:487
GlobalVariableTemplatePartialSpecializationRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, class Template Template, bool IsFromSystemHeader)
Definition: API.h:567
static bool classof(const APIRecord *Record)
Definition: API.h:536
static bool classofKind(RecordKind K)
Definition: API.h:539
GlobalVariableTemplateRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, class Template Template, bool IsFromSystemHeader)
Definition: API.h:524
static bool classof(const APIRecord *Record)
Definition: API.h:555
GlobalVariableTemplateSpecializationRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:545
This holds information associated with macro definitions.
Definition: API.h:1354
static bool classof(const APIRecord *Record)
Definition: API.h:1363
MacroDefinitionRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:1355
static bool classofKind(RecordKind K)
Definition: API.h:1366
static bool classof(const APIRecord *Record)
Definition: API.h:398
NamespaceRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:388
static bool classofKind(RecordKind K)
Definition: API.h:401
This holds information associated with Objective-C categories.
Definition: API.h:1276
static bool classofKind(RecordKind K)
Definition: API.h:1294
ObjCCategoryRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference Interface, bool IsFromSystemHeader)
Definition: API.h:1279
bool isExtendingExternalModule() const
Definition: API.h:1296
static bool classof(const APIRecord *Record)
Definition: API.h:1291
std::optional< StringRef > getExtendedExternalModule() const
Definition: API.h:1298
static bool classofKind(RecordKind K)
Definition: API.h:1127
ObjCClassMethodRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader)
Definition: API.h:1114
static bool classof(const APIRecord *Record)
Definition: API.h:1124
static bool classof(const APIRecord *Record)
Definition: API.h:1042
static bool classofKind(RecordKind K)
Definition: API.h:1045
ObjCClassPropertyRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AttributeKind Attributes, StringRef GetterName, StringRef SetterName, bool IsOptional, bool IsFromSystemHeader)
Definition: API.h:1029
The base representation of an Objective-C container record.
Definition: API.h:1152
SmallVector< SymbolReference > Protocols
Definition: API.h:1153
ObjCContainerRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:1157
static bool classofKind(RecordKind K)
Definition: API.h:1107
ObjCInstanceMethodRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader)
Definition: API.h:1094
static bool classof(const APIRecord *Record)
Definition: API.h:1104
static bool classof(const APIRecord *Record)
Definition: API.h:1019
static bool classofKind(RecordKind K)
Definition: API.h:1022
ObjCInstancePropertyRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AttributeKind Attributes, StringRef GetterName, StringRef SetterName, bool IsOptional, bool IsFromSystemHeader)
Definition: API.h:1008
This holds information associated with Objective-C instance variables.
Definition: API.h:1052
static bool classofKind(RecordKind K)
Definition: API.h:1067
ObjCInstanceVariableRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:1053
static bool classof(const APIRecord *Record)
Definition: API.h:1064
This holds information associated with Objective-C interfaces/classes.
Definition: API.h:1309
static bool classof(const APIRecord *Record)
Definition: API.h:1323
static bool classofKind(RecordKind K)
Definition: API.h:1326
ObjCInterfaceRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference SuperClass, bool IsFromSystemHeader)
Definition: API.h:1312
This holds information associated with Objective-C methods.
Definition: API.h:1074
ObjCMethodRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader)
Definition: API.h:1079
FunctionSignature Signature
Definition: API.h:1075
This holds information associated with Objective-C properties.
Definition: API.h:975
AttributeKind
The attributes associated with an Objective-C property.
Definition: API.h:977
ObjCPropertyRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AttributeKind Attributes, StringRef GetterName, StringRef SetterName, bool IsOptional, bool IsFromSystemHeader)
Definition: API.h:988
This holds information associated with Objective-C protocols.
Definition: API.h:1333
static bool classof(const APIRecord *Record)
Definition: API.h:1344
static bool classofKind(RecordKind K)
Definition: API.h:1347
ObjCProtocolRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:1334
std::forward_iterator_tag iterator_category
Definition: API.h:341
friend bool operator==(record_iterator x, record_iterator y)
Definition: API.h:360
friend bool operator!=(record_iterator x, record_iterator y)
Definition: API.h:363
This holds information associated with struct or union fields fields.
Definition: API.h:655
RecordFieldRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:656
static bool classofKind(RecordKind K)
Definition: API.h:669
static bool classof(const APIRecord *Record)
Definition: API.h:666
This holds information associated with structs and unions.
Definition: API.h:677
RecordRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader, bool IsEmbeddedInVarDeclarator, AccessControl Access=AccessControl())
Definition: API.h:678
static bool classof(const APIRecord *Record)
Definition: API.h:689
static bool classofKind(RecordKind K)
Definition: API.h:692
static bool classof(const APIRecord *Record)
Definition: API.h:1144
static bool classofKind(RecordKind K)
Definition: API.h:1147
StaticFieldRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader)
Definition: API.h:1134
static bool classof(const APIRecord *Record)
Definition: API.h:710
static bool classofKind(RecordKind K)
Definition: API.h:713
StructFieldRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:702
StructRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader, bool IsEmbeddedInVarDeclarator)
Definition: API.h:720
static bool classof(const APIRecord *Record)
Definition: API.h:729
static bool classofKind(RecordKind K)
Definition: API.h:732
bool empty() const
Determine if this SymbolReference is empty.
Definition: API.h:182
SymbolReference(StringRef Name, StringRef USR, StringRef Source="")
Definition: API.h:175
StringRef Source
The source project/module/product of the referred symbol.
Definition: API.h:169
static bool classof(const APIRecord *Record)
Definition: API.h:620
static bool classofKind(RecordKind K)
Definition: API.h:623
TagRecord(RecordKind Kind, StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader, bool IsEmbeddedInVarDeclarator, AccessControl Access=AccessControl())
Definition: API.h:608
virtual ~TagRecord()=0
Definition: API.cpp:119
static RecordContext * doCast(FromTy *From)
Definition: API.h:1503
static bool isPossible(FromTy *From)
Definition: API.h:1501
This holds information associated with typedefs.
Definition: API.h:1377
static bool classofKind(RecordKind K)
Definition: API.h:1393
SymbolReference UnderlyingType
Definition: API.h:1378
TypedefRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference UnderlyingType, bool IsFromSystemHeader)
Definition: API.h:1380
static bool classof(const APIRecord *Record)
Definition: API.h:1390
static bool classofKind(RecordKind K)
Definition: API.h:750
static bool classof(const APIRecord *Record)
Definition: API.h:747
UnionFieldRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader)
Definition: API.h:739
static bool classof(const APIRecord *Record)
Definition: API.h:766
UnionRecord(StringRef USR, StringRef Name, SymbolReference Parent, PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader, bool IsEmbeddedInVarDeclarator)
Definition: API.h:757
static bool classofKind(RecordKind K)
Definition: API.h:769
static bool isPossible(::clang::extractapi::RecordContext *Ctx)
Definition: API.h:1585
static ToTy * doCast(::clang::extractapi::RecordContext *Ctx)
Definition: API.h:1590
static inline ::clang::extractapi::RecordContext * doCast(FromTy *From)
Definition: API.h:1567