| //===-- Generators.cpp - Generator Registry ----------------------*- C++-*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "Generators.h" |
| |
| LLVM_INSTANTIATE_REGISTRY(clang::doc::GeneratorRegistry) |
| |
| namespace clang { |
| namespace doc { |
| |
| llvm::Expected<std::unique_ptr<Generator>> |
| findGeneratorByName(llvm::StringRef Format) { |
| for (const auto &Generator : GeneratorRegistry::entries()) { |
| if (Generator.getName() != Format) |
| continue; |
| return Generator.instantiate(); |
| } |
| return createStringError(llvm::inconvertibleErrorCode(), |
| "can't find generator: " + Format); |
| } |
| |
| // Enum conversion |
| |
| std::string getTagType(TagTypeKind AS) { |
| switch (AS) { |
| case TagTypeKind::TTK_Class: |
| return "class"; |
| case TagTypeKind::TTK_Union: |
| return "union"; |
| case TagTypeKind::TTK_Interface: |
| return "interface"; |
| case TagTypeKind::TTK_Struct: |
| return "struct"; |
| case TagTypeKind::TTK_Enum: |
| return "enum"; |
| } |
| llvm_unreachable("Unknown TagTypeKind"); |
| } |
| |
| llvm::Error Generator::createResources(ClangDocContext &CDCtx) { |
| return llvm::Error::success(); |
| } |
| |
| // A function to add a reference to Info in Idx. |
| // Given an Info X with the following namespaces: [B,A]; a reference to X will |
| // be added in the children of a reference to B, which should be also a child of |
| // a reference to A, where A is a child of Idx. |
| // Idx |
| // |-- A |
| // |--B |
| // |--X |
| // If the references to the namespaces do not exist, they will be created. If |
| // the references already exist, the same one will be used. |
| void Generator::addInfoToIndex(Index &Idx, const doc::Info *Info) { |
| // Index pointer that will be moving through Idx until the first parent |
| // namespace of Info (where the reference has to be inserted) is found. |
| Index *I = &Idx; |
| // The Namespace vector includes the upper-most namespace at the end so the |
| // loop will start from the end to find each of the namespaces. |
| for (const auto &R : llvm::reverse(Info->Namespace)) { |
| // Look for the current namespace in the children of the index I is |
| // pointing. |
| auto It = std::find(I->Children.begin(), I->Children.end(), R.USR); |
| if (It != I->Children.end()) { |
| // If it is found, just change I to point the namespace reference found. |
| I = &*It; |
| } else { |
| // If it is not found a new reference is created |
| I->Children.emplace_back(R.USR, R.Name, R.RefType, R.Path); |
| // I is updated with the reference of the new namespace reference |
| I = &I->Children.back(); |
| } |
| } |
| // Look for Info in the vector where it is supposed to be; it could already |
| // exist if it is a parent namespace of an Info already passed to this |
| // function. |
| auto It = std::find(I->Children.begin(), I->Children.end(), Info->USR); |
| if (It == I->Children.end()) { |
| // If it is not in the vector it is inserted |
| I->Children.emplace_back(Info->USR, Info->extractName(), Info->IT, |
| Info->Path); |
| } else { |
| // If it not in the vector we only check if Path and Name are not empty |
| // because if the Info was included by a namespace it may not have those |
| // values. |
| if (It->Path.empty()) |
| It->Path = Info->Path; |
| if (It->Name.empty()) |
| It->Name = Info->extractName(); |
| } |
| } |
| |
| // This anchor is used to force the linker to link in the generated object file |
| // and thus register the generators. |
| extern volatile int YAMLGeneratorAnchorSource; |
| extern volatile int MDGeneratorAnchorSource; |
| extern volatile int HTMLGeneratorAnchorSource; |
| static int LLVM_ATTRIBUTE_UNUSED YAMLGeneratorAnchorDest = |
| YAMLGeneratorAnchorSource; |
| static int LLVM_ATTRIBUTE_UNUSED MDGeneratorAnchorDest = |
| MDGeneratorAnchorSource; |
| static int LLVM_ATTRIBUTE_UNUSED HTMLGeneratorAnchorDest = |
| HTMLGeneratorAnchorSource; |
| |
| } // namespace doc |
| } // namespace clang |