18 #include "clang/Index/IndexingAction.h"
19 #include "llvm/Support/Path.h"
20 #include "gmock/gmock.h"
21 #include "gtest/gtest.h"
27 using ::testing::UnorderedElementsAreArray;
29 auto CreateExpectedSymbolDetails = [](
const std::string &
name,
30 const std::string &container,
31 const std::string &USR) {
32 return SymbolDetails{
name, container, USR,
SymbolID(USR)};
35 TEST(SymbolInfoTests, All) {
36 std::pair<const char *, std::vector<SymbolDetails>>
37 TestInputExpectedOutput[] = {
39 R
"cpp( // Simple function reference - declaration
45 {CreateExpectedSymbolDetails("foo",
"",
"c:@F@foo#")}},
47 R
"cpp( // Simple function reference - definition
53 {CreateExpectedSymbolDetails("foo",
"",
"c:@F@foo#")}},
55 R
"cpp( // Function in namespace reference
63 {CreateExpectedSymbolDetails("foo",
"bar::",
"c:@N@bar@F@foo#")}},
65 R
"cpp( // Function in different namespace reference
75 {CreateExpectedSymbolDetails("foo",
"bar::",
"c:@N@bar@F@foo#")}},
77 R
"cpp( // Function in global namespace reference
87 {CreateExpectedSymbolDetails("foo",
"",
"c:@F@foo#")}},
89 R
"cpp( // Function in anonymous namespace reference
99 {CreateExpectedSymbolDetails("foo",
"(anonymous)",
100 "c:TestTU.cpp@aN@F@foo#")}},
102 R
"cpp( // Function reference - ADL
105 void foo(const BarType&);
114 {CreateExpectedSymbolDetails(
115 "foo",
"bar::",
"c:@N@bar@F@foo#&1$@N@bar@S@BarType#")}},
117 R
"cpp( // Global value reference
124 {CreateExpectedSymbolDetails("value",
"",
"c:@value")}},
126 R
"cpp( // Local value reference
127 void foo() { int aaa; int bbb = aa^a; }
129 {CreateExpectedSymbolDetails("aaa",
"foo",
130 "c:TestTU.cpp@49@F@foo#@aaa")}},
132 R
"cpp( // Function param
137 {CreateExpectedSymbolDetails("aaa",
"bar",
138 "c:TestTU.cpp@38@F@bar#I#@aaa")}},
140 R
"cpp( // Lambda capture
148 {CreateExpectedSymbolDetails("ii",
"foo",
149 "c:TestTU.cpp@54@F@foo#@ii")}},
151 R
"cpp( // Macro reference
152 #define MACRO 5\nint i = MAC^RO;
154 {CreateExpectedSymbolDetails("MACRO",
"",
155 "c:TestTU.cpp@38@macro@MACRO")}},
157 R
"cpp( // Macro reference
158 #define MACRO 5\nint i = MACRO^;
160 {CreateExpectedSymbolDetails("MACRO",
"",
161 "c:TestTU.cpp@38@macro@MACRO")}},
163 R
"cpp( // Multiple symbols returned - using overloaded function name
171 {CreateExpectedSymbolDetails("foo",
"",
"c:@F@foo#"),
172 CreateExpectedSymbolDetails(
"foo",
"",
"c:@F@foo#b#"),
173 CreateExpectedSymbolDetails(
"foo",
"",
"c:@F@foo#I#"),
174 CreateExpectedSymbolDetails(
"foo",
"bar::",
"c:@N@bar@UD@foo")}},
176 R
"cpp( // Multiple symbols returned - implicit conversion
181 void func_baz1(bar) {}
187 {CreateExpectedSymbolDetails(
188 "ff",
"func_baz2",
"c:TestTU.cpp@218@F@func_baz2#@ff")}},
190 R
"cpp( // Type reference - declaration
194 {CreateExpectedSymbolDetails("foo",
"",
"c:@S@foo")}},
196 R
"cpp( // Type reference - definition
200 {CreateExpectedSymbolDetails("foo",
"",
"c:@S@foo")}},
202 R
"cpp( // Type Reference - template argument
204 template<class T> struct bar {};
209 {CreateExpectedSymbolDetails("foo",
"",
"c:@S@foo")}},
211 R
"cpp( // Template parameter reference - type param
212 template<class TT> struct bar {
216 {CreateExpectedSymbolDetails("TT",
"bar::",
"c:TestTU.cpp@65")}},
218 R
"cpp( // Template parameter reference - type param
219 template<int NN> struct bar {
223 {CreateExpectedSymbolDetails("NN",
"bar::",
"c:TestTU.cpp@65")}},
225 R
"cpp( // Class member reference - objec
234 {CreateExpectedSymbolDetails("aa",
"foo::",
"c:@S@foo@FI@aa")}},
236 R
"cpp( // Class member reference - pointer
244 {CreateExpectedSymbolDetails("aa",
"foo::",
"c:@S@foo@FI@aa")}},
246 R
"cpp( // Class method reference - objec
255 {CreateExpectedSymbolDetails("aa",
"foo::",
"c:@S@foo@F@aa#")}},
257 R
"cpp( // Class method reference - pointer
265 {CreateExpectedSymbolDetails("aa",
"foo::",
"c:@S@foo@F@aa#")}},
273 {CreateExpectedSymbolDetails("foo",
"",
"c:TestTU.cpp@T@foo")}},
281 {CreateExpectedSymbolDetails("foo",
"",
"c:@foo")}},
283 R
"cpp( // Namespace reference
285 using namespace fo^o;
287 {CreateExpectedSymbolDetails("foo",
"",
"c:@N@foo")}},
289 R
"cpp( // Enum value reference
290 enum foo { bar, baz };
295 {CreateExpectedSymbolDetails("bar",
"foo",
"c:@E@foo@bar")}},
297 R
"cpp( // Enum class value reference
298 enum class foo { bar, baz };
303 {CreateExpectedSymbolDetails("bar",
"foo::",
"c:@E@foo@bar")}},
305 R
"cpp( // Parameters in declarations
308 {CreateExpectedSymbolDetails("bar",
"foo",
309 "c:TestTU.cpp@50@F@foo#I#@bar")}},
311 R
"cpp( // Type inference with auto keyword
313 foo getfoo() { return foo{}; }
330 for (
const auto &T : TestInputExpectedOutput) {
331 Annotations TestInput(T.first);
335 UnorderedElementsAreArray(T.second))