From 4e5742a479781860a67c55911132b993b9718064 Mon Sep 17 00:00:00 2001 From: Sam McCall Date: Fri, 6 Jul 2018 11:50:49 +0000 Subject: [PATCH] [clangd] Make SymbolOrigin an enum class, rather than a plain enum. I never intended to define namespace pollution like clangd::AST, clangd::Unknown etc. Oops! llvm-svn: 336431 --- clang-tools-extra/clangd/CodeComplete.cpp | 17 ++++++++--------- clang-tools-extra/clangd/index/Index.cpp | 2 +- clang-tools-extra/clangd/index/Index.h | 15 +++++++++++++-- clang-tools-extra/clangd/index/Merge.cpp | 3 +-- .../unittests/clangd/CodeCompleteTests.cpp | 3 +-- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp index e8a77e6..be252b5 100644 --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -268,8 +268,7 @@ struct CodeCompletionBuilder { : ASTCtx(ASTCtx), ExtractDocumentation(Opts.IncludeComments) { add(C, SemaCCS); if (C.SemaResult) { - Completion.Origin = - static_cast(Completion.Origin | SymbolOrigin::AST); + Completion.Origin |= SymbolOrigin::AST; Completion.Name = llvm::StringRef(SemaCCS->getTypedText()); if (Completion.Scope.empty()) if (C.SemaResult->Kind == CodeCompletionResult::RK_Declaration) @@ -281,8 +280,7 @@ struct CodeCompletionBuilder { toCompletionItemKind(C.SemaResult->Kind, C.SemaResult->Declaration); } if (C.IndexResult) { - Completion.Origin = - static_cast(Completion.Origin | C.IndexResult->Origin); + Completion.Origin |= C.IndexResult->Origin; if (Completion.Scope.empty()) Completion.Scope = C.IndexResult->Scope; if (Completion.Kind == CompletionItemKind::Missing) @@ -1156,17 +1154,18 @@ private: else return; SymbolOrigin Origin = SymbolOrigin::Unknown; + bool FromIndex = false; for (const auto &Candidate : Bundle) { if (Candidate.IndexResult) { Quality.merge(*Candidate.IndexResult); Relevance.merge(*Candidate.IndexResult); - Origin = - static_cast(Origin | Candidate.IndexResult->Origin); + Origin |= Candidate.IndexResult->Origin; + FromIndex = true; } if (Candidate.SemaResult) { Quality.merge(*Candidate.SemaResult); Relevance.merge(*Candidate.SemaResult); - Origin = static_cast(Origin | SymbolOrigin::AST); + Origin |= SymbolOrigin::AST; } } @@ -1184,8 +1183,8 @@ private: << Quality << Relevance << "\n"); NSema += bool(Origin & SymbolOrigin::AST); - NIndex += bool(Origin & ~SymbolOrigin::AST); - NBoth += (Origin & SymbolOrigin::AST) && (Origin & ~SymbolOrigin::AST); + NIndex += FromIndex; + NBoth += bool(Origin & SymbolOrigin::AST) && FromIndex; if (Candidates.push({std::move(Bundle), Scores})) Incomplete = true; } diff --git a/clang-tools-extra/clangd/index/Index.cpp b/clang-tools-extra/clangd/index/Index.cpp index 58cc82c..1ae3d54 100644 --- a/clang-tools-extra/clangd/index/Index.cpp +++ b/clang-tools-extra/clangd/index/Index.cpp @@ -49,7 +49,7 @@ raw_ostream &operator<<(raw_ostream &OS, SymbolOrigin O) { return OS << "unknown"; constexpr static char Sigils[] = "ADSM4567"; for (unsigned I = 0; I < sizeof(Sigils); ++I) - if (O & static_cast(1 << I)) + if (static_cast(O) & 1u << I) OS << Sigils[I]; return OS; } diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h index 1b098ae..0fda5ad 100644 --- a/clang-tools-extra/clangd/index/Index.h +++ b/clang-tools-extra/clangd/index/Index.h @@ -120,7 +120,7 @@ namespace clangd { // Describes the source of information about a symbol. // Mainly useful for debugging, e.g. understanding code completion reuslts. // This is a bitfield as information can be combined from several sources. -enum SymbolOrigin : uint8_t { +enum class SymbolOrigin : uint8_t { Unknown = 0, AST = 1 << 0, // Directly from the AST (indexes should not set this). Dynamic = 1 << 1, // From the dynamic index of opened files. @@ -128,6 +128,17 @@ enum SymbolOrigin : uint8_t { Merge = 1 << 3, // A non-trivial index merge was performed. // Remaining bits reserved for index implementations. }; +inline SymbolOrigin operator|(SymbolOrigin A, SymbolOrigin B) { + return static_cast(static_cast(A) | + static_cast(B)); +} +inline SymbolOrigin &operator|=(SymbolOrigin &A, SymbolOrigin B) { + return A = A | B; +} +inline SymbolOrigin operator&(SymbolOrigin A, SymbolOrigin B) { + return static_cast(static_cast(A) & + static_cast(B)); +} raw_ostream &operator<<(raw_ostream &, SymbolOrigin); // The class presents a C++ symbol, e.g. class, function. @@ -171,7 +182,7 @@ struct Symbol { /// See also isIndexedForCodeCompletion(). bool IsIndexedForCodeCompletion = false; /// Where this symbol came from. Usually an index provides a constant value. - SymbolOrigin Origin = Unknown; + SymbolOrigin Origin = SymbolOrigin::Unknown; /// A brief description of the symbol that can be appended in the completion /// candidate list. For example, "(X x, Y y) const" is a function signature. llvm::StringRef Signature; diff --git a/clang-tools-extra/clangd/index/Merge.cpp b/clang-tools-extra/clangd/index/Merge.cpp index 1207e1a..4365e04 100644 --- a/clang-tools-extra/clangd/index/Merge.cpp +++ b/clang-tools-extra/clangd/index/Merge.cpp @@ -116,8 +116,7 @@ mergeSymbol(const Symbol &L, const Symbol &R, Symbol::Details *Scratch) { S.Detail = O.Detail; } - S.Origin = - static_cast(S.Origin | O.Origin | SymbolOrigin::Merge); + S.Origin |= O.Origin | SymbolOrigin::Merge; return S; } diff --git a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp index c8c45d7..cc35c4f 100644 --- a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp +++ b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp @@ -1257,8 +1257,7 @@ TEST(CompletionTest, Render) { C.Header = "\"foo.h\""; C.Kind = CompletionItemKind::Method; C.Score.Total = 1.0; - C.Origin = - static_cast(SymbolOrigin::AST | SymbolOrigin::Static); + C.Origin = SymbolOrigin::AST | SymbolOrigin::Static; CodeCompleteOptions Opts; Opts.IncludeIndicator.Insert = "^"; -- 2.7.4