summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clangd/CodeComplete.cpp10
-rw-r--r--clang-tools-extra/clangd/index/FileIndex.cpp19
-rw-r--r--clang-tools-extra/clangd/index/Index.h4
-rw-r--r--clang-tools-extra/clangd/index/SymbolCollector.cpp11
-rw-r--r--clang-tools-extra/unittests/clangd/FileIndexTests.cpp12
-rw-r--r--clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp2
6 files changed, 22 insertions, 36 deletions
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp
index 35738fad788..d582adc9bce 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -286,13 +286,9 @@ struct CompletionCandidate {
I.documentation = D->Documentation;
if (I.detail.empty())
I.detail = D->CompletionDetail;
- // We only insert #include for items with details, since we can't tell
- // whether the file URI of the canonical declaration would be the
- // canonical #include without checking IncludeHeader in the detail.
// FIXME: delay creating include insertion command to
// "completionItem/resolve", when it is supported
- if (!D->IncludeHeader.empty() ||
- !IndexResult->CanonicalDeclaration.FileURI.empty()) {
+ if (!D->IncludeHeader.empty()) {
// LSP favors additionalTextEdits over command. But we are still using
// command here because it would be expensive to calculate #include
// insertion edits for all candidates, and the include insertion edit
@@ -301,9 +297,7 @@ struct CompletionCandidate {
// Command title is not added since this is not a user-facing command.
Cmd.command = ExecuteCommandParams::CLANGD_INSERT_HEADER_INCLUDE;
IncludeInsertion Insertion;
- Insertion.header = D->IncludeHeader.empty()
- ? IndexResult->CanonicalDeclaration.FileURI
- : D->IncludeHeader;
+ Insertion.header = D->IncludeHeader;
Insertion.textDocument.uri = URIForFile(FileName);
Cmd.includeInsertion = std::move(Insertion);
I.command = std::move(Cmd);
diff --git a/clang-tools-extra/clangd/index/FileIndex.cpp b/clang-tools-extra/clangd/index/FileIndex.cpp
index 3f1cdeb2a12..8a8d179557a 100644
--- a/clang-tools-extra/clangd/index/FileIndex.cpp
+++ b/clang-tools-extra/clangd/index/FileIndex.cpp
@@ -15,15 +15,6 @@ namespace clang {
namespace clangd {
namespace {
-const CanonicalIncludes *canonicalIncludesForSystemHeaders() {
- static const auto *Includes = [] {
- auto *I = new CanonicalIncludes();
- addSystemHeadersMapping(I);
- return I;
- }();
- return Includes;
-}
-
/// Retrieves namespace and class level symbols in \p Decls.
std::unique_ptr<SymbolSlab> indexAST(ASTContext &Ctx,
std::shared_ptr<Preprocessor> PP,
@@ -32,12 +23,14 @@ std::unique_ptr<SymbolSlab> indexAST(ASTContext &Ctx,
// Although we do not index symbols in main files (e.g. cpp file), information
// in main files like definition locations of class declarations will still be
// collected; thus, the index works for go-to-definition.
- // FIXME(ioeric): handle IWYU pragma for dynamic index. We might want to make
- // SymbolCollector always provides include canonicalization (e.g. IWYU, STL).
// FIXME(ioeric): get rid of `IndexMainFiles` as this is always set to false.
CollectorOpts.IndexMainFiles = false;
- CollectorOpts.CollectIncludePath = true;
- CollectorOpts.Includes = canonicalIncludesForSystemHeaders();
+ // FIXME(ioeric): we might also want to collect include headers. We would need
+ // to make sure all includes are canonicalized (with CanonicalIncludes), which
+ // is not trivial given the current way of collecting symbols: we only have
+ // AST at this point, but we also need preprocessor callbacks (e.g.
+ // CommentHandler for IWYU pragma) to canonicalize includes.
+ CollectorOpts.CollectIncludePath = false;
auto Collector = std::make_shared<SymbolCollector>(std::move(CollectorOpts));
Collector->setPreprocessor(std::move(PP));
diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h
index 43ea4590f76..629db530928 100644
--- a/clang-tools-extra/clangd/index/Index.h
+++ b/clang-tools-extra/clangd/index/Index.h
@@ -162,8 +162,8 @@ struct Symbol {
/// directly. When this is a URI, the exact #include path needs to be
/// calculated according to the URI scheme.
///
- /// If empty, FileURI in CanonicalDeclaration should be used to calculate
- /// the #include path.
+ /// This is a canonical include for the symbol and can be different from
+ /// FileURI in the CanonicalDeclaration.
llvm::StringRef IncludeHeader;
};
diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp
index 2a32565eb7a..f8fb2c29570 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -150,8 +150,9 @@ bool shouldCollectIncludePath(index::SymbolKind Kind) {
}
}
-/// Gets a canonical include (<header> or "header") for header of \p Loc.
-/// Returns None if the header has no canonical include.
+/// Gets a canonical include (URI of the header or <header> or "header") for
+/// header of \p Loc.
+/// Returns None if fails to get include header for \p Loc.
/// FIXME: we should handle .inc files whose symbols are expected be exported by
/// their containing headers.
llvm::Optional<std::string>
@@ -167,10 +168,8 @@ getIncludeHeader(const SourceManager &SM, SourceLocation Loc,
? Mapped.str()
: ("\"" + Mapped + "\"").str();
}
- // If the header path is the same as the file path of the declaration, we skip
- // storing the #include path; users can use the URI in declaration location to
- // calculate the #include path.
- return llvm::None;
+
+ return toURI(SM, SM.getFilename(Loc), Opts);
}
// Return the symbol location of the given declaration `D`.
diff --git a/clang-tools-extra/unittests/clangd/FileIndexTests.cpp b/clang-tools-extra/unittests/clangd/FileIndexTests.cpp
index 04bdf9a5c44..8ef4313d194 100644
--- a/clang-tools-extra/unittests/clangd/FileIndexTests.cpp
+++ b/clang-tools-extra/unittests/clangd/FileIndexTests.cpp
@@ -181,19 +181,19 @@ TEST(FileIndexTest, IgnoreClassMembers) {
EXPECT_THAT(match(M, Req), UnorderedElementsAre("X"));
}
-#ifndef LLVM_ON_WIN32
-TEST(FileIndexTest, CanonicalizeSystemHeader) {
+TEST(FileIndexTest, NoIncludeCollected) {
FileIndex M;
- std::string File = testPath("bits/basic_string");
- M.update(File, build(File, "class string {};").getPointer());
+ M.update("f", build("f", "class string {};").getPointer());
FuzzyFindRequest Req;
Req.Query = "";
+ bool SeenSymbol = false;
M.fuzzyFind(Req, [&](const Symbol &Sym) {
- EXPECT_EQ(Sym.Detail->IncludeHeader, "<string>");
+ EXPECT_TRUE(Sym.Detail->IncludeHeader.empty());
+ SeenSymbol = true;
});
+ EXPECT_TRUE(SeenSymbol);
}
-#endif
} // namespace
} // namespace clangd
diff --git a/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp b/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp
index d99aac05258..27cf6308100 100644
--- a/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp
+++ b/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp
@@ -585,7 +585,7 @@ TEST_F(SymbolCollectorTest, IncludeHeaderSameAsFileURI) {
runSymbolCollector("class Foo {};", /*Main=*/"");
EXPECT_THAT(Symbols,
UnorderedElementsAre(AllOf(QName("Foo"), DeclURI(TestHeaderURI),
- IncludeHeader(""))));
+ IncludeHeader(TestHeaderURI))));
}
#ifndef LLVM_ON_WIN32
OpenPOWER on IntegriCloud