https://github.com/evelez7 created https://github.com/llvm/llvm-project/pull/184663
Most of the JSONGenerator functionality was provided by a series of static functions. This made it unwieldy to access useful properties of ClangDocContext. As methods, they can now access a pointer to CDCtx. >From b6747daa9f8ad348fbe3829326330370c6dca673 Mon Sep 17 00:00:00 2001 From: Erick Velez <[email protected]> Date: Wed, 4 Mar 2026 10:21:51 -0800 Subject: [PATCH] [clang-doc][NFC] Move static functions into JSONGenerator as methods Most of the JSONGenerator functionality was provided by a series of static functions. This made it unwieldy to access useful properties of ClangDocContext. As methods, they can now access a pointer to CDCtx. --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 254 ++++++++---------- 1 file changed, 116 insertions(+), 138 deletions(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 773dc3a205e1c..fa5fba43a8a8f 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -8,51 +8,69 @@ using namespace llvm::json; namespace clang { namespace doc { -// FIXME: These static methods should be refactored into methods for -// `JSONGenerator`. It's cumbersome to pass around important properties from -// ClangDocContext using these static methods. +template <typename Container, typename SerializationFunc> +static void serializeArray( + const Container &Records, Object &Obj, const StringRef Key, + SerializationFunc SerializeInfo, const StringRef EndKey = "End", + function_ref<void(Object &)> UpdateJson = [](Object &Obj) {}); + +// TODO(issue URL): Wrapping logic for HTML should probably use a more +// sophisticated heuristic than number of parameters. +constexpr static unsigned getMaxParamWrapLimit() { return 2; } + class JSONGenerator : public Generator { + json::Object serializeLocation(const Location &Loc); + void serializeCommonAttributes(const Info &I, json::Object &Obj); + void serializeCommonChildren(const ScopeChildren &Children, + json::Object &Obj); + void serializeInfo(const ConstraintInfo &I, Object &Obj); + void serializeInfo(const TemplateInfo &Template, Object &Obj); + void serializeInfo(const ConceptInfo &I, Object &Obj); + void serializeInfo(const TypeInfo &I, Object &Obj); + void serializeInfo(const FieldTypeInfo &I, Object &Obj); + void serializeInfo(const FunctionInfo &F, json::Object &Obj); + void serializeInfo(const EnumValueInfo &I, Object &Obj); + void serializeInfo(const EnumInfo &I, json::Object &Obj); + void serializeInfo(const TypedefInfo &I, json::Object &Obj); + void serializeInfo(const BaseRecordInfo &I, Object &Obj); + void serializeInfo(const FriendInfo &I, Object &Obj); + void serializeInfo(const RecordInfo &I, json::Object &Obj); + void serializeInfo(const VarInfo &I, json::Object &Obj); + void serializeInfo(const NamespaceInfo &I, json::Object &Obj); + SmallString<16> determineFileName(Info *I, SmallString<128> &Path); + Error serializeIndex(StringRef RootDir); + void generateContext(const Info &I, Object &Obj); + void serializeReference(const Reference &Ref, Object &ReferenceObj); + + // Convenience lambdas to pass to serializeArray. + auto serializeInfoLambda() { + return [this](const auto &Info, Object &Object) { + serializeInfo(Info, Object); + }; + } + auto serializeReferenceLambda() { + return [this](const auto &Ref, Object &Object) { + serializeReference(Ref, Object); + }; + } + public: static const char *Format; + const ClangDocContext *CDCtx; Error generateDocumentation(StringRef RootDir, llvm::StringMap<std::unique_ptr<doc::Info>> Infos, const ClangDocContext &CDCtx, std::string DirName) override; Error createResources(ClangDocContext &CDCtx) override; + // FIXME: Once legacy generators are removed, we can refactor the Generator + // interface to sto passing CDCtx here since we hold a pointer to it. Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, const ClangDocContext &CDCtx) override; }; const char *JSONGenerator::Format = "json"; -static void serializeInfo(const ConstraintInfo &I, Object &Obj); -static void serializeInfo(const RecordInfo &I, Object &Obj, - const std::optional<StringRef> &RepositoryUrl, - const std::optional<StringRef> &RepositoryLinePrefix); - -static void serializeReference(const Reference &Ref, Object &ReferenceObj); - -template <typename Container, typename SerializationFunc> -static void serializeArray( - const Container &Records, Object &Obj, const StringRef Key, - SerializationFunc SerializeInfo, const StringRef EndKey = "End", - function_ref<void(Object &)> UpdateJson = [](Object &Obj) {}); - -// TODO(issue URL): Wrapping logic for HTML should probably use a more -// sophisticated heuristic than number of parameters. -constexpr static unsigned getMaxParamWrapLimit() { return 2; } - -// Convenience lambda to pass to serializeArray. -// If a serializeInfo needs a RepositoryUrl, create a local lambda that captures -// the optional. -static auto SerializeInfoLambda = [](const auto &Info, Object &Object) { - serializeInfo(Info, Object); -}; -static auto SerializeReferenceLambda = [](const auto &Ref, Object &Object) { - serializeReference(Ref, Object); -}; - static void insertNonEmpty(StringRef Key, StringRef Value, Object &Obj) { if (!Value.empty()) Obj[Key] = Value; @@ -82,24 +100,21 @@ static std::string infoTypeToString(InfoType IT) { llvm_unreachable("Unknown InfoType encountered."); } -static json::Object -serializeLocation(const Location &Loc, - const std::optional<StringRef> RepositoryUrl, - const std::optional<StringRef> RepositoryLinePrefix) { +json::Object JSONGenerator::serializeLocation(const Location &Loc) { Object LocationObj = Object(); LocationObj["LineNumber"] = Loc.StartLineNumber; LocationObj["Filename"] = Loc.Filename; - if (!Loc.IsFileInRootDir || !RepositoryUrl) + if (!Loc.IsFileInRootDir || !CDCtx->RepositoryUrl) return LocationObj; - SmallString<128> FileURL(*RepositoryUrl); + SmallString<128> FileURL(*CDCtx->RepositoryUrl); sys::path::append(FileURL, sys::path::Style::posix, Loc.Filename); std::string LinePrefix; - if (!RepositoryLinePrefix) + if (!CDCtx->RepositoryLinePrefix) LinePrefix = "#L"; else - LinePrefix = *RepositoryLinePrefix; + LinePrefix = *CDCtx->RepositoryLinePrefix; FileURL += LinePrefix + std::to_string(Loc.StartLineNumber); LocationObj["FileURL"] = FileURL; @@ -296,7 +311,7 @@ static Object serializeComment(const CommentInfo &I, Object &Description) { } /// Creates Contexts for namespaces and records to allow for navigation. -static void generateContext(const Info &I, Object &Obj) { +void JSONGenerator::generateContext(const Info &I, Object &Obj) { json::Value ContextArray = json::Array(); auto &ContextArrayRef = *ContextArray.getAsArray(); ContextArrayRef.reserve(I.Contexts.size()); @@ -353,10 +368,8 @@ static void generateContext(const Info &I, Object &Obj) { Obj["HasContexts"] = true; } -static void -serializeCommonAttributes(const Info &I, json::Object &Obj, - const std::optional<StringRef> RepositoryUrl, - const std::optional<StringRef> RepositoryLinePrefix) { +void JSONGenerator::serializeCommonAttributes(const Info &I, + json::Object &Obj) { insertNonEmpty("Name", I.Name, Obj); Obj["USR"] = toHex(toStringRef(I.USR)); Obj["InfoType"] = infoTypeToString(I.IT); @@ -396,15 +409,15 @@ serializeCommonAttributes(const Info &I, json::Object &Obj, if (I.IT != InfoType::IT_namespace) { const auto *Symbol = static_cast<const SymbolInfo *>(&I); if (Symbol->DefLoc) - Obj["Location"] = serializeLocation(Symbol->DefLoc.value(), RepositoryUrl, - RepositoryLinePrefix); + Obj["Location"] = serializeLocation(Symbol->DefLoc.value()); } if (!I.Contexts.empty()) generateContext(I, Obj); } -static void serializeReference(const Reference &Ref, Object &ReferenceObj) { +void JSONGenerator::serializeReference(const Reference &Ref, + Object &ReferenceObj) { insertNonEmpty("Path", Ref.Path, ReferenceObj); ReferenceObj["Name"] = Ref.Name; ReferenceObj["QualName"] = Ref.QualName; @@ -421,27 +434,21 @@ static void serializeReference(const Reference &Ref, Object &ReferenceObj) { // Although namespaces and records both have ScopeChildren, they serialize them // differently. Only enums, records, and typedefs are handled here. -static void -serializeCommonChildren(const ScopeChildren &Children, json::Object &Obj, - const std::optional<StringRef> RepositoryUrl, - const std::optional<StringRef> RepositoryLinePrefix) { - static auto SerializeInfo = - [RepositoryUrl, RepositoryLinePrefix](const auto &Info, Object &Object) { - serializeInfo(Info, Object, RepositoryUrl, RepositoryLinePrefix); - }; - +void JSONGenerator::serializeCommonChildren(const ScopeChildren &Children, + json::Object &Obj) { if (!Children.Enums.empty()) { - serializeArray(Children.Enums, Obj, "Enums", SerializeInfo); + serializeArray(Children.Enums, Obj, "Enums", serializeInfoLambda()); Obj["HasEnums"] = true; } if (!Children.Typedefs.empty()) { - serializeArray(Children.Typedefs, Obj, "Typedefs", SerializeInfo); + serializeArray(Children.Typedefs, Obj, "Typedefs", serializeInfoLambda()); Obj["HasTypedefs"] = true; } if (!Children.Records.empty()) { - serializeArray(Children.Records, Obj, "Records", SerializeReferenceLambda); + serializeArray(Children.Records, Obj, "Records", + serializeReferenceLambda()); Obj["HasRecords"] = true; } } @@ -465,12 +472,12 @@ static void serializeArray(const Container &Records, Object &Obj, StringRef Key, UpdateJson(Obj); } -static void serializeInfo(const ConstraintInfo &I, Object &Obj) { +void JSONGenerator::serializeInfo(const ConstraintInfo &I, Object &Obj) { serializeReference(I.ConceptRef, Obj); Obj["Expression"] = I.ConstraintExpr; } -static void serializeInfo(const TemplateInfo &Template, Object &Obj) { +void JSONGenerator::serializeInfo(const TemplateInfo &Template, Object &Obj) { json::Value TemplateVal = Object(); auto &TemplateObj = *TemplateVal.getAsObject(); auto SerializeTemplateParam = [](const TemplateParamInfo &Param, @@ -506,21 +513,19 @@ static void serializeInfo(const TemplateInfo &Template, Object &Obj) { if (!Template.Constraints.empty()) serializeArray(Template.Constraints, TemplateObj, "Constraints", - SerializeInfoLambda); + serializeInfoLambda()); Obj["Template"] = TemplateVal; } -static void serializeInfo(const ConceptInfo &I, Object &Obj, - const std::optional<StringRef> &RepositoryUrl, - const std::optional<StringRef> &RepositoryLine) { - serializeCommonAttributes(I, Obj, RepositoryUrl, RepositoryLine); +void JSONGenerator::serializeInfo(const ConceptInfo &I, Object &Obj) { + serializeCommonAttributes(I, Obj); Obj["IsType"] = I.IsType; Obj["ConstraintExpression"] = I.ConstraintExpression; serializeInfo(I.Template, Obj); } -static void serializeInfo(const TypeInfo &I, Object &Obj) { +void JSONGenerator::serializeInfo(const TypeInfo &I, Object &Obj) { Obj["Name"] = I.Type.Name; Obj["QualName"] = I.Type.QualName; Obj["USR"] = toHex(toStringRef(I.Type.USR)); @@ -528,7 +533,7 @@ static void serializeInfo(const TypeInfo &I, Object &Obj) { Obj["IsBuiltIn"] = I.IsBuiltIn; } -static void serializeInfo(const FieldTypeInfo &I, Object &Obj) { +void JSONGenerator::serializeInfo(const FieldTypeInfo &I, Object &Obj) { Obj["Name"] = I.Name; insertNonEmpty("DefaultValue", I.DefaultValue, Obj); json::Value ReferenceVal = Object(); @@ -537,10 +542,8 @@ static void serializeInfo(const FieldTypeInfo &I, Object &Obj) { Obj["Type"] = ReferenceVal; } -static void serializeInfo(const FunctionInfo &F, json::Object &Obj, - const std::optional<StringRef> RepositoryURL, - const std::optional<StringRef> RepositoryLine) { - serializeCommonAttributes(F, Obj, RepositoryURL, RepositoryLine); +void JSONGenerator::serializeInfo(const FunctionInfo &F, json::Object &Obj) { + serializeCommonAttributes(F, Obj); Obj["IsStatic"] = F.IsStatic; auto ReturnTypeObj = Object(); @@ -549,7 +552,7 @@ static void serializeInfo(const FunctionInfo &F, json::Object &Obj, if (!F.Params.empty()) { const bool VerticalDisplay = F.Params.size() > getMaxParamWrapLimit(); - serializeArray(F.Params, Obj, "Params", SerializeInfoLambda, "ParamEnd", + serializeArray(F.Params, Obj, "Params", serializeInfoLambda(), "ParamEnd", [VerticalDisplay](Object &JsonObj) { JsonObj["VerticalDisplay"] = VerticalDisplay; }); @@ -559,7 +562,7 @@ static void serializeInfo(const FunctionInfo &F, json::Object &Obj, serializeInfo(F.Template.value(), Obj); } -static void serializeInfo(const EnumValueInfo &I, Object &Obj) { +void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) { Obj["Name"] = I.Name; if (!I.ValueExpr.empty()) Obj["ValueExpr"] = I.ValueExpr; @@ -567,10 +570,8 @@ static void serializeInfo(const EnumValueInfo &I, Object &Obj) { Obj["Value"] = I.Value; } -static void serializeInfo(const EnumInfo &I, json::Object &Obj, - const std::optional<StringRef> &RepositoryUrl, - const std::optional<StringRef> &RepositoryLine) { - serializeCommonAttributes(I, Obj, RepositoryUrl, RepositoryLine); +void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) { + serializeCommonAttributes(I, Obj); Obj["Scoped"] = I.Scoped; if (I.BaseType) { @@ -583,14 +584,11 @@ static void serializeInfo(const EnumInfo &I, json::Object &Obj, } if (!I.Members.empty()) - serializeArray(I.Members, Obj, "Members", SerializeInfoLambda); + serializeArray(I.Members, Obj, "Members", serializeInfoLambda()); } -static void -serializeInfo(const TypedefInfo &I, json::Object &Obj, - const std::optional<StringRef> &RepositoryUrl, - const std::optional<StringRef> &RepositoryLinePrefix) { - serializeCommonAttributes(I, Obj, RepositoryUrl, RepositoryLinePrefix); +void JSONGenerator::serializeInfo(const TypedefInfo &I, json::Object &Obj) { + serializeCommonAttributes(I, Obj); Obj["TypeDeclaration"] = I.TypeDeclaration; Obj["IsUsing"] = I.IsUsing; json::Value TypeVal = Object(); @@ -601,18 +599,14 @@ serializeInfo(const TypedefInfo &I, json::Object &Obj, serializeInfo(I.Template.value(), Obj); } -static void -serializeInfo(const BaseRecordInfo &I, Object &Obj, - const std::optional<StringRef> &RepositoryUrl, - const std::optional<StringRef> &RepositoryLinePrefix) { - serializeInfo(static_cast<const RecordInfo &>(I), Obj, RepositoryUrl, - RepositoryLinePrefix); +void JSONGenerator::serializeInfo(const BaseRecordInfo &I, Object &Obj) { + serializeInfo(static_cast<const RecordInfo &>(I), Obj); Obj["IsVirtual"] = I.IsVirtual; Obj["Access"] = getAccessSpelling(I.Access); Obj["IsParent"] = I.IsParent; } -static void serializeInfo(const FriendInfo &I, Object &Obj) { +void JSONGenerator::serializeInfo(const FriendInfo &I, Object &Obj) { auto FriendRef = Object(); serializeReference(I.Ref, FriendRef); Obj["Reference"] = std::move(FriendRef); @@ -620,13 +614,13 @@ static void serializeInfo(const FriendInfo &I, Object &Obj) { if (I.Template) serializeInfo(I.Template.value(), Obj); if (I.Params) - serializeArray(I.Params.value(), Obj, "Params", SerializeInfoLambda); + serializeArray(I.Params.value(), Obj, "Params", serializeInfoLambda()); if (I.ReturnType) { auto ReturnTypeObj = Object(); serializeInfo(I.ReturnType.value(), ReturnTypeObj); Obj["ReturnType"] = std::move(ReturnTypeObj); } - serializeCommonAttributes(I, Obj, std::nullopt, std::nullopt); + serializeCommonAttributes(I, Obj); } static void insertArray(Object &Obj, json::Value &Array, StringRef Key) { @@ -634,11 +628,8 @@ static void insertArray(Object &Obj, json::Value &Array, StringRef Key) { Obj["Has" + Key.str()] = true; } -static void -serializeInfo(const RecordInfo &I, json::Object &Obj, - const std::optional<StringRef> &RepositoryUrl, - const std::optional<StringRef> &RepositoryLinePrefix) { - serializeCommonAttributes(I, Obj, RepositoryUrl, RepositoryLinePrefix); +void JSONGenerator::serializeInfo(const RecordInfo &I, json::Object &Obj) { + serializeCommonAttributes(I, Obj); Obj["TagType"] = getTagType(I.TagType); Obj["IsTypedef"] = I.IsTypeDef; Obj["MangledName"] = I.MangledName; @@ -652,7 +643,7 @@ serializeInfo(const RecordInfo &I, json::Object &Obj, for (const auto &Function : I.Children.Functions) { json::Value FunctionVal = Object(); auto &FunctionObj = *FunctionVal.getAsObject(); - serializeInfo(Function, FunctionObj, RepositoryUrl, RepositoryLinePrefix); + serializeInfo(Function, FunctionObj); AccessSpecifier Access = Function.Access; if (Access == AccessSpecifier::AS_public) PubFunctionsArrayRef.push_back(FunctionVal); @@ -698,21 +689,16 @@ serializeInfo(const RecordInfo &I, json::Object &Obj, } if (!I.Bases.empty()) - serializeArray(I.Bases, Obj, "Bases", - [&RepositoryUrl, &RepositoryLinePrefix]( - const BaseRecordInfo &Base, Object &BaseObj) { - serializeInfo(Base, BaseObj, RepositoryUrl, - RepositoryLinePrefix); - }); + serializeArray(I.Bases, Obj, "Bases", serializeInfoLambda()); if (!I.Parents.empty()) { - serializeArray(I.Parents, Obj, "Parents", SerializeReferenceLambda); + serializeArray(I.Parents, Obj, "Parents", serializeReferenceLambda()); Obj["HasParents"] = true; } if (!I.VirtualParents.empty()) { serializeArray(I.VirtualParents, Obj, "VirtualParents", - SerializeReferenceLambda); + serializeReferenceLambda()); Obj["HasVirtualParents"] = true; } @@ -720,61 +706,54 @@ serializeInfo(const RecordInfo &I, json::Object &Obj, serializeInfo(I.Template.value(), Obj); if (!I.Friends.empty()) { - serializeArray(I.Friends, Obj, "Friends", SerializeInfoLambda); + serializeArray(I.Friends, Obj, "Friends", serializeInfoLambda()); Obj["HasFriends"] = true; } - serializeCommonChildren(I.Children, Obj, RepositoryUrl, RepositoryLinePrefix); + serializeCommonChildren(I.Children, Obj); } -static void -serializeInfo(const VarInfo &I, json::Object &Obj, - const std::optional<StringRef> RepositoryUrl, - const std::optional<StringRef> RepositoryUrlLinePrefix) { - serializeCommonAttributes(I, Obj, RepositoryUrl, RepositoryUrlLinePrefix); +void JSONGenerator::serializeInfo(const VarInfo &I, json::Object &Obj) { + serializeCommonAttributes(I, Obj); Obj["IsStatic"] = I.IsStatic; auto TypeObj = Object(); serializeInfo(I.Type, TypeObj); Obj["Type"] = std::move(TypeObj); } -static void serializeInfo(const NamespaceInfo &I, json::Object &Obj, - const std::optional<StringRef> RepositoryUrl, - const std::optional<StringRef> RepositoryLinePrefix) { - serializeCommonAttributes(I, Obj, RepositoryUrl, RepositoryLinePrefix); +void JSONGenerator::serializeInfo(const NamespaceInfo &I, json::Object &Obj) { + serializeCommonAttributes(I, Obj); if (I.USR == GlobalNamespaceID) Obj["Name"] = "Global Namespace"; if (!I.Children.Namespaces.empty()) { serializeArray(I.Children.Namespaces, Obj, "Namespaces", - SerializeReferenceLambda); + serializeReferenceLambda()); Obj["HasNamespaces"] = true; } - static auto SerializeInfo = - [RepositoryUrl, RepositoryLinePrefix](const auto &Info, Object &Object) { - serializeInfo(Info, Object, RepositoryUrl, RepositoryLinePrefix); - }; - if (!I.Children.Functions.empty()) { - serializeArray(I.Children.Functions, Obj, "Functions", SerializeInfo); + serializeArray(I.Children.Functions, Obj, "Functions", + serializeInfoLambda()); Obj["HasFunctions"] = true; } if (!I.Children.Concepts.empty()) { - serializeArray(I.Children.Concepts, Obj, "Concepts", SerializeInfo); + serializeArray(I.Children.Concepts, Obj, "Concepts", serializeInfoLambda()); Obj["HasConcepts"] = true; } if (!I.Children.Variables.empty()) { - serializeArray(I.Children.Variables, Obj, "Variables", SerializeInfo); + serializeArray(I.Children.Variables, Obj, "Variables", + serializeInfoLambda()); Obj["HasVariables"] = true; } - serializeCommonChildren(I.Children, Obj, RepositoryUrl, RepositoryLinePrefix); + serializeCommonChildren(I.Children, Obj); } -static SmallString<16> determineFileName(Info *I, SmallString<128> &Path) { +SmallString<16> JSONGenerator::determineFileName(Info *I, + SmallString<128> &Path) { SmallString<16> FileName; if (I->IT == InfoType::IT_record) { auto *RecordSymbolInfo = static_cast<SymbolInfo *>(I); @@ -790,15 +769,15 @@ static SmallString<16> determineFileName(Info *I, SmallString<128> &Path) { // Creates a JSON file above the global namespace directory. // An index can be used to create the top-level HTML index page or the Markdown // index file. -static Error serializeIndex(const ClangDocContext &CDCtx, StringRef RootDir) { - if (CDCtx.Idx.Children.empty()) +Error JSONGenerator::serializeIndex(StringRef RootDir) { + if (CDCtx->Idx.Children.empty()) return Error::success(); json::Value ObjVal = Object(); Object &Obj = *ObjVal.getAsObject(); - insertNonEmpty("ProjectName", CDCtx.ProjectName, Obj); + insertNonEmpty("ProjectName", CDCtx->ProjectName, Obj); - auto IndexCopy = CDCtx.Idx; + auto IndexCopy = CDCtx->Idx; IndexCopy.sort(); json::Value IndexArray = json::Array(); auto &IndexArrayRef = *IndexArray.getAsArray(); @@ -809,7 +788,7 @@ static Error serializeIndex(const ClangDocContext &CDCtx, StringRef RootDir) { GlobalNamespaceID, "", InfoType::IT_namespace, "GlobalNamespace"); } else { - IndexArrayRef.reserve(CDCtx.Idx.Children.size()); + IndexArrayRef.reserve(CDCtx->Idx.Children.size()); } llvm::SmallVector<const Index *> Children; @@ -865,6 +844,7 @@ static void serializeContexts(Info *I, Error JSONGenerator::generateDocumentation( StringRef RootDir, llvm::StringMap<std::unique_ptr<doc::Info>> Infos, const ClangDocContext &CDCtx, std::string DirName) { + this->CDCtx = &CDCtx; StringSet<> CreatedDirs; StringMap<std::vector<doc::Info *>> FileToInfos; for (const auto &Group : Infos) { @@ -903,7 +883,7 @@ Error JSONGenerator::generateDocumentation( } } - return serializeIndex(CDCtx, RootDir); + return serializeIndex(RootDir); } Error JSONGenerator::generateDocForInfo(Info *I, raw_ostream &OS, @@ -912,12 +892,10 @@ Error JSONGenerator::generateDocForInfo(Info *I, raw_ostream &OS, switch (I->IT) { case InfoType::IT_namespace: - serializeInfo(*static_cast<NamespaceInfo *>(I), Obj, CDCtx.RepositoryUrl, - CDCtx.RepositoryLinePrefix); + serializeInfo(*static_cast<NamespaceInfo *>(I), Obj); break; case InfoType::IT_record: - serializeInfo(*static_cast<RecordInfo *>(I), Obj, CDCtx.RepositoryUrl, - CDCtx.RepositoryLinePrefix); + serializeInfo(*static_cast<RecordInfo *>(I), Obj); break; case InfoType::IT_concept: case InfoType::IT_enum: _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
