jkorous-apple updated this revision to Diff 122470.
jkorous-apple added a comment.

I am able to enable ctor completion selectively in translate unit scope and 
namespace scope so ctor completion does not appear in dot access context. I 
haven't figured out how to explicitly specify that completion context needs to 
be qualified id though.


https://reviews.llvm.org/D39730

Files:
  lib/Sema/SemaCodeComplete.cpp
  test/CodeCompletion/ctor.cpp


Index: test/CodeCompletion/ctor.cpp
===================================================================
--- /dev/null
+++ test/CodeCompletion/ctor.cpp
@@ -0,0 +1,50 @@
+struct foo {
+  foo();
+  ~foo();
+
+  foo(const foo&) = delete;
+  foo(foo&&) = delete;
+  foo& operator=(const foo&) = delete;
+  foo& operator=(foo&&) = delete;
+
+  static bool faz;
+  int far;
+};
+
+foo::foo() { }
+// RUN: c-index-test -code-completion-at=%s:14:7 %s | FileCheck 
-check-prefix=CHECK-TRANSLATION-UNIT %s
+// CHECK-TRANSLATION-UNIT:CXXConstructor:{TypedText foo}{LeftParen 
(}{RightParen )} (35)
+// CHECK-TRANSLATION-UNIT:CXXConstructor:{TypedText foo}{LeftParen 
(}{Placeholder const foo &}{RightParen )} (35) (unavailable)
+// CHECK-TRANSLATION-UNIT:CXXConstructor:{TypedText foo}{LeftParen 
(}{Placeholder foo &&}{RightParen )} (35) (unavailable)
+
+namespace ns_foo {
+struct foo {
+  foo();
+  ~foo();
+
+  foo(const foo&) = delete;
+  foo(foo&&) = delete;
+  foo& operator=(const foo&) = delete;
+  foo& operator=(foo&&) = delete;
+
+  static bool faz;
+  int far;
+};
+
+foo::foo() { }
+// RUN: c-index-test -code-completion-at=%s:34:7 %s | FileCheck 
-check-prefix=CHECK-NAMESPACE %s
+// CHECK-NAMESPACE: CXXConstructor:{TypedText foo}{LeftParen (}{RightParen )} 
(35)
+// CHECK-NAMESPACE: CXXConstructor:{TypedText foo}{LeftParen (}{Placeholder 
const ns_foo::foo &}{RightParen )} (35) (unavailable)
+// CHECK-NAMESPACE: CXXConstructor:{TypedText foo}{LeftParen (}{Placeholder 
ns_foo::foo &&}{RightParen )} (35) (unavailable)
+
+}
+
+int main() {
+  foo baz;
+  baz.far = 5;
+  foo::faz = 42;
+}
+// RUN: c-index-test -code-completion-at=%s:44:7 %s | not grep "CXXConstructor"
+// RUN: c-index-test -code-completion-at=%s:44:8 %s | not grep "CXXConstructor"
+// RUN: c-index-test -code-completion-at=%s:45:8 %s | not grep "CXXConstructor"
+// RUN: c-index-test -code-completion-at=%s:45:9 %s | not grep "CXXConstructor"
Index: lib/Sema/SemaCodeComplete.cpp
===================================================================
--- lib/Sema/SemaCodeComplete.cpp
+++ lib/Sema/SemaCodeComplete.cpp
@@ -975,9 +975,11 @@
   bool AsNestedNameSpecifier = false;
   if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
     return;
-  
-  // C++ constructors are never found by name lookup.
-  if (isa<CXXConstructorDecl>(R.Declaration))
+
+  if (isa<CXXConstructorDecl>(R.Declaration)
+      && dyn_cast<NamespaceDecl>(CurContext) == nullptr
+      && dyn_cast<TranslationUnitDecl>(CurContext) == nullptr
+    )
     return;
 
   if (Hiding && CheckHiddenResult(R, CurContext, Hiding))


Index: test/CodeCompletion/ctor.cpp
===================================================================
--- /dev/null
+++ test/CodeCompletion/ctor.cpp
@@ -0,0 +1,50 @@
+struct foo {
+  foo();
+  ~foo();
+
+  foo(const foo&) = delete;
+  foo(foo&&) = delete;
+  foo& operator=(const foo&) = delete;
+  foo& operator=(foo&&) = delete;
+
+  static bool faz;
+  int far;
+};
+
+foo::foo() { }
+// RUN: c-index-test -code-completion-at=%s:14:7 %s | FileCheck -check-prefix=CHECK-TRANSLATION-UNIT %s
+// CHECK-TRANSLATION-UNIT:CXXConstructor:{TypedText foo}{LeftParen (}{RightParen )} (35)
+// CHECK-TRANSLATION-UNIT:CXXConstructor:{TypedText foo}{LeftParen (}{Placeholder const foo &}{RightParen )} (35) (unavailable)
+// CHECK-TRANSLATION-UNIT:CXXConstructor:{TypedText foo}{LeftParen (}{Placeholder foo &&}{RightParen )} (35) (unavailable)
+
+namespace ns_foo {
+struct foo {
+  foo();
+  ~foo();
+
+  foo(const foo&) = delete;
+  foo(foo&&) = delete;
+  foo& operator=(const foo&) = delete;
+  foo& operator=(foo&&) = delete;
+
+  static bool faz;
+  int far;
+};
+
+foo::foo() { }
+// RUN: c-index-test -code-completion-at=%s:34:7 %s | FileCheck -check-prefix=CHECK-NAMESPACE %s
+// CHECK-NAMESPACE: CXXConstructor:{TypedText foo}{LeftParen (}{RightParen )} (35)
+// CHECK-NAMESPACE: CXXConstructor:{TypedText foo}{LeftParen (}{Placeholder const ns_foo::foo &}{RightParen )} (35) (unavailable)
+// CHECK-NAMESPACE: CXXConstructor:{TypedText foo}{LeftParen (}{Placeholder ns_foo::foo &&}{RightParen )} (35) (unavailable)
+
+}
+
+int main() {
+  foo baz;
+  baz.far = 5;
+  foo::faz = 42;
+}
+// RUN: c-index-test -code-completion-at=%s:44:7 %s | not grep "CXXConstructor"
+// RUN: c-index-test -code-completion-at=%s:44:8 %s | not grep "CXXConstructor"
+// RUN: c-index-test -code-completion-at=%s:45:8 %s | not grep "CXXConstructor"
+// RUN: c-index-test -code-completion-at=%s:45:9 %s | not grep "CXXConstructor"
Index: lib/Sema/SemaCodeComplete.cpp
===================================================================
--- lib/Sema/SemaCodeComplete.cpp
+++ lib/Sema/SemaCodeComplete.cpp
@@ -975,9 +975,11 @@
   bool AsNestedNameSpecifier = false;
   if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
     return;
-  
-  // C++ constructors are never found by name lookup.
-  if (isa<CXXConstructorDecl>(R.Declaration))
+
+  if (isa<CXXConstructorDecl>(R.Declaration)
+      && dyn_cast<NamespaceDecl>(CurContext) == nullptr
+      && dyn_cast<TranslationUnitDecl>(CurContext) == nullptr
+    )
     return;
 
   if (Hiding && CheckHiddenResult(R, CurContext, Hiding))
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to