]> granicus.if.org Git - clang/commitdiff
When gathering results for code completion, only include hidden
authorDouglas Gregor <dgregor@apple.com>
Fri, 18 Sep 2009 15:51:54 +0000 (15:51 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 18 Sep 2009 15:51:54 +0000 (15:51 +0000)
results when there is some way to refer to them in the language, such
as with a qualified name in C++.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82223 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Sema/CodeCompleteConsumer.h
lib/Sema/CodeCompleteConsumer.cpp
test/CodeCompletion/tag.c

index 0da5541c3d702ccaa5ea43cb2eb2a190813af7f4..425a937a93d85ddb2fea16be0fec63d84d8f41e9 100644 (file)
@@ -204,6 +204,14 @@ public:
   bool IsClassOrStruct(NamedDecl *ND) const;
   bool IsUnion(NamedDecl *ND) const;
   //@}
+  
+  /// \name Utility functions
+  ///
+  //@{
+  
+  bool canHiddenResultBeFound(NamedDecl *Hidden, NamedDecl *Visible);
+  
+  //@}
 };
   
 /// \brief A simple code-completion consumer that prints the results it 
index 707ad9a1434036b2f69baa03d6f58503354f5363..fb82a6c3313eb739f9c71813e994f16f2f516471 100644 (file)
@@ -174,7 +174,15 @@ void CodeCompleteConsumer::ResultSet::MaybeAddResult(Result R) {
         continue;
       
       // The newly-added result is hidden by an entry in the shadow map.
-      R.Hidden = true;
+      if (Completer.canHiddenResultBeFound(R.Declaration, I->second.first)) {
+        // Note that this result was hidden.
+        R.Hidden = true;
+      } else {
+        // This result was hidden and cannot be found; don't bother adding
+        // it.
+        return;
+      }
+      
       break;
     }
   }
@@ -420,6 +428,35 @@ namespace {
   };
 }
 
+/// \brief Determines whether the given hidden result could be found with
+/// some extra work, e.g., by qualifying the name.
+///
+/// \param Hidden the declaration that is hidden by the currenly \p Visible
+/// declaration.
+///
+/// \param Visible the declaration with the same name that is already visible.
+///
+/// \returns true if the hidden result can be found by some mechanism,
+/// false otherwise.
+bool CodeCompleteConsumer::canHiddenResultBeFound(NamedDecl *Hidden, 
+                                                  NamedDecl *Visible) {
+  // In C, there is no way to refer to a hidden name.
+  if (!getSema().getLangOptions().CPlusPlus)
+    return false;
+  
+  DeclContext *HiddenCtx = Hidden->getDeclContext()->getLookupContext();
+  
+  // There is no way to qualify a name declared in a function or method.
+  if (HiddenCtx->isFunctionOrMethod())
+    return false;
+
+  // If the hidden and visible declarations are in different name-lookup
+  // contexts, then we can qualify the name of the hidden declaration.
+  // FIXME: Optionally compute the string needed to refer to the hidden
+  // name.
+  return HiddenCtx != Visible->getDeclContext()->getLookupContext();
+}
+
 void 
 PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Result *Results, 
                                                          unsigned NumResults) {
index 06a2e20474436a7b8af485f7cff771ce6eb646a2..35ddda273e2c8a8556d4401133e670e8c97b66a7 100644 (file)
@@ -11,5 +11,4 @@ void test() {
   enum X { x };
   // CHECK-CC1: X : 0
   // CHECK-CC1: Y : 2
-  // CHECK-CC1: X : 2 (Hidden)
   enum