https://github.com/MythreyaK updated 
https://github.com/llvm/llvm-project/pull/146258

>From a839ba01fc05750ca880ac430a70f7df766f7694 Mon Sep 17 00:00:00 2001
From: Mythreya Kuricheti <g...@mythreya.dev>
Date: Sat, 28 Jun 2025 19:06:06 -0700
Subject: [PATCH 1/2] [clang] skip explicit obj param in code complete

Skips the first explicit object parameter
when generating autocomplete suggestion string
---
 .../clangd/unittests/CodeCompleteTests.cpp    | 29 +++++++++++++++++++
 clang/lib/Sema/SemaCodeComplete.cpp           |  7 +++++
 2 files changed, 36 insertions(+)

diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp 
b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index 311f0d98904ad..34cab8a957a19 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -4363,6 +4363,35 @@ TEST(CompletionTest, PreambleFromDifferentTarget) {
   EXPECT_THAT(Result.Completions, Not(testing::IsEmpty()));
   EXPECT_THAT(Signatures.signatures, Not(testing::IsEmpty()));
 }
+
+TEST(CompletionTest, DeducingThisIgnoreSelf) {
+  Annotations Test(R"cpp(
+    struct A {
+      void f(this auto&& self, int arg); 
+    };
+
+    int main() {
+      A a {};
+      a.^
+    }
+  )cpp");
+
+  auto TU = TestTU::withCode(Test.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), Test.point(),
+                             Preamble.get(), Inputs, Opts);
+
+  EXPECT_THAT(Result.Completions,
+              ElementsAre(AllOf(named("f"), 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

>From 8b015eb8011033b021c92654ef33498bef244e6e Mon Sep 17 00:00:00 2001
From: Mythreya Kuricheti <g...@mythreya.dev>
Date: Sun, 29 Jun 2025 16:10:01 -0700
Subject: [PATCH 2/2] address review comments

---
 .../clangd/unittests/CodeCompleteTests.cpp         |  3 ++-
 .../CodeCompletion/explicit-object-parameter.cpp   | 14 ++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CodeCompletion/explicit-object-parameter.cpp

diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp 
b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index 34cab8a957a19..d163b4bff4f0c 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -4390,7 +4390,8 @@ TEST(CompletionTest, DeducingThisIgnoreSelf) {
                              Preamble.get(), Inputs, Opts);
 
   EXPECT_THAT(Result.Completions,
-              ElementsAre(AllOf(named("f"), snippetSuffix("(${1:int arg})"))));
+              ElementsAre(AllOf(named("f"), signature("(int arg)"),
+                                snippetSuffix("(${1:int arg})"))));
 }
 } // namespace
 } // namespace clangd
diff --git a/clang/test/CodeCompletion/explicit-object-parameter.cpp 
b/clang/test/CodeCompletion/explicit-object-parameter.cpp
new file mode 100644
index 0000000000000..3ed315321c04a
--- /dev/null
+++ b/clang/test/CodeCompletion/explicit-object-parameter.cpp
@@ -0,0 +1,14 @@
+struct A {
+  void f(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: f : [#void#]f(<#int arg#>)
+// CHECK-NEXT: COMPLETION: operator= : [#A &#]operator=(<#const A &#>)
+// CHECK-NEXT: COMPLETION: operator= : [#A &#]operator=(<#A &&#>)
+// CHECK-NEXT: COMPLETION: ~A : [#void#]~A()

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to