kadircet updated this revision to Diff 329930. kadircet added a comment. - Rebase - Add a storage for returned verbatim header spellings, as getHeaderIncludeUncached can only return a ref.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98242/new/ https://reviews.llvm.org/D98242 Files: clang-tools-extra/clangd/index/SymbolCollector.cpp clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp Index: clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp +++ clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp @@ -1446,6 +1446,20 @@ UnorderedElementsAre(IncludeHeaderWithRef(TestHeaderURI, 1u))); } +TEST_F(SymbolCollectorTest, IncludeHeaderFromSystemIsVerbatim) { + llvm::StringRef HeaderName = "header.h"; + TestHeaderName = testPath(HeaderName); + TestHeaderURI = URI::create(TestHeaderName).toString(); + CollectorOpts.CollectIncludePath = true; + runSymbolCollector("#pragma once\nclass Foo {};", /*Main=*/"", + {"-isystem", testRoot()}); + EXPECT_THAT(Symbols, UnorderedElementsAre( + AllOf(QName("Foo"), DeclURI(TestHeaderURI)))); + EXPECT_THAT(Symbols.begin()->IncludeHeaders, + UnorderedElementsAre( + IncludeHeaderWithRef("<" + HeaderName.str() + ">", 1u))); +} + TEST_F(SymbolCollectorTest, CanonicalSTLHeader) { CollectorOpts.CollectIncludePath = true; CanonicalIncludes Includes; Index: clang-tools-extra/clangd/index/SymbolCollector.cpp =================================================================== --- clang-tools-extra/clangd/index/SymbolCollector.cpp +++ clang-tools-extra/clangd/index/SymbolCollector.cpp @@ -35,6 +35,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" +#include <list> namespace clang { namespace clangd { @@ -167,6 +168,7 @@ llvm::StringRef FallbackDir; llvm::DenseMap<const FileEntry *, const std::string *> CacheFEToURI; llvm::StringMap<std::string> CachePathToURI; + std::list<std::string> StorageForSystemHeaders; llvm::DenseMap<FileID, llvm::StringRef> CacheFIDToInclude; public: @@ -250,6 +252,18 @@ // Conservatively refuse to insert #includes to files without guards. return ""; } + // Store system includes as verbatim. This enables making use of the same + // index in different environments, e.g. a system header like <linux/dlm.h> + // might resolve to different absolute paths, but the path relative to + // sysroot will be the same. + bool IsSystem = false; + auto ShorterInclude = + PP->getHeaderSearchInfo().suggestPathToFileForDiagnostics(FE, "", + &IsSystem); + if (IsSystem) { + StorageForSystemHeaders.push_back("<" + ShorterInclude + ">"); + return StorageForSystemHeaders.back(); + } // Standard case: just insert the file itself. return toURI(FE); }
Index: clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp +++ clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp @@ -1446,6 +1446,20 @@ UnorderedElementsAre(IncludeHeaderWithRef(TestHeaderURI, 1u))); } +TEST_F(SymbolCollectorTest, IncludeHeaderFromSystemIsVerbatim) { + llvm::StringRef HeaderName = "header.h"; + TestHeaderName = testPath(HeaderName); + TestHeaderURI = URI::create(TestHeaderName).toString(); + CollectorOpts.CollectIncludePath = true; + runSymbolCollector("#pragma once\nclass Foo {};", /*Main=*/"", + {"-isystem", testRoot()}); + EXPECT_THAT(Symbols, UnorderedElementsAre( + AllOf(QName("Foo"), DeclURI(TestHeaderURI)))); + EXPECT_THAT(Symbols.begin()->IncludeHeaders, + UnorderedElementsAre( + IncludeHeaderWithRef("<" + HeaderName.str() + ">", 1u))); +} + TEST_F(SymbolCollectorTest, CanonicalSTLHeader) { CollectorOpts.CollectIncludePath = true; CanonicalIncludes Includes; Index: clang-tools-extra/clangd/index/SymbolCollector.cpp =================================================================== --- clang-tools-extra/clangd/index/SymbolCollector.cpp +++ clang-tools-extra/clangd/index/SymbolCollector.cpp @@ -35,6 +35,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" +#include <list> namespace clang { namespace clangd { @@ -167,6 +168,7 @@ llvm::StringRef FallbackDir; llvm::DenseMap<const FileEntry *, const std::string *> CacheFEToURI; llvm::StringMap<std::string> CachePathToURI; + std::list<std::string> StorageForSystemHeaders; llvm::DenseMap<FileID, llvm::StringRef> CacheFIDToInclude; public: @@ -250,6 +252,18 @@ // Conservatively refuse to insert #includes to files without guards. return ""; } + // Store system includes as verbatim. This enables making use of the same + // index in different environments, e.g. a system header like <linux/dlm.h> + // might resolve to different absolute paths, but the path relative to + // sysroot will be the same. + bool IsSystem = false; + auto ShorterInclude = + PP->getHeaderSearchInfo().suggestPathToFileForDiagnostics(FE, "", + &IsSystem); + if (IsSystem) { + StorageForSystemHeaders.push_back("<" + ShorterInclude + ">"); + return StorageForSystemHeaders.back(); + } // Standard case: just insert the file itself. return toURI(FE); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits