From: Douglas Gregor Date: Fri, 18 Sep 2009 15:51:54 +0000 (+0000) Subject: When gathering results for code completion, only include hidden X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1c28a1f7ef3bd3616df6ddcdb503f4b480a8df6;p=clang When gathering results for code completion, only include hidden 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 --- diff --git a/include/clang/Sema/CodeCompleteConsumer.h b/include/clang/Sema/CodeCompleteConsumer.h index 0da5541c3d..425a937a93 100644 --- a/include/clang/Sema/CodeCompleteConsumer.h +++ b/include/clang/Sema/CodeCompleteConsumer.h @@ -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 diff --git a/lib/Sema/CodeCompleteConsumer.cpp b/lib/Sema/CodeCompleteConsumer.cpp index 707ad9a143..fb82a6c331 100644 --- a/lib/Sema/CodeCompleteConsumer.cpp +++ b/lib/Sema/CodeCompleteConsumer.cpp @@ -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) { diff --git a/test/CodeCompletion/tag.c b/test/CodeCompletion/tag.c index 06a2e20474..35ddda273e 100644 --- a/test/CodeCompletion/tag.c +++ b/test/CodeCompletion/tag.c @@ -11,5 +11,4 @@ void test() { enum X { x }; // CHECK-CC1: X : 0 // CHECK-CC1: Y : 2 - // CHECK-CC1: X : 2 (Hidden) enum