Skip to content

Commit 8000d50

Browse files
committed
[clangd] Strip /showIncludes in clangd compile commands
In command lines with /showIncludes, clangd would output includes to stdout, breaking clients. Summary: Fixes clangd/clangd#322. Reviewers: sammccall, kadircet Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D78836
1 parent 8ba3649 commit 8000d50

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,20 @@ TEST(CommandMangler, StripOutput) {
7979
EXPECT_THAT(Cmd, Not(Contains(Stripped)));
8080
}
8181

82+
TEST(CommandMangler, StripShowIncludes) {
83+
auto Mangler = CommandMangler::forTests();
84+
std::vector<std::string> Cmd = {"clang-cl", "/showIncludes", "foo.cc"};
85+
Mangler.adjust(Cmd);
86+
EXPECT_THAT(Cmd, Not(Contains("/showIncludes")));
87+
}
88+
89+
TEST(CommandMangler, StripShowIncludesUser) {
90+
auto Mangler = CommandMangler::forTests();
91+
std::vector<std::string> Cmd = {"clang-cl", "/showIncludes:user", "foo.cc"};
92+
Mangler.adjust(Cmd);
93+
EXPECT_THAT(Cmd, Not(Contains("/showIncludes:user")));
94+
}
95+
8296
TEST(CommandMangler, ClangPath) {
8397
auto Mangler = CommandMangler::forTests();
8498
Mangler.ClangPath = testPath("fake/clang");

clang/lib/Tooling/ArgumentsAdjusters.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ ArgumentsAdjuster getClangStripDependencyFileAdjuster() {
9898
StringRef Arg = Args[i];
9999
// All dependency-file options begin with -M. These include -MM,
100100
// -MF, -MG, -MP, -MT, -MQ, -MD, and -MMD.
101-
if (!Arg.startswith("-M")) {
101+
if (!Arg.startswith("-M") && !Arg.startswith("/showIncludes")) {
102102
AdjustedArgs.push_back(Args[i]);
103103
continue;
104104
}

clang/unittests/Tooling/ToolingTest.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,62 @@ TEST(ClangToolTest, StripDependencyFileAdjuster) {
530530
EXPECT_TRUE(HasFlag("-w"));
531531
}
532532

533+
// Check getClangStripDependencyFileAdjuster strips /showIncludes
534+
TEST(ClangToolTest, StripDependencyFileAdjusterShowIncludes) {
535+
FixedCompilationDatabase Compilations("/", {"/showIncludes", "-c"});
536+
537+
ClangTool Tool(Compilations, std::vector<std::string>(1, "/a.cc"));
538+
Tool.mapVirtualFile("/a.cc", "void a() {}");
539+
540+
std::unique_ptr<FrontendActionFactory> Action(
541+
newFrontendActionFactory<SyntaxOnlyAction>());
542+
543+
CommandLineArguments FinalArgs;
544+
ArgumentsAdjuster CheckFlagsAdjuster =
545+
[&FinalArgs](const CommandLineArguments &Args, StringRef /*unused*/) {
546+
FinalArgs = Args;
547+
return Args;
548+
};
549+
Tool.clearArgumentsAdjusters();
550+
Tool.appendArgumentsAdjuster(getClangStripDependencyFileAdjuster());
551+
Tool.appendArgumentsAdjuster(CheckFlagsAdjuster);
552+
Tool.run(Action.get());
553+
554+
auto HasFlag = [&FinalArgs](const std::string &Flag) {
555+
return llvm::find(FinalArgs, Flag) != FinalArgs.end();
556+
};
557+
EXPECT_FALSE(HasFlag("/showIncludes"));
558+
EXPECT_TRUE(HasFlag("-c"));
559+
}
560+
561+
// Check getClangStripDependencyFileAdjuster strips /showIncludes:user
562+
TEST(ClangToolTest, StripDependencyFileAdjusterShowIncludesUser) {
563+
FixedCompilationDatabase Compilations("/", {"/showIncludes:user", "-c"});
564+
565+
ClangTool Tool(Compilations, std::vector<std::string>(1, "/a.cc"));
566+
Tool.mapVirtualFile("/a.cc", "void a() {}");
567+
568+
std::unique_ptr<FrontendActionFactory> Action(
569+
newFrontendActionFactory<SyntaxOnlyAction>());
570+
571+
CommandLineArguments FinalArgs;
572+
ArgumentsAdjuster CheckFlagsAdjuster =
573+
[&FinalArgs](const CommandLineArguments &Args, StringRef /*unused*/) {
574+
FinalArgs = Args;
575+
return Args;
576+
};
577+
Tool.clearArgumentsAdjusters();
578+
Tool.appendArgumentsAdjuster(getClangStripDependencyFileAdjuster());
579+
Tool.appendArgumentsAdjuster(CheckFlagsAdjuster);
580+
Tool.run(Action.get());
581+
582+
auto HasFlag = [&FinalArgs](const std::string &Flag) {
583+
return llvm::find(FinalArgs, Flag) != FinalArgs.end();
584+
};
585+
EXPECT_FALSE(HasFlag("/showIncludes:user"));
586+
EXPECT_TRUE(HasFlag("-c"));
587+
}
588+
533589
// Check getClangStripPluginsAdjuster strips plugin related args.
534590
TEST(ClangToolTest, StripPluginsAdjuster) {
535591
FixedCompilationDatabase Compilations(

0 commit comments

Comments
 (0)