Skip to content

Commit aa2c6fe

Browse files
committed
Add const to signature string
1 parent 471fa8c commit aa2c6fe

File tree

2 files changed

+75
-48
lines changed

2 files changed

+75
-48
lines changed

clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4581,74 +4581,74 @@ TEST(CompletionTest, ListExplicitObjectOverloads) {
45814581
{
45824582
auto Result = codeComplete(testPath(TU.Filename), Code.point("c1"),
45834583
Preamble.get(), Inputs, Opts);
4584-
EXPECT_THAT(Result.Completions,
4585-
UnorderedElementsAre(
4586-
AllOf(named("foo1"), signature("(int a)"),
4587-
snippetSuffix("(${1:int a})")),
4588-
AllOf(named("foo2"), signature("(int a) const"),
4589-
snippetSuffix("(${1:int a})")),
4590-
AllOf(named("foo3"), signature("(int a)" /* const */),
4591-
snippetSuffix("(${1:int a})")),
4592-
AllOf(named("foo4"), signature("(int a)"),
4593-
snippetSuffix("(${1:int a})"))));
4584+
EXPECT_THAT(
4585+
Result.Completions,
4586+
UnorderedElementsAre(AllOf(named("foo1"), signature("(int a)"),
4587+
snippetSuffix("(${1:int a})")),
4588+
AllOf(named("foo2"), signature("(int a) const"),
4589+
snippetSuffix("(${1:int a})")),
4590+
AllOf(named("foo3"), signature("(int a) const"),
4591+
snippetSuffix("(${1:int a})")),
4592+
AllOf(named("foo4"), signature("(int a)"),
4593+
snippetSuffix("(${1:int a})"))));
45944594
}
45954595
{
45964596
auto Result = codeComplete(testPath(TU.Filename), Code.point("c2"),
45974597
Preamble.get(), Inputs, Opts);
4598-
EXPECT_THAT(Result.Completions,
4599-
UnorderedElementsAre(
4600-
AllOf(named("foo2"), signature("(int a) const"),
4601-
snippetSuffix("(${1:int a})")),
4602-
AllOf(named("foo3"), signature("(int a)" /* const */),
4603-
snippetSuffix("(${1:int a})"))));
4598+
EXPECT_THAT(
4599+
Result.Completions,
4600+
UnorderedElementsAre(AllOf(named("foo2"), signature("(int a) const"),
4601+
snippetSuffix("(${1:int a})")),
4602+
AllOf(named("foo3"), signature("(int a) const"),
4603+
snippetSuffix("(${1:int a})"))));
46044604
}
46054605
{
46064606
auto Result = codeComplete(testPath(TU.Filename), Code.point("c3"),
46074607
Preamble.get(), Inputs, Opts);
4608-
EXPECT_THAT(Result.Completions,
4609-
UnorderedElementsAre(
4610-
AllOf(named("foo2"), signature("(int a) const"),
4611-
snippetSuffix("(${1:int a})")),
4612-
AllOf(named("foo3"), signature("(int a)" /* const */),
4613-
snippetSuffix("(${1:int a})"))));
4608+
EXPECT_THAT(
4609+
Result.Completions,
4610+
UnorderedElementsAre(AllOf(named("foo2"), signature("(int a) const"),
4611+
snippetSuffix("(${1:int a})")),
4612+
AllOf(named("foo3"), signature("(int a) const"),
4613+
snippetSuffix("(${1:int a})"))));
46144614
}
46154615
{
46164616
auto Result = codeComplete(testPath(TU.Filename), Code.point("c4"),
46174617
Preamble.get(), Inputs, Opts);
4618-
EXPECT_THAT(Result.Completions,
4619-
UnorderedElementsAre(
4620-
AllOf(named("foo1"), signature("(int a)"),
4621-
snippetSuffix("(${1:int a})")),
4622-
AllOf(named("foo2"), signature("(int a) const"),
4623-
snippetSuffix("(${1:int a})")),
4624-
AllOf(named("foo3"), signature("(int a)" /* const */),
4625-
snippetSuffix("(${1:int a})")),
4626-
AllOf(named("foo4"), signature("(int a)"),
4627-
snippetSuffix("(${1:int a})"))));
4618+
EXPECT_THAT(
4619+
Result.Completions,
4620+
UnorderedElementsAre(AllOf(named("foo1"), signature("(int a)"),
4621+
snippetSuffix("(${1:int a})")),
4622+
AllOf(named("foo2"), signature("(int a) const"),
4623+
snippetSuffix("(${1:int a})")),
4624+
AllOf(named("foo3"), signature("(int a) const"),
4625+
snippetSuffix("(${1:int a})")),
4626+
AllOf(named("foo4"), signature("(int a)"),
4627+
snippetSuffix("(${1:int a})"))));
46284628
}
46294629
{
46304630
auto Result = codeComplete(testPath(TU.Filename), Code.point("c5"),
46314631
Preamble.get(), Inputs, Opts);
4632-
EXPECT_THAT(Result.Completions,
4633-
UnorderedElementsAre(
4634-
AllOf(named("foo1"), signature("(int a)"),
4635-
snippetSuffix("(${1:int a})")),
4636-
AllOf(named("foo2"), signature("(int a) const"),
4637-
snippetSuffix("(${1:int a})")),
4638-
AllOf(named("foo3"), signature("(int a)" /* const */),
4639-
snippetSuffix("(${1:int a})")),
4640-
AllOf(named("foo4"), signature("(int a)"),
4641-
snippetSuffix("(${1:int a})"))));
4632+
EXPECT_THAT(
4633+
Result.Completions,
4634+
UnorderedElementsAre(AllOf(named("foo1"), signature("(int a)"),
4635+
snippetSuffix("(${1:int a})")),
4636+
AllOf(named("foo2"), signature("(int a) const"),
4637+
snippetSuffix("(${1:int a})")),
4638+
AllOf(named("foo3"), signature("(int a) const"),
4639+
snippetSuffix("(${1:int a})")),
4640+
AllOf(named("foo4"), signature("(int a)"),
4641+
snippetSuffix("(${1:int a})"))));
46424642
}
46434643
{
46444644
auto Result = codeComplete(testPath(TU.Filename), Code.point("c6"),
46454645
Preamble.get(), Inputs, Opts);
4646-
EXPECT_THAT(Result.Completions,
4647-
UnorderedElementsAre(
4648-
AllOf(named("foo2"), signature("(int a) const"),
4649-
snippetSuffix("(${1:int a})")),
4650-
AllOf(named("foo3"), signature("(int a)" /* const */),
4651-
snippetSuffix("(${1:int a})"))));
4646+
EXPECT_THAT(
4647+
Result.Completions,
4648+
UnorderedElementsAre(AllOf(named("foo2"), signature("(int a) const"),
4649+
snippetSuffix("(${1:int a})")),
4650+
AllOf(named("foo3"), signature("(int a) const"),
4651+
snippetSuffix("(${1:int a})"))));
46524652
}
46534653
}
46544654

