ArrayRef'ize Sema::CodeCompleteConstructorInitializer
Patch by Robert Wilhelm. llvm-svn: 184675
This commit is contained in:
parent
0323925d51
commit
27cb3dd085
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue