xref: /aosp_15_r20/external/clang/lib/Tooling/ArgumentsAdjusters.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- ArgumentsAdjusters.cpp - Command line arguments adjuster ---------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file contains definitions of classes which implement ArgumentsAdjuster
11*67e74705SXin Li // interface.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li 
15*67e74705SXin Li #include "clang/Tooling/ArgumentsAdjusters.h"
16*67e74705SXin Li 
17*67e74705SXin Li namespace clang {
18*67e74705SXin Li namespace tooling {
19*67e74705SXin Li 
20*67e74705SXin Li /// Add -fsyntax-only option to the commnand line arguments.
getClangSyntaxOnlyAdjuster()21*67e74705SXin Li ArgumentsAdjuster getClangSyntaxOnlyAdjuster() {
22*67e74705SXin Li   return [](const CommandLineArguments &Args, StringRef /*unused*/) {
23*67e74705SXin Li     CommandLineArguments AdjustedArgs;
24*67e74705SXin Li     for (size_t i = 0, e = Args.size(); i != e; ++i) {
25*67e74705SXin Li       StringRef Arg = Args[i];
26*67e74705SXin Li       // FIXME: Remove options that generate output.
27*67e74705SXin Li       if (!Arg.startswith("-fcolor-diagnostics") &&
28*67e74705SXin Li           !Arg.startswith("-fdiagnostics-color"))
29*67e74705SXin Li         AdjustedArgs.push_back(Args[i]);
30*67e74705SXin Li     }
31*67e74705SXin Li     AdjustedArgs.push_back("-fsyntax-only");
32*67e74705SXin Li     return AdjustedArgs;
33*67e74705SXin Li   };
34*67e74705SXin Li }
35*67e74705SXin Li 
getClangStripOutputAdjuster()36*67e74705SXin Li ArgumentsAdjuster getClangStripOutputAdjuster() {
37*67e74705SXin Li   return [](const CommandLineArguments &Args, StringRef /*unused*/) {
38*67e74705SXin Li     CommandLineArguments AdjustedArgs;
39*67e74705SXin Li     for (size_t i = 0, e = Args.size(); i < e; ++i) {
40*67e74705SXin Li       StringRef Arg = Args[i];
41*67e74705SXin Li       if (!Arg.startswith("-o"))
42*67e74705SXin Li         AdjustedArgs.push_back(Args[i]);
43*67e74705SXin Li 
44*67e74705SXin Li       if (Arg == "-o") {
45*67e74705SXin Li         // Output is specified as -o foo. Skip the next argument also.
46*67e74705SXin Li         ++i;
47*67e74705SXin Li       }
48*67e74705SXin Li       // Else, the output is specified as -ofoo. Just do nothing.
49*67e74705SXin Li     }
50*67e74705SXin Li     return AdjustedArgs;
51*67e74705SXin Li   };
52*67e74705SXin Li }
53*67e74705SXin Li 
getInsertArgumentAdjuster(const CommandLineArguments & Extra,ArgumentInsertPosition Pos)54*67e74705SXin Li ArgumentsAdjuster getInsertArgumentAdjuster(const CommandLineArguments &Extra,
55*67e74705SXin Li                                             ArgumentInsertPosition Pos) {
56*67e74705SXin Li   return [Extra, Pos](const CommandLineArguments &Args, StringRef /*unused*/) {
57*67e74705SXin Li     CommandLineArguments Return(Args);
58*67e74705SXin Li 
59*67e74705SXin Li     CommandLineArguments::iterator I;
60*67e74705SXin Li     if (Pos == ArgumentInsertPosition::END) {
61*67e74705SXin Li       I = Return.end();
62*67e74705SXin Li     } else {
63*67e74705SXin Li       I = Return.begin();
64*67e74705SXin Li       ++I; // To leave the program name in place
65*67e74705SXin Li     }
66*67e74705SXin Li 
67*67e74705SXin Li     Return.insert(I, Extra.begin(), Extra.end());
68*67e74705SXin Li     return Return;
69*67e74705SXin Li   };
70*67e74705SXin Li }
71*67e74705SXin Li 
getInsertArgumentAdjuster(const char * Extra,ArgumentInsertPosition Pos)72*67e74705SXin Li ArgumentsAdjuster getInsertArgumentAdjuster(const char *Extra,
73*67e74705SXin Li                                             ArgumentInsertPosition Pos) {
74*67e74705SXin Li   return getInsertArgumentAdjuster(CommandLineArguments(1, Extra), Pos);
75*67e74705SXin Li }
76*67e74705SXin Li 
combineAdjusters(ArgumentsAdjuster First,ArgumentsAdjuster Second)77*67e74705SXin Li ArgumentsAdjuster combineAdjusters(ArgumentsAdjuster First,
78*67e74705SXin Li                                    ArgumentsAdjuster Second) {
79*67e74705SXin Li   return [First, Second](const CommandLineArguments &Args, StringRef File) {
80*67e74705SXin Li     return Second(First(Args, File), File);
81*67e74705SXin Li   };
82*67e74705SXin Li }
83*67e74705SXin Li 
84*67e74705SXin Li } // end namespace tooling
85*67e74705SXin Li } // end namespace clang
86*67e74705SXin Li 
87