diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -82,6 +82,8 @@ return PD->getDefinition(); if (const auto *ID = dyn_cast(D)) return ID->getImplementation(); + if (const auto *CD = dyn_cast(D)) + return CD->getImplementation(); // Only a single declaration is allowed. if (isa(D) || isa(D) || isa(D)) // except cases above diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/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());