[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 updated
https://github.com/llvm/llvm-project/pull/144430
>From 63143f08d0044e11562ce142060cb1f2234c9a36 Mon Sep 17 00:00:00 2001
From: Erick Velez
Date: Mon, 16 Jun 2025 10:50:35 -0700
Subject: [PATCH] add serializeArray for infos with URLs
---
clang-tools-extra/clang-doc/BitcodeReader.cpp | 73 +++
clang-tools-extra/clang-doc/BitcodeWriter.cpp | 44 ++-
clang-tools-extra/clang-doc/BitcodeWriter.h | 12 +-
clang-tools-extra/clang-doc/HTMLGenerator.cpp | 4 +
.../clang-doc/HTMLMustacheGenerator.cpp | 2 +
clang-tools-extra/clang-doc/JSONGenerator.cpp | 50
clang-tools-extra/clang-doc/MDGenerator.cpp | 5 +
clang-tools-extra/clang-doc/Mapper.cpp| 4 +
clang-tools-extra/clang-doc/Mapper.h | 1 +
.../clang-doc/Representation.cpp | 20 +++
clang-tools-extra/clang-doc/Representation.h | 26 +++-
clang-tools-extra/clang-doc/Serialize.cpp | 90 +
clang-tools-extra/clang-doc/Serialize.h | 4 +
clang-tools-extra/clang-doc/YAMLGenerator.cpp | 2 +
.../test/clang-doc/json/class-requires.cpp| 18 +--
.../clang-doc/json/compound-constraints.cpp | 121 ++
.../test/clang-doc/json/concept.cpp | 49 +++
.../test/clang-doc/json/function-requires.cpp | 36 +++---
.../unittests/clang-doc/BitcodeTest.cpp | 2 +
19 files changed, 507 insertions(+), 56 deletions(-)
create mode 100644
clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 35058abab0663..66852931226bf 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType
&Field,
case InfoType::IT_default:
case InfoType::IT_enum:
case InfoType::IT_typedef:
+ case InfoType::IT_concept:
Field = IT;
return llvm::Error::success();
}
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId
&Field,
case FieldId::F_type:
case FieldId::F_child_namespace:
case FieldId::F_child_record:
+ case FieldId::F_concept:
case FieldId::F_default:
Field = F;
return llvm::Error::success();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned
ID,
"invalid field for TemplateParamInfo");
}
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConceptInfo *I) {
+ switch (ID) {
+ case CONCEPT_USR:
+return decodeRecord(R, I->USR, Blob);
+ case CONCEPT_NAME:
+return decodeRecord(R, I->Name, Blob);
+ case CONCEPT_IS_TYPE:
+return decodeRecord(R, I->IsType, Blob);
+ case CONCEPT_CONSTRAINT_EXPRESSION:
+return decodeRecord(R, I->ConstraintExpression, Blob);
+ }
+ llvm_unreachable("invalid field for ConceptInfo");
+}
+
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConstraintInfo *I) {
+ if (ID == CONSTRAINT_EXPRESSION)
+return decodeRecord(R, I->ConstraintExpr, Blob);
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid field for ConstraintInfo");
+}
+
template static llvm::Expected getCommentInfo(T I)
{
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid type cannot contain CommentInfo");
@@ -429,6 +454,10 @@ template <> llvm::Expected
getCommentInfo(CommentInfo *I) {
return I->Children.back().get();
}
+template <> llvm::Expected getCommentInfo(ConceptInfo *I) {
+ return &I->Description.emplace_back();
+}
+
// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
// the parent block to set it. The template specializations define what to do
// for each supported parent block.
@@ -584,6 +613,17 @@ template <> llvm::Error addReference(RecordInfo *I,
Reference &&R, FieldId F) {
}
}
+template <>
+llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
+ if (F == FieldId::F_concept) {
+I->ConceptRef = std::move(R);
+return llvm::Error::success();
+ }
+ return llvm::createStringError(
+ llvm::inconvertibleErrorCode(),
+ "ConstraintInfo cannot contain this Reference");
+}
+
template
static void addChild(T I, ChildInfoType &&R) {
llvm::errs() << "invalid child type for info";
@@ -600,6 +640,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
I->Children.Typedefs.emplace_back(std::move(R));
}
+template <> void addChild(NamespaceInfo *I, ConceptInfo &&R) {
+ I->Children.Concepts.emplace_back(std::move(R));
+}
// Record children:
template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
@@ -649,6 +692,9 @@ template <> void a
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 updated
https://github.com/llvm/llvm-project/pull/144430
>From 63143f08d0044e11562ce142060cb1f2234c9a36 Mon Sep 17 00:00:00 2001
From: Erick Velez
Date: Mon, 16 Jun 2025 10:50:35 -0700
Subject: [PATCH] add serializeArray for infos with URLs
---
clang-tools-extra/clang-doc/BitcodeReader.cpp | 73 +++
clang-tools-extra/clang-doc/BitcodeWriter.cpp | 44 ++-
clang-tools-extra/clang-doc/BitcodeWriter.h | 12 +-
clang-tools-extra/clang-doc/HTMLGenerator.cpp | 4 +
.../clang-doc/HTMLMustacheGenerator.cpp | 2 +
clang-tools-extra/clang-doc/JSONGenerator.cpp | 50
clang-tools-extra/clang-doc/MDGenerator.cpp | 5 +
clang-tools-extra/clang-doc/Mapper.cpp| 4 +
clang-tools-extra/clang-doc/Mapper.h | 1 +
.../clang-doc/Representation.cpp | 20 +++
clang-tools-extra/clang-doc/Representation.h | 26 +++-
clang-tools-extra/clang-doc/Serialize.cpp | 90 +
clang-tools-extra/clang-doc/Serialize.h | 4 +
clang-tools-extra/clang-doc/YAMLGenerator.cpp | 2 +
.../test/clang-doc/json/class-requires.cpp| 18 +--
.../clang-doc/json/compound-constraints.cpp | 121 ++
.../test/clang-doc/json/concept.cpp | 49 +++
.../test/clang-doc/json/function-requires.cpp | 36 +++---
.../unittests/clang-doc/BitcodeTest.cpp | 2 +
19 files changed, 507 insertions(+), 56 deletions(-)
create mode 100644
clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 35058abab0663..66852931226bf 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType
&Field,
case InfoType::IT_default:
case InfoType::IT_enum:
case InfoType::IT_typedef:
+ case InfoType::IT_concept:
Field = IT;
return llvm::Error::success();
}
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId
&Field,
case FieldId::F_type:
case FieldId::F_child_namespace:
case FieldId::F_child_record:
+ case FieldId::F_concept:
case FieldId::F_default:
Field = F;
return llvm::Error::success();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned
ID,
"invalid field for TemplateParamInfo");
}
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConceptInfo *I) {
+ switch (ID) {
+ case CONCEPT_USR:
+return decodeRecord(R, I->USR, Blob);
+ case CONCEPT_NAME:
+return decodeRecord(R, I->Name, Blob);
+ case CONCEPT_IS_TYPE:
+return decodeRecord(R, I->IsType, Blob);
+ case CONCEPT_CONSTRAINT_EXPRESSION:
+return decodeRecord(R, I->ConstraintExpression, Blob);
+ }
+ llvm_unreachable("invalid field for ConceptInfo");
+}
+
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConstraintInfo *I) {
+ if (ID == CONSTRAINT_EXPRESSION)
+return decodeRecord(R, I->ConstraintExpr, Blob);
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid field for ConstraintInfo");
+}
+
template static llvm::Expected getCommentInfo(T I)
{
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid type cannot contain CommentInfo");
@@ -429,6 +454,10 @@ template <> llvm::Expected
getCommentInfo(CommentInfo *I) {
return I->Children.back().get();
}
+template <> llvm::Expected getCommentInfo(ConceptInfo *I) {
+ return &I->Description.emplace_back();
+}
+
// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
// the parent block to set it. The template specializations define what to do
// for each supported parent block.
@@ -584,6 +613,17 @@ template <> llvm::Error addReference(RecordInfo *I,
Reference &&R, FieldId F) {
}
}
+template <>
+llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
+ if (F == FieldId::F_concept) {
+I->ConceptRef = std::move(R);
+return llvm::Error::success();
+ }
+ return llvm::createStringError(
+ llvm::inconvertibleErrorCode(),
+ "ConstraintInfo cannot contain this Reference");
+}
+
template
static void addChild(T I, ChildInfoType &&R) {
llvm::errs() << "invalid child type for info";
@@ -600,6 +640,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
I->Children.Typedefs.emplace_back(std::move(R));
}
+template <> void addChild(NamespaceInfo *I, ConceptInfo &&R) {
+ I->Children.Concepts.emplace_back(std::move(R));
+}
// Record children:
template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
@@ -649,6 +692,9 @@ template <> void a
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
@@ -248,6 +257,27 @@ static void serializeCommonChildren(const ScopeChildren
&Children,
}
}
+template
+static void serializeArray(const std::vector &Records, Object &Obj,
+ const std::string &Key,
+ SerializationFunc serializeInfo) {
+ json::Value RecordsArray = Array();
+ auto &RecordsArrayRef = *RecordsArray.getAsArray();
+ RecordsArrayRef.reserve(Records.size());
+ for (const auto &Item : Records) {
+json::Value ItemVal = Object();
+auto &ItemObj = *ItemVal.getAsObject();
+serializeInfo(Item, ItemObj);
+RecordsArrayRef.push_back(ItemVal);
+ }
evelez7 wrote:
I'm going to refactor a lot of the code in here later to call this function for
arrays. And I'll probably make a similar one for objects that just get a value
declared and passed to `serializeInfo`.
https://github.com/llvm/llvm-project/pull/144430
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
@@ -211,6 +214,15 @@ struct TemplateSpecializationInfo {
std::vector Params;
};
+struct ConstraintInfo {
+ ConstraintInfo() = default;
+ ConstraintInfo(SymbolID USR, StringRef Name)
+ : ConceptRef(USR, Name, InfoType::IT_concept) {}
+ Reference ConceptRef;
+
+ SmallString<16> Expression; // The expression that defines the constraint.
ilovepi wrote:
Maybe just name it `ConstraintExpr`?
https://github.com/llvm/llvm-project/pull/144430
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
@@ -649,6 +693,9 @@ template <> void addTemplate(RecordInfo *I, TemplateInfo
&&P) {
template <> void addTemplate(FunctionInfo *I, TemplateInfo &&P) {
I->Template.emplace(std::move(P));
}
+template <> void addTemplate(ConceptInfo *I, TemplateInfo &&P) {
+ I->Template = std::move(P);
+}
ilovepi wrote:
Not something you need to fix here, but dang do we require a lot of
boiler-plate changes to the APIs. It's almost like we're not holding templates
in the normal way...
https://github.com/llvm/llvm-project/pull/144430
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
@@ -584,6 +613,18 @@ template <> llvm::Error addReference(RecordInfo *I,
Reference &&R, FieldId F) {
}
}
+template <>
+llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
+ switch (F) {
+ case FieldId::F_concept:
+I->ConceptRef = std::move(R);
+return llvm::Error::success();
+ default:
+return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid type cannot contain Reference");
ilovepi wrote:
can we make it more obvious that this is related to concepts somehow? you just
have a single arm in the switch, so it may also be preferable to just use an
`if`, unless you plan to support more feild types.
https://github.com/llvm/llvm-project/pull/144430
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/ilovepi edited https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
@@ -817,6 +872,20 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned
ID, T I) {
addChild(I, std::move(TI));
return llvm::Error::success();
}
+ case BI_CONSTRAINT_BLOCK_ID: {
+ConstraintInfo CI;
+if (auto Err = readBlock(ID, &CI))
+ return Err;
+addConstraint(I, std::move(CI));
+return llvm::Error::success();
+ }
ilovepi wrote:
We should have a helper to avoid this kind of boilerplate that can take a
callable. Not for this patch, though. If you wouldn't mind, please add a TODO,
or file an issue.
https://github.com/llvm/llvm-project/pull/144430
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
@@ -248,6 +257,27 @@ static void serializeCommonChildren(const ScopeChildren
&Children,
}
}
+template
+static void serializeArray(const std::vector &Records, Object &Obj,
+ const std::string &Key,
+ SerializationFunc serializeInfo) {
+ json::Value RecordsArray = Array();
+ auto &RecordsArrayRef = *RecordsArray.getAsArray();
+ RecordsArrayRef.reserve(Records.size());
+ for (const auto &Item : Records) {
+json::Value ItemVal = Object();
+auto &ItemObj = *ItemVal.getAsObject();
+serializeInfo(Item, ItemObj);
+RecordsArrayRef.push_back(ItemVal);
+ }
ilovepi wrote:
Here's another code pattern I see repeated a lot.
https://github.com/llvm/llvm-project/pull/144430
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
@@ -662,6 +709,14 @@ void addTemplateSpecialization(TemplateInfo *I,
I->Specialization.emplace(std::move(TSI));
}
+template static void addConstraint(T I, ConstraintInfo &&C) {
+ llvm::errs() << "invalid container for constraint info";
+ exit(1);
+}
ilovepi wrote:
Well, I was going to leave a comment about this, but I see there's already 4
occurrences. These should probably use exit on err, but that should all be
handled separately.
I assume this could be rewritten w/ some `constexpr enable_if` magic to be
equivalent, but 🤷 most of this code was written when the LLVM codebase was
still c++14-only.
https://github.com/llvm/llvm-project/pull/144430
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/ilovepi approved this pull request. LGTM. overall really good improvement. most of my comments are me noticing bad existing code we should fix. I also left a few nit comments to address, but they're rather minor. https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 updated
https://github.com/llvm/llvm-project/pull/144430
>From 2febdc89f0c2b2f9abe47415f5c115ad8305ed2d Mon Sep 17 00:00:00 2001
From: Erick Velez
Date: Mon, 16 Jun 2025 10:50:35 -0700
Subject: [PATCH] add serializeArray for infos with URLs
---
clang-tools-extra/clang-doc/BitcodeReader.cpp | 72 +++
clang-tools-extra/clang-doc/BitcodeWriter.cpp | 44 ++-
clang-tools-extra/clang-doc/BitcodeWriter.h | 12 +-
clang-tools-extra/clang-doc/HTMLGenerator.cpp | 4 +
.../clang-doc/HTMLMustacheGenerator.cpp | 2 +
clang-tools-extra/clang-doc/JSONGenerator.cpp | 50
clang-tools-extra/clang-doc/MDGenerator.cpp | 5 +
clang-tools-extra/clang-doc/Mapper.cpp| 4 +
clang-tools-extra/clang-doc/Mapper.h | 1 +
.../clang-doc/Representation.cpp | 20 +++
clang-tools-extra/clang-doc/Representation.h | 26 +++-
clang-tools-extra/clang-doc/Serialize.cpp | 90 +
clang-tools-extra/clang-doc/Serialize.h | 4 +
clang-tools-extra/clang-doc/YAMLGenerator.cpp | 2 +
.../test/clang-doc/json/class-requires.cpp| 18 +--
.../clang-doc/json/compound-constraints.cpp | 121 ++
.../test/clang-doc/json/concept.cpp | 48 +++
.../test/clang-doc/json/function-requires.cpp | 36 +++---
.../unittests/clang-doc/BitcodeTest.cpp | 2 +
19 files changed, 505 insertions(+), 56 deletions(-)
create mode 100644
clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 35058abab0663..5b70280e7dba8 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType
&Field,
case InfoType::IT_default:
case InfoType::IT_enum:
case InfoType::IT_typedef:
+ case InfoType::IT_concept:
Field = IT;
return llvm::Error::success();
}
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId
&Field,
case FieldId::F_type:
case FieldId::F_child_namespace:
case FieldId::F_child_record:
+ case FieldId::F_concept:
case FieldId::F_default:
Field = F;
return llvm::Error::success();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned
ID,
"invalid field for TemplateParamInfo");
}
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConceptInfo *I) {
+ switch (ID) {
+ case CONCEPT_USR:
+return decodeRecord(R, I->USR, Blob);
+ case CONCEPT_NAME:
+return decodeRecord(R, I->Name, Blob);
+ case CONCEPT_IS_TYPE:
+return decodeRecord(R, I->IsType, Blob);
+ case CONCEPT_CONSTRAINT_EXPRESSION:
+return decodeRecord(R, I->ConstraintExpression, Blob);
+ }
+ llvm_unreachable("invalid field for ConceptInfo");
+}
+
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConstraintInfo *I) {
+ if (ID == CONSTRAINT_EXPRESSION)
+return decodeRecord(R, I->Expression, Blob);
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid field for ConstraintInfo");
+}
+
template static llvm::Expected getCommentInfo(T I)
{
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid type cannot contain CommentInfo");
@@ -429,6 +454,10 @@ template <> llvm::Expected
getCommentInfo(CommentInfo *I) {
return I->Children.back().get();
}
+template <> llvm::Expected getCommentInfo(ConceptInfo *I) {
+ return &I->Description.emplace_back();
+}
+
// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
// the parent block to set it. The template specializations define what to do
// for each supported parent block.
@@ -584,6 +613,18 @@ template <> llvm::Error addReference(RecordInfo *I,
Reference &&R, FieldId F) {
}
}
+template <>
+llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
+ switch (F) {
+ case FieldId::F_concept:
+I->ConceptRef = std::move(R);
+return llvm::Error::success();
+ default:
+return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid type cannot contain Reference");
+ }
+}
+
template
static void addChild(T I, ChildInfoType &&R) {
llvm::errs() << "invalid child type for info";
@@ -600,6 +641,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
I->Children.Typedefs.emplace_back(std::move(R));
}
+template <> void addChild(NamespaceInfo *I, ConceptInfo &&R) {
+ I->Children.Concepts.emplace_back(std::move(R));
+}
// Record children:
template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
@@ -
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 ready_for_review https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 updated
https://github.com/llvm/llvm-project/pull/144430
>From 9754f70f3255e250c51c177bb00ef955e8d92f9c Mon Sep 17 00:00:00 2001
From: Erick Velez
Date: Mon, 16 Jun 2025 10:50:35 -0700
Subject: [PATCH] add serializeArray for infos with URLs
---
clang-tools-extra/clang-doc/BitcodeReader.cpp | 72 +++
clang-tools-extra/clang-doc/BitcodeWriter.cpp | 44 ++-
clang-tools-extra/clang-doc/BitcodeWriter.h | 12 +-
clang-tools-extra/clang-doc/HTMLGenerator.cpp | 4 +
.../clang-doc/HTMLMustacheGenerator.cpp | 2 +
clang-tools-extra/clang-doc/JSONGenerator.cpp | 54
clang-tools-extra/clang-doc/MDGenerator.cpp | 5 +
clang-tools-extra/clang-doc/Mapper.cpp| 4 +
clang-tools-extra/clang-doc/Mapper.h | 1 +
.../clang-doc/Representation.cpp | 13 ++
clang-tools-extra/clang-doc/Representation.h | 26 +++-
clang-tools-extra/clang-doc/Serialize.cpp | 90 +
clang-tools-extra/clang-doc/Serialize.h | 4 +
clang-tools-extra/clang-doc/YAMLGenerator.cpp | 2 +
.../test/clang-doc/json/class-requires.cpp| 18 +--
.../clang-doc/json/compound-constraints.cpp | 121 ++
.../test/clang-doc/json/concept.cpp | 48 +++
.../test/clang-doc/json/function-requires.cpp | 36 +++---
.../unittests/clang-doc/BitcodeTest.cpp | 2 +
19 files changed, 502 insertions(+), 56 deletions(-)
create mode 100644
clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 35058abab0663..5b70280e7dba8 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType
&Field,
case InfoType::IT_default:
case InfoType::IT_enum:
case InfoType::IT_typedef:
+ case InfoType::IT_concept:
Field = IT;
return llvm::Error::success();
}
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId
&Field,
case FieldId::F_type:
case FieldId::F_child_namespace:
case FieldId::F_child_record:
+ case FieldId::F_concept:
case FieldId::F_default:
Field = F;
return llvm::Error::success();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned
ID,
"invalid field for TemplateParamInfo");
}
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConceptInfo *I) {
+ switch (ID) {
+ case CONCEPT_USR:
+return decodeRecord(R, I->USR, Blob);
+ case CONCEPT_NAME:
+return decodeRecord(R, I->Name, Blob);
+ case CONCEPT_IS_TYPE:
+return decodeRecord(R, I->IsType, Blob);
+ case CONCEPT_CONSTRAINT_EXPRESSION:
+return decodeRecord(R, I->ConstraintExpression, Blob);
+ }
+ llvm_unreachable("invalid field for ConceptInfo");
+}
+
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConstraintInfo *I) {
+ if (ID == CONSTRAINT_EXPRESSION)
+return decodeRecord(R, I->Expression, Blob);
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid field for ConstraintInfo");
+}
+
template static llvm::Expected getCommentInfo(T I)
{
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid type cannot contain CommentInfo");
@@ -429,6 +454,10 @@ template <> llvm::Expected
getCommentInfo(CommentInfo *I) {
return I->Children.back().get();
}
+template <> llvm::Expected getCommentInfo(ConceptInfo *I) {
+ return &I->Description.emplace_back();
+}
+
// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
// the parent block to set it. The template specializations define what to do
// for each supported parent block.
@@ -584,6 +613,18 @@ template <> llvm::Error addReference(RecordInfo *I,
Reference &&R, FieldId F) {
}
}
+template <>
+llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
+ switch (F) {
+ case FieldId::F_concept:
+I->ConceptRef = std::move(R);
+return llvm::Error::success();
+ default:
+return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid type cannot contain Reference");
+ }
+}
+
template
static void addChild(T I, ChildInfoType &&R) {
llvm::errs() << "invalid child type for info";
@@ -600,6 +641,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
I->Children.Typedefs.emplace_back(std::move(R));
}
+template <> void addChild(NamespaceInfo *I, ConceptInfo &&R) {
+ I->Children.Concepts.emplace_back(std::move(R));
+}
// Record children:
template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
@@ -6
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 converted_to_draft https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
ilovepi wrote: > Linux CI shows failing but looks like all tests passed despite that. > > Added compound constraint support which just goes through the nested > expressions until it reaches the constraint. I've just been clicking re-run on those when i see it. you may want to file abug about it. or chime in on an existing one. https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 edited https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 updated
https://github.com/llvm/llvm-project/pull/144430
>From 72e4a2441b93546c3e275078d1525ae01e73e361 Mon Sep 17 00:00:00 2001
From: Erick Velez
Date: Mon, 16 Jun 2025 10:50:35 -0700
Subject: [PATCH] remove extraneous change
---
clang-tools-extra/clang-doc/BitcodeReader.cpp | 72 +++
clang-tools-extra/clang-doc/BitcodeWriter.cpp | 44 ++-
clang-tools-extra/clang-doc/BitcodeWriter.h | 12 +-
clang-tools-extra/clang-doc/HTMLGenerator.cpp | 4 +
.../clang-doc/HTMLMustacheGenerator.cpp | 2 +
clang-tools-extra/clang-doc/JSONGenerator.cpp | 46 +++
clang-tools-extra/clang-doc/MDGenerator.cpp | 5 +
clang-tools-extra/clang-doc/Mapper.cpp| 4 +
clang-tools-extra/clang-doc/Mapper.h | 1 +
.../clang-doc/Representation.cpp | 13 ++
clang-tools-extra/clang-doc/Representation.h | 26 +++-
clang-tools-extra/clang-doc/Serialize.cpp | 90 +
clang-tools-extra/clang-doc/Serialize.h | 4 +
clang-tools-extra/clang-doc/YAMLGenerator.cpp | 2 +
.../test/clang-doc/json/class-requires.cpp| 18 +--
.../clang-doc/json/compound-constraints.cpp | 121 ++
.../test/clang-doc/json/concept.cpp | 48 +++
.../test/clang-doc/json/function-requires.cpp | 36 +++---
.../unittests/clang-doc/BitcodeTest.cpp | 2 +
19 files changed, 494 insertions(+), 56 deletions(-)
create mode 100644
clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 35058abab0663..5b70280e7dba8 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType
&Field,
case InfoType::IT_default:
case InfoType::IT_enum:
case InfoType::IT_typedef:
+ case InfoType::IT_concept:
Field = IT;
return llvm::Error::success();
}
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId
&Field,
case FieldId::F_type:
case FieldId::F_child_namespace:
case FieldId::F_child_record:
+ case FieldId::F_concept:
case FieldId::F_default:
Field = F;
return llvm::Error::success();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned
ID,
"invalid field for TemplateParamInfo");
}
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConceptInfo *I) {
+ switch (ID) {
+ case CONCEPT_USR:
+return decodeRecord(R, I->USR, Blob);
+ case CONCEPT_NAME:
+return decodeRecord(R, I->Name, Blob);
+ case CONCEPT_IS_TYPE:
+return decodeRecord(R, I->IsType, Blob);
+ case CONCEPT_CONSTRAINT_EXPRESSION:
+return decodeRecord(R, I->ConstraintExpression, Blob);
+ }
+ llvm_unreachable("invalid field for ConceptInfo");
+}
+
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConstraintInfo *I) {
+ if (ID == CONSTRAINT_EXPRESSION)
+return decodeRecord(R, I->Expression, Blob);
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid field for ConstraintInfo");
+}
+
template static llvm::Expected getCommentInfo(T I)
{
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid type cannot contain CommentInfo");
@@ -429,6 +454,10 @@ template <> llvm::Expected
getCommentInfo(CommentInfo *I) {
return I->Children.back().get();
}
+template <> llvm::Expected getCommentInfo(ConceptInfo *I) {
+ return &I->Description.emplace_back();
+}
+
// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
// the parent block to set it. The template specializations define what to do
// for each supported parent block.
@@ -584,6 +613,18 @@ template <> llvm::Error addReference(RecordInfo *I,
Reference &&R, FieldId F) {
}
}
+template <>
+llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
+ switch (F) {
+ case FieldId::F_concept:
+I->ConceptRef = std::move(R);
+return llvm::Error::success();
+ default:
+return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid type cannot contain Reference");
+ }
+}
+
template
static void addChild(T I, ChildInfoType &&R) {
llvm::errs() << "invalid child type for info";
@@ -600,6 +641,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
I->Children.Typedefs.emplace_back(std::move(R));
}
+template <> void addChild(NamespaceInfo *I, ConceptInfo &&R) {
+ I->Children.Concepts.emplace_back(std::move(R));
+}
// Record children:
template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
@@ -649,6 +693,9 @@
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
evelez7 wrote: Linux CI shows failing but looks like all tests passed despite that. Added compound constraint support which just goes through the nested expressions until it reaches the constraint. https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
llvmbot wrote:
@llvm/pr-subscribers-clang-tools-extra
Author: Erick Velez (evelez7)
Changes
---
Patch is 40.83 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/144430.diff
19 Files Affected:
- (modified) clang-tools-extra/clang-doc/BitcodeReader.cpp (+72)
- (modified) clang-tools-extra/clang-doc/BitcodeWriter.cpp (+41-3)
- (modified) clang-tools-extra/clang-doc/BitcodeWriter.h (+11-1)
- (modified) clang-tools-extra/clang-doc/HTMLGenerator.cpp (+4)
- (modified) clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp (+2)
- (modified) clang-tools-extra/clang-doc/JSONGenerator.cpp (+46)
- (modified) clang-tools-extra/clang-doc/MDGenerator.cpp (+5)
- (modified) clang-tools-extra/clang-doc/Mapper.cpp (+4)
- (modified) clang-tools-extra/clang-doc/Mapper.h (+1)
- (modified) clang-tools-extra/clang-doc/Representation.cpp (+13)
- (modified) clang-tools-extra/clang-doc/Representation.h (+25-1)
- (modified) clang-tools-extra/clang-doc/Serialize.cpp (+91-1)
- (modified) clang-tools-extra/clang-doc/Serialize.h (+4)
- (modified) clang-tools-extra/clang-doc/YAMLGenerator.cpp (+2)
- (modified) clang-tools-extra/test/clang-doc/json/class-requires.cpp (+9-9)
- (added) clang-tools-extra/test/clang-doc/json/compound-constraints.cpp (+121)
- (modified) clang-tools-extra/test/clang-doc/json/concept.cpp (+24-24)
- (modified) clang-tools-extra/test/clang-doc/json/function-requires.cpp
(+18-18)
- (modified) clang-tools-extra/unittests/clang-doc/BitcodeTest.cpp (+2)
``diff
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 35058abab0663..5b70280e7dba8 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType
&Field,
case InfoType::IT_default:
case InfoType::IT_enum:
case InfoType::IT_typedef:
+ case InfoType::IT_concept:
Field = IT;
return llvm::Error::success();
}
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId
&Field,
case FieldId::F_type:
case FieldId::F_child_namespace:
case FieldId::F_child_record:
+ case FieldId::F_concept:
case FieldId::F_default:
Field = F;
return llvm::Error::success();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned
ID,
"invalid field for TemplateParamInfo");
}
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConceptInfo *I) {
+ switch (ID) {
+ case CONCEPT_USR:
+return decodeRecord(R, I->USR, Blob);
+ case CONCEPT_NAME:
+return decodeRecord(R, I->Name, Blob);
+ case CONCEPT_IS_TYPE:
+return decodeRecord(R, I->IsType, Blob);
+ case CONCEPT_CONSTRAINT_EXPRESSION:
+return decodeRecord(R, I->ConstraintExpression, Blob);
+ }
+ llvm_unreachable("invalid field for ConceptInfo");
+}
+
+static llvm::Error parseRecord(const Record &R, unsigned ID,
+ llvm::StringRef Blob, ConstraintInfo *I) {
+ if (ID == CONSTRAINT_EXPRESSION)
+return decodeRecord(R, I->Expression, Blob);
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid field for ConstraintInfo");
+}
+
template static llvm::Expected getCommentInfo(T I)
{
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid type cannot contain CommentInfo");
@@ -429,6 +454,10 @@ template <> llvm::Expected
getCommentInfo(CommentInfo *I) {
return I->Children.back().get();
}
+template <> llvm::Expected getCommentInfo(ConceptInfo *I) {
+ return &I->Description.emplace_back();
+}
+
// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
// the parent block to set it. The template specializations define what to do
// for each supported parent block.
@@ -584,6 +613,18 @@ template <> llvm::Error addReference(RecordInfo *I,
Reference &&R, FieldId F) {
}
}
+template <>
+llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
+ switch (F) {
+ case FieldId::F_concept:
+I->ConceptRef = std::move(R);
+return llvm::Error::success();
+ default:
+return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "invalid type cannot contain Reference");
+ }
+}
+
template
static void addChild(T I, ChildInfoType &&R) {
llvm::errs() << "invalid child type for info";
@@ -600,6 +641,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
I->Children.Typedefs.emplace_back(std::move(R));
}
+template <> void addChild(NamespaceInfo *I, ConceptInfo &&R) {
+ I->Children.Concepts.emplace_back(std::move(R));
+}
// Record children:
template <> void addChild(RecordInfo *I
[llvm-branch-commits] [clang-tools-extra] [clang-doc] add support for concepts (PR #144430)
https://github.com/evelez7 ready_for_review https://github.com/llvm/llvm-project/pull/144430 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
