ArrayRef'ize Sema::CodeCompleteConstructorInitializer

Patch by Robert Wilhelm.

llvm-svn: 184675
This commit is contained in:
Dmitri Gribenko 2013-06-23 22:58:02 +00:00
parent 0323925d51
commit 27cb3dd085
3 changed files with 20 additions and 20 deletions

View File

@ -7365,9 +7365,10 @@ public:
void CodeCompleteNamespaceDecl(Scope *S); void CodeCompleteNamespaceDecl(Scope *S);
void CodeCompleteNamespaceAliasDecl(Scope *S); void CodeCompleteNamespaceAliasDecl(Scope *S);
void CodeCompleteOperatorName(Scope *S); void CodeCompleteOperatorName(Scope *S);
void CodeCompleteConstructorInitializer(Decl *Constructor, void CodeCompleteConstructorInitializer(
CXXCtorInitializer** Initializers, Decl *Constructor,
unsigned NumInitializers); ArrayRef<CXXCtorInitializer *> Initializers);
void CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, void CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
bool AfterAmpersand); bool AfterAmpersand);

View File

@ -2709,9 +2709,8 @@ void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) {
do { do {
if (Tok.is(tok::code_completion)) { if (Tok.is(tok::code_completion)) {
Actions.CodeCompleteConstructorInitializer(ConstructorDecl, Actions.CodeCompleteConstructorInitializer(ConstructorDecl,
MemInitializers.data(), MemInitializers);
MemInitializers.size());
return cutOffParsing(); return cutOffParsing();
} else { } else {
MemInitResult MemInit = ParseMemInitializer(ConstructorDecl); MemInitResult MemInit = ParseMemInitializer(ConstructorDecl);

View File

@ -4241,9 +4241,9 @@ void Sema::CodeCompleteOperatorName(Scope *S) {
Results.data(),Results.size()); Results.data(),Results.size());
} }
void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, void Sema::CodeCompleteConstructorInitializer(
CXXCtorInitializer** Initializers, Decl *ConstructorD,
unsigned NumInitializers) { ArrayRef <CXXCtorInitializer *> Initializers) {
PrintingPolicy Policy = getCompletionPrintingPolicy(*this); PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
CXXConstructorDecl *Constructor CXXConstructorDecl *Constructor
= static_cast<CXXConstructorDecl *>(ConstructorD); = static_cast<CXXConstructorDecl *>(ConstructorD);
@ -4258,7 +4258,7 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
// Fill in any already-initialized fields or base classes. // Fill in any already-initialized fields or base classes.
llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
llvm::SmallPtrSet<CanQualType, 4> InitializedBases; llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
for (unsigned I = 0; I != NumInitializers; ++I) { for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
if (Initializers[I]->isBaseInitializer()) if (Initializers[I]->isBaseInitializer())
InitializedBases.insert( InitializedBases.insert(
Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0)));
@ -4270,17 +4270,17 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
// Add completions for base classes. // Add completions for base classes.
CodeCompletionBuilder Builder(Results.getAllocator(), CodeCompletionBuilder Builder(Results.getAllocator(),
Results.getCodeCompletionTUInfo()); Results.getCodeCompletionTUInfo());
bool SawLastInitializer = (NumInitializers == 0); bool SawLastInitializer = Initializers.empty();
CXXRecordDecl *ClassDecl = Constructor->getParent(); CXXRecordDecl *ClassDecl = Constructor->getParent();
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
BaseEnd = ClassDecl->bases_end(); BaseEnd = ClassDecl->bases_end();
Base != BaseEnd; ++Base) { Base != BaseEnd; ++Base) {
if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
SawLastInitializer SawLastInitializer
= NumInitializers > 0 && = !Initializers.empty() &&
Initializers[NumInitializers - 1]->isBaseInitializer() && Initializers.back()->isBaseInitializer() &&
Context.hasSameUnqualifiedType(Base->getType(), Context.hasSameUnqualifiedType(Base->getType(),
QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); QualType(Initializers.back()->getBaseClass(), 0));
continue; continue;
} }
@ -4302,10 +4302,10 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
Base != BaseEnd; ++Base) { Base != BaseEnd; ++Base) {
if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
SawLastInitializer SawLastInitializer
= NumInitializers > 0 && = !Initializers.empty() &&
Initializers[NumInitializers - 1]->isBaseInitializer() && Initializers.back()->isBaseInitializer() &&
Context.hasSameUnqualifiedType(Base->getType(), Context.hasSameUnqualifiedType(Base->getType(),
QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); QualType(Initializers.back()->getBaseClass(), 0));
continue; continue;
} }
@ -4327,9 +4327,9 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
Field != FieldEnd; ++Field) { Field != FieldEnd; ++Field) {
if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) {
SawLastInitializer SawLastInitializer
= NumInitializers > 0 && = !Initializers.empty() &&
Initializers[NumInitializers - 1]->isAnyMemberInitializer() && Initializers.back()->isAnyMemberInitializer() &&
Initializers[NumInitializers - 1]->getAnyMember() == *Field; Initializers.back()->getAnyMember() == *Field;
continue; continue;
} }