[clang-tools-extra] r352367 - [clangd] Index main-file macros (bug 39761)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 28 06:11:50 PST 2019
Author: hokein
Date: Mon Jan 28 06:11:49 2019
New Revision: 352367
URL: http://llvm.org/viewvc/llvm-project?rev=352367&view=rev
Log:
[clangd] Index main-file macros (bug 39761)
Patch by Nathan Ridge!
Differential Revision: https://reviews.llvm.org/D55739
Modified:
clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp
clang-tools-extra/trunk/unittests/clangd/FindSymbolsTests.cpp
clang-tools-extra/trunk/unittests/clangd/SymbolCollectorTests.cpp
Modified: clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp?rev=352367&r1=352366&r2=352367&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp (original)
+++ clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp Mon Jan 28 06:11:49 2019
@@ -379,13 +379,21 @@ bool SymbolCollector::handleMacroOccuren
const auto &SM = PP->getSourceManager();
auto DefLoc = MI->getDefinitionLoc();
- if (SM.isInMainFile(SM.getExpansionLoc(DefLoc)))
- return true;
+
// Header guards are not interesting in index. Builtin macros don't have
// useful locations and are not needed for code completions.
if (MI->isUsedForHeaderGuard() || MI->isBuiltinMacro())
return true;
+ // Skip main-file symbols if we are not collecting them.
+ bool IsMainFileSymbol = SM.isInMainFile(SM.getExpansionLoc(DefLoc));
+ if (IsMainFileSymbol && !Opts.CollectMainFileSymbols)
+ return false;
+
+ // Also avoid storing predefined macros like __DBL_MIN__.
+ if (SM.isWrittenInBuiltinFile(DefLoc))
+ return true;
+
// Mark the macro as referenced if this is a reference coming from the main
// file. The macro may not be an interesting symbol, but it's cheaper to check
// at the end.
@@ -410,7 +418,10 @@ bool SymbolCollector::handleMacroOccuren
Symbol S;
S.ID = std::move(*ID);
S.Name = Name->getName();
- S.Flags |= Symbol::IndexedForCodeCompletion;
+ if (!IsMainFileSymbol) {
+ S.Flags |= Symbol::IndexedForCodeCompletion;
+ S.Flags |= Symbol::VisibleOutsideFile;
+ }
S.SymInfo = index::getSymbolInfoForMacro(*MI);
std::string FileURI;
// FIXME: use the result to filter out symbols.
Modified: clang-tools-extra/trunk/unittests/clangd/FindSymbolsTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/FindSymbolsTests.cpp?rev=352367&r1=352366&r2=352367&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clangd/FindSymbolsTests.cpp (original)
+++ clang-tools-extra/trunk/unittests/clangd/FindSymbolsTests.cpp Mon Jan 28 06:11:49 2019
@@ -87,13 +87,16 @@ protected:
} // namespace
-TEST_F(WorkspaceSymbolsTest, NoMacro) {
+TEST_F(WorkspaceSymbolsTest, Macros) {
addFile("foo.cpp", R"cpp(
- #define MACRO X
- )cpp");
+ #define MACRO X
+ )cpp");
- // Macros are not in the index.
- EXPECT_THAT(getSymbols("macro"), IsEmpty());
+ // LSP's SymbolKind doesn't have a "Macro" kind, and
+ // indexSymbolKindToSymbolKind() currently maps macros
+ // to SymbolKind::String.
+ EXPECT_THAT(getSymbols("macro"),
+ ElementsAre(AllOf(QName("MACRO"), WithKind(SymbolKind::String))));
}
TEST_F(WorkspaceSymbolsTest, NoLocals) {
Modified: clang-tools-extra/trunk/unittests/clangd/SymbolCollectorTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/SymbolCollectorTests.cpp?rev=352367&r1=352366&r2=352367&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clangd/SymbolCollectorTests.cpp (original)
+++ clang-tools-extra/trunk/unittests/clangd/SymbolCollectorTests.cpp Mon Jan 28 06:11:49 2019
@@ -1069,21 +1069,27 @@ TEST_F(SymbolCollectorTest, CollectMacro
MAC(p);
)");
- const std::string Main = R"(
- #define MAIN 1 // not indexed
- USED(t);
- )";
+
+ Annotations Main(R"(
+ #define $main[[MAIN]] 1
+ USED(t);
+ )");
CollectorOpts.CountReferences = true;
CollectorOpts.CollectMacro = true;
- runSymbolCollector(Header.code(), Main);
- EXPECT_THAT(Symbols,
- UnorderedElementsAre(QName("p"), QName("t"),
- AllOf(QName("X"), DeclURI(TestHeaderURI),
- IncludeHeader(TestHeaderURI)),
- AllOf(Labeled("MAC(x)"), RefCount(0),
- DeclRange(Header.range("mac"))),
- AllOf(Labeled("USED(y)"), RefCount(1),
- DeclRange(Header.range("used")))));
+ runSymbolCollector(Header.code(), Main.code());
+ EXPECT_THAT(
+ Symbols,
+ UnorderedElementsAre(
+ QName("p"), QName("t"),
+ AllOf(QName("X"), DeclURI(TestHeaderURI),
+ IncludeHeader(TestHeaderURI)),
+ AllOf(Labeled("MAC(x)"), RefCount(0),
+
+ DeclRange(Header.range("mac")), VisibleOutsideFile()),
+ AllOf(Labeled("USED(y)"), RefCount(1),
+ DeclRange(Header.range("used")), VisibleOutsideFile()),
+ AllOf(Labeled("MAIN"), RefCount(0), DeclRange(Main.range("main")),
+ Not(VisibleOutsideFile()))));
}
TEST_F(SymbolCollectorTest, DeprecatedSymbols) {
More information about the cfe-commits
mailing list