diff --git a/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp b/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp --- a/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp +++ b/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp @@ -79,6 +79,20 @@ EXPECT_THAT(Cmd, Not(Contains(Stripped))); } +TEST(CommandMangler, StripShowIncludes) { + auto Mangler = CommandMangler::forTests(); + std::vector Cmd = {"clang-cl", "/showIncludes", "foo.cc"}; + Mangler.adjust(Cmd); + EXPECT_THAT(Cmd, Not(Contains("/showIncludes"))); +} + +TEST(CommandMangler, StripShowIncludesUser) { + auto Mangler = CommandMangler::forTests(); + std::vector Cmd = {"clang-cl", "/showIncludes:user", "foo.cc"}; + Mangler.adjust(Cmd); + EXPECT_THAT(Cmd, Not(Contains("/showIncludes:user"))); +} + TEST(CommandMangler, ClangPath) { auto Mangler = CommandMangler::forTests(); Mangler.ClangPath = testPath("fake/clang"); diff --git a/clang/lib/Tooling/ArgumentsAdjusters.cpp b/clang/lib/Tooling/ArgumentsAdjusters.cpp --- a/clang/lib/Tooling/ArgumentsAdjusters.cpp +++ b/clang/lib/Tooling/ArgumentsAdjusters.cpp @@ -98,7 +98,7 @@ StringRef Arg = Args[i]; // All dependency-file options begin with -M. These include -MM, // -MF, -MG, -MP, -MT, -MQ, -MD, and -MMD. - if (!Arg.startswith("-M")) { + if (!Arg.startswith("-M") && !Arg.startswith("/showIncludes")) { AdjustedArgs.push_back(Args[i]); continue; } diff --git a/clang/unittests/Tooling/ToolingTest.cpp b/clang/unittests/Tooling/ToolingTest.cpp --- a/clang/unittests/Tooling/ToolingTest.cpp +++ b/clang/unittests/Tooling/ToolingTest.cpp @@ -530,6 +530,62 @@ EXPECT_TRUE(HasFlag("-w")); } +// Check getClangStripDependencyFileAdjuster strips /showIncludes +TEST(ClangToolTest, StripDependencyFileAdjusterShowIncludes) { + FixedCompilationDatabase Compilations("/", {"/showIncludes", "-c"}); + + ClangTool Tool(Compilations, std::vector(1, "/a.cc")); + Tool.mapVirtualFile("/a.cc", "void a() {}"); + + std::unique_ptr Action( + newFrontendActionFactory()); + + CommandLineArguments FinalArgs; + ArgumentsAdjuster CheckFlagsAdjuster = + [&FinalArgs](const CommandLineArguments &Args, StringRef /*unused*/) { + FinalArgs = Args; + return Args; + }; + Tool.clearArgumentsAdjusters(); + Tool.appendArgumentsAdjuster(getClangStripDependencyFileAdjuster()); + Tool.appendArgumentsAdjuster(CheckFlagsAdjuster); + Tool.run(Action.get()); + + auto HasFlag = [&FinalArgs](const std::string &Flag) { + return llvm::find(FinalArgs, Flag) != FinalArgs.end(); + }; + EXPECT_FALSE(HasFlag("/showIncludes")); + EXPECT_TRUE(HasFlag("-c")); +} + +// Check getClangStripDependencyFileAdjuster strips /showIncludes:user +TEST(ClangToolTest, StripDependencyFileAdjusterShowIncludesUser) { + FixedCompilationDatabase Compilations("/", {"/showIncludes:user", "-c"}); + + ClangTool Tool(Compilations, std::vector(1, "/a.cc")); + Tool.mapVirtualFile("/a.cc", "void a() {}"); + + std::unique_ptr Action( + newFrontendActionFactory()); + + CommandLineArguments FinalArgs; + ArgumentsAdjuster CheckFlagsAdjuster = + [&FinalArgs](const CommandLineArguments &Args, StringRef /*unused*/) { + FinalArgs = Args; + return Args; + }; + Tool.clearArgumentsAdjusters(); + Tool.appendArgumentsAdjuster(getClangStripDependencyFileAdjuster()); + Tool.appendArgumentsAdjuster(CheckFlagsAdjuster); + Tool.run(Action.get()); + + auto HasFlag = [&FinalArgs](const std::string &Flag) { + return llvm::find(FinalArgs, Flag) != FinalArgs.end(); + }; + EXPECT_FALSE(HasFlag("/showIncludes:user")); + EXPECT_TRUE(HasFlag("-c")); +} + // Check getClangStripPluginsAdjuster strips plugin related args. TEST(ClangToolTest, StripPluginsAdjuster) { FixedCompilationDatabase Compilations(