https://github.com/sr-tream updated https://github.com/llvm/llvm-project/pull/72479
>From 225ca71650e880e9584fe2d49e03baba34690883 Mon Sep 17 00:00:00 2001 From: SR_team <m...@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 | 50 ++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clangd/TUScheduler.cpp b/clang-tools-extra/clangd/TUScheduler.cpp index 324ba1fc8cb8952..caaf5bd7d8ab151 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,24 @@ 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(), "--"); + auto UsePushBack = PosArg == Cmd->CommandLine.end(); + Cmd->CommandLine.reserve(Cmd->CommandLine.size() + + Inputs.CompileCommand.CommandLine.size()); + for (auto &&Arg : Inputs.CompileCommand.CommandLine) { + if (UsePushBack) + 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 +1700,34 @@ bool TUScheduler::update(PathRef File, ParseInputs Inputs, ContentChanged = true; FD->Contents = Inputs.Contents; } + if (isHeaderFile(File)) { + std::string SourceFile; + auto VFS = Inputs.TFS->view(Inputs.CompileCommand.Directory); + if (auto CorrespondingFile = + clang::clangd::getCorrespondingHeaderOrSource(File, std::move(VFS))) + SourceFile = *CorrespondingFile; + if (SourceFile.empty()) + SourceFile = HeaderIncluders->get(File); + if (!SourceFile.empty() && Files.contains(SourceFile)) { + 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. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits