Skip to content

Commit 2eff821

Browse files
committedJan 18, 2019
[tooling] Add a new argument adjuster for deleting plugin related command line args
Summary: Currently both clangd and clang-tidy makes use of this mechanism so putting it into tooling so that all tools can make use of it. Reviewers: ilya-biryukov, sammccall Subscribers: ioeric, cfe-commits Differential Revision: https://reviews.llvm.org/D56856 llvm-svn: 351531
1 parent cec3809 commit 2eff821

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed
 

‎clang/include/clang/Tooling/ArgumentsAdjusters.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ ArgumentsAdjuster getInsertArgumentAdjuster(
6161
const char *Extra,
6262
ArgumentInsertPosition Pos = ArgumentInsertPosition::END);
6363

64+
/// Gets an argument adjuster which strips plugin related command line
65+
/// arguments.
66+
ArgumentsAdjuster getStripPluginsAdjuster();
67+
6468
/// Gets an argument adjuster which adjusts the arguments in sequence
6569
/// with the \p First adjuster and then with the \p Second one.
6670
ArgumentsAdjuster combineAdjusters(ArgumentsAdjuster First,

‎clang/lib/Tooling/ArgumentsAdjusters.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,27 @@ ArgumentsAdjuster combineAdjusters(ArgumentsAdjuster First,
108108
};
109109
}
110110

111+
ArgumentsAdjuster getStripPluginsAdjuster() {
112+
return [](const CommandLineArguments &Args, StringRef /*unused*/) {
113+
CommandLineArguments AdjustedArgs;
114+
for (size_t I = 0, E = Args.size(); I != E; I++) {
115+
// According to https://clang.llvm.org/docs/ClangPlugins.html
116+
// plugin arguments are in the form:
117+
// -Xclang {-load, -plugin, -plugin-arg-<plugin-name>, -add-plugin}
118+
// -Xclang <arbitrary-argument>
119+
if (I + 4 < E && Args[I] == "-Xclang" &&
120+
(Args[I + 1] == "-load" || Args[I + 1] == "-plugin" ||
121+
llvm::StringRef(Args[I + 1]).startswith("-plugin-arg-") ||
122+
Args[I + 1] == "-add-plugin") &&
123+
Args[I + 2] == "-Xclang") {
124+
I += 3;
125+
continue;
126+
}
127+
AdjustedArgs.push_back(Args[I]);
128+
}
129+
return AdjustedArgs;
130+
};
131+
}
132+
111133
} // end namespace tooling
112134
} // end namespace clang

‎clang/unittests/Tooling/ToolingTest.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,37 @@ TEST(ClangToolTest, StripDependencyFileAdjuster) {
450450
EXPECT_TRUE(HasFlag("-w"));
451451
}
452452

453+
// Check getClangStripPluginsAdjuster strips plugin related args.
454+
TEST(ClangToolTest, StripPluginsAdjuster) {
455+
FixedCompilationDatabase Compilations(
456+
"/", {"-Xclang", "-add-plugin", "-Xclang", "random-plugin"});
457+
458+
ClangTool Tool(Compilations, std::vector<std::string>(1, "/a.cc"));
459+
Tool.mapVirtualFile("/a.cc", "void a() {}");
460+
461+
std::unique_ptr<FrontendActionFactory> Action(
462+
newFrontendActionFactory<SyntaxOnlyAction>());
463+
464+
CommandLineArguments FinalArgs;
465+
ArgumentsAdjuster CheckFlagsAdjuster =
466+
[&FinalArgs](const CommandLineArguments &Args, StringRef /*unused*/) {
467+
FinalArgs = Args;
468+
return Args;
469+
};
470+
Tool.clearArgumentsAdjusters();
471+
Tool.appendArgumentsAdjuster(getStripPluginsAdjuster());
472+
Tool.appendArgumentsAdjuster(CheckFlagsAdjuster);
473+
Tool.run(Action.get());
474+
475+
auto HasFlag = [&FinalArgs](const std::string &Flag) {
476+
return std::find(FinalArgs.begin(), FinalArgs.end(), Flag) !=
477+
FinalArgs.end();
478+
};
479+
EXPECT_FALSE(HasFlag("-Xclang"));
480+
EXPECT_FALSE(HasFlag("-add-plugin"));
481+
EXPECT_FALSE(HasFlag("-random-plugin"));
482+
}
483+
453484
namespace {
454485
/// Find a target name such that looking for it in TargetRegistry by that name
455486
/// returns the same target. We expect that there is at least one target

0 commit comments

Comments
 (0)
Please sign in to comment.