1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | #include "clang/Tooling/ArgumentsAdjusters.h" |
15 | #include "clang/Basic/LLVM.h" |
16 | #include "llvm/ADT/StringRef.h" |
17 | #include <cstddef> |
18 | |
19 | namespace clang { |
20 | namespace tooling { |
21 | |
22 | |
23 | ArgumentsAdjuster getClangSyntaxOnlyAdjuster() { |
24 | return [](const CommandLineArguments &Args, StringRef ) { |
25 | CommandLineArguments AdjustedArgs; |
26 | for (size_t i = 0, e = Args.size(); i < e; ++i) { |
27 | StringRef Arg = Args[i]; |
28 | |
29 | if (!Arg.startswith("-fcolor-diagnostics") && |
30 | !Arg.startswith("-fdiagnostics-color")) |
31 | AdjustedArgs.push_back(Args[i]); |
32 | } |
33 | AdjustedArgs.push_back("-fsyntax-only"); |
34 | return AdjustedArgs; |
35 | }; |
36 | } |
37 | |
38 | ArgumentsAdjuster getClangStripOutputAdjuster() { |
39 | return [](const CommandLineArguments &Args, StringRef ) { |
40 | CommandLineArguments AdjustedArgs; |
41 | for (size_t i = 0, e = Args.size(); i < e; ++i) { |
42 | StringRef Arg = Args[i]; |
43 | if (!Arg.startswith("-o")) |
44 | AdjustedArgs.push_back(Args[i]); |
45 | |
46 | if (Arg == "-o") { |
47 | |
48 | ++i; |
49 | } |
50 | |
51 | } |
52 | return AdjustedArgs; |
53 | }; |
54 | } |
55 | |
56 | ArgumentsAdjuster getClangStripDependencyFileAdjuster() { |
57 | return [](const CommandLineArguments &Args, StringRef ) { |
58 | CommandLineArguments AdjustedArgs; |
59 | for (size_t i = 0, e = Args.size(); i < e; ++i) { |
60 | StringRef Arg = Args[i]; |
61 | |
62 | |
63 | if (!Arg.startswith("-M")) { |
64 | AdjustedArgs.push_back(Args[i]); |
65 | continue; |
66 | } |
67 | |
68 | if (Arg == "-MF" || Arg == "-MT" || Arg == "-MQ") |
69 | |
70 | ++i; |
71 | } |
72 | return AdjustedArgs; |
73 | }; |
74 | } |
75 | |
76 | ArgumentsAdjuster getInsertArgumentAdjuster(const CommandLineArguments &, |
77 | ArgumentInsertPosition Pos) { |
78 | return [Extra, Pos](const CommandLineArguments &Args, StringRef ) { |
79 | CommandLineArguments Return(Args); |
80 | |
81 | CommandLineArguments::iterator I; |
82 | if (Pos == ArgumentInsertPosition::END) { |
83 | I = Return.end(); |
84 | } else { |
85 | I = Return.begin(); |
86 | ++I; |
87 | } |
88 | |
89 | Return.insert(I, Extra.begin(), Extra.end()); |
90 | return Return; |
91 | }; |
92 | } |
93 | |
94 | ArgumentsAdjuster getInsertArgumentAdjuster(const char *, |
95 | ArgumentInsertPosition Pos) { |
96 | return getInsertArgumentAdjuster(CommandLineArguments(1, Extra), Pos); |
97 | } |
98 | |
99 | ArgumentsAdjuster combineAdjusters(ArgumentsAdjuster First, |
100 | ArgumentsAdjuster Second) { |
101 | if (!First) |
102 | return Second; |
103 | if (!Second) |
104 | return First; |
105 | return [First, Second](const CommandLineArguments &Args, StringRef File) { |
106 | return Second(First(Args, File), File); |
107 | }; |
108 | } |
109 | |
110 | ArgumentsAdjuster getStripPluginsAdjuster() { |
111 | return [](const CommandLineArguments &Args, StringRef ) { |
112 | CommandLineArguments AdjustedArgs; |
113 | for (size_t I = 0, E = Args.size(); I != E; I++) { |
114 | |
115 | |
116 | |
117 | |
118 | if (I + 4 < E && Args[I] == "-Xclang" && |
119 | (Args[I + 1] == "-load" || Args[I + 1] == "-plugin" || |
120 | llvm::StringRef(Args[I + 1]).startswith("-plugin-arg-") || |
121 | Args[I + 1] == "-add-plugin") && |
122 | Args[I + 2] == "-Xclang") { |
123 | I += 3; |
124 | continue; |
125 | } |
126 | AdjustedArgs.push_back(Args[I]); |
127 | } |
128 | return AdjustedArgs; |
129 | }; |
130 | } |
131 | |
132 | } |
133 | } |
134 | |