forked from OSchip/llvm-project
[clangd] Strip /showIncludes in clangd compile commands
In command lines with /showIncludes, clangd would output includes to stdout, breaking clients. Summary: Fixes https://github.com/clangd/clangd/issues/322. Reviewers: sammccall, kadircet Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D78836
This commit is contained in:
parent
8ba36497dd
commit
8000d506af
|
@ -79,6 +79,20 @@ TEST(CommandMangler, StripOutput) {
|
||||||
EXPECT_THAT(Cmd, Not(Contains(Stripped)));
|
EXPECT_THAT(Cmd, Not(Contains(Stripped)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(CommandMangler, StripShowIncludes) {
|
||||||
|
auto Mangler = CommandMangler::forTests();
|
||||||
|
std::vector<std::string> Cmd = {"clang-cl", "/showIncludes", "foo.cc"};
|
||||||
|
Mangler.adjust(Cmd);
|
||||||
|
EXPECT_THAT(Cmd, Not(Contains("/showIncludes")));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CommandMangler, StripShowIncludesUser) {
|
||||||
|
auto Mangler = CommandMangler::forTests();
|
||||||
|
std::vector<std::string> Cmd = {"clang-cl", "/showIncludes:user", "foo.cc"};
|
||||||
|
Mangler.adjust(Cmd);
|
||||||
|
EXPECT_THAT(Cmd, Not(Contains("/showIncludes:user")));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(CommandMangler, ClangPath) {
|
TEST(CommandMangler, ClangPath) {
|
||||||
auto Mangler = CommandMangler::forTests();
|
auto Mangler = CommandMangler::forTests();
|
||||||
Mangler.ClangPath = testPath("fake/clang");
|
Mangler.ClangPath = testPath("fake/clang");
|
||||||
|
|
|
@ -98,7 +98,7 @@ ArgumentsAdjuster getClangStripDependencyFileAdjuster() {
|
||||||
StringRef Arg = Args[i];
|
StringRef Arg = Args[i];
|
||||||
// All dependency-file options begin with -M. These include -MM,
|
// All dependency-file options begin with -M. These include -MM,
|
||||||
// -MF, -MG, -MP, -MT, -MQ, -MD, and -MMD.
|
// -MF, -MG, -MP, -MT, -MQ, -MD, and -MMD.
|
||||||
if (!Arg.startswith("-M")) {
|
if (!Arg.startswith("-M") && !Arg.startswith("/showIncludes")) {
|
||||||
AdjustedArgs.push_back(Args[i]);
|
AdjustedArgs.push_back(Args[i]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -530,6 +530,62 @@ TEST(ClangToolTest, StripDependencyFileAdjuster) {
|
||||||
EXPECT_TRUE(HasFlag("-w"));
|
EXPECT_TRUE(HasFlag("-w"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check getClangStripDependencyFileAdjuster strips /showIncludes
|
||||||
|
TEST(ClangToolTest, StripDependencyFileAdjusterShowIncludes) {
|
||||||
|
FixedCompilationDatabase Compilations("/", {"/showIncludes", "-c"});
|
||||||
|
|
||||||
|
ClangTool Tool(Compilations, std::vector<std::string>(1, "/a.cc"));
|
||||||
|
Tool.mapVirtualFile("/a.cc", "void a() {}");
|
||||||
|
|
||||||
|
std::unique_ptr<FrontendActionFactory> Action(
|
||||||
|
newFrontendActionFactory<SyntaxOnlyAction>());
|
||||||
|
|
||||||
|
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<std::string>(1, "/a.cc"));
|
||||||
|
Tool.mapVirtualFile("/a.cc", "void a() {}");
|
||||||
|
|
||||||
|
std::unique_ptr<FrontendActionFactory> Action(
|
||||||
|
newFrontendActionFactory<SyntaxOnlyAction>());
|
||||||
|
|
||||||
|
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.
|
// Check getClangStripPluginsAdjuster strips plugin related args.
|
||||||
TEST(ClangToolTest, StripPluginsAdjuster) {
|
TEST(ClangToolTest, StripPluginsAdjuster) {
|
||||||
FixedCompilationDatabase Compilations(
|
FixedCompilationDatabase Compilations(
|
||||||
|
|
Loading…
Reference in New Issue