[clang-tools-extra] [clangd] Add includes from source to non-self-contained headers (PR #72479)

via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 17 10:07:37 PST 2023


https://github.com/sr-tream updated https://github.com/llvm/llvm-project/pull/72479

>From 7b0b07e4a9adc5229226addd2700588bc0985c59 Mon Sep 17 00:00:00 2001
From: SR_team <me at sr.team>
Date: Thu, 16 Nov 2023 07:15:10 +0200
Subject: [PATCH] Add includes from source to non-self-contained headers

---
 clang-tools-extra/clangd/TUScheduler.cpp | 48 ++++++++++++++++++++++--
 1 file changed, 45 insertions(+), 3 deletions(-)

diff --git a/clang-tools-extra/clangd/TUScheduler.cpp b/clang-tools-extra/clangd/TUScheduler.cpp
index 324ba1fc8cb8952..f4204c10a1b41e6 100644
--- a/clang-tools-extra/clangd/TUScheduler.cpp
+++ b/clang-tools-extra/clangd/TUScheduler.cpp
@@ -52,6 +52,7 @@
 #include "Config.h"
 #include "Diagnostics.h"
 #include "GlobalCompilationDatabase.h"
+#include "HeaderSourceSwitch.h"
 #include "ParsedAST.h"
 #include "Preamble.h"
 #include "clang-include-cleaner/Record.h"
@@ -64,6 +65,7 @@
 #include "support/Threading.h"
 #include "support/Trace.h"
 #include "clang/Basic/Stack.h"
+#include "clang/Driver/Driver.h"
 #include "clang/Frontend/CompilerInvocation.h"
 #include "clang/Tooling/CompilationDatabase.h"
 #include "llvm/ADT/FunctionExtras.h"
@@ -881,10 +883,21 @@ void ASTWorker::update(ParseInputs Inputs, WantDiagnostics WantDiags,
         }
       }
     }
-    if (Cmd)
+    if (!Cmd)
+      Cmd = CDB.getFallbackCommand(FileName);
+    if (Cmd) {
+      if (!Inputs.CompileCommand.CommandLine.empty()) {
+        auto PosArg =
+            std::find(Cmd->CommandLine.begin(), Cmd->CommandLine.end(), "--");
+        for (auto &&Arg : Inputs.CompileCommand.CommandLine) {
+          if (PosArg == Cmd->CommandLine.end())
+            Cmd->CommandLine.push_back(std::move(Arg));
+          else
+            PosArg = std::next(Cmd->CommandLine.insert(PosArg, std::move(Arg)));
+        }
+      }
       Inputs.CompileCommand = std::move(*Cmd);
-    else
-      Inputs.CompileCommand = CDB.getFallbackCommand(FileName);
+    }
 
     bool InputsAreTheSame =
         std::tie(FileInputs.CompileCommand, FileInputs.Contents) ==
@@ -1684,6 +1697,35 @@ bool TUScheduler::update(PathRef File, ParseInputs Inputs,
     ContentChanged = true;
     FD->Contents = Inputs.Contents;
   }
+  if (isHeaderFile(File)) {
+    std::string SourceFile = HeaderIncluders->get(File);
+    if (SourceFile.empty()) {
+      auto VFS = Inputs.TFS->view(Inputs.CompileCommand.Directory);
+      if (auto CorrespondingFile =
+              clang::clangd::getCorrespondingHeaderOrSource(File,
+                                                            std::move(VFS)))
+        SourceFile = *CorrespondingFile;
+    }
+    if (!SourceFile.empty()) {
+      std::unique_ptr<FileData> &FD = Files[SourceFile];
+      if (FD && FD->Worker->isASTCached()) {
+        if (auto AST = IdleASTs->take(FD->Worker.lock().get())) {
+          auto &Headers = AST.value()->getIncludeStructure().MainFileIncludes;
+          Inputs.CompileCommand.CommandLine.reserve(Headers.size());
+          for (const auto &H : Headers) {
+            if (H.Resolved == File) {
+              if (isSystem(H.FileKind))
+                Inputs.CompileCommand.CommandLine.clear();
+              break;
+            }
+            auto CmdLine = "-include" + H.Resolved;
+            Inputs.CompileCommand.CommandLine.push_back(std::move(CmdLine));
+          }
+          IdleASTs->put(FD->Worker.lock().get(), std::move(AST.value()));
+        }
+      }
+    }
+  }
   FD->Worker->update(std::move(Inputs), WantDiags, ContentChanged);
   // There might be synthetic update requests, don't change the LastActiveFile
   // in such cases.



More information about the cfe-commits mailing list