[clang-doc] serialize IsBuiltIn and IsTemplate for types (#146149)

IsBuiltIn and IsTemplate were being emitted as their default values.
This commit is contained in:
Erick Velez
2025-06-27 16:17:39 -07:00
committed by GitHub
parent 71d4c9ce70
commit 6d817810da
8 changed files with 51 additions and 14 deletions

View File

@@ -283,7 +283,15 @@ static llvm::Error parseRecord(const Record &R, unsigned ID,
static llvm::Error parseRecord(const Record &R, unsigned ID,
llvm::StringRef Blob, TypeInfo *I) {
return llvm::Error::success();
switch (ID) {
case TYPE_IS_BUILTIN:
return decodeRecord(R, I->IsBuiltIn, Blob);
case TYPE_IS_TEMPLATE:
return decodeRecord(R, I->IsTemplate, Blob);
default:
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid field for TypeInfo");
}
}
static llvm::Error parseRecord(const Record &R, unsigned ID,
@@ -293,6 +301,10 @@ static llvm::Error parseRecord(const Record &R, unsigned ID,
return decodeRecord(R, I->Name, Blob);
case FIELD_DEFAULT_VALUE:
return decodeRecord(R, I->DefaultValue, Blob);
case FIELD_TYPE_IS_BUILTIN:
return decodeRecord(R, I->IsBuiltIn, Blob);
case FIELD_TYPE_IS_TEMPLATE:
return decodeRecord(R, I->IsTemplate, Blob);
default:
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid field for TypeInfo");
@@ -308,6 +320,10 @@ static llvm::Error parseRecord(const Record &R, unsigned ID,
return decodeRecord(R, I->Access, Blob);
case MEMBER_TYPE_IS_STATIC:
return decodeRecord(R, I->IsStatic, Blob);
case MEMBER_TYPE_IS_BUILTIN:
return decodeRecord(R, I->IsBuiltIn, Blob);
case MEMBER_TYPE_IS_TEMPLATE:
return decodeRecord(R, I->IsTemplate, Blob);
default:
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid field for MemberTypeInfo");

View File

@@ -161,9 +161,15 @@ static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor>
{COMMENT_ARG, {"Arg", &genStringAbbrev}},
{FIELD_TYPE_NAME, {"Name", &genStringAbbrev}},
{FIELD_DEFAULT_VALUE, {"DefaultValue", &genStringAbbrev}},
{FIELD_TYPE_IS_BUILTIN, {"IsBuiltin", &genBoolAbbrev}},
{FIELD_TYPE_IS_TEMPLATE, {"IsTemplate", &genBoolAbbrev}},
{MEMBER_TYPE_NAME, {"Name", &genStringAbbrev}},
{MEMBER_TYPE_ACCESS, {"Access", &genIntAbbrev}},
{MEMBER_TYPE_IS_STATIC, {"IsStatic", &genBoolAbbrev}},
{MEMBER_TYPE_IS_BUILTIN, {"IsBuiltin", &genBoolAbbrev}},
{MEMBER_TYPE_IS_TEMPLATE, {"IsTemplate", &genBoolAbbrev}},
{TYPE_IS_BUILTIN, {"IsBuiltin", &genBoolAbbrev}},
{TYPE_IS_TEMPLATE, {"IsTemplate", &genBoolAbbrev}},
{NAMESPACE_USR, {"USR", &genSymbolIdAbbrev}},
{NAMESPACE_NAME, {"Name", &genStringAbbrev}},
{NAMESPACE_PATH, {"Path", &genStringAbbrev}},
@@ -239,12 +245,15 @@ static const std::vector<std::pair<BlockId, std::vector<RecordId>>>
COMMENT_PARAMNAME, COMMENT_CLOSENAME, COMMENT_SELFCLOSING,
COMMENT_EXPLICIT, COMMENT_ATTRKEY, COMMENT_ATTRVAL, COMMENT_ARG}},
// Type Block
{BI_TYPE_BLOCK_ID, {}},
{BI_TYPE_BLOCK_ID, {TYPE_IS_BUILTIN, TYPE_IS_TEMPLATE}},
// FieldType Block
{BI_FIELD_TYPE_BLOCK_ID, {FIELD_TYPE_NAME, FIELD_DEFAULT_VALUE}},
{BI_FIELD_TYPE_BLOCK_ID,
{FIELD_TYPE_NAME, FIELD_DEFAULT_VALUE, FIELD_TYPE_IS_BUILTIN,
FIELD_TYPE_IS_TEMPLATE}},
// MemberType Block
{BI_MEMBER_TYPE_BLOCK_ID,
{MEMBER_TYPE_NAME, MEMBER_TYPE_ACCESS, MEMBER_TYPE_IS_STATIC}},
{MEMBER_TYPE_NAME, MEMBER_TYPE_ACCESS, MEMBER_TYPE_IS_STATIC,
MEMBER_TYPE_IS_BUILTIN, MEMBER_TYPE_IS_TEMPLATE}},
// Enum Block
{BI_ENUM_BLOCK_ID,
{ENUM_USR, ENUM_NAME, ENUM_DEFLOCATION, ENUM_LOCATION, ENUM_SCOPED}},
@@ -470,6 +479,8 @@ void ClangDocBitcodeWriter::emitBlock(const Reference &R, FieldId Field) {
void ClangDocBitcodeWriter::emitBlock(const TypeInfo &T) {
StreamSubBlockGuard Block(Stream, BI_TYPE_BLOCK_ID);
emitBlock(T.Type, FieldId::F_type);
emitRecord(T.IsBuiltIn, TYPE_IS_BUILTIN);
emitRecord(T.IsTemplate, TYPE_IS_TEMPLATE);
}
void ClangDocBitcodeWriter::emitBlock(const TypedefInfo &T) {
@@ -491,6 +502,8 @@ void ClangDocBitcodeWriter::emitBlock(const FieldTypeInfo &T) {
emitBlock(T.Type, FieldId::F_type);
emitRecord(T.Name, FIELD_TYPE_NAME);
emitRecord(T.DefaultValue, FIELD_DEFAULT_VALUE);
emitRecord(T.IsBuiltIn, FIELD_TYPE_IS_BUILTIN);
emitRecord(T.IsTemplate, FIELD_TYPE_IS_TEMPLATE);
}
void ClangDocBitcodeWriter::emitBlock(const MemberTypeInfo &T) {
@@ -499,6 +512,9 @@ void ClangDocBitcodeWriter::emitBlock(const MemberTypeInfo &T) {
emitRecord(T.Name, MEMBER_TYPE_NAME);
emitRecord(T.Access, MEMBER_TYPE_ACCESS);
emitRecord(T.IsStatic, MEMBER_TYPE_IS_STATIC);
emitRecord(T.IsBuiltIn, MEMBER_TYPE_IS_BUILTIN);
emitRecord(T.IsTemplate, MEMBER_TYPE_IS_TEMPLATE);
emitRecord(T.IsTemplate, MEMBER_TYPE_IS_TEMPLATE);
for (const auto &CI : T.Description)
emitBlock(CI);
}

View File

@@ -96,11 +96,17 @@ enum RecordId {
COMMENT_ATTRKEY,
COMMENT_ATTRVAL,
COMMENT_ARG,
TYPE_IS_BUILTIN,
TYPE_IS_TEMPLATE,
FIELD_TYPE_NAME,
FIELD_DEFAULT_VALUE,
FIELD_TYPE_IS_BUILTIN,
FIELD_TYPE_IS_TEMPLATE,
MEMBER_TYPE_NAME,
MEMBER_TYPE_ACCESS,
MEMBER_TYPE_IS_STATIC,
MEMBER_TYPE_IS_BUILTIN,
MEMBER_TYPE_IS_TEMPLATE,
NAMESPACE_USR,
NAMESPACE_NAME,
NAMESPACE_PATH,

View File

@@ -17,7 +17,7 @@ template<typename T> struct MyClass {
// CHECK-NEXT: ],
// CHECK-NEXT: "ReturnType": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "IsTemplate": true,
// CHECK-NEXT: "Name": "T",
// CHECK-NEXT: "QualName": "T"
// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000"

View File

@@ -107,7 +107,7 @@ protected:
// CHECK-NEXT: "GlobalNamespace"
// CHECK-NEXT: ],
// CHECK-NEXT: "ReturnType": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsBuiltIn": true,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "Name": "int",
// CHECK-NEXT: "QualName": "int",
@@ -137,7 +137,7 @@ protected:
// CHECK-NEXT: }
// CHECK-NEXT: ],
// CHECK-NEXT: "ReturnType": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsBuiltIn": true,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "Name": "int",
// CHECK-NEXT: "QualName": "int",
@@ -184,7 +184,7 @@ protected:
// CHECK-NEXT: "TypeDeclaration": "",
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}",
// CHECK-NEXT: "Underlying": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsBuiltIn": true,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "Name": "int",
// CHECK-NEXT: "QualName": "int",

View File

@@ -23,7 +23,7 @@ template<Incrementable T> Incrementable auto incrementTwo(T t);
// CHECK-NEXT: }
// CHECK-NEXT: ],
// CHECK-NEXT: "ReturnType": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsBuiltIn": true,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "Name": "void",
// CHECK-NEXT: "QualName": "void",

View File

@@ -27,7 +27,7 @@ struct MyClass {
// CHECK-NEXT: ],
// CHECK-NEXT: "ReturnType": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "IsTemplate": true,
// CHECK-NEXT: "Name": "T",
// CHECK-NEXT: "QualName": "T",
// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000"

View File

@@ -56,7 +56,7 @@ typedef int MyTypedef;
// CHECK-NEXT: }
// CHECK-NEXT: ],
// CHECK-NEXT: "ReturnType": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsBuiltIn": true,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "Name": "void",
// CHECK-NEXT: "QualName": "void",
@@ -93,7 +93,7 @@ typedef int MyTypedef;
// CHECK-NEXT: "TypeDeclaration": "",
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}",
// CHECK-NEXT: "Underlying": {
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsBuiltIn": true,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "Name": "int",
// CHECK-NEXT: "QualName": "int",
@@ -111,8 +111,7 @@ typedef int MyTypedef;
// CHECK-NEXT: },
// CHECK-NEXT: "Name": "Global",
// CHECK-NEXT: "Type": {
// COM: FIXME: IsBuiltIn emits as its default value
// CHECK-NEXT: "IsBuiltIn": false,
// CHECK-NEXT: "IsBuiltIn": true,
// CHECK-NEXT: "IsTemplate": false,
// CHECK-NEXT: "Name": "int",
// CHECK-NEXT: "QualName": "int",