@@ -800,11 +800,39 @@ llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) {
800
800
}
801
801
}
802
802
803
- // TODO: Create a helper that can receive a function to reduce repetition for
804
- // most blocks.
803
+ // TODO: fix inconsistentent returning of errors in add callbacks.
804
+ // Once that's fixed, we only need one handleSubBlock.
805
+ template <typename InfoType, typename T, typename Callback>
806
+ llvm::Error ClangDocBitcodeReader::handleSubBlock (unsigned ID, T Parent,
807
+ Callback Function) {
808
+ InfoType Info;
809
+ if (auto Err = readBlock (ID, &Info))
810
+ return Err;
811
+ Function (Parent, std::move (Info));
812
+ return llvm::Error::success ();
813
+ }
814
+
815
+ template <typename InfoType, typename T, typename Callback>
816
+ llvm::Error ClangDocBitcodeReader::handleTypeSubBlock (unsigned ID, T Parent,
817
+ Callback Function) {
818
+ InfoType Info;
819
+ if (auto Err = readBlock (ID, &Info))
820
+ return Err;
821
+ if (auto Err = Function (Parent, std::move (Info)))
822
+ return Err;
823
+ return llvm::Error::success ();
824
+ }
825
+
805
826
template <typename T>
806
827
llvm::Error ClangDocBitcodeReader::readSubBlock (unsigned ID, T I) {
807
828
llvm::TimeTraceScope (" Reducing infos" , " readSubBlock" );
829
+
830
+ static auto CreateAddFunc = [](auto AddFunc) {
831
+ return [AddFunc](auto Parent, auto Child) {
832
+ return AddFunc (Parent, std::move (Child));
833
+ };
834
+ };
835
+
808
836
switch (ID) {
809
837
// Blocks can only have certain types of sub blocks.
810
838
case BI_COMMENT_BLOCK_ID: {
@@ -816,28 +844,16 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
816
844
return llvm::Error::success ();
817
845
}
818
846
case BI_TYPE_BLOCK_ID: {
819
- TypeInfo TI;
820
- if (auto Err = readBlock (ID, &TI))
821
- return Err;
822
- if (auto Err = addTypeInfo (I, std::move (TI)))
823
- return Err;
824
- return llvm::Error::success ();
847
+ return handleTypeSubBlock<TypeInfo>(
848
+ ID, I, CreateAddFunc (addTypeInfo<T, TypeInfo>));
825
849
}
826
850
case BI_FIELD_TYPE_BLOCK_ID: {
827
- FieldTypeInfo TI;
828
- if (auto Err = readBlock (ID, &TI))
829
- return Err;
830
- if (auto Err = addTypeInfo (I, std::move (TI)))
831
- return Err;
832
- return llvm::Error::success ();
851
+ return handleTypeSubBlock<FieldTypeInfo>(
852
+ ID, I, CreateAddFunc (addTypeInfo<T, FieldTypeInfo>));
833
853
}
834
854
case BI_MEMBER_TYPE_BLOCK_ID: {
835
- MemberTypeInfo TI;
836
- if (auto Err = readBlock (ID, &TI))
837
- return Err;
838
- if (auto Err = addTypeInfo (I, std::move (TI)))
839
- return Err;
840
- return llvm::Error::success ();
855
+ return handleTypeSubBlock<MemberTypeInfo>(
856
+ ID, I, CreateAddFunc (addTypeInfo<T, MemberTypeInfo>));
841
857
}
842
858
case BI_REFERENCE_BLOCK_ID: {
843
859
Reference R;
@@ -848,81 +864,46 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
848
864
return llvm::Error::success ();
849
865
}
850
866
case BI_FUNCTION_BLOCK_ID: {
851
- FunctionInfo F;
852
- if (auto Err = readBlock (ID, &F))
853
- return Err;
854
- addChild (I, std::move (F));
855
- return llvm::Error::success ();
867
+ return handleSubBlock<FunctionInfo>(
868
+ ID, I, CreateAddFunc (addChild<T, FunctionInfo>));
856
869
}
857
870
case BI_BASE_RECORD_BLOCK_ID: {
858
- BaseRecordInfo BR;
859
- if (auto Err = readBlock (ID, &BR))
860
- return Err;
861
- addChild (I, std::move (BR));
862
- return llvm::Error::success ();
871
+ return handleSubBlock<BaseRecordInfo>(
872
+ ID, I, CreateAddFunc (addChild<T, BaseRecordInfo>));
863
873
}
864
874
case BI_ENUM_BLOCK_ID: {
865
- EnumInfo E;
866
- if (auto Err = readBlock (ID, &E))
867
- return Err;
868
- addChild (I, std::move (E));
869
- return llvm::Error::success ();
875
+ return handleSubBlock<EnumInfo>(ID, I,
876
+ CreateAddFunc (addChild<T, EnumInfo>));
870
877
}
871
878
case BI_ENUM_VALUE_BLOCK_ID: {
872
- EnumValueInfo EV;
873
- if (auto Err = readBlock (ID, &EV))
874
- return Err;
875
- addChild (I, std::move (EV));
876
- return llvm::Error::success ();
879
+ return handleSubBlock<EnumValueInfo>(
880
+ ID, I, CreateAddFunc (addChild<T, EnumValueInfo>));
877
881
}
878
882
case BI_TEMPLATE_BLOCK_ID: {
879
- TemplateInfo TI;
880
- if (auto Err = readBlock (ID, &TI))
881
- return Err;
882
- addTemplate (I, std::move (TI));
883
- return llvm::Error::success ();
883
+ return handleSubBlock<TemplateInfo>(ID, I, CreateAddFunc (addTemplate<T>));
884
884
}
885
885
case BI_TEMPLATE_SPECIALIZATION_BLOCK_ID: {
886
- TemplateSpecializationInfo TSI;
887
- if (auto Err = readBlock (ID, &TSI))
888
- return Err;
889
- addTemplateSpecialization (I, std::move (TSI));
890
- return llvm::Error::success ();
886
+ return handleSubBlock<TemplateSpecializationInfo>(
887
+ ID, I, CreateAddFunc (addTemplateSpecialization<T>));
891
888
}
892
889
case BI_TEMPLATE_PARAM_BLOCK_ID: {
893
- TemplateParamInfo TPI;
894
- if (auto Err = readBlock (ID, &TPI))
895
- return Err;
896
- addTemplateParam (I, std::move (TPI));
897
- return llvm::Error::success ();
890
+ return handleSubBlock<TemplateParamInfo>(
891
+ ID, I, CreateAddFunc (addTemplateParam<T>));
898
892
}
899
893
case BI_TYPEDEF_BLOCK_ID: {
900
- TypedefInfo TI;
901
- if (auto Err = readBlock (ID, &TI))
902
- return Err;
903
- addChild (I, std::move (TI));
904
- return llvm::Error::success ();
894
+ return handleSubBlock<TypedefInfo>(ID, I,
895
+ CreateAddFunc (addChild<T, TypedefInfo>));
905
896
}
906
897
case BI_CONSTRAINT_BLOCK_ID: {
907
- ConstraintInfo CI;
908
- if (auto Err = readBlock (ID, &CI))
909
- return Err;
910
- addConstraint (I, std::move (CI));
911
- return llvm::Error::success ();
898
+ return handleSubBlock<ConstraintInfo>(ID, I,
899
+ CreateAddFunc (addConstraint<T>));
912
900
}
913
901
case BI_CONCEPT_BLOCK_ID: {
914
- ConceptInfo CI;
915
- if (auto Err = readBlock (ID, &CI))
916
- return Err;
917
- addChild (I, std::move (CI));
918
- return llvm::Error::success ();
902
+ return handleSubBlock<ConceptInfo>(ID, I,
903
+ CreateAddFunc (addChild<T, ConceptInfo>));
919
904
}
920
905
case BI_VAR_BLOCK_ID: {
921
- VarInfo VI;
922
- if (auto Err = readBlock (ID, &VI))
923
- return Err;
924
- addChild (I, std::move (VI));
925
- return llvm::Error::success ();
906
+ return handleSubBlock<VarInfo>(ID, I, CreateAddFunc (addChild<T, VarInfo>));
926
907
}
927
908
default :
928
909
return llvm::createStringError (llvm::inconvertibleErrorCode (),
0 commit comments