clang/lib/Sema/SemaCodeComplete.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3434,9 +3434,36 @@ static void AddQualifierToCompletionString(CodeCompletionBuilder &Result,
34343434
Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS));
34353435
}
34363436

3437+
// Sets the function qualifiers completion string by inspecting the explicit
3438+
// object
3439+
static void AddCXXExplicitObjectFunctionTypeQualsToCompletionString(
3440+
CodeCompletionBuilder &Result, const CXXMethodDecl *Function) {
3441+
const auto Quals = Function->getFunctionObjectParameterType();
3442+
3443+
if (!Quals.hasQualifiers())
3444+
return;
3445+
3446+
std::string QualsStr;
3447+
if (Quals.getQualifiers().hasConst())
3448+
QualsStr += " const";
3449+
if (Quals.getQualifiers().hasVolatile())
3450+
QualsStr += " volatile";
3451+
if (Quals.getQualifiers().hasRestrict())
3452+
QualsStr += " restrict";
3453+
Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr));
3454+
}
3455+
34373456
static void
34383457
AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result,
34393458
const FunctionDecl *Function) {
3459+
if (auto *CxxMethodDecl = llvm::dyn_cast_if_present<CXXMethodDecl>(Function);
3460+
CxxMethodDecl && CxxMethodDecl->hasCXXExplicitFunctionObjectParameter()) {
3461+
// if explicit object method, infer quals from the object parameter
3462+
AddCXXExplicitObjectFunctionTypeQualsToCompletionString(Result,
3463+
CxxMethodDecl);
3464+
return;
3465+
}
3466+
34403467
const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
34413468
if (!Proto || !Proto->getMethodQuals())
34423469
return;

0 commit comments

Comments
 (0)