dgoldman updated this revision to Diff 277054.
dgoldman marked 2 inline comments as done.
dgoldman added a comment.

Add support for categories + fix tests


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D83501/new/

https://reviews.llvm.org/D83501

Files:
  clang-tools-extra/clangd/XRefs.cpp
  clang-tools-extra/clangd/unittests/XRefsTests.cpp


Index: clang-tools-extra/clangd/unittests/XRefsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -676,7 +676,7 @@
         };
       )cpp",
 
-      R"objc(//objc
+      R"objc(
         @protocol $decl[[Dog]];
         @protocol $def[[Dog]]
         - (void)bark;
@@ -686,14 +686,25 @@
         }
       )objc",
 
-      R"objc(//objc
+      R"objc(
+        @interface Cat
+        @end
+        @interface $decl[[Ca^t]] (Extension)
+        - (void)meow;
+        @end
+        @implementation $def[[Cat]] (Extension)
+        - (void)meow {}
+        @end
+      )objc",
+
+      R"objc(
         @class $decl[[Foo]];
         Fo^o * getFoo() {
           return 0;
         }
       )objc",
 
-      R"objc(//objc
+      R"objc(
         @class Foo;
         @interface $decl[[Foo]]
         @end
@@ -702,7 +713,7 @@
         }
       )objc",
 
-      R"objc(//objc
+      R"objc(
         @class Foo;
         @interface $decl[[Foo]]
         @end
@@ -726,14 +737,10 @@
     TestTU TU;
     TU.Code = std::string(T.code());
 
-    std::string ObjcPrefix = "//objc";
-    if (strncmp(Test, ObjcPrefix.c_str(), ObjcPrefix.size()) == 0) {
-      TU.Filename = "TestTU.m";
-    }
-
     // FIXME: Auto-completion in a template requires disabling delayed template
     // parsing.
     TU.ExtraArgs.push_back("-fno-delayed-template-parsing");
+    TU.ExtraArgs.push_back("-xobjective-c++");
 
     auto AST = TU.build();
     auto Results = locateSymbolAt(AST, T.point());
Index: clang-tools-extra/clangd/XRefs.cpp
===================================================================
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -82,6 +82,8 @@
     return PD->getDefinition();
   if (const auto *ID = dyn_cast<ObjCInterfaceDecl>(D))
     return ID->getImplementation();
+  if (const auto *CD = dyn_cast<ObjCCategoryDecl>(D))
+    return CD->getImplementation();
   // Only a single declaration is allowed.
   if (isa<ValueDecl>(D) || isa<TemplateTypeParmDecl>(D) ||
       isa<TemplateTemplateParmDecl>(D)) // except cases above


Index: clang-tools-extra/clangd/unittests/XRefsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -676,7 +676,7 @@
         };
       )cpp",
 
-      R"objc(//objc
+      R"objc(
         @protocol $decl[[Dog]];
         @protocol $def[[Dog]]
         - (void)bark;
@@ -686,14 +686,25 @@
         }
       )objc",
 
-      R"objc(//objc
+      R"objc(
+        @interface Cat
+        @end
+        @interface $decl[[Ca^t]] (Extension)
+        - (void)meow;
+        @end
+        @implementation $def[[Cat]] (Extension)
+        - (void)meow {}
+        @end
+      )objc",
+
+      R"objc(
         @class $decl[[Foo]];
         Fo^o * getFoo() {
           return 0;
         }
       )objc",
 
-      R"objc(//objc
+      R"objc(
         @class Foo;
         @interface $decl[[Foo]]
         @end
@@ -702,7 +713,7 @@
         }
       )objc",
 
-      R"objc(//objc
+      R"objc(
         @class Foo;
         @interface $decl[[Foo]]
         @end
@@ -726,14 +737,10 @@
     TestTU TU;
     TU.Code = std::string(T.code());
 
-    std::string ObjcPrefix = "//objc";
-    if (strncmp(Test, ObjcPrefix.c_str(), ObjcPrefix.size()) == 0) {
-      TU.Filename = "TestTU.m";
-    }
-
     // FIXME: Auto-completion in a template requires disabling delayed template
     // parsing.
     TU.ExtraArgs.push_back("-fno-delayed-template-parsing");
+    TU.ExtraArgs.push_back("-xobjective-c++");
 
     auto AST = TU.build();
     auto Results = locateSymbolAt(AST, T.point());
Index: clang-tools-extra/clangd/XRefs.cpp
===================================================================
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -82,6 +82,8 @@
     return PD->getDefinition();
   if (const auto *ID = dyn_cast<ObjCInterfaceDecl>(D))
     return ID->getImplementation();
+  if (const auto *CD = dyn_cast<ObjCCategoryDecl>(D))
+    return CD->getImplementation();
   // Only a single declaration is allowed.
   if (isa<ValueDecl>(D) || isa<TemplateTypeParmDecl>(D) ||
       isa<TemplateTemplateParmDecl>(D)) // except cases above
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to