blob: c8e9c167422e800ad80a4841217bc99f92cbc0a4 [file] [log] [blame]
Eugene Zelenko6366efe2018-03-14 21:05:51 +00001//===- ArgumentsAdjusters.cpp - Command line arguments adjuster -----------===//
Simon Atanasyan32df72d2012-05-09 16:18:30 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains definitions of classes which implement ArgumentsAdjuster
11// interface.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Tooling/ArgumentsAdjusters.h"
Eugene Zelenko6366efe2018-03-14 21:05:51 +000016#include "clang/Basic/LLVM.h"
17#include "llvm/ADT/StringRef.h"
18#include <cstddef>
Simon Atanasyan32df72d2012-05-09 16:18:30 +000019
20namespace clang {
21namespace tooling {
22
Joerg Sonnenberger92d91562016-11-25 20:15:57 +000023/// Add -fsyntax-only option to the command line arguments.
Alexander Kornienko74e1c462014-12-03 17:53:02 +000024ArgumentsAdjuster getClangSyntaxOnlyAdjuster() {
Alexander Kornienko857b10f2015-11-05 02:19:53 +000025 return [](const CommandLineArguments &Args, StringRef /*unused*/) {
Alexander Kornienko74e1c462014-12-03 17:53:02 +000026 CommandLineArguments AdjustedArgs;
Eugene Zelenko6366efe2018-03-14 21:05:51 +000027 for (size_t i = 0, e = Args.size(); i < e; ++i) {
Alexander Kornienko74e1c462014-12-03 17:53:02 +000028 StringRef Arg = Args[i];
29 // FIXME: Remove options that generate output.
30 if (!Arg.startswith("-fcolor-diagnostics") &&
31 !Arg.startswith("-fdiagnostics-color"))
32 AdjustedArgs.push_back(Args[i]);
Pavel Labathdee20c12013-06-06 11:52:19 +000033 }
Alexander Kornienko74e1c462014-12-03 17:53:02 +000034 AdjustedArgs.push_back("-fsyntax-only");
35 return AdjustedArgs;
36 };
Pavel Labathdee20c12013-06-06 11:52:19 +000037}
38
Alexander Kornienko74e1c462014-12-03 17:53:02 +000039ArgumentsAdjuster getClangStripOutputAdjuster() {
Alexander Kornienko857b10f2015-11-05 02:19:53 +000040 return [](const CommandLineArguments &Args, StringRef /*unused*/) {
Alexander Kornienko74e1c462014-12-03 17:53:02 +000041 CommandLineArguments AdjustedArgs;
42 for (size_t i = 0, e = Args.size(); i < e; ++i) {
43 StringRef Arg = Args[i];
44 if (!Arg.startswith("-o"))
45 AdjustedArgs.push_back(Args[i]);
Alexander Kornienko61686092014-11-04 08:51:24 +000046
Alexander Kornienko74e1c462014-12-03 17:53:02 +000047 if (Arg == "-o") {
Sterling Augustine1cda1d72017-07-06 21:02:52 +000048 // Output is specified as -o foo. Skip the next argument too.
Alexander Kornienko74e1c462014-12-03 17:53:02 +000049 ++i;
50 }
51 // Else, the output is specified as -ofoo. Just do nothing.
52 }
53 return AdjustedArgs;
54 };
55}
Alexander Kornienko61686092014-11-04 08:51:24 +000056
Sterling Augustine1cda1d72017-07-06 21:02:52 +000057ArgumentsAdjuster getClangStripDependencyFileAdjuster() {
58 return [](const CommandLineArguments &Args, StringRef /*unused*/) {
59 CommandLineArguments AdjustedArgs;
60 for (size_t i = 0, e = Args.size(); i < e; ++i) {
61 StringRef Arg = Args[i];
62 // All dependency-file options begin with -M. These include -MM,
63 // -MF, -MG, -MP, -MT, -MQ, -MD, and -MMD.
Dave Lee984964a2017-11-17 16:27:21 +000064 if (!Arg.startswith("-M")) {
Sterling Augustine1cda1d72017-07-06 21:02:52 +000065 AdjustedArgs.push_back(Args[i]);
Dave Lee984964a2017-11-17 16:27:21 +000066 continue;
Sterling Augustine1cda1d72017-07-06 21:02:52 +000067 }
Dave Lee984964a2017-11-17 16:27:21 +000068
69 if (Arg == "-MF" || Arg == "-MT" || Arg == "-MQ")
70 // These flags take an argument: -MX foo. Skip the next argument also.
71 ++i;
Sterling Augustine1cda1d72017-07-06 21:02:52 +000072 }
73 return AdjustedArgs;
74 };
75}
76
Alexander Kornienko74e1c462014-12-03 17:53:02 +000077ArgumentsAdjuster getInsertArgumentAdjuster(const CommandLineArguments &Extra,
78 ArgumentInsertPosition Pos) {
Alexander Kornienko857b10f2015-11-05 02:19:53 +000079 return [Extra, Pos](const CommandLineArguments &Args, StringRef /*unused*/) {
Alexander Kornienko74e1c462014-12-03 17:53:02 +000080 CommandLineArguments Return(Args);
81
82 CommandLineArguments::iterator I;
83 if (Pos == ArgumentInsertPosition::END) {
84 I = Return.end();
85 } else {
86 I = Return.begin();
87 ++I; // To leave the program name in place
88 }
89
90 Return.insert(I, Extra.begin(), Extra.end());
91 return Return;
92 };
93}
94
95ArgumentsAdjuster getInsertArgumentAdjuster(const char *Extra,
96 ArgumentInsertPosition Pos) {
97 return getInsertArgumentAdjuster(CommandLineArguments(1, Extra), Pos);
98}
99
100ArgumentsAdjuster combineAdjusters(ArgumentsAdjuster First,
101 ArgumentsAdjuster Second) {
Eric Liu826b7832017-10-26 10:38:14 +0000102 if (!First)
103 return Second;
104 if (!Second)
105 return First;
Alexander Kornienko857b10f2015-11-05 02:19:53 +0000106 return [First, Second](const CommandLineArguments &Args, StringRef File) {
107 return Second(First(Args, File), File);
Alexander Kornienkod1f1fa22015-01-16 15:57:15 +0000108 };
Alexander Kornienko61686092014-11-04 08:51:24 +0000109}
110
Simon Atanasyan32df72d2012-05-09 16:18:30 +0000111} // end namespace tooling
112} // end namespace clang