https://github.com/evelez7 created 
https://github.com/llvm/llvm-project/pull/146149

None

>From 2f505f6ba4af1b9c48d644ef81e2848234df593a Mon Sep 17 00:00:00 2001
From: Erick Velez <erickvel...@gmail.com>
Date: Fri, 27 Jun 2025 12:03:31 -0700
Subject: [PATCH] [clang-doc] emit IsBuiltIn and IsTemplate for types

---
 clang-tools-extra/clang-doc/BitcodeReader.cpp | 18 ++++++++++++++-
 clang-tools-extra/clang-doc/BitcodeWriter.cpp | 22 ++++++++++++++++---
 clang-tools-extra/clang-doc/BitcodeWriter.h   |  6 +++++
 .../test/clang-doc/json/class-template.cpp    |  2 +-
 .../test/clang-doc/json/class.cpp             |  6 ++---
 .../test/clang-doc/json/function-requires.cpp |  2 +-
 .../test/clang-doc/json/method-template.cpp   |  2 +-
 .../test/clang-doc/json/namespace.cpp         |  7 +++---
 8 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp 
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 74da80c382120..fd6f40cff1a4e 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -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");
diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp 
b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
index c3351d1decbf5..006ddda1b75e7 100644
--- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
@@ -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);
 }
diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.h 
b/clang-tools-extra/clang-doc/BitcodeWriter.h
index a70e50b53a61a..f1325094f957a 100644
--- a/clang-tools-extra/clang-doc/BitcodeWriter.h
+++ b/clang-tools-extra/clang-doc/BitcodeWriter.h
@@ -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,
diff --git a/clang-tools-extra/test/clang-doc/json/class-template.cpp 
b/clang-tools-extra/test/clang-doc/json/class-template.cpp
index e3ca086d1d9a4..fb9c4c2f21c2e 100644
--- a/clang-tools-extra/test/clang-doc/json/class-template.cpp
+++ b/clang-tools-extra/test/clang-doc/json/class-template.cpp
@@ -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"
diff --git a/clang-tools-extra/test/clang-doc/json/class.cpp 
b/clang-tools-extra/test/clang-doc/json/class.cpp
index 9ae1f14e2d2a6..bd82b8159e2f9 100644
--- a/clang-tools-extra/test/clang-doc/json/class.cpp
+++ b/clang-tools-extra/test/clang-doc/json/class.cpp
@@ -107,7 +107,7 @@ struct MyClass {
 // 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 @@ struct MyClass {
 // 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 @@ struct MyClass {
 // 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",
diff --git a/clang-tools-extra/test/clang-doc/json/function-requires.cpp 
b/clang-tools-extra/test/clang-doc/json/function-requires.cpp
index 99eb2bdb898f3..4e8432e088c4f 100644
--- a/clang-tools-extra/test/clang-doc/json/function-requires.cpp
+++ b/clang-tools-extra/test/clang-doc/json/function-requires.cpp
@@ -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",
diff --git a/clang-tools-extra/test/clang-doc/json/method-template.cpp 
b/clang-tools-extra/test/clang-doc/json/method-template.cpp
index c51a2706d1c22..ea9110d6c2d1c 100644
--- a/clang-tools-extra/test/clang-doc/json/method-template.cpp
+++ b/clang-tools-extra/test/clang-doc/json/method-template.cpp
@@ -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"
diff --git a/clang-tools-extra/test/clang-doc/json/namespace.cpp 
b/clang-tools-extra/test/clang-doc/json/namespace.cpp
index f1e094f6cab17..6e4fc6938d856 100644
--- a/clang-tools-extra/test/clang-doc/json/namespace.cpp
+++ b/clang-tools-extra/test/clang-doc/json/namespace.cpp
@@ -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",

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to