Implement code completion for preprocessor expressions and in macro

arguments.

llvm-svn: 111976
This commit is contained in:
Douglas Gregor
2010-08-24 22:20:20 +00:00
parent 3c884a014c
commit ec00a26855
11 changed files with 137 additions and 16 deletions

View File

@@ -4608,7 +4608,7 @@ void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,
Results.data(),Results.size());
}
void Sema::CodeCompletePreprocessorDirective(Scope *S, bool InConditional) {
void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
ResultBuilder Results(*this);
Results.EnterNewScope();
@@ -4785,11 +4785,12 @@ void Sema::CodeCompletePreprocessorDirective(Scope *S, bool InConditional) {
}
void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
CodeCompleteOrdinaryName(S, Action::PCC_RecoveryInFunction);
CodeCompleteOrdinaryName(S,
S->getFnParent()? Action::PCC_RecoveryInFunction
: Action::PCC_Namespace);
}
void Sema::CodeCompletePreprocessorMacroName(Scope *S, bool IsDefinition) {
typedef CodeCompleteConsumer::Result Result;
void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
ResultBuilder Results(*this);
if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
// Add just the names of macros, not their arguments.
@@ -4812,6 +4813,40 @@ void Sema::CodeCompletePreprocessorMacroName(Scope *S, bool IsDefinition) {
Results.data(), Results.size());
}
void Sema::CodeCompletePreprocessorExpression() {
ResultBuilder Results(*this);
if (!CodeCompleter || CodeCompleter->includeMacros())
AddMacroResults(PP, Results);
// defined (<macro>)
Results.EnterNewScope();
CodeCompletionString *Pattern = new CodeCompletionString;
Pattern->AddTypedTextChunk("defined");
Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace);
Pattern->AddChunk(CodeCompletionString::CK_LeftParen);
Pattern->AddPlaceholderChunk("macro");
Pattern->AddChunk(CodeCompletionString::CK_RightParen);
Results.AddResult(Pattern);
Results.ExitScope();
HandleCodeCompleteResults(this, CodeCompleter,
CodeCompletionContext::CCC_PreprocessorExpression,
Results.data(), Results.size());
}
void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
IdentifierInfo *Macro,
MacroInfo *MacroInfo,
unsigned Argument) {
// FIXME: In the future, we could provide "overload" results, much like we
// do for function calls.
CodeCompleteOrdinaryName(S,
S->getFnParent()? Action::PCC_RecoveryInFunction
: Action::PCC_Namespace);
}
void Sema::GatherGlobalCodeCompletions(
llvm::SmallVectorImpl<CodeCompleteConsumer::Result> &Results) {
ResultBuilder Builder(*this);