Skip to content

Commit b1296fa

Browse files
committedMay 28, 2019
[CodeComplete] Set preferred type for qualified-id
Reviewers: kadircet Reviewed By: kadircet Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D62514 llvm-svn: 361838
1 parent 9bf766c commit b1296fa

File tree

4 files changed

+43
-8
lines changed

4 files changed

+43
-8
lines changed
 

‎clang/include/clang/Sema/Sema.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -10646,8 +10646,8 @@ class Sema {
1064610646
void CodeCompleteInitializer(Scope *S, Decl *D);
1064710647
void CodeCompleteAfterIf(Scope *S);
1064810648

10649-
void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
10650-
bool EnteringContext, QualType BaseType);
10649+
void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext,
10650+
QualType BaseType, QualType PreferredType);
1065110651
void CodeCompleteUsing(Scope *S);
1065210652
void CodeCompleteUsingDirective(Scope *S);
1065310653
void CodeCompleteNamespaceDecl(Scope *S);

‎clang/lib/Parse/ParseExprCXX.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,16 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
232232
HasScopeSpecifier = true;
233233
}
234234

235+
// Preferred type might change when parsing qualifiers, we need the original.
236+
auto SavedType = PreferredType;
235237
while (true) {
236238
if (HasScopeSpecifier) {
237239
if (Tok.is(tok::code_completion)) {
238240
// Code completion for a nested-name-specifier, where the code
239241
// completion token follows the '::'.
240242
Actions.CodeCompleteQualifiedId(getCurScope(), SS, EnteringContext,
241-
ObjectType.get());
243+
ObjectType.get(),
244+
SavedType.get(SS.getBeginLoc()));
242245
// Include code completion token into the range of the scope otherwise
243246
// when we try to annotate the scope tokens the dangling code completion
244247
// token will cause assertion in

‎clang/lib/Sema/SemaCodeComplete.cpp

+11-5
Original file line numberDiff line numberDiff line change
@@ -5215,7 +5215,8 @@ void Sema::CodeCompleteAfterIf(Scope *S) {
52155215
}
52165216

52175217
void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
5218-
bool EnteringContext, QualType BaseType) {
5218+
bool EnteringContext, QualType BaseType,
5219+
QualType PreferredType) {
52195220
if (SS.isEmpty() || !CodeCompleter)
52205221
return;
52215222

@@ -5224,13 +5225,15 @@ void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
52245225
// it can be useful for global code completion which have information about
52255226
// contexts/symbols that are not in the AST.
52265227
if (SS.isInvalid()) {
5227-
CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol);
5228+
CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType);
52285229
CC.setCXXScopeSpecifier(SS);
52295230
// As SS is invalid, we try to collect accessible contexts from the current
52305231
// scope with a dummy lookup so that the completion consumer can try to
52315232
// guess what the specified scope is.
52325233
ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(),
52335234
CodeCompleter->getCodeCompletionTUInfo(), CC);
5235+
if (!PreferredType.isNull())
5236+
DummyResults.setPreferredType(PreferredType);
52345237
if (S->getEntity()) {
52355238
CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
52365239
BaseType);
@@ -5253,9 +5256,12 @@ void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
52535256
if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
52545257
return;
52555258

5256-
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5257-
CodeCompleter->getCodeCompletionTUInfo(),
5258-
CodeCompletionContext::CCC_Symbol);
5259+
ResultBuilder Results(
5260+
*this, CodeCompleter->getAllocator(),
5261+
CodeCompleter->getCodeCompletionTUInfo(),
5262+
CodeCompletionContext(CodeCompletionContext::CCC_Symbol, PreferredType));
5263+
if (!PreferredType.isNull())
5264+
Results.setPreferredType(PreferredType);
52595265
Results.EnterNewScope();
52605266

52615267
// The "template" keyword can follow "::" in the grammar, but only

‎clang/unittests/Sema/CodeCompleteTest.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -454,5 +454,31 @@ TEST(PreferredTypeTest, FunctionArguments) {
454454
}
455455
)cpp";
456456
EXPECT_THAT(collectPreferredTypes(Code), Each("volatile double *"));
457+
458+
Code = R"cpp(
459+
namespace ns {
460+
struct vector {
461+
};
462+
}
463+
void accepts_vector(ns::vector);
464+
465+
void test() {
466+
accepts_vector(^::^ns::^vector());
467+
}
468+
)cpp";
469+
EXPECT_THAT(collectPreferredTypes(Code), Each("ns::vector"));
470+
471+
Code = R"cpp(
472+
template <class T>
473+
struct vector { using self = vector; };
474+
475+
void accepts_vector(vector<int>);
476+
int foo(int);
477+
478+
void test() {
479+
accepts_vector(^::^vector<decltype(foo(1))>::^self);
480+
}
481+
)cpp";
482+
EXPECT_THAT(collectPreferredTypes(Code), Each("vector<int>"));
457483
}
458484
} // namespace

0 commit comments

Comments
 (0)