diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-09-18 15:51:54 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-09-18 15:51:54 +0000 |
commit | b1c28a1f7ef3bd3616df6ddcdb503f4b480a8df6 (patch) | |
tree | f370f1020f5827ae4966cd982a250d71d0daa379 /lib/Sema/CodeCompleteConsumer.cpp | |
parent | 374929f7e88f6c7a96382b3eb4201b721c418372 (diff) |
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
Diffstat (limited to 'lib/Sema/CodeCompleteConsumer.cpp')
-rw-r--r-- | lib/Sema/CodeCompleteConsumer.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
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) { |