[clangd] Make SymbolOrigin an enum class, rather than a plain enum.
authorSam McCall <sam.mccall@gmail.com>
Fri, 6 Jul 2018 11:50:49 +0000 (11:50 +0000)
committerSam McCall <sam.mccall@gmail.com>
Fri, 6 Jul 2018 11:50:49 +0000 (11:50 +0000)
I never intended to define namespace pollution like clangd::AST, clangd::Unknown
etc. Oops!

llvm-svn: 336431

clang-tools-extra/clangd/CodeComplete.cpp
clang-tools-extra/clangd/index/Index.cpp
clang-tools-extra/clangd/index/Index.h
clang-tools-extra/clangd/index/Merge.cpp
clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp

index e8a77e6..be252b5 100644 (file)
@@ -268,8 +268,7 @@ struct CodeCompletionBuilder {
       : ASTCtx(ASTCtx), ExtractDocumentation(Opts.IncludeComments) {
     add(C, SemaCCS);
     if (C.SemaResult) {
-      Completion.Origin =
-          static_cast<SymbolOrigin>(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<SymbolOrigin>(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<SymbolOrigin>(Origin | Candidate.IndexResult->Origin);
+        Origin |= Candidate.IndexResult->Origin;
+        FromIndex = true;
       }
       if (Candidate.SemaResult) {
         Quality.merge(*Candidate.SemaResult);
         Relevance.merge(*Candidate.SemaResult);
-        Origin = static_cast<SymbolOrigin>(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;
   }
index 58cc82c..1ae3d54 100644 (file)
@@ -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<SymbolOrigin>(1 << I))
+    if (static_cast<uint8_t>(O) & 1u << I)
       OS << Sigils[I];
   return OS;
 }
index 1b098ae..0fda5ad 100644 (file)
@@ -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<SymbolOrigin>(static_cast<uint8_t>(A) |
+                                   static_cast<uint8_t>(B));
+}
+inline SymbolOrigin &operator|=(SymbolOrigin &A, SymbolOrigin B) {
+  return A = A | B;
+}
+inline SymbolOrigin operator&(SymbolOrigin A, SymbolOrigin B) {
+  return static_cast<SymbolOrigin>(static_cast<uint8_t>(A) &
+                                   static_cast<uint8_t>(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;
index 1207e1a..4365e04 100644 (file)
@@ -116,8 +116,7 @@ mergeSymbol(const Symbol &L, const Symbol &R, Symbol::Details *Scratch) {
       S.Detail = O.Detail;
   }
 
-  S.Origin =
-      static_cast<SymbolOrigin>(S.Origin | O.Origin | SymbolOrigin::Merge);
+  S.Origin |= O.Origin | SymbolOrigin::Merge;
   return S;
 }
 
index c8c45d7..cc35c4f 100644 (file)
@@ -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>(SymbolOrigin::AST | SymbolOrigin::Static);
+  C.Origin = SymbolOrigin::AST | SymbolOrigin::Static;
 
   CodeCompleteOptions Opts;
   Opts.IncludeIndicator.Insert = "^";