hokein updated this revision to Diff 141654. hokein marked an inline comment as done. hokein added a comment.
includeSpelling Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D45426 Files: clangd/ClangdServer.cpp clangd/URI.cpp clangd/URI.h unittests/clangd/ClangdTests.cpp unittests/clangd/TestScheme.h
Index: unittests/clangd/ClangdTests.cpp =================================================================== --- unittests/clangd/ClangdTests.cpp +++ unittests/clangd/ClangdTests.cpp @@ -152,6 +152,28 @@ } }; +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 @@ -961,6 +983,10 @@ /*Preferred=*/"<Y.h>", "<Y.h>")); EXPECT_TRUE(Inserted(OriginalHeader, PreferredHeader, "\"Y.h\"")); EXPECT_TRUE(Inserted("<y.h>", PreferredHeader, "\"Y.h\"")); + auto TestURIHeader = + URI::parse(llvm::formatv("{0}:///x/y/z.h", ClangdTestScheme).str()); + EXPECT_TRUE(static_cast<bool>(TestURIHeader)); + EXPECT_TRUE(Inserted(TestURIHeader->toString(), "", "\"x/y/z.h\"")); // Check that includes are sorted. const auto Expected = R"cpp( Index: clangd/URI.h =================================================================== --- clangd/URI.h +++ clangd/URI.h @@ -60,6 +60,16 @@ static llvm::Expected<std::string> resolve(const URI &U, llvm::StringRef HintPath = ""); + /// Gets the preferred spelling of this file for #include, if there is one, + /// e.g. <system_header.h>, "path/to/x.h". + /// + /// This allows URI schemas to provide their customized include paths. + /// + /// Returns an empty string if normal include-shortening based on the absolute + /// path should be used. + /// Fails if the URI is not valid in the schema. + static llvm::Expected<std::string> includeSpelling(const URI &U); + friend bool operator==(const URI &LHS, const URI &RHS) { return std::tie(LHS.Scheme, LHS.Authority, LHS.Body) == std::tie(RHS.Scheme, RHS.Authority, RHS.Body); @@ -94,6 +104,13 @@ virtual llvm::Expected<URI> uriFromAbsolutePath(llvm::StringRef AbsolutePath) const = 0; + + /// Returns the include path of the file (e.g. <path>, "path"), which can be + /// #included directly. See URI::includeSpelling for details. + virtual llvm::Expected<std::string> + getIncludeSpelling(const URI& U) const { + return ""; // no customized include path for this scheme. + } }; /// By default, a "file" scheme is supported where URI paths are always absolute Index: clangd/URI.cpp =================================================================== --- clangd/URI.cpp +++ clangd/URI.cpp @@ -196,5 +196,12 @@ return S->get()->getAbsolutePath(Uri.Authority, Uri.Body, HintPath); } +llvm::Expected<std::string> URI::includeSpelling(const URI &Uri) { + auto S = findSchemeByName(Uri.Scheme); + if (!S) + return S.takeError(); + return S->get()->getIncludeSpelling(Uri); +} + } // namespace clangd } // namespace clang Index: clangd/ClangdServer.cpp =================================================================== --- clangd/ClangdServer.cpp +++ clangd/ClangdServer.cpp @@ -286,6 +286,13 @@ auto U = URI::parse(Header); if (!U) return U.takeError(); + + auto IncludePath = URI::includeSpelling(*U); + if (!IncludePath) + return IncludePath.takeError(); + if (!IncludePath->empty()) + return HeaderFile{std::move(*IncludePath), /*Verbatim=*/true}; + auto Resolved = URI::resolve(*U, HintPath); if (!Resolved) return Resolved.takeError();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits