Changeset View
Changeset View
Standalone View
Standalone View
unittests/clangd/SymbolCollectorTests.cpp
Show First 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | |||||
MATCHER_P(DeclRange, Offsets, "") { | MATCHER_P(DeclRange, Offsets, "") { | ||||
return arg.CanonicalDeclaration.StartOffset == Offsets.first && | return arg.CanonicalDeclaration.StartOffset == Offsets.first && | ||||
arg.CanonicalDeclaration.EndOffset == Offsets.second; | arg.CanonicalDeclaration.EndOffset == Offsets.second; | ||||
} | } | ||||
MATCHER_P(DefRange, Offsets, "") { | MATCHER_P(DefRange, Offsets, "") { | ||||
return arg.Definition.StartOffset == Offsets.first && | return arg.Definition.StartOffset == Offsets.first && | ||||
arg.Definition.EndOffset == Offsets.second; | arg.Definition.EndOffset == Offsets.second; | ||||
} | } | ||||
MATCHER_P(Refs, R, "") { return int(arg.References) == R; } | |||||
namespace clang { | namespace clang { | ||||
namespace clangd { | namespace clangd { | ||||
namespace { | namespace { | ||||
class SymbolIndexActionFactory : public tooling::FrontendActionFactory { | class SymbolIndexActionFactory : public tooling::FrontendActionFactory { | ||||
public: | public: | ||||
SymbolIndexActionFactory(SymbolCollector::Options COpts, | SymbolIndexActionFactory(SymbolCollector::Options COpts, | ||||
▲ Show 20 Lines • Show All 126 Lines • ▼ Show 20 Lines | EXPECT_THAT(Symbols, | ||||
QName("kStr"), QName("foo"), QName("foo::bar"), | QName("kStr"), QName("foo"), QName("foo::bar"), | ||||
QName("foo::int32"), QName("foo::int32_t"), QName("foo::v1"), | QName("foo::int32"), QName("foo::int32_t"), QName("foo::v1"), | ||||
QName("foo::bar::v2"), QName("foo::baz")})); | QName("foo::bar::v2"), QName("foo::baz")})); | ||||
} | } | ||||
TEST_F(SymbolCollectorTest, Template) { | TEST_F(SymbolCollectorTest, Template) { | ||||
Annotations Header(R"( | Annotations Header(R"( | ||||
// Template is indexed, specialization and instantiation is not. | // Template is indexed, specialization and instantiation is not. | ||||
template <class T> struct [[Tmpl]] {T x = 0}; | template <class T> struct [[Tmpl]] {T x = 0;}; | ||||
template <> struct Tmpl<int> {}; | template <> struct Tmpl<int> {}; | ||||
extern template struct Tmpl<float>; | extern template struct Tmpl<float>; | ||||
template struct Tmpl<double>; | template struct Tmpl<double>; | ||||
)"); | )"); | ||||
runSymbolCollector(Header.code(), /*Main=*/""); | runSymbolCollector(Header.code(), /*Main=*/""); | ||||
EXPECT_THAT(Symbols, UnorderedElementsAreArray({AllOf( | EXPECT_THAT(Symbols, UnorderedElementsAreArray({AllOf( | ||||
QName("Tmpl"), DeclRange(Header.offsetRange()))})); | QName("Tmpl"), DeclRange(Header.offsetRange()))})); | ||||
} | } | ||||
Show All 24 Lines | EXPECT_THAT( | ||||
DefRange(Main.offsetRange("xdef"))), | DefRange(Main.offsetRange("xdef"))), | ||||
AllOf(QName("Cls"), DeclRange(Header.offsetRange("clsdecl")), | AllOf(QName("Cls"), DeclRange(Header.offsetRange("clsdecl")), | ||||
DefRange(Main.offsetRange("clsdef"))), | DefRange(Main.offsetRange("clsdef"))), | ||||
AllOf(QName("print"), DeclRange(Header.offsetRange("printdecl")), | AllOf(QName("print"), DeclRange(Header.offsetRange("printdecl")), | ||||
DefRange(Main.offsetRange("printdef"))), | DefRange(Main.offsetRange("printdef"))), | ||||
AllOf(QName("Z"), DeclRange(Header.offsetRange("zdecl"))))); | AllOf(QName("Z"), DeclRange(Header.offsetRange("zdecl"))))); | ||||
} | } | ||||
TEST_F(SymbolCollectorTest, References) { | |||||
const std::string Header = R"( | |||||
class W; | |||||
class X {}; | |||||
class Y; | |||||
class Z {}; // not used anywhere | |||||
Y* y = nullptr; // used in header doesn't count | |||||
)"; | |||||
const std::string Main = R"( | |||||
W* w = nullptr; | |||||
W* w2 = nullptr; // only one usage counts | |||||
X x(); | |||||
class V; | |||||
V* v = nullptr; // Used, but not eligible for indexing. | |||||
class Y{}; // definition doesn't count as a reference | |||||
)"; | |||||
CollectorOpts.CountReferences = true; | |||||
runSymbolCollector(Header, Main); | |||||
EXPECT_THAT(Symbols, | |||||
UnorderedElementsAre(AllOf(QName("W"), Refs(1)), | |||||
AllOf(QName("X"), Refs(1)), | |||||
AllOf(QName("Y"), Refs(0)), | |||||
AllOf(QName("Z"), Refs(0)), QName("y"))); | |||||
} | |||||
TEST_F(SymbolCollectorTest, SymbolRelativeNoFallback) { | TEST_F(SymbolCollectorTest, SymbolRelativeNoFallback) { | ||||
runSymbolCollector("class Foo {};", /*Main=*/""); | runSymbolCollector("class Foo {};", /*Main=*/""); | ||||
EXPECT_THAT(Symbols, UnorderedElementsAre( | EXPECT_THAT(Symbols, UnorderedElementsAre( | ||||
AllOf(QName("Foo"), DeclURI(TestHeaderURI)))); | AllOf(QName("Foo"), DeclURI(TestHeaderURI)))); | ||||
} | } | ||||
TEST_F(SymbolCollectorTest, SymbolRelativeWithFallback) { | TEST_F(SymbolCollectorTest, SymbolRelativeWithFallback) { | ||||
TestHeaderName = "x.h"; | TestHeaderName = "x.h"; | ||||
▲ Show 20 Lines • Show All 392 Lines • Show Last 20 Lines |