Macro.Name = std::string(M->Name);
Macro.PreferredDeclaration = *Loc;
Macro.Definition = Loc;
+ Macro.ID = getSymbolID(M->Name, M->Info, AST.getSourceManager());
return Macro;
}
}
Result.emplace_back();
Result.back().Name = printName(AST.getASTContext(), *D);
Result.back().PreferredDeclaration = *Loc;
+ Result.back().ID = getSymbolID(D);
if (const NamedDecl *Def = getDefinition(D))
Result.back().Definition = makeLocation(
AST.getASTContext(), nameLocation(*Def, SM), MainFilePath);
Results.emplace_back();
Results.back().Name = printName(ASTContext, *D);
Results.back().PreferredDeclaration = *Loc;
+ Results.back().ID = getSymbolID(D);
if (const NamedDecl *Def = getDefinition(D))
Results.back().Definition =
makeLocation(ASTContext, nameLocation(*Def, SM), *MainFilePath);
LocatedSymbol Located;
Located.PreferredDeclaration = *MaybeDeclLoc;
Located.Name = (Sym.Name + Sym.TemplateSpecializationArgs).str();
+ Located.ID = Sym.ID;
if (Sym.Definition) {
auto MaybeDefLoc = indexToLSPLocation(Sym.Definition, MainFilePath);
if (!MaybeDefLoc) {
#include "Protocol.h"
#include "SourceCode.h"
#include "index/Index.h"
+#include "index/SymbolID.h"
#include "index/SymbolLocation.h"
#include "support/Path.h"
#include "clang/AST/ASTTypeTraits.h"
Location PreferredDeclaration;
// Where the symbol is defined, if known. May equal PreferredDeclaration.
llvm::Optional<Location> Definition;
+ // SymbolID of the located symbol if available.
+ SymbolID ID;
};
llvm::raw_ostream &operator<<(llvm::raw_ostream &, const LocatedSymbol &);
/// Get definition of symbol at a specified \p Pos.
MATCHER_P(RangeIs, R, "") { return arg.Loc.range == R; }
MATCHER_P(AttrsAre, A, "") { return arg.Attributes == A; }
+MATCHER_P(HasID, ID, "") { return arg.ID == ID; }
TEST(LocateSymbol, WithIndex) {
Annotations SymbolHeader(R"cpp(
} else {
ASSERT_THAT(Results, ::testing::SizeIs(1)) << Test;
EXPECT_EQ(Results[0].PreferredDeclaration.range, *WantDecl) << Test;
+ EXPECT_TRUE(Results[0].ID) << Test;
llvm::Optional<Range> GotDef;
if (Results[0].Definition)
GotDef = Results[0].Definition->range;
}
}
}
+TEST(LocateSymbol, ValidSymbolID) {
+ auto T = Annotations(R"cpp(
+ #define MACRO(x, y) ((x) + (y))
+ int add(int x, int y) { return $MACRO^MACRO(x, y); }
+ int sum = $add^add(1, 2);
+ )cpp");
+
+ TestTU TU = TestTU::withCode(T.code());
+ auto AST = TU.build();
+ auto Index = TU.index();
+ EXPECT_THAT(locateSymbolAt(AST, T.point("add"), Index.get()),
+ ElementsAre(AllOf(Sym("add"),
+ HasID(getSymbolID(&findDecl(AST, "add"))))));
+ EXPECT_THAT(
+ locateSymbolAt(AST, T.point("MACRO"), Index.get()),
+ ElementsAre(AllOf(Sym("MACRO"),
+ HasID(findSymbol(TU.headerSymbols(), "MACRO").ID))));
+}
TEST(LocateSymbol, AllMulti) {
// Ranges in tests:
auto TU = TestTU::withCode(T.code());
auto AST = TU.build();
auto Index = TU.index();
- EXPECT_THAT(locateSymbolAt(AST, T.point(), Index.get()),
- ElementsAre(Sym("MyClass", T.range(), T.range())));
+ EXPECT_THAT(
+ locateSymbolAt(AST, T.point(), Index.get()),
+ ElementsAre(AllOf(Sym("MyClass", T.range(), T.range()),
+ HasID(getSymbolID(&findDecl(AST, "MyClass"))))));
}
TEST(LocateSymbol, Textual) {