aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clang-doc/BitcodeReader.cpp
diff options
context:
space:
mode:
authorErick Velez <erickvelez7@gmail.com>2025-06-26 20:44:14 -0700
committerGitHub <noreply@github.com>2025-06-26 20:44:14 -0700
commitab1e4d55d866fb9fc8b9082ae02d4b0aa884d239 (patch)
treec1b7e2c28575ab2ab499f2fa5df88bbd1736bdd1 /clang-tools-extra/clang-doc/BitcodeReader.cpp
parent4f97780a7a5581f4b4080824e33a14e7a62e8613 (diff)
downloadllvm-ab1e4d55d866fb9fc8b9082ae02d4b0aa884d239.zip
llvm-ab1e4d55d866fb9fc8b9082ae02d4b0aa884d239.tar.gz
llvm-ab1e4d55d866fb9fc8b9082ae02d4b0aa884d239.tar.bz2
[clang-doc] refactor BitcodeReader::readSubBlock (#145835)
Reduce boilerplate code in readSubBlock by creating a callable from a higher-order lambda based on the block's add need.
Diffstat (limited to 'clang-tools-extra/clang-doc/BitcodeReader.cpp')
-rw-r--r--clang-tools-extra/clang-doc/BitcodeReader.cpp131
1 files changed, 56 insertions, 75 deletions
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index cbdd5d2..74da80c 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -800,11 +800,39 @@ llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) {
}
}
-// TODO: Create a helper that can receive a function to reduce repetition for
-// most blocks.
+// TODO: fix inconsistentent returning of errors in add callbacks.
+// Once that's fixed, we only need one handleSubBlock.
+template <typename InfoType, typename T, typename Callback>
+llvm::Error ClangDocBitcodeReader::handleSubBlock(unsigned ID, T Parent,
+ Callback Function) {
+ InfoType Info;
+ if (auto Err = readBlock(ID, &Info))
+ return Err;
+ Function(Parent, std::move(Info));
+ return llvm::Error::success();
+}
+
+template <typename InfoType, typename T, typename Callback>
+llvm::Error ClangDocBitcodeReader::handleTypeSubBlock(unsigned ID, T Parent,
+ Callback Function) {
+ InfoType Info;
+ if (auto Err = readBlock(ID, &Info))
+ return Err;
+ if (auto Err = Function(Parent, std::move(Info)))
+ return Err;
+ return llvm::Error::success();
+}
+
template <typename T>
llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
llvm::TimeTraceScope("Reducing infos", "readSubBlock");
+
+ static auto CreateAddFunc = [](auto AddFunc) {
+ return [AddFunc](auto Parent, auto Child) {
+ return AddFunc(Parent, std::move(Child));
+ };
+ };
+
switch (ID) {
// Blocks can only have certain types of sub blocks.
case BI_COMMENT_BLOCK_ID: {
@@ -816,28 +844,16 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
return llvm::Error::success();
}
case BI_TYPE_BLOCK_ID: {
- TypeInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- if (auto Err = addTypeInfo(I, std::move(TI)))
- return Err;
- return llvm::Error::success();
+ return handleTypeSubBlock<TypeInfo>(
+ ID, I, CreateAddFunc(addTypeInfo<T, TypeInfo>));
}
case BI_FIELD_TYPE_BLOCK_ID: {
- FieldTypeInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- if (auto Err = addTypeInfo(I, std::move(TI)))
- return Err;
- return llvm::Error::success();
+ return handleTypeSubBlock<FieldTypeInfo>(
+ ID, I, CreateAddFunc(addTypeInfo<T, FieldTypeInfo>));
}
case BI_MEMBER_TYPE_BLOCK_ID: {
- MemberTypeInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- if (auto Err = addTypeInfo(I, std::move(TI)))
- return Err;
- return llvm::Error::success();
+ return handleTypeSubBlock<MemberTypeInfo>(
+ ID, I, CreateAddFunc(addTypeInfo<T, MemberTypeInfo>));
}
case BI_REFERENCE_BLOCK_ID: {
Reference R;
@@ -848,81 +864,46 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
return llvm::Error::success();
}
case BI_FUNCTION_BLOCK_ID: {
- FunctionInfo F;
- if (auto Err = readBlock(ID, &F))
- return Err;
- addChild(I, std::move(F));
- return llvm::Error::success();
+ return handleSubBlock<FunctionInfo>(
+ ID, I, CreateAddFunc(addChild<T, FunctionInfo>));
}
case BI_BASE_RECORD_BLOCK_ID: {
- BaseRecordInfo BR;
- if (auto Err = readBlock(ID, &BR))
- return Err;
- addChild(I, std::move(BR));
- return llvm::Error::success();
+ return handleSubBlock<BaseRecordInfo>(
+ ID, I, CreateAddFunc(addChild<T, BaseRecordInfo>));
}
case BI_ENUM_BLOCK_ID: {
- EnumInfo E;
- if (auto Err = readBlock(ID, &E))
- return Err;
- addChild(I, std::move(E));
- return llvm::Error::success();
+ return handleSubBlock<EnumInfo>(ID, I,
+ CreateAddFunc(addChild<T, EnumInfo>));
}
case BI_ENUM_VALUE_BLOCK_ID: {
- EnumValueInfo EV;
- if (auto Err = readBlock(ID, &EV))
- return Err;
- addChild(I, std::move(EV));
- return llvm::Error::success();
+ return handleSubBlock<EnumValueInfo>(
+ ID, I, CreateAddFunc(addChild<T, EnumValueInfo>));
}
case BI_TEMPLATE_BLOCK_ID: {
- TemplateInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- addTemplate(I, std::move(TI));
- return llvm::Error::success();
+ return handleSubBlock<TemplateInfo>(ID, I, CreateAddFunc(addTemplate<T>));
}
case BI_TEMPLATE_SPECIALIZATION_BLOCK_ID: {
- TemplateSpecializationInfo TSI;
- if (auto Err = readBlock(ID, &TSI))
- return Err;
- addTemplateSpecialization(I, std::move(TSI));
- return llvm::Error::success();
+ return handleSubBlock<TemplateSpecializationInfo>(
+ ID, I, CreateAddFunc(addTemplateSpecialization<T>));
}
case BI_TEMPLATE_PARAM_BLOCK_ID: {
- TemplateParamInfo TPI;
- if (auto Err = readBlock(ID, &TPI))
- return Err;
- addTemplateParam(I, std::move(TPI));
- return llvm::Error::success();
+ return handleSubBlock<TemplateParamInfo>(
+ ID, I, CreateAddFunc(addTemplateParam<T>));
}
case BI_TYPEDEF_BLOCK_ID: {
- TypedefInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- addChild(I, std::move(TI));
- return llvm::Error::success();
+ return handleSubBlock<TypedefInfo>(ID, I,
+ CreateAddFunc(addChild<T, TypedefInfo>));
}
case BI_CONSTRAINT_BLOCK_ID: {
- ConstraintInfo CI;
- if (auto Err = readBlock(ID, &CI))
- return Err;
- addConstraint(I, std::move(CI));
- return llvm::Error::success();
+ return handleSubBlock<ConstraintInfo>(ID, I,
+ CreateAddFunc(addConstraint<T>));
}
case BI_CONCEPT_BLOCK_ID: {
- ConceptInfo CI;
- if (auto Err = readBlock(ID, &CI))
- return Err;
- addChild(I, std::move(CI));
- return llvm::Error::success();
+ return handleSubBlock<ConceptInfo>(ID, I,
+ CreateAddFunc(addChild<T, ConceptInfo>));
}
case BI_VAR_BLOCK_ID: {
- VarInfo VI;
- if (auto Err = readBlock(ID, &VI))
- return Err;
- addChild(I, std::move(VI));
- return llvm::Error::success();
+ return handleSubBlock<VarInfo>(ID, I, CreateAddFunc(addChild<T, VarInfo>));
}
default:
return llvm::createStringError(llvm::inconvertibleErrorCode(),