[clangd] Revert to older include spelling approach.
authorViktoriia Bakalova <bakalova@google.com>
Mon, 5 Jun 2023 15:18:17 +0000 (15:18 +0000)
committerViktoriia Bakalova <bakalova@google.com>
Mon, 5 Jun 2023 15:18:28 +0000 (15:18 +0000)
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h

index 8030326..d1f6f3a 100644 (file)
@@ -18,7 +18,6 @@
 #include "Selection.h"
 #include "SourceCode.h"
 #include "clang-include-cleaner/Analysis.h"
-#include "clang-include-cleaner/IncludeSpeller.h"
 #include "clang-include-cleaner/Types.h"
 #include "index/SymbolCollector.h"
 #include "support/Logger.h"
@@ -1223,9 +1222,7 @@ void maybeAddSymbolProviders(ParsedAST &AST, HoverInfo &HI,
     // on local variables, etc.
     return;
 
-  HI.Provider = include_cleaner::spellHeader(
-      {H, AST.getPreprocessor().getHeaderSearchInfo(),
-       SM.getFileEntryForID(SM.getMainFileID())});
+  HI.Provider = spellHeader(AST, SM.getFileEntryForID(SM.getMainFileID()), H);
 }
 
 // FIXME: similar functions are present in FindHeaders.cpp (symbolName)
index c9d32a0..fa30592 100644 (file)
@@ -198,9 +198,9 @@ std::vector<Diag> generateMissingIncludeDiagnostics(
       continue;
     }
 
-    std::string Spelling = include_cleaner::spellHeader(
-        {SymbolWithMissingInclude.Providers.front(),
-         AST.getPreprocessor().getHeaderSearchInfo(), MainFile});
+    std::string Spelling =
+        spellHeader(AST, MainFile, SymbolWithMissingInclude.Providers.front());
+
     llvm::StringRef HeaderRef{Spelling};
     bool Angled = HeaderRef.starts_with("<");
     // We might suggest insertion of an existing include in edge cases, e.g.,
@@ -334,6 +334,22 @@ convertIncludes(const SourceManager &SM,
   return ConvertedIncludes;
 }
 
+std::string spellHeader(ParsedAST &AST, const FileEntry *MainFile,
+                        include_cleaner::Header Provider) {
+  if (Provider.kind() == include_cleaner::Header::Physical) {
+    if (auto CanonicalPath =
+            getCanonicalPath(Provider.physical()->getLastRef(),
+                             AST.getSourceManager().getFileManager())) {
+      std::string SpelledHeader =
+          llvm::cantFail(URI::includeSpelling(URI::create(*CanonicalPath)));
+      if (!SpelledHeader.empty())
+        return SpelledHeader;
+    }
+  }
+  return include_cleaner::spellHeader(
+      {Provider, AST.getPreprocessor().getHeaderSearchInfo(), MainFile});
+}
+
 std::vector<const Inclusion *>
 getUnused(ParsedAST &AST,
           const llvm::DenseSet<IncludeStructure::HeaderID> &ReferencedFiles,
index c4051b3..675c05a 100644 (file)
@@ -74,6 +74,11 @@ include_cleaner::Includes
 convertIncludes(const SourceManager &SM,
                 const llvm::ArrayRef<Inclusion> Includes);
 
+/// Determines the header spelling of an include-cleaner header
+/// representation. The spelling contains the ""<> characters.
+std::string spellHeader(ParsedAST &AST, const FileEntry *MainFile,
+                        include_cleaner::Header Provider);
+
 std::vector<include_cleaner::SymbolReference>
 collectMacroReferences(ParsedAST &AST);