diff --git a/clang/include/clang/ExtractAPI/API.h b/clang/include/clang/ExtractAPI/API.h index b4c0e0ad39cdf..f4a6374161685 100644 --- a/clang/include/clang/ExtractAPI/API.h +++ b/clang/include/clang/ExtractAPI/API.h @@ -224,7 +224,7 @@ struct APIRecord { StringRef USR; StringRef Name; PresumedLoc Location; - AvailabilitySet Availabilities; + AvailabilityInfo Availability; LinkageInfo Linkage; /// Documentation comment lines attached to this symbol declaration. @@ -256,12 +256,12 @@ struct APIRecord { APIRecord() = delete; APIRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Location, AvailabilitySet Availabilities, + PresumedLoc Location, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) : USR(USR), Name(Name), Location(Location), - Availabilities(std::move(Availabilities)), Linkage(Linkage), + Availability(std::move(Availability)), Linkage(Linkage), Comment(Comment), Declaration(Declaration), SubHeading(SubHeading), IsFromSystemHeader(IsFromSystemHeader), Kind(Kind) {} @@ -274,10 +274,10 @@ struct APIRecord { struct NamespaceRecord : APIRecord { NamespaceRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(RK_Namespace, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_Namespace, USR, Name, Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader) {} @@ -291,23 +291,23 @@ struct GlobalFunctionRecord : APIRecord { FunctionSignature Signature; GlobalFunctionRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) - : APIRecord(RK_GlobalFunction, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_GlobalFunction, USR, Name, Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader), Signature(Signature) {} GlobalFunctionRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) - : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), Linkage, + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader), Signature(Signature) {} @@ -323,14 +323,14 @@ struct GlobalFunctionTemplateRecord : GlobalFunctionRecord { Template Templ; GlobalFunctionTemplateRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, Template Template, bool IsFromSystemHeader) : GlobalFunctionRecord(RK_GlobalFunctionTemplate, USR, Name, Loc, - std::move(Availabilities), Linkage, Comment, + std::move(Availability), Linkage, Comment, Declaration, SubHeading, Signature, IsFromSystemHeader), Templ(Template) {} @@ -343,12 +343,12 @@ struct GlobalFunctionTemplateRecord : GlobalFunctionRecord { struct GlobalFunctionTemplateSpecializationRecord : GlobalFunctionRecord { GlobalFunctionTemplateSpecializationRecord( StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) : GlobalFunctionRecord(RK_GlobalFunctionTemplateSpecialization, USR, Name, - Loc, std::move(Availabilities), Linkage, Comment, + Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, Signature, IsFromSystemHeader) {} @@ -360,20 +360,20 @@ struct GlobalFunctionTemplateSpecializationRecord : GlobalFunctionRecord { /// This holds information associated with global functions. struct GlobalVariableRecord : APIRecord { GlobalVariableRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(RK_GlobalVariable, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_GlobalVariable, USR, Name, Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader) {} GlobalVariableRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), Linkage, + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { @@ -388,13 +388,13 @@ struct GlobalVariableTemplateRecord : GlobalVariableRecord { Template Templ; GlobalVariableTemplateRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, class Template Template, bool IsFromSystemHeader) : GlobalVariableRecord(RK_GlobalVariableTemplate, USR, Name, Loc, - std::move(Availabilities), Linkage, Comment, + std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader), Templ(Template) {} @@ -406,11 +406,11 @@ struct GlobalVariableTemplateRecord : GlobalVariableRecord { struct GlobalVariableTemplateSpecializationRecord : GlobalVariableRecord { GlobalVariableTemplateSpecializationRecord( StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) : GlobalVariableRecord(RK_GlobalVariableTemplateSpecialization, USR, Name, - Loc, std::move(Availabilities), Linkage, Comment, + Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { @@ -424,12 +424,12 @@ struct GlobalVariableTemplatePartialSpecializationRecord GlobalVariableTemplatePartialSpecializationRecord( StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, class Template Template, bool IsFromSystemHeader) : GlobalVariableRecord(RK_GlobalVariableTemplatePartialSpecialization, - USR, Name, Loc, std::move(Availabilities), Linkage, + USR, Name, Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader), Templ(Template) {} @@ -442,10 +442,10 @@ struct GlobalVariableTemplatePartialSpecializationRecord /// This holds information associated with enum constants. struct EnumConstantRecord : APIRecord { EnumConstantRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(RK_EnumConstant, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_EnumConstant, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader) {} @@ -462,10 +462,10 @@ struct EnumRecord : APIRecord { SmallVector> Constants; EnumRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(RK_Enum, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_Enum, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader) {} @@ -480,10 +480,10 @@ struct EnumRecord : APIRecord { /// This holds information associated with struct fields. struct StructFieldRecord : APIRecord { StructFieldRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(RK_StructField, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_StructField, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader) {} @@ -500,10 +500,10 @@ struct StructRecord : APIRecord { SmallVector> Fields; StructRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(RK_Struct, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_Struct, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader) {} @@ -519,21 +519,21 @@ struct CXXFieldRecord : APIRecord { AccessControl Access; CXXFieldRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader) - : APIRecord(RK_CXXField, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_CXXField, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Access(Access) {} CXXFieldRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader) - : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Access(Access) {} @@ -550,13 +550,13 @@ struct CXXFieldTemplateRecord : CXXFieldRecord { Template Templ; CXXFieldTemplateRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, Template Template, bool IsFromSystemHeader) : CXXFieldRecord(RK_CXXFieldTemplate, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Access, IsFromSystemHeader), Templ(Template) {} @@ -572,11 +572,11 @@ struct CXXMethodRecord : APIRecord { CXXMethodRecord() = delete; CXXMethodRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) - : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Signature(Signature), Access(Access) {} @@ -586,14 +586,13 @@ struct CXXMethodRecord : APIRecord { struct CXXConstructorRecord : CXXMethodRecord { CXXConstructorRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, - const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) : CXXMethodRecord(RK_CXXConstructorMethod, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, Access, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { return Record->getKind() == RK_CXXConstructorMethod; @@ -605,13 +604,13 @@ struct CXXConstructorRecord : CXXMethodRecord { struct CXXDestructorRecord : CXXMethodRecord { CXXDestructorRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) : CXXMethodRecord(RK_CXXDestructorMethod, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, Access, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { return Record->getKind() == RK_CXXDestructorMethod; @@ -623,14 +622,14 @@ struct CXXDestructorRecord : CXXMethodRecord { struct CXXStaticMethodRecord : CXXMethodRecord { CXXStaticMethodRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) : CXXMethodRecord(RK_CXXStaticMethod, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, Access, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { return Record->getKind() == RK_CXXStaticMethod; @@ -642,14 +641,14 @@ struct CXXStaticMethodRecord : CXXMethodRecord { struct CXXInstanceMethodRecord : CXXMethodRecord { CXXInstanceMethodRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) : CXXMethodRecord(RK_CXXInstanceMethod, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, Access, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { @@ -664,14 +663,14 @@ struct CXXMethodTemplateRecord : CXXMethodRecord { Template Templ; CXXMethodTemplateRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, Template Template, bool IsFromSystemHeader) : CXXMethodRecord(RK_CXXMethodTemplate, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, Access, IsFromSystemHeader), Templ(Template) {} @@ -683,12 +682,12 @@ struct CXXMethodTemplateRecord : CXXMethodRecord { struct CXXMethodTemplateSpecializationRecord : CXXMethodRecord { CXXMethodTemplateSpecializationRecord( StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) : CXXMethodRecord(RK_CXXMethodTemplateSpecialization, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, Access, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { @@ -711,13 +710,13 @@ struct ObjCPropertyRecord : APIRecord { bool IsOptional; ObjCPropertyRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, 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), + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Attributes(Attributes), GetterName(GetterName), SetterName(SetterName), @@ -731,7 +730,7 @@ struct ObjCPropertyRecord : APIRecord { struct ObjCInstancePropertyRecord : ObjCPropertyRecord { ObjCInstancePropertyRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, @@ -739,7 +738,7 @@ struct ObjCInstancePropertyRecord : ObjCPropertyRecord { StringRef SetterName, bool IsOptional, bool IsFromSystemHeader) : ObjCPropertyRecord(RK_ObjCInstanceProperty, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Attributes, GetterName, SetterName, IsOptional, IsFromSystemHeader) {} @@ -753,7 +752,7 @@ struct ObjCInstancePropertyRecord : ObjCPropertyRecord { struct ObjCClassPropertyRecord : ObjCPropertyRecord { ObjCClassPropertyRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, @@ -761,7 +760,7 @@ struct ObjCClassPropertyRecord : ObjCPropertyRecord { StringRef SetterName, bool IsOptional, bool IsFromSystemHeader) : ObjCPropertyRecord(RK_ObjCClassProperty, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Attributes, GetterName, SetterName, IsOptional, IsFromSystemHeader) {} @@ -779,12 +778,12 @@ struct ObjCInstanceVariableRecord : APIRecord { AccessControl Access; ObjCInstanceVariableRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader) - : APIRecord(RK_ObjCIvar, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_ObjCIvar, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Access(Access) {} @@ -804,11 +803,11 @@ struct ObjCMethodRecord : APIRecord { ObjCMethodRecord() = delete; ObjCMethodRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) - : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Signature(Signature) {} @@ -818,13 +817,13 @@ struct ObjCMethodRecord : APIRecord { struct ObjCInstanceMethodRecord : ObjCMethodRecord { ObjCInstanceMethodRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) : ObjCMethodRecord(RK_ObjCInstanceMethod, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { return Record->getKind() == RK_ObjCInstanceMethod; @@ -836,13 +835,13 @@ struct ObjCInstanceMethodRecord : ObjCMethodRecord { struct ObjCClassMethodRecord : ObjCMethodRecord { ObjCClassMethodRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) : ObjCMethodRecord(RK_ObjCClassMethod, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Signature, IsFromSystemHeader) {} static bool classof(const APIRecord *Record) { @@ -880,13 +879,13 @@ struct StaticFieldRecord : CXXFieldRecord { SymbolReference Context; StaticFieldRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference Context, AccessControl Access, bool IsFromSystemHeader) - : CXXFieldRecord(RK_StaticField, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, - SubHeading, Access, IsFromSystemHeader), + : CXXFieldRecord(RK_StaticField, USR, Name, Loc, std::move(Availability), + Comment, Declaration, SubHeading, Access, + IsFromSystemHeader), Context(Context) {} static bool classof(const APIRecord *Record) { @@ -905,11 +904,11 @@ struct ObjCContainerRecord : APIRecord { ObjCContainerRecord() = delete; ObjCContainerRecord(RecordKind Kind, StringRef USR, StringRef Name, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), Linkage, + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader) {} virtual ~ObjCContainerRecord() = 0; @@ -922,11 +921,11 @@ struct CXXClassRecord : APIRecord { AccessControl Access; CXXClassRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, RecordKind Kind, AccessControl Access, bool IsFromSystemHeader) - : APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), + : APIRecord(Kind, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Access(Access) {} @@ -943,11 +942,11 @@ struct ClassTemplateRecord : CXXClassRecord { Template Templ; ClassTemplateRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader) - : CXXClassRecord(USR, Name, Loc, std::move(Availabilities), Comment, + : CXXClassRecord(USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, RK_ClassTemplate, Access, IsFromSystemHeader), Templ(Template) {} @@ -960,10 +959,10 @@ struct ClassTemplateRecord : CXXClassRecord { struct ClassTemplateSpecializationRecord : CXXClassRecord { ClassTemplateSpecializationRecord( StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader) - : CXXClassRecord(USR, Name, Loc, std::move(Availabilities), Comment, + : CXXClassRecord(USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, RK_ClassTemplateSpecialization, Access, IsFromSystemHeader) {} @@ -976,10 +975,10 @@ struct ClassTemplatePartialSpecializationRecord : CXXClassRecord { Template Templ; ClassTemplatePartialSpecializationRecord( StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader) - : CXXClassRecord(USR, Name, Loc, std::move(Availabilities), Comment, + : CXXClassRecord(USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, RK_ClassTemplateSpecialization, Access, IsFromSystemHeader), Templ(Template) {} @@ -993,11 +992,11 @@ struct ConceptRecord : APIRecord { Template Templ; ConceptRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, bool IsFromSystemHeader) - : APIRecord(RK_Concept, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_Concept, USR, Name, Loc, std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Templ(Template) {} @@ -1010,12 +1009,12 @@ struct ObjCCategoryRecord : ObjCContainerRecord { bool IsFromExternalModule = false; ObjCCategoryRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference Interface, bool IsFromSystemHeader) : ObjCContainerRecord(RK_ObjCCategory, USR, Name, Loc, - std::move(Availabilities), LinkageInfo::none(), + std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader), Interface(Interface) {} @@ -1035,13 +1034,13 @@ struct ObjCInterfaceRecord : ObjCContainerRecord { SmallVector Categories; ObjCInterfaceRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference SuperClass, bool IsFromSystemHeader) : ObjCContainerRecord(RK_ObjCInterface, USR, Name, Loc, - std::move(Availabilities), Linkage, Comment, + std::move(Availability), Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader), SuperClass(SuperClass) {} @@ -1056,11 +1055,11 @@ struct ObjCInterfaceRecord : ObjCContainerRecord { /// This holds information associated with Objective-C protocols. struct ObjCProtocolRecord : ObjCContainerRecord { ObjCProtocolRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) : ObjCContainerRecord(RK_ObjCProtocol, USR, Name, Loc, - std::move(Availabilities), LinkageInfo::none(), + std::move(Availability), LinkageInfo::none(), Comment, Declaration, SubHeading, IsFromSystemHeader) {} @@ -1078,7 +1077,7 @@ struct MacroDefinitionRecord : APIRecord { DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) - : APIRecord(RK_MacroDefinition, USR, Name, Loc, AvailabilitySet(), + : APIRecord(RK_MacroDefinition, USR, Name, Loc, AvailabilityInfo(), LinkageInfo(), {}, Declaration, SubHeading, IsFromSystemHeader) {} @@ -1099,11 +1098,11 @@ struct TypedefRecord : APIRecord { SymbolReference UnderlyingType; TypedefRecord(StringRef USR, StringRef Name, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference UnderlyingType, bool IsFromSystemHeader) - : APIRecord(RK_Typedef, USR, Name, Loc, std::move(Availabilities), + : APIRecord(RK_Typedef, USR, Name, Loc, std::move(Availability), LinkageInfo(), Comment, Declaration, SubHeading, IsFromSystemHeader), UnderlyingType(UnderlyingType) {} @@ -1191,7 +1190,7 @@ class APISet { public: NamespaceRecord *addNamespace(APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, @@ -1204,13 +1203,13 @@ class APISet { /// 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, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeadin, bool IsFromSystemHeaderg); GlobalVariableTemplateRecord * addGlobalVariableTemplate(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, @@ -1224,14 +1223,14 @@ class APISet { /// 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, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader); GlobalFunctionTemplateRecord *addGlobalFunctionTemplate( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, Template Template, bool IsFromSystemHeader); @@ -1239,7 +1238,7 @@ class APISet { GlobalFunctionTemplateSpecializationRecord * addGlobalFunctionTemplateSpecialization( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader); @@ -1252,7 +1251,7 @@ class APISet { /// 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, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader); @@ -1263,7 +1262,7 @@ class APISet { /// 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, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader); @@ -1275,7 +1274,7 @@ class APISet { /// 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, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader); @@ -1286,7 +1285,7 @@ class APISet { /// 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, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, @@ -1294,14 +1293,14 @@ class APISet { StaticFieldRecord * addStaticField(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference Context, AccessControl Access, bool IsFromSystemHeaderg); CXXFieldRecord *addCXXField(APIRecord *CXXClass, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, @@ -1309,12 +1308,12 @@ class APISet { CXXFieldTemplateRecord *addCXXFieldTemplate( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, Template Template, bool IsFromSystemHeader); CXXClassRecord *addCXXClass(APIRecord *Parent, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availability, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, @@ -1323,76 +1322,76 @@ class APISet { ClassTemplateRecord * addClassTemplate(APIRecord *Parent, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availability, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader); ClassTemplateSpecializationRecord *addClassTemplateSpecialization( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader); ClassTemplatePartialSpecializationRecord * addClassTemplatePartialSpecialization( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader); GlobalVariableTemplateSpecializationRecord * addGlobalVariableTemplateSpecialization( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader); GlobalVariableTemplatePartialSpecializationRecord * addGlobalVariableTemplatePartialSpecialization( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, bool IsFromSystemHeader); CXXMethodRecord *addCXXInstanceMethod( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader); CXXMethodRecord *addCXXStaticMethod( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader); CXXMethodRecord *addCXXSpecialMethod( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader); CXXMethodTemplateRecord *addCXXMethodTemplate( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, Template Template, bool IsFromSystemHeader); CXXMethodTemplateSpecializationRecord *addCXXMethodTemplateSpec( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader); ConceptRecord *addConcept(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, @@ -1406,7 +1405,7 @@ class APISet { /// 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, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference Interface, bool IsFromSystemHeader, bool IsFromExternalModule); @@ -1419,7 +1418,7 @@ class APISet { /// 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, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference SuperClass, bool IsFromSystemHeader); @@ -1432,7 +1431,7 @@ class APISet { /// 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, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsInstanceMethod, bool IsFromSystemHeader); @@ -1445,7 +1444,7 @@ class APISet { /// 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, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, ObjCPropertyRecord::AttributeKind Attributes, @@ -1460,7 +1459,7 @@ class APISet { /// 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, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, ObjCInstanceVariableRecord::AccessControl Access, bool IsFromSystemHeader); @@ -1473,7 +1472,7 @@ class APISet { /// 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, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader); @@ -1498,7 +1497,7 @@ class APISet { /// 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, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference UnderlyingType, bool IsFromSystemHeader); diff --git a/clang/include/clang/ExtractAPI/AvailabilityInfo.h b/clang/include/clang/ExtractAPI/AvailabilityInfo.h index 0af373135b667..3b8d6f46ed56d 100644 --- a/clang/include/clang/ExtractAPI/AvailabilityInfo.h +++ b/clang/include/clang/ExtractAPI/AvailabilityInfo.h @@ -16,56 +16,31 @@ #define LLVM_CLANG_EXTRACTAPI_AVAILABILITY_INFO_H #include "clang/AST/Decl.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/Support/Error.h" #include "llvm/Support/VersionTuple.h" #include "llvm/Support/raw_ostream.h" -using llvm::VersionTuple; - namespace clang { namespace extractapi { -/// Stores availability attributes of a symbol in a given domain. +/// Stores availability attributes of a symbol. struct AvailabilityInfo { /// The domain for which this availability info item applies std::string Domain; VersionTuple Introduced; VersionTuple Deprecated; VersionTuple Obsoleted; - bool Unavailable; - - AvailabilityInfo() = default; - - AvailabilityInfo(StringRef Domain, VersionTuple I, VersionTuple D, - VersionTuple O, bool U) - : Domain(Domain), Introduced(I), Deprecated(D), Obsoleted(O), - Unavailable(U) {} -}; - -class AvailabilitySet { -private: - using AvailabilityList = llvm::SmallVector; - AvailabilityList Availabilities; - bool UnconditionallyDeprecated = false; bool UnconditionallyUnavailable = false; -public: - AvailabilitySet(const Decl *Decl); - AvailabilitySet() = default; - - AvailabilityList::const_iterator begin() const { - return Availabilities.begin(); - } - - AvailabilityList::const_iterator end() const { return Availabilities.end(); } + AvailabilityInfo() = default; + /// Determine if this AvailabilityInfo represents the default availability. + bool isDefault() const { return *this == AvailabilityInfo(); } /// Check if the symbol is unconditionally deprecated. /// /// i.e. \code __attribute__((deprecated)) \endcode bool isUnconditionallyDeprecated() const { return UnconditionallyDeprecated; } - /// Check if the symbol is unconditionally unavailable. /// /// i.e. \code __attribute__((unavailable)) \endcode @@ -73,10 +48,28 @@ class AvailabilitySet { return UnconditionallyUnavailable; } - /// Determine if this AvailabilitySet represents default availability. - bool isDefault() const { return Availabilities.empty(); } + AvailabilityInfo(StringRef Domain, VersionTuple I, VersionTuple D, + VersionTuple O, bool UD, bool UU) + : Domain(Domain), Introduced(I), Deprecated(D), Obsoleted(O), + UnconditionallyDeprecated(UD), UnconditionallyUnavailable(UU) {} + + friend bool operator==(const AvailabilityInfo &Lhs, + const AvailabilityInfo &Rhs); + +public: + static AvailabilityInfo createFromDecl(const Decl *Decl); }; +inline bool operator==(const AvailabilityInfo &Lhs, + const AvailabilityInfo &Rhs) { + return std::tie(Lhs.Introduced, Lhs.Deprecated, Lhs.Obsoleted, + Lhs.UnconditionallyDeprecated, + Lhs.UnconditionallyUnavailable) == + std::tie(Rhs.Introduced, Rhs.Deprecated, Rhs.Obsoleted, + Rhs.UnconditionallyDeprecated, + Rhs.UnconditionallyUnavailable); +} + } // namespace extractapi } // namespace clang diff --git a/clang/include/clang/ExtractAPI/ExtractAPIVisitor.h b/clang/include/clang/ExtractAPI/ExtractAPIVisitor.h index a344fa7d5d8a7..1f76add1faae8 100644 --- a/clang/include/clang/ExtractAPI/ExtractAPIVisitor.h +++ b/clang/include/clang/ExtractAPI/ExtractAPIVisitor.h @@ -18,6 +18,7 @@ #include "clang/AST/DeclTemplate.h" #include "clang/Basic/OperatorKinds.h" #include "clang/Basic/Specifiers.h" +#include "clang/ExtractAPI/AvailabilityInfo.h" #include "clang/ExtractAPI/DeclarationFragments.h" #include "llvm/ADT/FunctionExtras.h" @@ -263,7 +264,6 @@ bool ExtractAPIVisitorBase::VisitVarDecl(const VarDecl *Decl) { DeclarationFragmentsBuilder::getFragmentsForVar(Decl); DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - if (Decl->isStaticDataMember()) { SymbolReference Context; // getDeclContext() should return a RecordDecl since we @@ -272,13 +272,14 @@ bool ExtractAPIVisitorBase::VisitVarDecl(const VarDecl *Decl) { Context.Name = Record->getName(); Context.USR = API.recordUSR(Record); auto Access = DeclarationFragmentsBuilder::getAccessControl(Decl); - API.addStaticField(Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, - Declaration, SubHeading, Context, Access, - isInSystemHeader(Decl)); + API.addStaticField(Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), + Linkage, Comment, Declaration, SubHeading, Context, + Access, isInSystemHeader(Decl)); } else // Add the global variable record to the API set. - API.addGlobalVar(Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, - Declaration, SubHeading, isInSystemHeader(Decl)); + API.addGlobalVar(Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), + Linkage, Comment, Declaration, SubHeading, + isInSystemHeader(Decl)); return true; } @@ -333,19 +334,19 @@ bool ExtractAPIVisitorBase::VisitFunctionDecl( DeclarationFragmentsBuilder::getSubHeading(Decl); FunctionSignature Signature = DeclarationFragmentsBuilder::getFunctionSignature(Decl); - if (Decl->getTemplateSpecializationInfo()) API.addGlobalFunctionTemplateSpecialization( - Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Linkage, + Comment, DeclarationFragmentsBuilder:: getFragmentsForFunctionTemplateSpecialization(Decl), SubHeading, Signature, isInSystemHeader(Decl)); else // Add the function record to the API set. API.addGlobalFunction( - Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, - DeclarationFragmentsBuilder::getFragmentsForFunction(Decl), SubHeading, - Signature, isInSystemHeader(Decl)); + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Linkage, + Comment, DeclarationFragmentsBuilder::getFragmentsForFunction(Decl), + SubHeading, Signature, isInSystemHeader(Decl)); return true; } @@ -379,10 +380,9 @@ bool ExtractAPIVisitorBase::VisitEnumDecl(const EnumDecl *Decl) { DeclarationFragmentsBuilder::getFragmentsForEnum(Decl); DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - - EnumRecord *EnumRecord = - API.addEnum(API.copyString(Name), USR, Loc, AvailabilitySet(Decl), - Comment, Declaration, SubHeading, isInSystemHeader(Decl)); + EnumRecord *EnumRecord = API.addEnum( + API.copyString(Name), USR, Loc, AvailabilityInfo::createFromDecl(Decl), + Comment, Declaration, SubHeading, isInSystemHeader(Decl)); // Now collect information about the enumerators in this enum. getDerivedExtractAPIVisitor().recordEnumConstants(EnumRecord, @@ -496,8 +496,9 @@ bool ExtractAPIVisitorBase::VisitNamespaceDecl( DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); APIRecord *Parent = determineParentRecord(Decl->getDeclContext()); - API.addNamespace(Parent, Name, USR, Loc, AvailabilitySet(Decl), Linkage, - Comment, Declaration, SubHeading, isInSystemHeader(Decl)); + API.addNamespace(Parent, Name, USR, Loc, + AvailabilityInfo::createFromDecl(Decl), Linkage, Comment, + Declaration, SubHeading, isInSystemHeader(Decl)); return true; } @@ -527,10 +528,9 @@ bool ExtractAPIVisitorBase::VisitRecordDecl(const RecordDecl *Decl) { DeclarationFragmentsBuilder::getFragmentsForStruct(Decl); DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - StructRecord *StructRecord = - API.addStruct(Name, USR, Loc, AvailabilitySet(Decl), Comment, Declaration, - SubHeading, isInSystemHeader(Decl)); + API.addStruct(Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), + Comment, Declaration, SubHeading, isInSystemHeader(Decl)); // Now collect information about the fields in this struct. getDerivedExtractAPIVisitor().recordStructFields(StructRecord, @@ -578,13 +578,13 @@ bool ExtractAPIVisitorBase::VisitCXXRecordDecl( DeclarationFragmentsBuilder::getFragmentsForRedeclarableTemplate( Decl->getDescribedClassTemplate())); CXXClassRecord = API.addClassTemplate( - Parent, Name, USR, Loc, AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Template(Decl->getDescribedClassTemplate()), Access, - isInSystemHeader(Decl)); + Parent, Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, Template(Decl->getDescribedClassTemplate()), + Access, isInSystemHeader(Decl)); } else CXXClassRecord = API.addCXXClass( - Parent, Name, USR, Loc, AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Kind, Access, isInSystemHeader(Decl)); + Parent, Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, Kind, Access, isInSystemHeader(Decl)); CXXClassRecord->Bases = getBases(Decl); @@ -624,7 +624,7 @@ bool ExtractAPIVisitorBase::VisitCXXMethodDecl( FunctionTemplateDecl *TemplateDecl = Decl->getDescribedFunctionTemplate(); API.addCXXMethodTemplate( API.findRecordForUSR(ParentUSR), Decl->getName(), USR, Loc, - AvailabilitySet(Decl), Comment, + AvailabilityInfo::createFromDecl(Decl), Comment, DeclarationFragmentsBuilder::getFragmentsForFunctionTemplate( TemplateDecl), SubHeading, DeclarationFragmentsBuilder::getFunctionSignature(Decl), @@ -632,24 +632,27 @@ bool ExtractAPIVisitorBase::VisitCXXMethodDecl( Template(TemplateDecl), isInSystemHeader(Decl)); } else if (Decl->getTemplateSpecializationInfo()) API.addCXXMethodTemplateSpec( - Parent, Decl->getName(), USR, Loc, AvailabilitySet(Decl), Comment, + Parent, Decl->getName(), USR, Loc, + AvailabilityInfo::createFromDecl(Decl), Comment, DeclarationFragmentsBuilder:: getFragmentsForFunctionTemplateSpecialization(Decl), SubHeading, Signature, Access, isInSystemHeader(Decl)); else if (Decl->isOverloadedOperator()) API.addCXXInstanceMethod( Parent, API.copyString(Decl->getNameAsString()), USR, Loc, - AvailabilitySet(Decl), Comment, + AvailabilityInfo::createFromDecl(Decl), Comment, DeclarationFragmentsBuilder::getFragmentsForOverloadedOperator(Decl), SubHeading, Signature, Access, isInSystemHeader(Decl)); else if (Decl->isStatic()) API.addCXXStaticMethod( - Parent, Decl->getName(), USR, Loc, AvailabilitySet(Decl), Comment, + Parent, Decl->getName(), USR, Loc, + AvailabilityInfo::createFromDecl(Decl), Comment, DeclarationFragmentsBuilder::getFragmentsForCXXMethod(Decl), SubHeading, Signature, Access, isInSystemHeader(Decl)); else API.addCXXInstanceMethod( - Parent, Decl->getName(), USR, Loc, AvailabilitySet(Decl), Comment, + Parent, Decl->getName(), USR, Loc, + AvailabilityInfo::createFromDecl(Decl), Comment, DeclarationFragmentsBuilder::getFragmentsForCXXMethod(Decl), SubHeading, Signature, Access, isInSystemHeader(Decl)); @@ -678,13 +681,12 @@ bool ExtractAPIVisitorBase::VisitCXXConstructorDecl( FunctionSignature Signature = DeclarationFragmentsBuilder::getFunctionSignature(Decl); AccessControl Access = DeclarationFragmentsBuilder::getAccessControl(Decl); - SmallString<128> ParentUSR; index::generateUSRForDecl(dyn_cast(Decl->getDeclContext()), ParentUSR); API.addCXXInstanceMethod(API.findRecordForUSR(ParentUSR), Name, USR, Loc, - AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Signature, Access, + AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, Signature, Access, isInSystemHeader(Decl)); return true; } @@ -711,13 +713,12 @@ bool ExtractAPIVisitorBase::VisitCXXDestructorDecl( FunctionSignature Signature = DeclarationFragmentsBuilder::getFunctionSignature(Decl); AccessControl Access = DeclarationFragmentsBuilder::getAccessControl(Decl); - SmallString<128> ParentUSR; index::generateUSRForDecl(dyn_cast(Decl->getDeclContext()), ParentUSR); API.addCXXInstanceMethod(API.findRecordForUSR(ParentUSR), Name, USR, Loc, - AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Signature, Access, + AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, Signature, Access, isInSystemHeader(Decl)); return true; } @@ -740,8 +741,9 @@ bool ExtractAPIVisitorBase::VisitConceptDecl(const ConceptDecl *Decl) { DeclarationFragmentsBuilder::getFragmentsForConcept(Decl); DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - API.addConcept(Name, USR, Loc, AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Template(Decl), isInSystemHeader(Decl)); + API.addConcept(Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), + Comment, Declaration, SubHeading, Template(Decl), + isInSystemHeader(Decl)); return true; } @@ -768,8 +770,9 @@ bool ExtractAPIVisitorBase::VisitClassTemplateSpecializationDecl( APIRecord *Parent = determineParentRecord(Decl->getDeclContext()); auto *ClassTemplateSpecializationRecord = API.addClassTemplateSpecialization( - Parent, Name, USR, Loc, AvailabilitySet(Decl), Comment, Declaration, - SubHeading, DeclarationFragmentsBuilder::getAccessControl(Decl), + Parent, Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, + DeclarationFragmentsBuilder::getAccessControl(Decl), isInSystemHeader(Decl)); ClassTemplateSpecializationRecord->Bases = getBases(Decl); @@ -797,12 +800,11 @@ bool ExtractAPIVisitorBase:: getFragmentsForClassTemplatePartialSpecialization(Decl); DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - APIRecord *Parent = determineParentRecord(Decl->getDeclContext()); auto *ClassTemplatePartialSpecRecord = API.addClassTemplatePartialSpecialization( - Parent, Name, USR, Loc, AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Template(Decl), + Parent, Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), + Comment, Declaration, SubHeading, Template(Decl), DeclarationFragmentsBuilder::getAccessControl(Decl), isInSystemHeader(Decl)); @@ -845,12 +847,13 @@ bool ExtractAPIVisitorBase::VisitVarTemplateDecl( ParentUSR); if (Decl->getDeclContext()->getDeclKind() == Decl::CXXRecord) API.addCXXFieldTemplate(API.findRecordForUSR(ParentUSR), Name, USR, Loc, - AvailabilitySet(Decl), Comment, Declaration, - SubHeading, + AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, DeclarationFragmentsBuilder::getAccessControl(Decl), Template(Decl), isInSystemHeader(Decl)); else - API.addGlobalVariableTemplate(Name, USR, Loc, AvailabilitySet(Decl), + API.addGlobalVariableTemplate(Name, USR, Loc, + AvailabilityInfo::createFromDecl(Decl), Linkage, Comment, Declaration, SubHeading, Template(Decl), isInSystemHeader(Decl)); return true; @@ -880,10 +883,9 @@ bool ExtractAPIVisitorBase::VisitVarTemplateSpecializationDecl( Decl); DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - API.addGlobalVariableTemplateSpecialization( - Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, Declaration, - SubHeading, isInSystemHeader(Decl)); + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Linkage, Comment, + Declaration, SubHeading, isInSystemHeader(Decl)); return true; } @@ -910,10 +912,9 @@ bool ExtractAPIVisitorBase::VisitVarTemplatePartialSpecializationDecl( getFragmentsForVarTemplatePartialSpecialization(Decl); DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - API.addGlobalVariableTemplatePartialSpecialization( - Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, Declaration, - SubHeading, Template(Decl), isInSystemHeader(Decl)); + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Linkage, Comment, + Declaration, SubHeading, Template(Decl), isInSystemHeader(Decl)); return true; } @@ -942,9 +943,8 @@ bool ExtractAPIVisitorBase::VisitFunctionTemplateDecl( FunctionSignature Signature = DeclarationFragmentsBuilder::getFunctionSignature( Decl->getTemplatedDecl()); - API.addGlobalFunctionTemplate( - Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Linkage, Comment, DeclarationFragmentsBuilder::getFragmentsForFunctionTemplate(Decl), SubHeading, Signature, Template(Decl), isInSystemHeader(Decl)); @@ -983,8 +983,8 @@ bool ExtractAPIVisitorBase::VisitObjCInterfaceDecl( } ObjCInterfaceRecord *ObjCInterfaceRecord = API.addObjCInterface( - Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, Declaration, - SubHeading, SuperClass, isInSystemHeader(Decl)); + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Linkage, Comment, + Declaration, SubHeading, SuperClass, isInSystemHeader(Decl)); // Record all methods (selectors). This doesn't include automatically // synthesized property methods. @@ -1023,9 +1023,9 @@ bool ExtractAPIVisitorBase::VisitObjCProtocolDecl( DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Decl); - ObjCProtocolRecord *ObjCProtocolRecord = - API.addObjCProtocol(Name, USR, Loc, AvailabilitySet(Decl), Comment, - Declaration, SubHeading, isInSystemHeader(Decl)); + ObjCProtocolRecord *ObjCProtocolRecord = API.addObjCProtocol( + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, isInSystemHeader(Decl)); getDerivedExtractAPIVisitor().recordObjCMethods(ObjCProtocolRecord, Decl->methods()); @@ -1080,7 +1080,8 @@ bool ExtractAPIVisitorBase::VisitTypedefNameDecl( TypedefUnderlyingTypeResolver(Context).getSymbolReferenceForType(Type, API); - API.addTypedef(Name, USR, Loc, AvailabilitySet(Decl), Comment, + API.addTypedef(Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), + Comment, DeclarationFragmentsBuilder::getFragmentsForTypedef(Decl), DeclarationFragmentsBuilder::getSubHeading(Decl), SymRef, isInSystemHeader(Decl)); @@ -1122,8 +1123,9 @@ bool ExtractAPIVisitorBase::VisitObjCCategoryDecl( } ObjCCategoryRecord *ObjCCategoryRecord = API.addObjCCategory( - Name, USR, Loc, AvailabilitySet(Decl), Comment, Declaration, SubHeading, - Interface, isInSystemHeader(Decl), IsFromExternalModule); + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, Interface, isInSystemHeader(Decl), + IsFromExternalModule); getDerivedExtractAPIVisitor().recordObjCMethods(ObjCCategoryRecord, Decl->methods()); @@ -1160,9 +1162,9 @@ void ExtractAPIVisitorBase::recordEnumConstants( DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Constant); - API.addEnumConstant(EnumRecord, Name, USR, Loc, AvailabilitySet(Constant), - Comment, Declaration, SubHeading, - isInSystemHeader(Constant)); + API.addEnumConstant(EnumRecord, Name, USR, Loc, + AvailabilityInfo::createFromDecl(Constant), Comment, + Declaration, SubHeading, isInSystemHeader(Constant)); } } @@ -1189,9 +1191,9 @@ void ExtractAPIVisitorBase::recordStructFields( DeclarationFragments SubHeading = DeclarationFragmentsBuilder::getSubHeading(Field); - API.addStructField(StructRecord, Name, USR, Loc, AvailabilitySet(Field), - Comment, Declaration, SubHeading, - isInSystemHeader(Field)); + API.addStructField(StructRecord, Name, USR, Loc, + AvailabilityInfo::createFromDecl(Field), Comment, + Declaration, SubHeading, isInSystemHeader(Field)); } } @@ -1223,8 +1225,8 @@ bool ExtractAPIVisitorBase::VisitFieldDecl(const FieldDecl *Decl) { index::generateUSRForDecl(dyn_cast(Decl->getDeclContext()), ParentUSR); API.addCXXField(API.findRecordForUSR(ParentUSR), Name, USR, Loc, - AvailabilitySet(Decl), Comment, Declaration, SubHeading, - Access, isInSystemHeader(Decl)); + AvailabilityInfo::createFromDecl(Decl), Comment, Declaration, + SubHeading, Access, isInSystemHeader(Decl)); return true; } @@ -1255,13 +1257,13 @@ bool ExtractAPIVisitorBase::VisitCXXConversionDecl( ParentUSR); if (Decl->isStatic()) API.addCXXStaticMethod(API.findRecordForUSR(ParentUSR), Name, USR, Loc, - AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Signature, Access, + AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, Signature, Access, isInSystemHeader(Decl)); else API.addCXXInstanceMethod(API.findRecordForUSR(ParentUSR), Name, USR, Loc, - AvailabilitySet(Decl), Comment, Declaration, - SubHeading, Signature, Access, + AvailabilityInfo::createFromDecl(Decl), Comment, + Declaration, SubHeading, Signature, Access, isInSystemHeader(Decl)); return true; } @@ -1295,8 +1297,9 @@ void ExtractAPIVisitorBase::recordObjCMethods( FunctionSignature Signature = DeclarationFragmentsBuilder::getFunctionSignature(Method); - API.addObjCMethod(Container, Name, USR, Loc, AvailabilitySet(Method), - Comment, Declaration, SubHeading, Signature, + API.addObjCMethod(Container, Name, USR, Loc, + AvailabilityInfo::createFromDecl(Method), Comment, + Declaration, SubHeading, Signature, Method->isInstanceMethod(), isInSystemHeader(Method)); } } @@ -1334,8 +1337,8 @@ void ExtractAPIVisitorBase::recordObjCProperties( Attributes |= ObjCPropertyRecord::ReadOnly; API.addObjCProperty( - Container, Name, USR, Loc, AvailabilitySet(Property), Comment, - Declaration, SubHeading, + Container, Name, USR, Loc, AvailabilityInfo::createFromDecl(Property), + Comment, Declaration, SubHeading, static_cast(Attributes), GetterName, SetterName, Property->isOptional(), !(Property->getPropertyAttributes() & @@ -1370,9 +1373,9 @@ void ExtractAPIVisitorBase::recordObjCInstanceVariables( ObjCInstanceVariableRecord::AccessControl Access = Ivar->getCanonicalAccessControl(); - API.addObjCInstanceVariable(Container, Name, USR, Loc, - AvailabilitySet(Ivar), Comment, Declaration, - SubHeading, Access, isInSystemHeader(Ivar)); + API.addObjCInstanceVariable( + Container, Name, USR, Loc, AvailabilityInfo::createFromDecl(Ivar), + Comment, Declaration, SubHeading, Access, isInSystemHeader(Ivar)); } } diff --git a/clang/lib/ExtractAPI/API.cpp b/clang/lib/ExtractAPI/API.cpp index 71c655ba5b5b3..a7709fff85ffe 100644 --- a/clang/lib/ExtractAPI/API.cpp +++ b/clang/lib/ExtractAPI/API.cpp @@ -45,7 +45,7 @@ RecordTy *addTopLevelRecord(DenseMap &USRLookupTable, NamespaceRecord * APISet::addNamespace(APIRecord *Parent, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availability, + PresumedLoc Loc, AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) { @@ -61,17 +61,17 @@ APISet::addNamespace(APIRecord *Parent, StringRef Name, StringRef USR, GlobalVariableRecord * APISet::addGlobalVar(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Fragments, DeclarationFragments SubHeading, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, GlobalVariables, USR, Name, Loc, - std::move(Availabilities), Linkage, Comment, - Fragments, SubHeading, IsFromSystemHeader); + std::move(Availability), Linkage, Comment, Fragments, + SubHeading, IsFromSystemHeader); } GlobalVariableTemplateRecord *APISet::addGlobalVariableTemplate( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, bool IsFromSystemHeader) { @@ -83,19 +83,18 @@ GlobalVariableTemplateRecord *APISet::addGlobalVariableTemplate( GlobalFunctionRecord *APISet::addGlobalFunction( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Fragments, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, GlobalFunctions, USR, Name, Loc, - std::move(Availabilities), Linkage, Comment, - Fragments, SubHeading, Signature, - IsFromSystemHeader); + std::move(Availability), Linkage, Comment, Fragments, + SubHeading, Signature, IsFromSystemHeader); } GlobalFunctionTemplateRecord *APISet::addGlobalFunctionTemplate( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, Template Template, bool IsFromSystemHeader) { @@ -108,7 +107,7 @@ GlobalFunctionTemplateRecord *APISet::addGlobalFunctionTemplate( GlobalFunctionTemplateSpecializationRecord * APISet::addGlobalFunctionTemplateSpecialization( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsFromSystemHeader) { @@ -120,14 +119,14 @@ APISet::addGlobalFunctionTemplateSpecialization( EnumConstantRecord *APISet::addEnumConstant(EnumRecord *Enum, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) { auto Record = std::make_unique( - USR, Name, Loc, std::move(Availabilities), Comment, Declaration, - SubHeading, IsFromSystemHeader); + USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, + IsFromSystemHeader); Record->ParentInformation = APIRecord::HierarchyInformation( Enum->USR, Enum->Name, Enum->getKind(), Enum); USRBasedLookupTable.insert({USR, Record.get()}); @@ -135,26 +134,26 @@ EnumConstantRecord *APISet::addEnumConstant(EnumRecord *Enum, StringRef Name, } EnumRecord *APISet::addEnum(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, Enums, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, IsFromSystemHeader); } StructFieldRecord *APISet::addStructField(StructRecord *Struct, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) { auto Record = std::make_unique( - USR, Name, Loc, std::move(Availabilities), Comment, Declaration, - SubHeading, IsFromSystemHeader); + USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, + IsFromSystemHeader); Record->ParentInformation = APIRecord::HierarchyInformation( Struct->USR, Struct->Name, Struct->getKind(), Struct); USRBasedLookupTable.insert({USR, Record.get()}); @@ -162,37 +161,37 @@ StructFieldRecord *APISet::addStructField(StructRecord *Struct, StringRef Name, } StructRecord *APISet::addStruct(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, Structs, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, IsFromSystemHeader); } StaticFieldRecord * APISet::addStaticField(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference Context, AccessControl Access, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, StaticFields, USR, Name, Loc, - std::move(Availabilities), Linkage, Comment, + std::move(Availability), Linkage, Comment, Declaration, SubHeading, Context, Access, IsFromSystemHeader); } CXXFieldRecord * APISet::addCXXField(APIRecord *CXXClass, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader) { auto *Record = addTopLevelRecord( - USRBasedLookupTable, CXXFields, USR, Name, Loc, std::move(Availabilities), + USRBasedLookupTable, CXXFields, USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, Access, IsFromSystemHeader); Record->ParentInformation = APIRecord::HierarchyInformation( CXXClass->USR, CXXClass->Name, CXXClass->getKind(), CXXClass); @@ -201,7 +200,7 @@ APISet::addCXXField(APIRecord *CXXClass, StringRef Name, StringRef USR, CXXFieldTemplateRecord *APISet::addCXXFieldTemplate( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, Template Template, bool IsFromSystemHeader) { auto *Record = @@ -216,14 +215,13 @@ CXXFieldTemplateRecord *APISet::addCXXFieldTemplate( CXXClassRecord * APISet::addCXXClass(APIRecord *Parent, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availabilities, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, APIRecord::RecordKind Kind, AccessControl Access, bool IsFromSystemHeader) { - auto *Record = - addTopLevelRecord(USRBasedLookupTable, CXXClasses, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, - SubHeading, Kind, Access, IsFromSystemHeader); + auto *Record = addTopLevelRecord( + USRBasedLookupTable, CXXClasses, USR, Name, Loc, std::move(Availability), + Comment, Declaration, SubHeading, Kind, Access, IsFromSystemHeader); if (Parent) Record->ParentInformation = APIRecord::HierarchyInformation( Parent->USR, Parent->Name, Parent->getKind(), Parent); @@ -232,7 +230,7 @@ APISet::addCXXClass(APIRecord *Parent, StringRef Name, StringRef USR, ClassTemplateRecord *APISet::addClassTemplate( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader) { auto *Record = @@ -247,7 +245,7 @@ ClassTemplateRecord *APISet::addClassTemplate( ClassTemplateSpecializationRecord *APISet::addClassTemplateSpecialization( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, AccessControl Access, bool IsFromSystemHeader) { auto *Record = @@ -263,7 +261,7 @@ ClassTemplateSpecializationRecord *APISet::addClassTemplateSpecialization( ClassTemplatePartialSpecializationRecord * APISet::addClassTemplatePartialSpecialization( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, AccessControl Access, bool IsFromSystemHeader) { auto *Record = addTopLevelRecord( @@ -279,7 +277,7 @@ APISet::addClassTemplatePartialSpecialization( GlobalVariableTemplateSpecializationRecord * APISet::addGlobalVariableTemplateSpecialization( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, @@ -291,7 +289,7 @@ APISet::addGlobalVariableTemplateSpecialization( GlobalVariableTemplatePartialSpecializationRecord * APISet::addGlobalVariableTemplatePartialSpecialization( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, Template Template, bool IsFromSystemHeader) { @@ -302,7 +300,8 @@ APISet::addGlobalVariableTemplatePartialSpecialization( } ConceptRecord *APISet::addConcept(StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availability, + PresumedLoc Loc, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, @@ -314,7 +313,7 @@ ConceptRecord *APISet::addConcept(StringRef Name, StringRef USR, CXXMethodRecord *APISet::addCXXInstanceMethod( APIRecord *CXXClassRecord, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) { @@ -331,7 +330,7 @@ CXXMethodRecord *APISet::addCXXInstanceMethod( CXXMethodRecord *APISet::addCXXStaticMethod( APIRecord *CXXClassRecord, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) { @@ -348,7 +347,7 @@ CXXMethodRecord *APISet::addCXXStaticMethod( CXXMethodTemplateRecord *APISet::addCXXMethodTemplate( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, Template Template, bool IsFromSystemHeader) { @@ -364,7 +363,7 @@ CXXMethodTemplateRecord *APISet::addCXXMethodTemplate( CXXMethodTemplateSpecializationRecord *APISet::addCXXMethodTemplateSpec( APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availability, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, AccessControl Access, bool IsFromSystemHeader) { @@ -381,14 +380,14 @@ CXXMethodTemplateSpecializationRecord *APISet::addCXXMethodTemplateSpec( ObjCCategoryRecord *APISet::addObjCCategory( StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference Interface, bool IsFromSystemHeader, bool IsFromExternalModule) { // Create the category record. auto *Record = addTopLevelRecord(USRBasedLookupTable, ObjCCategories, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, Interface, IsFromSystemHeader); Record->IsFromExternalModule = IsFromExternalModule; @@ -402,31 +401,31 @@ ObjCCategoryRecord *APISet::addObjCCategory( ObjCInterfaceRecord * APISet::addObjCInterface(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, LinkageInfo Linkage, + AvailabilityInfo Availability, LinkageInfo Linkage, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference SuperClass, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, ObjCInterfaces, USR, Name, Loc, - std::move(Availabilities), Linkage, Comment, + std::move(Availability), Linkage, Comment, Declaration, SubHeading, SuperClass, IsFromSystemHeader); } ObjCMethodRecord *APISet::addObjCMethod( ObjCContainerRecord *Container, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availabilities, const DocComment &Comment, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, FunctionSignature Signature, bool IsInstanceMethod, bool IsFromSystemHeader) { std::unique_ptr Record; if (IsInstanceMethod) Record = std::make_unique( - USR, Name, Loc, std::move(Availabilities), Comment, Declaration, + USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, Signature, IsFromSystemHeader); else Record = std::make_unique( - USR, Name, Loc, std::move(Availabilities), Comment, Declaration, + USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, Signature, IsFromSystemHeader); Record->ParentInformation = APIRecord::HierarchyInformation( @@ -437,7 +436,7 @@ ObjCMethodRecord *APISet::addObjCMethod( ObjCPropertyRecord *APISet::addObjCProperty( ObjCContainerRecord *Container, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availabilities, const DocComment &Comment, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, ObjCPropertyRecord::AttributeKind Attributes, StringRef GetterName, StringRef SetterName, bool IsOptional, bool IsInstanceProperty, @@ -445,12 +444,12 @@ ObjCPropertyRecord *APISet::addObjCProperty( std::unique_ptr Record; if (IsInstanceProperty) Record = std::make_unique( - USR, Name, Loc, std::move(Availabilities), Comment, Declaration, + USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, Attributes, GetterName, SetterName, IsOptional, IsFromSystemHeader); else Record = std::make_unique( - USR, Name, Loc, std::move(Availabilities), Comment, Declaration, + USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, Attributes, GetterName, SetterName, IsOptional, IsFromSystemHeader); Record->ParentInformation = APIRecord::HierarchyInformation( @@ -461,12 +460,12 @@ ObjCPropertyRecord *APISet::addObjCProperty( ObjCInstanceVariableRecord *APISet::addObjCInstanceVariable( ObjCContainerRecord *Container, StringRef Name, StringRef USR, - PresumedLoc Loc, AvailabilitySet Availabilities, const DocComment &Comment, + PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, ObjCInstanceVariableRecord::AccessControl Access, bool IsFromSystemHeader) { auto Record = std::make_unique( - USR, Name, Loc, std::move(Availabilities), Comment, Declaration, - SubHeading, Access, IsFromSystemHeader); + USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading, + Access, IsFromSystemHeader); Record->ParentInformation = APIRecord::HierarchyInformation( Container->USR, Container->Name, Container->getKind(), Container); USRBasedLookupTable.insert({USR, Record.get()}); @@ -475,13 +474,13 @@ ObjCInstanceVariableRecord *APISet::addObjCInstanceVariable( ObjCProtocolRecord *APISet::addObjCProtocol(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, ObjCProtocols, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, IsFromSystemHeader); } @@ -496,12 +495,12 @@ APISet::addMacroDefinition(StringRef Name, StringRef USR, PresumedLoc Loc, TypedefRecord * APISet::addTypedef(StringRef Name, StringRef USR, PresumedLoc Loc, - AvailabilitySet Availabilities, const DocComment &Comment, + AvailabilityInfo Availability, const DocComment &Comment, DeclarationFragments Declaration, DeclarationFragments SubHeading, SymbolReference UnderlyingType, bool IsFromSystemHeader) { return addTopLevelRecord(USRBasedLookupTable, Typedefs, USR, Name, Loc, - std::move(Availabilities), Comment, Declaration, + std::move(Availability), Comment, Declaration, SubHeading, UnderlyingType, IsFromSystemHeader); } diff --git a/clang/lib/ExtractAPI/AvailabilityInfo.cpp b/clang/lib/ExtractAPI/AvailabilityInfo.cpp index 1df852fdbf930..18e4d16b45bb6 100644 --- a/clang/lib/ExtractAPI/AvailabilityInfo.cpp +++ b/clang/lib/ExtractAPI/AvailabilityInfo.cpp @@ -1,50 +1,35 @@ #include "clang/ExtractAPI/AvailabilityInfo.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/Basic/TargetInfo.h" #include "llvm/ADT/STLExtras.h" -using namespace clang; -using namespace extractapi; +using namespace clang::extractapi; +using namespace llvm; -AvailabilitySet::AvailabilitySet(const Decl *Decl) { - // Collect availability attributes from all redeclrations. - for (const auto *RD : Decl->redecls()) { - if (const auto *A = RD->getAttr()) { - if (!A->isImplicit()) { - this->Availabilities.clear(); - UnconditionallyUnavailable = true; - } - } +AvailabilityInfo AvailabilityInfo::createFromDecl(const Decl *Decl) { + ASTContext &Context = Decl->getASTContext(); + StringRef PlatformName = Context.getTargetInfo().getPlatformName(); + AvailabilityInfo Availability; - if (const auto *A = RD->getAttr()) { - if (!A->isImplicit()) { - this->Availabilities.clear(); - UnconditionallyDeprecated = true; - } + // Collect availability attributes from all redeclarations. + for (const auto *RD : Decl->redecls()) { + for (const auto *A : RD->specific_attrs()) { + if (A->getPlatform()->getName() != PlatformName) + continue; + Availability = + AvailabilityInfo(A->getPlatform()->getName(), A->getIntroduced(), + A->getDeprecated(), A->getObsoleted(), false, false); + break; } - for (const auto *Attr : RD->specific_attrs()) { - StringRef Domain = Attr->getPlatform()->getName(); - auto *Availability = - llvm::find_if(Availabilities, [Domain](const AvailabilityInfo &Info) { - return Domain.equals(Info.Domain); - }); - if (Availability != Availabilities.end()) { - // Get the highest introduced version for all redeclarations. - if (Availability->Introduced < Attr->getIntroduced()) - Availability->Introduced = Attr->getIntroduced(); + if (const auto *A = RD->getAttr()) + if (!A->isImplicit()) + Availability.UnconditionallyUnavailable = true; - // Get the lowest deprecated version for all redeclarations. - if (Availability->Deprecated > Attr->getDeprecated()) - Availability->Deprecated = Attr->getDeprecated(); - - // Get the lowest obsoleted version for all redeclarations. - if (Availability->Obsoleted > Attr->getObsoleted()) - Availability->Obsoleted = Attr->getObsoleted(); - } else { - Availabilities.emplace_back(Domain, Attr->getIntroduced(), - Attr->getDeprecated(), Attr->getObsoleted(), - Attr->getUnavailable()); - } - } + if (const auto *A = RD->getAttr()) + if (!A->isImplicit()) + Availability.UnconditionallyDeprecated = true; } + return Availability; } diff --git a/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp b/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp index 53b22297ee0ea..ee424a16fc1cf 100644 --- a/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp +++ b/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp @@ -147,46 +147,40 @@ Object serializeSourceRange(const PresumedLoc &BeginLoc, /// Serialize the availability attributes of a symbol. /// /// Availability information contains the introduced, deprecated, and obsoleted -/// versions of the symbol for a given domain (roughly corresponds to a -/// platform) as semantic versions, if not default. Availability information -/// also contains flags to indicate if the symbol is unconditionally unavailable -/// or deprecated, i.e. \c __attribute__((unavailable)) and \c -/// __attribute__((deprecated)). +/// versions of the symbol as semantic versions, if not default. +/// Availability information also contains flags to indicate if the symbol is +/// unconditionally unavailable or deprecated, +/// i.e. \c __attribute__((unavailable)) and \c __attribute__((deprecated)). /// /// \returns \c std::nullopt if the symbol has default availability attributes, -/// or an \c Array containing the formatted availability information. -std::optional -serializeAvailability(const AvailabilitySet &Availabilities) { - if (Availabilities.isDefault()) +/// or an \c Array containing an object with the formatted availability +/// information. +std::optional serializeAvailability(const AvailabilityInfo &Avail) { + if (Avail.isDefault()) return std::nullopt; + Object Availability; Array AvailabilityArray; - - if (Availabilities.isUnconditionallyDeprecated()) { + Availability["domain"] = Avail.Domain; + serializeObject(Availability, "introduced", + serializeSemanticVersion(Avail.Introduced)); + serializeObject(Availability, "deprecated", + serializeSemanticVersion(Avail.Deprecated)); + serializeObject(Availability, "obsoleted", + serializeSemanticVersion(Avail.Obsoleted)); + if (Avail.isUnconditionallyDeprecated()) { Object UnconditionallyDeprecated; UnconditionallyDeprecated["domain"] = "*"; UnconditionallyDeprecated["isUnconditionallyDeprecated"] = true; AvailabilityArray.emplace_back(std::move(UnconditionallyDeprecated)); } - - // Note unconditionally unavailable records are skipped. - - for (const auto &AvailInfo : Availabilities) { - Object Availability; - Availability["domain"] = AvailInfo.Domain; - if (AvailInfo.Unavailable) - Availability["isUnconditionallyUnavailable"] = true; - else { - serializeObject(Availability, "introduced", - serializeSemanticVersion(AvailInfo.Introduced)); - serializeObject(Availability, "deprecated", - serializeSemanticVersion(AvailInfo.Deprecated)); - serializeObject(Availability, "obsoleted", - serializeSemanticVersion(AvailInfo.Obsoleted)); - } - AvailabilityArray.emplace_back(std::move(Availability)); + if (Avail.isUnconditionallyUnavailable()) { + Object UnconditionallyUnavailable; + UnconditionallyUnavailable["domain"] = "*"; + UnconditionallyUnavailable["isUnconditionallyUnavailable"] = true; + AvailabilityArray.emplace_back(std::move(UnconditionallyUnavailable)); } - + AvailabilityArray.emplace_back(std::move(Availability)); return AvailabilityArray; } @@ -738,7 +732,7 @@ bool SymbolGraphSerializer::shouldSkip(const APIRecord &Record) const { return true; // Skip unconditionally unavailable symbols - if (Record.Availabilities.isUnconditionallyUnavailable()) + if (Record.Availability.isUnconditionallyUnavailable()) return true; // Filter out symbols prefixed with an underscored as they are understood to @@ -764,7 +758,7 @@ SymbolGraphSerializer::serializeAPIRecord(const RecordTy &Record) const { Obj, "location", serializeSourceLocation(Record.Location, /*IncludeFileURI=*/true)); serializeArray(Obj, "availability", - serializeAvailability(Record.Availabilities)); + serializeAvailability(Record.Availability)); serializeObject(Obj, "docComment", serializeDocComment(Record.Comment)); serializeArray(Obj, "declarationFragments", serializeDeclarationFragments(Record.Declaration)); diff --git a/clang/test/ExtractAPI/availability.c b/clang/test/ExtractAPI/availability.c index 4bda94ba7c2bf..3c1ef5c45b634 100644 --- a/clang/test/ExtractAPI/availability.c +++ b/clang/test/ExtractAPI/availability.c @@ -300,22 +300,6 @@ void e(void) __attribute__((availability(tvos, unavailable))); "minor": 0, "patch": 0 } - }, - { - "domain": "ios", - "introduced": { - "major": 13, - "minor": 0, - "patch": 0 - } - }, - { - "domain": "tvos", - "introduced": { - "major": 15, - "minor": 0, - "patch": 0 - } } ], "declarationFragments": [ @@ -394,10 +378,6 @@ void e(void) __attribute__((availability(tvos, unavailable))); "minor": 0, "patch": 0 } - }, - { - "domain": "tvos", - "isUnconditionallyUnavailable": true } ], "declarationFragments": [ diff --git a/clang/tools/libclang/CXExtractAPI.cpp b/clang/tools/libclang/CXExtractAPI.cpp index 9128e891538a8..05098c96829fc 100644 --- a/clang/tools/libclang/CXExtractAPI.cpp +++ b/clang/tools/libclang/CXExtractAPI.cpp @@ -80,8 +80,8 @@ struct LibClangExtractAPIVisitor } ObjCInterfaceRecord *ObjCInterfaceRecord = API.addObjCInterface( - Name, USR, Loc, AvailabilitySet(Decl), Linkage, Comment, Declaration, - SubHeading, SuperClass, isInSystemHeader(Decl)); + Name, USR, Loc, AvailabilityInfo::createFromDecl(Decl), Linkage, + Comment, Declaration, SubHeading, SuperClass, isInSystemHeader(Decl)); // Record all methods (selectors). This doesn't include automatically // synthesized property methods.