llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra @llvm/pr-subscribers-clangd Author: Mythreya (MythreyaK) <details> <summary>Changes</summary> Skips the first explicit object parameter when generating autocomplete suggestion string Fixes clangd/clangd#<!-- -->2339? --- Full diff: https://github.com/llvm/llvm-project/pull/146258.diff 3 Files Affected: - (modified) clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp (+30) - (modified) clang/lib/Sema/SemaCodeComplete.cpp (+7) - (added) clang/test/CodeCompletion/skip-explicit-object-parameter.cpp (+14) ``````````diff diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 311f0d98904ad..b7c64c7a06745 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -4363,6 +4363,36 @@ TEST(CompletionTest, PreambleFromDifferentTarget) { EXPECT_THAT(Result.Completions, Not(testing::IsEmpty())); EXPECT_THAT(Signatures.signatures, Not(testing::IsEmpty())); } + +TEST(CompletionTest, SkipExplicitObjectParameter) { + Annotations Code(R"cpp( + struct A { + void foo(this auto&& self, int arg); + }; + + int main() { + A a {}; + a.^ + } + )cpp"); + + auto TU = TestTU::withCode(Code.code()); + TU.ExtraArgs = {"-std=c++23"}; + + auto Preamble = TU.preamble(); + ASSERT_TRUE(Preamble); + + CodeCompleteOptions Opts{}; + + MockFS FS; + auto Inputs = TU.inputs(FS); + auto Result = codeComplete(testPath(TU.Filename), Code.point(), + Preamble.get(), Inputs, Opts); + + EXPECT_THAT(Result.Completions, + ElementsAre(AllOf(named("foo"), signature("(int arg)"), + snippetSuffix("(${1:int arg})")))); +} } // namespace } // namespace clangd } // namespace clang diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 78d4586e45978..b5d4a94da83df 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -3260,6 +3260,13 @@ static void AddFunctionParameterChunks(Preprocessor &PP, break; } + // C++23 introduces an explicit object parameter, a.k.a. "deducing this" + // Skip it for autocomplete and treat the next parameter as the first + // parameter + if (FirstParameter && Param->isExplicitObjectParameter()) { + continue; + } + if (FirstParameter) FirstParameter = false; else diff --git a/clang/test/CodeCompletion/skip-explicit-object-parameter.cpp b/clang/test/CodeCompletion/skip-explicit-object-parameter.cpp new file mode 100644 index 0000000000000..55c16bb126fee --- /dev/null +++ b/clang/test/CodeCompletion/skip-explicit-object-parameter.cpp @@ -0,0 +1,14 @@ +struct A { + void foo(this A self, int arg); +}; + +int main() { + A a {}; + a. +} +// RUN: %clang_cc1 -cc1 -fsyntax-only -code-completion-at=%s:%(line-2):5 -std=c++23 %s | FileCheck %s +// CHECK: COMPLETION: A : A:: +// CHECK-NEXT: COMPLETION: foo : [#void#]foo(<#int arg#>) +// CHECK-NEXT: COMPLETION: operator= : [#A &#]operator=(<#const A &#>) +// CHECK-NEXT: COMPLETION: operator= : [#A &#]operator=(<#A &&#>) +// CHECK-NEXT: COMPLETION: ~A : [#void#]~A() `````````` </details> https://github.com/llvm/llvm-project/pull/146258 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits