Skip to content

Commit 2aa0cf1

Browse files
committed
Revert D106562 "[clangd] Get rid of arg adjusters in CommandMangler"
This reverts commit 1c0d008. This commit made unittest BuildCompilerInvocation.DropsPlugins crash.
1 parent 42896ee commit 2aa0cf1

File tree

5 files changed

+47
-68
lines changed

5 files changed

+47
-68
lines changed

clang-tools-extra/clangd/CompileCommands.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
#include "clang/Driver/Options.h"
1313
#include "clang/Frontend/CompilerInvocation.h"
1414
#include "clang/Tooling/ArgumentsAdjusters.h"
15-
#include "llvm/ADT/STLExtras.h"
16-
#include "llvm/ADT/StringRef.h"
1715
#include "llvm/Option/Option.h"
1816
#include "llvm/Support/Allocator.h"
1917
#include "llvm/Support/Debug.h"
@@ -22,7 +20,6 @@
2220
#include "llvm/Support/MemoryBuffer.h"
2321
#include "llvm/Support/Path.h"
2422
#include "llvm/Support/Program.h"
25-
#include <iterator>
2623
#include <string>
2724
#include <vector>
2825

@@ -205,9 +202,14 @@ void CommandMangler::adjust(std::vector<std::string> &Cmd) const {
205202
return false;
206203
};
207204

208-
llvm::erase_if(Cmd, [](llvm::StringRef Elem) {
209-
return Elem.startswith("--save-temps") || Elem.startswith("-save-temps");
210-
});
205+
// clangd should not write files to disk, including dependency files
206+
// requested on the command line.
207+
Cmd = tooling::getClangStripDependencyFileAdjuster()(Cmd, "");
208+
// Strip plugin related command line arguments. Clangd does
209+
// not support plugins currently. Therefore it breaks if
210+
// compiler tries to load plugins.
211+
Cmd = tooling::getStripPluginsAdjuster()(Cmd, "");
212+
Cmd = tooling::getClangSyntaxOnlyAdjuster()(Cmd, "");
211213

212214
std::vector<std::string> ToAppend;
213215
if (ResourceDir && !Has("-resource-dir"))
@@ -221,8 +223,8 @@ void CommandMangler::adjust(std::vector<std::string> &Cmd) const {
221223
}
222224

223225
if (!ToAppend.empty()) {
224-
Cmd.insert(llvm::find(Cmd, "--"), std::make_move_iterator(ToAppend.begin()),
225-
std::make_move_iterator(ToAppend.end()));
226+
Cmd = tooling::getInsertArgumentAdjuster(
227+
std::move(ToAppend), tooling::ArgumentInsertPosition::END)(Cmd, "");
226228
}
227229

228230
if (!Cmd.empty()) {

clang-tools-extra/clangd/CompileCommands.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ namespace clangd {
2525
// - forcing the use of clangd's builtin headers rather than clang's
2626
// - resolving argv0 as cc1 expects
2727
// - injecting -isysroot flags on mac as the system clang does
28-
// FIXME: This is currently not used in all code paths that create invocations.
29-
// Make use of these adjusters and buildCompilerInvocation in clangd-indexer as
30-
// well. It should be possible to hook it up by overriding RunInvocation in
31-
// FrontendActionFactory.
3228
struct CommandMangler {
3329
// Absolute path to clang.
3430
llvm::Optional<std::string> ClangPath;

clang-tools-extra/clangd/Compiler.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ buildCompilerInvocation(const ParseInputs &Inputs, clang::DiagnosticConsumer &D,
6464
// our compiler invocation set-up doesn't seem to work with it (leading
6565
// assertions in VerifyDiagnosticConsumer).
6666
CI->getDiagnosticOpts().VerifyDiagnostics = false;
67-
CI->getDiagnosticOpts().ShowColors = false;
6867

6968
// Disable any dependency outputting, we don't want to generate files or write
7069
// to stdout/stderr.
@@ -91,12 +90,6 @@ buildCompilerInvocation(const ParseInputs &Inputs, clang::DiagnosticConsumer &D,
9190
CI->getHeaderSearchOpts().ModuleFormat =
9291
PCHContainerOperations().getRawReader().getFormat().str();
9392

94-
CI->getFrontendOpts().Plugins.clear();
95-
CI->getFrontendOpts().AddPluginActions.clear();
96-
CI->getFrontendOpts().PluginArgs.clear();
97-
CI->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
98-
CI->getFrontendOpts().ActionName.clear();
99-
10093
return CI;
10194
}
10295

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

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ TEST(CommandMangler, Everything) {
4141
Mangler.ClangPath = testPath("fake/clang");
4242
Mangler.ResourceDir = testPath("fake/resources");
4343
Mangler.Sysroot = testPath("fake/sysroot");
44-
std::vector<std::string> Cmd = {"clang++", "--", "foo.cc"};
44+
std::vector<std::string> Cmd = {"clang++", "-Xclang", "-load",
45+
"-Xclang", "plugin", "-MF",
46+
"dep", "--", "foo.cc"};
4547
Mangler.adjust(Cmd);
46-
EXPECT_THAT(Cmd, ElementsAre(testPath("fake/clang++"),
48+
EXPECT_THAT(Cmd, ElementsAre(testPath("fake/clang++"), "-fsyntax-only",
4749
"-resource-dir=" + testPath("fake/resources"),
4850
"-isysroot", testPath("fake/sysroot"), "--",
4951
"foo.cc"));
@@ -67,6 +69,38 @@ TEST(CommandMangler, Sysroot) {
6769
HasSubstr("-isysroot " + testPath("fake/sysroot")));
6870
}
6971

72+
TEST(CommandMangler, StripPlugins) {
73+
auto Mangler = CommandMangler::forTests();
74+
std::vector<std::string> Cmd = {"clang++", "-Xclang", "-load",
75+
"-Xclang", "plugin", "foo.cc"};
76+
Mangler.adjust(Cmd);
77+
for (const char* Stripped : {"-Xclang", "-load", "plugin"})
78+
EXPECT_THAT(Cmd, Not(Contains(Stripped)));
79+
}
80+
81+
TEST(CommandMangler, StripOutput) {
82+
auto Mangler = CommandMangler::forTests();
83+
std::vector<std::string> Cmd = {"clang++", "-MF", "dependency", "-c",
84+
"foo.cc"};
85+
Mangler.adjust(Cmd);
86+
for (const char* Stripped : {"-MF", "dependency"})
87+
EXPECT_THAT(Cmd, Not(Contains(Stripped)));
88+
}
89+
90+
TEST(CommandMangler, StripShowIncludes) {
91+
auto Mangler = CommandMangler::forTests();
92+
std::vector<std::string> Cmd = {"clang-cl", "/showIncludes", "foo.cc"};
93+
Mangler.adjust(Cmd);
94+
EXPECT_THAT(Cmd, Not(Contains("/showIncludes")));
95+
}
96+
97+
TEST(CommandMangler, StripShowIncludesUser) {
98+
auto Mangler = CommandMangler::forTests();
99+
std::vector<std::string> Cmd = {"clang-cl", "/showIncludes:user", "foo.cc"};
100+
Mangler.adjust(Cmd);
101+
EXPECT_THAT(Cmd, Not(Contains("/showIncludes:user")));
102+
}
103+
70104
TEST(CommandMangler, ClangPath) {
71105
auto Mangler = CommandMangler::forTests();
72106
Mangler.ClangPath = testPath("fake/clang");
@@ -171,7 +205,7 @@ TEST(CommandMangler, ConfigEdits) {
171205
Mangler.adjust(Cmd);
172206
}
173207
// Edits are applied in given order and before other mangling.
174-
EXPECT_THAT(Cmd, ElementsAre(_, "FOO.CC", "--hello"));
208+
EXPECT_THAT(Cmd, ElementsAre(_, "FOO.CC", "--hello", "-fsyntax-only"));
175209
}
176210

177211
static std::string strip(llvm::StringRef Arg, llvm::StringRef Argv) {

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

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
#include "Compiler.h"
1010
#include "TestTU.h"
11-
#include "clang/Frontend/DependencyOutputOptions.h"
12-
#include "clang/Frontend/FrontendOptions.h"
1311
#include "clang/Lex/PreprocessorOptions.h"
1412
#include "gmock/gmock.h"
1513
#include "gtest/gtest.h"
@@ -58,50 +56,6 @@ TEST(BuildCompilerInvocation, PragmaDebugCrash) {
5856
TU.build(); // no-crash
5957
}
6058

61-
TEST(BuildCompilerInvocation, DropsShowIncludes) {
62-
MockFS FS;
63-
IgnoreDiagnostics Diags;
64-
TestTU TU;
65-
66-
TU.ExtraArgs = {"-Xclang", "--show-includes"};
67-
EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
68-
->getDependencyOutputOpts()
69-
.ShowIncludesDest,
70-
ShowIncludesDestination::None);
71-
72-
TU.ExtraArgs = {"/showIncludes", "--driver-mode=cl"};
73-
EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
74-
->getDependencyOutputOpts()
75-
.ShowIncludesDest,
76-
ShowIncludesDestination::None);
77-
78-
TU.ExtraArgs = {"/showIncludes:user", "--driver-mode=cl"};
79-
EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
80-
->getDependencyOutputOpts()
81-
.ShowIncludesDest,
82-
ShowIncludesDestination::None);
83-
}
84-
85-
TEST(BuildCompilerInvocation, DropsPlugins) {
86-
MockFS FS;
87-
IgnoreDiagnostics Diags;
88-
TestTU TU;
89-
90-
TU.ExtraArgs = {"-Xclang", "-load",
91-
"-Xclang", "plugins.so",
92-
"-Xclang", "-plugin",
93-
"-Xclang", "my_plugin",
94-
"-Xclang", "-plugin-arg-my_plugin",
95-
"-Xclang", "foo=bar",
96-
"-Xclang", "-add-plugin",
97-
"-Xclang", "my_plugin2"};
98-
auto &Opts = buildCompilerInvocation(TU.inputs(FS), Diags)->getFrontendOpts();
99-
EXPECT_THAT(Opts.Plugins, IsEmpty());
100-
EXPECT_THAT(Opts.PluginArgs, IsEmpty());
101-
EXPECT_THAT(Opts.AddPluginActions, IsEmpty());
102-
EXPECT_EQ(Opts.ProgramAction, frontend::ActionKind::ParseSyntaxOnly);
103-
EXPECT_TRUE(Opts.ActionName.empty());
104-
}
10559
} // namespace
10660
} // namespace clangd
10761
} // namespace clang

0 commit comments

Comments
 (0)