@@ -800,11 +800,39 @@ llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) {
800800 }
801801}
802802
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+
805826template <typename T>
806827llvm::Error ClangDocBitcodeReader::readSubBlock (unsigned ID, T I) {
807828 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+
808836 switch (ID) {
809837 // Blocks can only have certain types of sub blocks.
810838 case BI_COMMENT_BLOCK_ID: {
@@ -816,28 +844,16 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
816844 return llvm::Error::success ();
817845 }
818846 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>));
825849 }
826850 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>));
833853 }
834854 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>));
841857 }
842858 case BI_REFERENCE_BLOCK_ID: {
843859 Reference R;
@@ -848,81 +864,46 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
848864 return llvm::Error::success ();
849865 }
850866 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>));
856869 }
857870 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>));
863873 }
864874 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>));
870877 }
871878 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>));
877881 }
878882 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>));
884884 }
885885 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>));
891888 }
892889 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>));
898892 }
899893 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>));
905896 }
906897 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>));
912900 }
913901 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>));
919904 }
920905 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>));
926907 }
927908 default :
928909 return llvm::createStringError (llvm::inconvertibleErrorCode (),
0 commit comments