diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-08-23 18:23:48 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-08-23 18:23:48 +0000 |
| commit | c49f5b2f111cad4596ed285bae771f62a25bd9e7 (patch) | |
| tree | d9bb3f286ce874ae344bdf3de1ae75f527297805 /clang/lib/Sema/SemaCodeComplete.cpp | |
| parent | 08fd2cf26a2363bd3192f1280976724869359ef1 (diff) | |
| download | bcm5719-llvm-c49f5b2f111cad4596ed285bae771f62a25bd9e7.tar.gz bcm5719-llvm-c49f5b2f111cad4596ed285bae771f62a25bd9e7.zip | |
Introduce a new code-completion point when we're parsing a
declarator. Here, we can only see a few things (e.g., cvr-qualifiers,
nested name specifiers) and we do not want to provide other non-macro
completions. Previously, we would end up in recovery mode and would
provide a large number of non-relevant completions.
llvm-svn: 111818
Diffstat (limited to 'clang/lib/Sema/SemaCodeComplete.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 34d0c4aa390..bdcc3ac5466 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -2222,7 +2222,7 @@ static enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, void Sema::CodeCompleteOrdinaryName(Scope *S, ParserCompletionContext CompletionContext) { typedef CodeCompleteConsumer::Result Result; - ResultBuilder Results(*this); + ResultBuilder Results(*this); // Determine how to filter results, e.g., so that the names of // values (functions, enumerators, function templates, etc.) are @@ -2268,6 +2268,45 @@ void Sema::CodeCompleteOrdinaryName(Scope *S, Results.data(),Results.size()); } +void Sema::CodeCompleteDeclarator(Scope *S, + bool AllowNonIdentifiers, + bool AllowNestedNameSpecifiers) { + typedef CodeCompleteConsumer::Result Result; + ResultBuilder Results(*this); + Results.EnterNewScope(); + + // Type qualifiers can come after names. + Results.AddResult(Result("const")); + Results.AddResult(Result("volatile")); + if (getLangOptions().C99) + Results.AddResult(Result("restrict")); + + if (getLangOptions().CPlusPlus) { + if (AllowNonIdentifiers) { + Results.AddResult(Result("operator")); + } + + // Add nested-name-specifiers. + if (AllowNestedNameSpecifiers) { + Results.allowNestedNameSpecifiers(); + CodeCompletionDeclConsumer Consumer(Results, CurContext); + LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, + CodeCompleter->includeGlobals()); + } + } + Results.ExitScope(); + + // Allow macros for names. + if (CodeCompleter->includeMacros()) + AddMacroResults(PP, Results); + + HandleCodeCompleteResults(this, CodeCompleter, + AllowNestedNameSpecifiers + ? CodeCompletionContext::CCC_PotentiallyQualifiedName + : CodeCompletionContext::CCC_Name, + Results.data(), Results.size()); +} + /// \brief Perform code-completion in an expression context when we know what /// type we're looking for. /// |

