Mercurial > hg > CbC > CbC_llvm
diff clang-tools-extra/clangd/IncludeFixer.cpp @ 221:79ff65ed7e25
LLVM12 Original
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Jun 2021 19:15:29 +0900 |
parents | 0572611fdcc8 |
children | c4bab56944e8 |
line wrap: on
line diff
--- a/clang-tools-extra/clangd/IncludeFixer.cpp Tue Jun 15 19:13:43 2021 +0900 +++ b/clang-tools-extra/clangd/IncludeFixer.cpp Tue Jun 15 19:15:29 2021 +0900 @@ -40,38 +40,28 @@ #include "llvm/ADT/StringSet.h" #include "llvm/Support/Error.h" #include "llvm/Support/FormatVariadic.h" +#include <algorithm> +#include <set> +#include <string> #include <vector> namespace clang { namespace clangd { -namespace { - -// Collects contexts visited during a Sema name lookup. -class VisitedContextCollector : public VisibleDeclConsumer { -public: - void EnteredContext(DeclContext *Ctx) override { Visited.push_back(Ctx); } - - void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, - bool InBaseClass) override {} - - std::vector<DeclContext *> takeVisitedContexts() { - return std::move(Visited); - } - -private: - std::vector<DeclContext *> Visited; -}; - -} // namespace - std::vector<Fix> IncludeFixer::fix(DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) const { switch (Info.getID()) { - case diag::err_incomplete_type: + case diag::err_incomplete_nested_name_spec: + case diag::err_incomplete_base_class: case diag::err_incomplete_member_access: - case diag::err_incomplete_base_class: - case diag::err_incomplete_nested_name_spec: + case diag::err_incomplete_type: + case diag::err_typecheck_decl_incomplete_type: + case diag::err_typecheck_incomplete_tag: + case diag::err_invalid_incomplete_type_use: + case diag::err_sizeof_alignof_incomplete_or_sizeless_type: + case diag::err_for_range_incomplete_type: + case diag::err_func_def_incomplete_result: + case diag::err_field_incomplete_or_sizeless: // Incomplete type diagnostics should have a QualType argument for the // incomplete type. for (unsigned Idx = 0; Idx < Info.getNumArgs(); ++Idx) { @@ -94,6 +84,8 @@ case diag::err_undeclared_var_use_suggest: case diag::err_no_member: // Could be no member in namespace. case diag::err_no_member_suggest: + case diag::err_no_member_template: + case diag::err_no_member_template_suggest: if (LastUnresolvedName) { // Try to fix unresolved name caused by missing declaration. // E.g. @@ -127,7 +119,7 @@ auto ID = getSymbolID(TD); if (!ID) return {}; - llvm::Optional<const SymbolSlab *> Symbols = lookupCached(*ID); + llvm::Optional<const SymbolSlab *> Symbols = lookupCached(ID); if (!Symbols) return {}; const SymbolSlab &Syms = **Symbols; @@ -153,8 +145,7 @@ return ResolvedInserted.takeError(); auto Spelled = Inserter->calculateIncludePath(*ResolvedInserted, File); if (!Spelled) - return llvm::createStringError(llvm::inconvertibleErrorCode(), - "Header not on include path"); + return error("Header not on include path"); return std::make_pair( std::move(*Spelled), Inserter->shouldInsertInclude(*ResolvedDeclaring, *ResolvedInserted)); @@ -305,17 +296,26 @@ std::vector<std::string> collectAccessibleScopes(Sema &Sem, const DeclarationNameInfo &Typo, Scope *S, Sema::LookupNameKind LookupKind) { + // Collects contexts visited during a Sema name lookup. + struct VisitedContextCollector : public VisibleDeclConsumer { + VisitedContextCollector(std::vector<std::string> &Out) : Out(Out) {} + void EnteredContext(DeclContext *Ctx) override { + if (llvm::isa<NamespaceDecl>(Ctx)) + Out.push_back(printNamespaceScope(*Ctx)); + } + void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, + bool InBaseClass) override {} + std::vector<std::string> &Out; + }; + std::vector<std::string> Scopes; - VisitedContextCollector Collector; + Scopes.push_back(""); + VisitedContextCollector Collector(Scopes); Sem.LookupVisibleDecls(S, LookupKind, Collector, /*IncludeGlobalScope=*/false, /*LoadExternal=*/false); - - Scopes.push_back(""); - for (const auto *Ctx : Collector.takeVisitedContexts()) { - if (isa<NamespaceDecl>(Ctx)) - Scopes.push_back(printNamespaceScope(*Ctx)); - } + std::sort(Scopes.begin(), Scopes.end()); + Scopes.erase(std::unique(Scopes.begin(), Scopes.end()), Scopes.end()); return Scopes; }