ioeric created this revision. ioeric added a reviewer: sammccall. Herald added subscribers: cfe-commits, jkorous, MaskRay, ilya-biryukov.
This allows dynamic index to have consistent URI schemes with the static index which can have customized URI schemes, which would make file proximity scoring based on URIs easier. Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D47931 Files: clangd/ClangdServer.cpp clangd/ClangdServer.h clangd/index/FileIndex.cpp clangd/index/FileIndex.h unittests/clangd/ClangdTests.cpp unittests/clangd/FileIndexTests.cpp
Index: unittests/clangd/FileIndexTests.cpp =================================================================== --- unittests/clangd/FileIndexTests.cpp +++ unittests/clangd/FileIndexTests.cpp @@ -96,6 +96,42 @@ M.update(File.Filename, &AST.getASTContext(), AST.getPreprocessorPtr()); } +class TestURIScheme : public URIScheme { +public: + llvm::Expected<std::string> + getAbsolutePath(llvm::StringRef /*Authority*/, llvm::StringRef Body, + llvm::StringRef /*HintPath*/) const override { + llvm_unreachable("ClangdTests never makes absolute path."); + } + + llvm::Expected<URI> + uriFromAbsolutePath(llvm::StringRef AbsolutePath) const override { + return URI::parse(HardcodedURI); + } + static const char HardcodedURI[]; + static const char Scheme[]; +}; + +const char TestURIScheme::HardcodedURI[] = "ClangdTests:///test"; +const char TestURIScheme::Scheme[] = "ClangdTest"; + +static URISchemeRegistry::Add<TestURIScheme> X(TestURIScheme::Scheme, + "Test scheme for ClangdTests."); + +TEST(FileIndexTest, CustomizedURIScheme) { + FileIndex M({TestURIScheme::Scheme}); + update(M, "f", "class string {};"); + + FuzzyFindRequest Req; + Req.Query = ""; + bool SeenSymbol = false; + M.fuzzyFind(Req, [&](const Symbol &Sym) { + EXPECT_EQ(Sym.CanonicalDeclaration.FileURI, TestURIScheme::HardcodedURI); + SeenSymbol = true; + }); + EXPECT_TRUE(SeenSymbol); +} + TEST(FileIndexTest, IndexAST) { FileIndex M; update(M, "f1", "namespace ns { void f() {} class X {}; }"); Index: unittests/clangd/ClangdTests.cpp =================================================================== --- unittests/clangd/ClangdTests.cpp +++ unittests/clangd/ClangdTests.cpp @@ -152,28 +152,6 @@ } }; -constexpr const char* ClangdTestScheme = "ClangdTests"; -class TestURIScheme : public URIScheme { -public: - llvm::Expected<std::string> - getAbsolutePath(llvm::StringRef /*Authority*/, llvm::StringRef Body, - llvm::StringRef /*HintPath*/) const override { - llvm_unreachable("ClangdTests never makes absolute path."); - } - - llvm::Expected<URI> - uriFromAbsolutePath(llvm::StringRef AbsolutePath) const override { - llvm_unreachable("ClangdTest never creates a test URI."); - } - - llvm::Expected<std::string> getIncludeSpelling(const URI &U) const override { - return ("\"" + U.body().trim("/") + "\"").str(); - } -}; - -static URISchemeRegistry::Add<TestURIScheme> - X(ClangdTestScheme, "Test scheme for ClangdTests."); - TEST_F(ClangdVFSTest, Parse) { // FIXME: figure out a stable format for AST dumps, so that we can check the // output of the dump itself is equal to the expected one, not just that it's Index: clangd/index/FileIndex.h =================================================================== --- clangd/index/FileIndex.h +++ clangd/index/FileIndex.h @@ -56,6 +56,10 @@ /// \brief This manages symbls from files and an in-memory index on all symbols. class FileIndex : public SymbolIndex { public: + /// If URISchemes is empty, the default schemes in SymbolCollector will be + /// used. + FileIndex(std::vector<std::string> URISchemes = {}); + /// \brief Update symbols in \p Path with symbols in \p AST. If \p AST is /// nullptr, this removes all symbols in the file. /// If \p AST is not null, \p PP cannot be null and it should be the @@ -72,11 +76,14 @@ private: FileSymbols FSymbols; MemIndex Index; + std::vector<std::string> URISchemes; }; /// Retrieves namespace and class level symbols in \p AST. /// Exposed to assist in unit tests. -SymbolSlab indexAST(ASTContext &AST, std::shared_ptr<Preprocessor> PP); +/// If URISchemes is empty, the default schemes in SymbolCollector will be used. +SymbolSlab indexAST(ASTContext &AST, std::shared_ptr<Preprocessor> PP, + llvm::ArrayRef<std::string> URISchemes = {}); } // namespace clangd } // namespace clang Index: clangd/index/FileIndex.cpp =================================================================== --- clangd/index/FileIndex.cpp +++ clangd/index/FileIndex.cpp @@ -15,15 +15,18 @@ namespace clang { namespace clangd { -SymbolSlab indexAST(ASTContext &AST, std::shared_ptr<Preprocessor> PP) { +SymbolSlab indexAST(ASTContext &AST, std::shared_ptr<Preprocessor> PP, + llvm::ArrayRef<std::string> URISchemes) { SymbolCollector::Options CollectorOpts; // 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; CollectorOpts.CountReferences = false; + if (!URISchemes.empty()) + CollectorOpts.URISchemes = URISchemes; SymbolCollector Collector(std::move(CollectorOpts)); Collector.setPreprocessor(PP); @@ -41,6 +44,9 @@ return Collector.takeSymbols(); } +FileIndex::FileIndex(std::vector<std::string> URISchemes) + : URISchemes(std::move(URISchemes)) {} + void FileSymbols::update(PathRef Path, std::unique_ptr<SymbolSlab> Slab) { std::lock_guard<std::mutex> Lock(Mutex); if (!Slab) @@ -79,7 +85,7 @@ } else { assert(PP); auto Slab = llvm::make_unique<SymbolSlab>(); - *Slab = indexAST(*AST, PP); + *Slab = indexAST(*AST, PP, URISchemes); FSymbols.update(Path, std::move(Slab)); } auto Symbols = FSymbols.allSymbols(); Index: clangd/ClangdServer.h =================================================================== --- clangd/ClangdServer.h +++ clangd/ClangdServer.h @@ -80,6 +80,10 @@ /// opened files and uses the index to augment code completion results. bool BuildDynamicSymbolIndex = false; + /// URI schemes to use when building the dynamic index. + /// If empty, the default schemes in SymbolCollector will be used. + std::vector<std::string> URISchemes; + /// If set, use this index to augment code completion results. SymbolIndex *StaticIndex = nullptr; Index: clangd/ClangdServer.cpp =================================================================== --- clangd/ClangdServer.cpp +++ clangd/ClangdServer.cpp @@ -86,7 +86,8 @@ : CompileArgs(CDB, Opts.ResourceDir ? Opts.ResourceDir->str() : getStandardResourceDir()), DiagConsumer(DiagConsumer), FSProvider(FSProvider), - FileIdx(Opts.BuildDynamicSymbolIndex ? new FileIndex() : nullptr), + FileIdx(Opts.BuildDynamicSymbolIndex ? new FileIndex(Opts.URISchemes) + : nullptr), PCHs(std::make_shared<PCHContainerOperations>()), // Pass a callback into `WorkScheduler` to extract symbols from a newly // parsed file and rebuild the file index synchronously each time an AST
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits