Skip to content

Commit 259e365

Browse files
committed
Revert "Revert "[clangd] Adjust compile flags to contain only the requested file as input""
This reverts commit 04e21fb.
1 parent ab714ba commit 259e365

File tree

6 files changed

+46
-27
lines changed

6 files changed

+46
-27
lines changed

clang-tools-extra/clangd/CompileCommands.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,8 @@ CommandMangler CommandMangler::detect() {
196196

197197
CommandMangler CommandMangler::forTests() { return CommandMangler(); }
198198

199-
void CommandMangler::adjust(std::vector<std::string> &Cmd) const {
199+
void CommandMangler::adjust(std::vector<std::string> &Cmd,
200+
llvm::StringRef File) const {
200201
trace::Span S("AdjustCompileFlags");
201202
auto &OptTable = clang::driver::getDriverOptTable();
202203
// OriginalArgs needs to outlive ArgList.
@@ -211,8 +212,10 @@ void CommandMangler::adjust(std::vector<std::string> &Cmd) const {
211212
// ParseArgs propagates missig arg/opt counts on error, but preserves
212213
// everything it could parse in ArgList. So we just ignore those counts.
213214
unsigned IgnoredCount;
215+
// Drop the executable name, as ParseArgs doesn't expect it. This means
216+
// indices are actually of by one between ArgList and OriginalArgs.
214217
auto ArgList = OptTable.ParseArgs(
215-
OriginalArgs, IgnoredCount, IgnoredCount,
218+
llvm::makeArrayRef(OriginalArgs).drop_front(), IgnoredCount, IgnoredCount,
216219
/*FlagsToInclude=*/
217220
IsCLMode ? (driver::options::CLOption | driver::options::CoreOption)
218221
: /*everything*/ 0,
@@ -223,12 +226,17 @@ void CommandMangler::adjust(std::vector<std::string> &Cmd) const {
223226
// modifications done in the following steps apply in more cases (like setting
224227
// -x, which only affects inputs that come after it).
225228
if (!ArgList.hasArgNoClaim(driver::options::OPT__DASH_DASH)) {
226-
// In theory there might be more than one input, but clangd can't deal with
227-
// them anyway.
228-
if (auto *Input = ArgList.getLastArg(driver::options::OPT_INPUT)) {
229-
Cmd.insert(Cmd.end(), {"--", Input->getAsString(ArgList)});
230-
Cmd.erase(Cmd.begin() + Input->getIndex());
231-
}
229+
// Drop all the inputs and only add one for the current file.
230+
llvm::SmallVector<unsigned, 1> IndicesToDrop;
231+
for (auto *Input : ArgList.filtered(driver::options::OPT_INPUT))
232+
IndicesToDrop.push_back(Input->getIndex());
233+
llvm::sort(IndicesToDrop);
234+
llvm::for_each(llvm::reverse(IndicesToDrop),
235+
// +1 to account for the executable name in Cmd[0] that
236+
// doesn't exist in ArgList.
237+
[&Cmd](unsigned Idx) { Cmd.erase(Cmd.begin() + Idx + 1); });
238+
Cmd.push_back("--");
239+
Cmd.push_back(File.str());
232240
}
233241

234242
for (auto &Edit : Config::current().CompileFlags.Edits)
@@ -278,7 +286,7 @@ CommandMangler::operator clang::tooling::ArgumentsAdjuster() && {
278286
return [Mangler = std::make_shared<CommandMangler>(std::move(*this))](
279287
const std::vector<std::string> &Args, llvm::StringRef File) {
280288
auto Result = Args;
281-
Mangler->adjust(Result);
289+
Mangler->adjust(Result, File);
282290
return Result;
283291
};
284292
}

clang-tools-extra/clangd/CompileCommands.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "clang/Tooling/ArgumentsAdjusters.h"
1313
#include "clang/Tooling/CompilationDatabase.h"
1414
#include "llvm/ADT/StringMap.h"
15+
#include "llvm/ADT/StringRef.h"
1516
#include <deque>
1617
#include <string>
1718
#include <vector>
@@ -46,7 +47,7 @@ struct CommandMangler {
4647
// - on mac, find clang and isysroot by querying the `xcrun` launcher
4748
static CommandMangler detect();
4849

49-
void adjust(std::vector<std::string> &Cmd) const;
50+
void adjust(std::vector<std::string> &Cmd, llvm::StringRef File) const;
5051
explicit operator clang::tooling::ArgumentsAdjuster() &&;
5152

5253
private:

clang-tools-extra/clangd/GlobalCompilationDatabase.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ OverlayCDB::getCompileCommand(PathRef File) const {
763763
if (!Cmd)
764764
return llvm::None;
765765
if (ArgsAdjuster)
766-
Cmd->CommandLine = ArgsAdjuster(Cmd->CommandLine, Cmd->Filename);
766+
Cmd->CommandLine = ArgsAdjuster(Cmd->CommandLine, File);
767767
return Cmd;
768768
}
769769

@@ -773,7 +773,7 @@ tooling::CompileCommand OverlayCDB::getFallbackCommand(PathRef File) const {
773773
Cmd.CommandLine.insert(Cmd.CommandLine.end(), FallbackFlags.begin(),
774774
FallbackFlags.end());
775775
if (ArgsAdjuster)
776-
Cmd.CommandLine = ArgsAdjuster(Cmd.CommandLine, Cmd.Filename);
776+
Cmd.CommandLine = ArgsAdjuster(Cmd.CommandLine, File);
777777
return Cmd;
778778
}
779779

clang-tools-extra/clangd/test/did-change-configuration-params.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
#
4949
# ERR: ASTWorker building file {{.*}}foo.c version 0 with command
5050
# ERR: [{{.*}}clangd-test2]
51-
# ERR: clang -c -Wall -Werror {{.*}} -- foo.c
51+
# ERR: clang -c -Wall -Werror {{.*}} -- {{.*}}foo.c
5252
---
5353
{"jsonrpc":"2.0","id":5,"method":"shutdown"}
5454
---

clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ TEST(CommandMangler, Everything) {
4444
Mangler.ResourceDir = testPath("fake/resources");
4545
Mangler.Sysroot = testPath("fake/sysroot");
4646
std::vector<std::string> Cmd = {"clang++", "--", "foo.cc"};
47-
Mangler.adjust(Cmd);
47+
Mangler.adjust(Cmd, "foo.cc");
4848
EXPECT_THAT(Cmd, ElementsAre(testPath("fake/clang++"),
4949
"-resource-dir=" + testPath("fake/resources"),
5050
"-isysroot", testPath("fake/sysroot"), "--",
@@ -55,7 +55,7 @@ TEST(CommandMangler, ResourceDir) {
5555
auto Mangler = CommandMangler::forTests();
5656
Mangler.ResourceDir = testPath("fake/resources");
5757
std::vector<std::string> Cmd = {"clang++", "foo.cc"};
58-
Mangler.adjust(Cmd);
58+
Mangler.adjust(Cmd, "foo.cc");
5959
EXPECT_THAT(Cmd, Contains("-resource-dir=" + testPath("fake/resources")));
6060
}
6161

@@ -64,7 +64,7 @@ TEST(CommandMangler, Sysroot) {
6464
Mangler.Sysroot = testPath("fake/sysroot");
6565

6666
std::vector<std::string> Cmd = {"clang++", "foo.cc"};
67-
Mangler.adjust(Cmd);
67+
Mangler.adjust(Cmd, "foo.cc");
6868
EXPECT_THAT(llvm::join(Cmd, " "),
6969
HasSubstr("-isysroot " + testPath("fake/sysroot")));
7070
}
@@ -74,19 +74,19 @@ TEST(CommandMangler, ClangPath) {
7474
Mangler.ClangPath = testPath("fake/clang");
7575

7676
std::vector<std::string> Cmd = {"clang++", "foo.cc"};
77-
Mangler.adjust(Cmd);
77+
Mangler.adjust(Cmd, "foo.cc");
7878
EXPECT_EQ(testPath("fake/clang++"), Cmd.front());
7979

8080
Cmd = {"unknown-binary", "foo.cc"};
81-
Mangler.adjust(Cmd);
81+
Mangler.adjust(Cmd, "foo.cc");
8282
EXPECT_EQ(testPath("fake/unknown-binary"), Cmd.front());
8383

8484
Cmd = {testPath("path/clang++"), "foo.cc"};
85-
Mangler.adjust(Cmd);
85+
Mangler.adjust(Cmd, "foo.cc");
8686
EXPECT_EQ(testPath("path/clang++"), Cmd.front());
8787

8888
Cmd = {"foo/unknown-binary", "foo.cc"};
89-
Mangler.adjust(Cmd);
89+
Mangler.adjust(Cmd, "foo.cc");
9090
EXPECT_EQ("foo/unknown-binary", Cmd.front());
9191
}
9292

@@ -129,7 +129,7 @@ TEST(CommandMangler, ClangPathResolve) {
129129
auto Mangler = CommandMangler::forTests();
130130
Mangler.ClangPath = testPath("fake/clang");
131131
std::vector<std::string> Cmd = {(TempDir + "/bin/foo").str(), "foo.cc"};
132-
Mangler.adjust(Cmd);
132+
Mangler.adjust(Cmd, "foo.cc");
133133
// Directory based on resolved symlink, basename preserved.
134134
EXPECT_EQ((TempDir + "/lib/foo").str(), Cmd.front());
135135

@@ -146,13 +146,13 @@ TEST(CommandMangler, ClangPathResolve) {
146146
Mangler.ClangPath = testPath("fake/clang");
147147
// Driver found on PATH.
148148
Cmd = {"foo", "foo.cc"};
149-
Mangler.adjust(Cmd);
149+
Mangler.adjust(Cmd, "foo.cc");
150150
// Found the symlink and resolved the path as above.
151151
EXPECT_EQ((TempDir + "/lib/foo").str(), Cmd.front());
152152

153153
// Symlink not resolved with -no-canonical-prefixes.
154154
Cmd = {"foo", "-no-canonical-prefixes", "foo.cc"};
155-
Mangler.adjust(Cmd);
155+
Mangler.adjust(Cmd, "foo.cc");
156156
EXPECT_EQ((TempDir + "/bin/foo").str(), Cmd.front());
157157
}
158158
#endif
@@ -171,7 +171,7 @@ TEST(CommandMangler, ConfigEdits) {
171171
Argv = tooling::getInsertArgumentAdjuster("--hello")(Argv, "");
172172
});
173173
WithContextValue WithConfig(Config::Key, std::move(Cfg));
174-
Mangler.adjust(Cmd);
174+
Mangler.adjust(Cmd, "foo.cc");
175175
}
176176
// Edits are applied in given order and before other mangling and they always
177177
// go before filename.
@@ -350,7 +350,7 @@ TEST(CommandMangler, InputsAfterDashDash) {
350350
const auto Mangler = CommandMangler::forTests();
351351
{
352352
std::vector<std::string> Args = {"clang", "/Users/foo.cc"};
353-
Mangler.adjust(Args);
353+
Mangler.adjust(Args, "/Users/foo.cc");
354354
EXPECT_THAT(llvm::makeArrayRef(Args).take_back(2),
355355
ElementsAre("--", "/Users/foo.cc"));
356356
EXPECT_THAT(llvm::makeArrayRef(Args).drop_back(2),
@@ -361,11 +361,21 @@ TEST(CommandMangler, InputsAfterDashDash) {
361361
{
362362
std::vector<std::string> Args = {"clang", "--driver-mode=cl", "bar.cc",
363363
"/Users/foo.cc"};
364-
Mangler.adjust(Args);
364+
Mangler.adjust(Args, "bar.cc");
365365
EXPECT_THAT(llvm::makeArrayRef(Args).take_back(2),
366366
ElementsAre("--", "bar.cc"));
367367
EXPECT_THAT(llvm::makeArrayRef(Args).drop_back(2), Not(Contains("bar.cc")));
368368
}
369+
// All inputs but the main file is dropped.
370+
{
371+
std::vector<std::string> Args = {"clang", "foo.cc", "bar.cc"};
372+
Mangler.adjust(Args, "baz.cc");
373+
EXPECT_THAT(llvm::makeArrayRef(Args).take_back(2),
374+
ElementsAre("--", "baz.cc"));
375+
EXPECT_THAT(
376+
llvm::makeArrayRef(Args).drop_back(2),
377+
testing::AllOf(Not(Contains("foo.cc")), Not(Contains("bar.cc"))));
378+
}
369379
}
370380
} // namespace
371381
} // namespace clangd

clang-tools-extra/clangd/unittests/TestTU.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ ParseInputs TestTU::inputs(MockFS &FS) const {
5959
Argv.push_back(FullFilename);
6060

6161
auto Mangler = CommandMangler::forTests();
62-
Mangler.adjust(Inputs.CompileCommand.CommandLine);
62+
Mangler.adjust(Inputs.CompileCommand.CommandLine, FullFilename);
6363
Inputs.CompileCommand.Filename = FullFilename;
6464
Inputs.CompileCommand.Directory = testRoot();
6565
Inputs.Contents = Code;

0 commit comments

Comments
 (0)