123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- ExtractAPI/API.h -----------------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- ///
- /// \file
- /// This file defines the APIRecord-based structs and the APISet class.
- ///
- /// Clang ExtractAPI is a tool to collect API information from a given set of
- /// header files. The structures in this file describe data representations of
- /// the API information collected for various kinds of symbols.
- ///
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_EXTRACTAPI_API_H
- #define LLVM_CLANG_EXTRACTAPI_API_H
- #include "clang/AST/Decl.h"
- #include "clang/AST/DeclObjC.h"
- #include "clang/AST/RawCommentList.h"
- #include "clang/Basic/SourceLocation.h"
- #include "clang/ExtractAPI/AvailabilityInfo.h"
- #include "clang/ExtractAPI/DeclarationFragments.h"
- #include "llvm/ADT/MapVector.h"
- #include "llvm/ADT/StringRef.h"
- #include "llvm/ADT/Triple.h"
- #include "llvm/Support/Allocator.h"
- #include "llvm/Support/Casting.h"
- #include <memory>
- #include <type_traits>
- namespace clang {
- namespace extractapi {
- /// DocComment is a vector of RawComment::CommentLine.
- ///
- /// Each line represents one line of striped documentation comment,
- /// with source range information. This simplifies calculating the source
- /// location of a character in the doc comment for pointing back to the source
- /// file.
- /// e.g.
- /// \code
- /// /// This is a documentation comment
- /// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' First line.
- /// /// with multiple lines.
- /// ^~~~~~~~~~~~~~~~~~~~~~~' Second line.
- /// \endcode
- using DocComment = std::vector<RawComment::CommentLine>;
- // Classes deriving from APIRecord need to have USR be the first constructor
- // argument. This is so that they are compatible with `addTopLevelRecord`
- // defined in API.cpp
- /// The base representation of an API record. Holds common symbol information.
- struct APIRecord {
- /// Discriminator for LLVM-style RTTI (dyn_cast<> et al.)
- enum RecordKind {
- RK_Unknown,
- RK_GlobalFunction,
- RK_GlobalVariable,
- RK_EnumConstant,
- RK_Enum,
- RK_StructField,
- RK_Struct,
- RK_ObjCInstanceProperty,
- RK_ObjCClassProperty,
- RK_ObjCIvar,
- RK_ObjCClassMethod,
- RK_ObjCInstanceMethod,
- RK_ObjCInterface,
- RK_ObjCCategory,
- RK_ObjCProtocol,
- RK_MacroDefinition,
- RK_Typedef,
- };
- /// Stores information about the context of the declaration of this API.
- /// This is roughly analogous to the DeclContext hierarchy for an AST Node.
- struct HierarchyInformation {
- /// The USR of the parent API.
- StringRef ParentUSR;
- /// The name of the parent API.
- StringRef ParentName;
- /// The record kind of the parent API.
- RecordKind ParentKind = RK_Unknown;
- /// A pointer to the parent APIRecord if known.
- APIRecord *ParentRecord = nullptr;
- HierarchyInformation() = default;
- HierarchyInformation(StringRef ParentUSR, StringRef ParentName,
- RecordKind Kind, APIRecord *ParentRecord = nullptr)
- : ParentUSR(ParentUSR), ParentName(ParentName), ParentKind(Kind),
- ParentRecord(ParentRecord) {}
- bool empty() const {
- return ParentUSR.empty() && ParentName.empty() &&
- ParentKind == RK_Unknown && ParentRecord == nullptr;
- }
- };
- StringRef USR;
- StringRef Name;
- PresumedLoc Location;
- AvailabilitySet Availabilities;
- LinkageInfo Linkage;
- /// Documentation comment lines attached to this symbol declaration.
- DocComment Comment;
- /// Declaration fragments of this symbol declaration.
- DeclarationFragments Declaration;
- /// SubHeading provides a more detailed representation than the plain
- /// declaration name.
- ///
- /// SubHeading is an array of declaration fragments of tagged declaration
- /// name, with potentially more tokens (for example the \c +/- symbol for
- /// Objective-C class/instance methods).
- DeclarationFragments SubHeading;
- /// Information about the parent record of this record.
- HierarchyInformation ParentInformation;
- /// Whether the symbol was defined in a system header.
- bool IsFromSystemHeader;
- private:
- const RecordKind Kind;
- public:
- RecordKind getKind() const { return Kind; }
- APIRecord() = delete;
- APIRecord(RecordKind Kind, StringRef USR, StringRef Name,
- PresumedLoc Location, AvailabilitySet Availabilities,
- LinkageInfo Linkage, const DocComment &Comment,
- DeclarationFragments Declaration, DeclarationFragments SubHeading,
- bool IsFromSystemHeader)
- : USR(USR), Name(Name), Location(Location),
- Availabilities(std::move(Availabilities)), Linkage(Linkage),
- Comment(Comment), Declaration(Declaration), SubHeading(SubHeading),
- IsFromSystemHeader(IsFromSystemHeader), Kind(Kind) {}
- // Pure virtual destructor to make APIRecord abstract
- virtual ~APIRecord() = 0;
- };
- /// This holds information associated with global functions.
- struct GlobalFunctionRecord : APIRecord {
- FunctionSignature Signature;
- GlobalFunctionRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, LinkageInfo Linkage,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- FunctionSignature Signature, bool IsFromSystemHeader)
- : APIRecord(RK_GlobalFunction, USR, Name, Loc, std::move(Availabilities),
- Linkage, Comment, Declaration, SubHeading,
- IsFromSystemHeader),
- Signature(Signature) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_GlobalFunction;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with global functions.
- struct GlobalVariableRecord : APIRecord {
- GlobalVariableRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, LinkageInfo Linkage,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
- : APIRecord(RK_GlobalVariable, USR, Name, Loc, std::move(Availabilities),
- Linkage, Comment, Declaration, SubHeading,
- IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_GlobalVariable;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with enum constants.
- struct EnumConstantRecord : APIRecord {
- EnumConstantRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
- : APIRecord(RK_EnumConstant, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo::none(), Comment, Declaration, SubHeading,
- IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_EnumConstant;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with enums.
- struct EnumRecord : APIRecord {
- SmallVector<std::unique_ptr<EnumConstantRecord>> Constants;
- EnumRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, const DocComment &Comment,
- DeclarationFragments Declaration, DeclarationFragments SubHeading,
- bool IsFromSystemHeader)
- : APIRecord(RK_Enum, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo::none(), Comment, Declaration, SubHeading,
- IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_Enum;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with struct fields.
- struct StructFieldRecord : APIRecord {
- StructFieldRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
- : APIRecord(RK_StructField, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo::none(), Comment, Declaration, SubHeading,
- IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_StructField;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with structs.
- struct StructRecord : APIRecord {
- SmallVector<std::unique_ptr<StructFieldRecord>> Fields;
- StructRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
- : APIRecord(RK_Struct, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo::none(), Comment, Declaration, SubHeading,
- IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_Struct;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with Objective-C properties.
- struct ObjCPropertyRecord : APIRecord {
- /// The attributes associated with an Objective-C property.
- enum AttributeKind : unsigned {
- NoAttr = 0,
- ReadOnly = 1,
- Dynamic = 1 << 2,
- };
- AttributeKind Attributes;
- StringRef GetterName;
- StringRef SetterName;
- bool IsOptional;
- ObjCPropertyRecord(RecordKind Kind, StringRef USR, StringRef Name,
- PresumedLoc Loc, AvailabilitySet Availabilities,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, AttributeKind Attributes,
- StringRef GetterName, StringRef SetterName,
- bool IsOptional, bool IsFromSystemHeader)
- : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo::none(), Comment, Declaration, SubHeading,
- IsFromSystemHeader),
- Attributes(Attributes), GetterName(GetterName), SetterName(SetterName),
- IsOptional(IsOptional) {}
- bool isReadOnly() const { return Attributes & ReadOnly; }
- bool isDynamic() const { return Attributes & Dynamic; }
- virtual ~ObjCPropertyRecord() = 0;
- };
- struct ObjCInstancePropertyRecord : ObjCPropertyRecord {
- ObjCInstancePropertyRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- AttributeKind Attributes, StringRef GetterName,
- StringRef SetterName, bool IsOptional,
- bool IsFromSystemHeader)
- : ObjCPropertyRecord(RK_ObjCInstanceProperty, USR, Name, Loc,
- std::move(Availabilities), Comment, Declaration,
- SubHeading, Attributes, GetterName, SetterName,
- IsOptional, IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCInstanceProperty;
- }
- private:
- virtual void anchor();
- };
- struct ObjCClassPropertyRecord : ObjCPropertyRecord {
- ObjCClassPropertyRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- AttributeKind Attributes, StringRef GetterName,
- StringRef SetterName, bool IsOptional,
- bool IsFromSystemHeader)
- : ObjCPropertyRecord(RK_ObjCClassProperty, USR, Name, Loc,
- std::move(Availabilities), Comment, Declaration,
- SubHeading, Attributes, GetterName, SetterName,
- IsOptional, IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCClassProperty;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with Objective-C instance variables.
- struct ObjCInstanceVariableRecord : APIRecord {
- using AccessControl = ObjCIvarDecl::AccessControl;
- AccessControl Access;
- ObjCInstanceVariableRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- AccessControl Access, bool IsFromSystemHeader)
- : APIRecord(RK_ObjCIvar, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo::none(), Comment, Declaration, SubHeading,
- IsFromSystemHeader),
- Access(Access) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCIvar;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with Objective-C methods.
- struct ObjCMethodRecord : APIRecord {
- FunctionSignature Signature;
- ObjCMethodRecord() = delete;
- ObjCMethodRecord(RecordKind Kind, StringRef USR, StringRef Name,
- PresumedLoc Loc, AvailabilitySet Availabilities,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeading, FunctionSignature Signature,
- bool IsFromSystemHeader)
- : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo::none(), Comment, Declaration, SubHeading,
- IsFromSystemHeader),
- Signature(Signature) {}
- virtual ~ObjCMethodRecord() = 0;
- };
- struct ObjCInstanceMethodRecord : ObjCMethodRecord {
- ObjCInstanceMethodRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- FunctionSignature Signature, bool IsFromSystemHeader)
- : ObjCMethodRecord(RK_ObjCInstanceMethod, USR, Name, Loc,
- std::move(Availabilities), Comment, Declaration,
- SubHeading, Signature, IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCInstanceMethod;
- }
- private:
- virtual void anchor();
- };
- struct ObjCClassMethodRecord : ObjCMethodRecord {
- ObjCClassMethodRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- FunctionSignature Signature, bool IsFromSystemHeader)
- : ObjCMethodRecord(RK_ObjCClassMethod, USR, Name, Loc,
- std::move(Availabilities), Comment, Declaration,
- SubHeading, Signature, IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCClassMethod;
- }
- private:
- virtual void anchor();
- };
- /// This represents a reference to another symbol that might come from external
- /// sources.
- struct SymbolReference {
- StringRef Name;
- StringRef USR;
- /// The source project/module/product of the referred symbol.
- StringRef Source;
- SymbolReference() = default;
- SymbolReference(StringRef Name, StringRef USR = "", StringRef Source = "")
- : Name(Name), USR(USR), Source(Source) {}
- SymbolReference(const APIRecord &Record)
- : Name(Record.Name), USR(Record.USR) {}
- /// Determine if this SymbolReference is empty.
- ///
- /// \returns true if and only if all \c Name, \c USR, and \c Source is empty.
- bool empty() const { return Name.empty() && USR.empty() && Source.empty(); }
- };
- /// The base representation of an Objective-C container record. Holds common
- /// information associated with Objective-C containers.
- struct ObjCContainerRecord : APIRecord {
- SmallVector<std::unique_ptr<ObjCMethodRecord>> Methods;
- SmallVector<std::unique_ptr<ObjCPropertyRecord>> Properties;
- SmallVector<std::unique_ptr<ObjCInstanceVariableRecord>> Ivars;
- SmallVector<SymbolReference> Protocols;
- ObjCContainerRecord() = delete;
- ObjCContainerRecord(RecordKind Kind, StringRef USR, StringRef Name,
- PresumedLoc Loc, AvailabilitySet Availabilities,
- LinkageInfo Linkage, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
- : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), Linkage,
- Comment, Declaration, SubHeading, IsFromSystemHeader) {}
- virtual ~ObjCContainerRecord() = 0;
- };
- /// This holds information associated with Objective-C categories.
- struct ObjCCategoryRecord : ObjCContainerRecord {
- SymbolReference Interface;
- ObjCCategoryRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, SymbolReference Interface,
- bool IsFromSystemHeader)
- : ObjCContainerRecord(RK_ObjCCategory, USR, Name, Loc,
- std::move(Availabilities), LinkageInfo::none(),
- Comment, Declaration, SubHeading,
- IsFromSystemHeader),
- Interface(Interface) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCCategory;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with Objective-C interfaces/classes.
- struct ObjCInterfaceRecord : ObjCContainerRecord {
- SymbolReference SuperClass;
- // ObjCCategoryRecord%s are stored in and owned by APISet.
- SmallVector<ObjCCategoryRecord *> Categories;
- ObjCInterfaceRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, LinkageInfo Linkage,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- SymbolReference SuperClass, bool IsFromSystemHeader)
- : ObjCContainerRecord(RK_ObjCInterface, USR, Name, Loc,
- std::move(Availabilities), Linkage, Comment,
- Declaration, SubHeading, IsFromSystemHeader),
- SuperClass(SuperClass) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCInterface;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with Objective-C protocols.
- struct ObjCProtocolRecord : ObjCContainerRecord {
- ObjCProtocolRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
- : ObjCContainerRecord(RK_ObjCProtocol, USR, Name, Loc,
- std::move(Availabilities), LinkageInfo::none(),
- Comment, Declaration, SubHeading,
- IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_ObjCProtocol;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with macro definitions.
- struct MacroDefinitionRecord : APIRecord {
- MacroDefinitionRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- bool IsFromSystemHeader)
- : APIRecord(RK_MacroDefinition, USR, Name, Loc, AvailabilitySet(),
- LinkageInfo(), {}, Declaration, SubHeading,
- IsFromSystemHeader) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_MacroDefinition;
- }
- private:
- virtual void anchor();
- };
- /// This holds information associated with typedefs.
- ///
- /// Note: Typedefs for anonymous enums and structs typically don't get emitted
- /// by the serializers but still get a TypedefRecord. Instead we use the
- /// typedef name as a name for the underlying anonymous struct or enum.
- struct TypedefRecord : APIRecord {
- SymbolReference UnderlyingType;
- TypedefRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
- AvailabilitySet Availabilities, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, SymbolReference UnderlyingType,
- bool IsFromSystemHeader)
- : APIRecord(RK_Typedef, USR, Name, Loc, std::move(Availabilities),
- LinkageInfo(), Comment, Declaration, SubHeading,
- IsFromSystemHeader),
- UnderlyingType(UnderlyingType) {}
- static bool classof(const APIRecord *Record) {
- return Record->getKind() == RK_Typedef;
- }
- private:
- virtual void anchor();
- };
- /// Check if a record type has a function signature mixin.
- ///
- /// This is denoted by the record type having a ``Signature`` field of type
- /// FunctionSignature.
- template <typename RecordTy>
- struct has_function_signature : public std::false_type {};
- template <>
- struct has_function_signature<GlobalFunctionRecord> : public std::true_type {};
- template <>
- struct has_function_signature<ObjCMethodRecord> : public std::true_type {};
- template <>
- struct has_function_signature<ObjCInstanceMethodRecord>
- : public std::true_type {};
- template <>
- struct has_function_signature<ObjCClassMethodRecord> : public std::true_type {};
- /// APISet holds the set of API records collected from given inputs.
- class APISet {
- public:
- /// Create and add a global variable record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- GlobalVariableRecord *
- addGlobalVar(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability, LinkageInfo Linkage,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeadin, bool IsFromSystemHeaderg);
- /// Create and add a function record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- GlobalFunctionRecord *
- addGlobalFunction(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability, LinkageInfo Linkage,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- FunctionSignature Signature, bool IsFromSystemHeader);
- /// Create and add an enum constant record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- EnumConstantRecord *
- addEnumConstant(EnumRecord *Enum, StringRef Name, StringRef USR,
- PresumedLoc Loc, AvailabilitySet Availability,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader);
- /// Create and add an enum record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- EnumRecord *addEnum(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader);
- /// Create and add a struct field record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- StructFieldRecord *
- addStructField(StructRecord *Struct, StringRef Name, StringRef USR,
- PresumedLoc Loc, AvailabilitySet Availability,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader);
- /// Create and add a struct record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- StructRecord *addStruct(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability,
- const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- bool IsFromSystemHeader);
- /// Create and add an Objective-C category record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- ObjCCategoryRecord *
- addObjCCategory(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, SymbolReference Interface,
- bool IsFromSystemHeader);
- /// Create and add an Objective-C interface record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- ObjCInterfaceRecord *
- addObjCInterface(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability, LinkageInfo Linkage,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeading, SymbolReference SuperClass,
- bool IsFromSystemHeader);
- /// Create and add an Objective-C method record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- ObjCMethodRecord *
- addObjCMethod(ObjCContainerRecord *Container, StringRef Name, StringRef USR,
- PresumedLoc Loc, AvailabilitySet Availability,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeading, FunctionSignature Signature,
- bool IsInstanceMethod, bool IsFromSystemHeader);
- /// Create and add an Objective-C property record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- ObjCPropertyRecord *
- addObjCProperty(ObjCContainerRecord *Container, StringRef Name, StringRef USR,
- PresumedLoc Loc, AvailabilitySet Availability,
- const DocComment &Comment, DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- ObjCPropertyRecord::AttributeKind Attributes,
- StringRef GetterName, StringRef SetterName, bool IsOptional,
- bool IsInstanceProperty, bool IsFromSystemHeader);
- /// Create and add an Objective-C instance variable record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- ObjCInstanceVariableRecord *addObjCInstanceVariable(
- ObjCContainerRecord *Container, StringRef Name, StringRef USR,
- PresumedLoc Loc, AvailabilitySet Availability, const DocComment &Comment,
- DeclarationFragments Declaration, DeclarationFragments SubHeading,
- ObjCInstanceVariableRecord::AccessControl Access,
- bool IsFromSystemHeader);
- /// Create and add an Objective-C protocol record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- ObjCProtocolRecord *
- addObjCProtocol(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability, const DocComment &Comment,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading, bool IsFromSystemHeader);
- /// Create a macro definition record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSRForMacro(StringRef Name,
- /// SourceLocation SL, const SourceManager &SM) is a helper method to generate
- /// the USR for the macro and keep it alive in APISet.
- MacroDefinitionRecord *addMacroDefinition(StringRef Name, StringRef USR,
- PresumedLoc Loc,
- DeclarationFragments Declaration,
- DeclarationFragments SubHeading,
- bool IsFromSystemHeader);
- /// Create a typedef record into the API set.
- ///
- /// Note: the caller is responsible for keeping the StringRef \p Name and
- /// \p USR alive. APISet::copyString provides a way to copy strings into
- /// APISet itself, and APISet::recordUSR(const Decl *D) is a helper method
- /// to generate the USR for \c D and keep it alive in APISet.
- TypedefRecord *
- addTypedef(StringRef Name, StringRef USR, PresumedLoc Loc,
- AvailabilitySet Availability, const DocComment &Comment,
- DeclarationFragments Declaration, DeclarationFragments SubHeading,
- SymbolReference UnderlyingType, bool IsFromSystemHeader);
- /// A mapping type to store a set of APIRecord%s with the USR as the key.
- template <typename RecordTy,
- typename =
- std::enable_if_t<std::is_base_of<APIRecord, RecordTy>::value>>
- using RecordMap = llvm::MapVector<StringRef, std::unique_ptr<RecordTy>>;
- /// Get the target triple for the ExtractAPI invocation.
- const llvm::Triple &getTarget() const { return Target; }
- /// Get the language used by the APIs.
- Language getLanguage() const { return Lang; }
- const RecordMap<GlobalFunctionRecord> &getGlobalFunctions() const {
- return GlobalFunctions;
- }
- const RecordMap<GlobalVariableRecord> &getGlobalVariables() const {
- return GlobalVariables;
- }
- const RecordMap<EnumRecord> &getEnums() const { return Enums; }
- const RecordMap<StructRecord> &getStructs() const { return Structs; }
- const RecordMap<ObjCCategoryRecord> &getObjCCategories() const {
- return ObjCCategories;
- }
- const RecordMap<ObjCInterfaceRecord> &getObjCInterfaces() const {
- return ObjCInterfaces;
- }
- const RecordMap<ObjCProtocolRecord> &getObjCProtocols() const {
- return ObjCProtocols;
- }
- const RecordMap<MacroDefinitionRecord> &getMacros() const { return Macros; }
- const RecordMap<TypedefRecord> &getTypedefs() const { return Typedefs; }
- /// Finds the APIRecord for a given USR.
- ///
- /// \returns a pointer to the APIRecord associated with that USR or nullptr.
- APIRecord *findRecordForUSR(StringRef USR) const;
- /// Generate and store the USR of declaration \p D.
- ///
- /// Note: The USR string is stored in and owned by Allocator.
- ///
- /// \returns a StringRef of the generated USR string.
- StringRef recordUSR(const Decl *D);
- /// Generate and store the USR for a macro \p Name.
- ///
- /// Note: The USR string is stored in and owned by Allocator.
- ///
- /// \returns a StringRef to the generate USR string.
- StringRef recordUSRForMacro(StringRef Name, SourceLocation SL,
- const SourceManager &SM);
- /// Copy \p String into the Allocator in this APISet.
- ///
- /// \returns a StringRef of the copied string in APISet::Allocator.
- StringRef copyString(StringRef String);
- APISet(const llvm::Triple &Target, Language Lang,
- const std::string &ProductName)
- : Target(Target), Lang(Lang), ProductName(ProductName) {}
- private:
- /// BumpPtrAllocator to store generated/copied strings.
- ///
- /// Note: The main use for this is being able to deduplicate strings.
- llvm::BumpPtrAllocator StringAllocator;
- const llvm::Triple Target;
- const Language Lang;
- llvm::DenseMap<StringRef, APIRecord *> USRBasedLookupTable;
- RecordMap<GlobalFunctionRecord> GlobalFunctions;
- RecordMap<GlobalVariableRecord> GlobalVariables;
- RecordMap<EnumRecord> Enums;
- RecordMap<StructRecord> Structs;
- RecordMap<ObjCCategoryRecord> ObjCCategories;
- RecordMap<ObjCInterfaceRecord> ObjCInterfaces;
- RecordMap<ObjCProtocolRecord> ObjCProtocols;
- RecordMap<MacroDefinitionRecord> Macros;
- RecordMap<TypedefRecord> Typedefs;
- public:
- const std::string ProductName;
- };
- } // namespace extractapi
- } // namespace clang
- #endif // LLVM_CLANG_EXTRACTAPI_API_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|