blob: ce31b8e6949e6b0f1104337e724d2c42aa6819fb [file] [log] [blame]
Daniel Dunbar1eb4e642009-03-03 05:55:11 +00001//===--- Option.cpp - Abstract Driver Options ---------------------------*-===//
2//
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#include "clang/Driver/Option.h"
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +000011#include "llvm/Support/raw_ostream.h"
Daniel Dunbar1eb4e642009-03-03 05:55:11 +000012#include <cassert>
13using namespace clang;
14using namespace clang::driver;
15
16Option::Option(OptionClass _Kind, const char *_Name,
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +000017 const OptionGroup *_Group, const Option *_Alias)
Daniel Dunbar1eb4e642009-03-03 05:55:11 +000018 : Kind(_Kind), Name(_Name), Group(_Group), Alias(_Alias) {
19
20 // Multi-level aliases are not supported, and alias options cannot
21 // have groups. This just simplifies option tracking, it is not an
22 // inherent limitation.
23 assert((!Alias || (!Alias->Alias && !Group)) &&
24 "Multi-level aliases and aliases with groups are unsupported.");
25}
26
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +000027Option::~Option() {
28}
29
30void Option::dump() const {
31 llvm::errs() << "<";
32 switch (Kind) {
33 default:
34 assert(0 && "Invalid kind");
35#define P(N) case N: llvm::errs() << #N; break
36 P(GroupClass);
37 P(InputClass);
38 P(UnknownClass);
39 P(FlagClass);
40 P(JoinedClass);
41 P(SeparateClass);
42 P(CommaJoinedClass);
43 P(MultiArgClass);
44 P(JoinedOrSeparateClass);
45 P(JoinedAndSeparateClass);
46#undef P
47 }
48
49 llvm::errs() << " Name:\"" << Name << '"';
50
51 if (Group) {
52 llvm::errs() << " Group:";
53 Group->dump();
54 }
55
56 if (Alias) {
57 llvm::errs() << " Alias:";
58 Alias->dump();
59 }
60
61 if (const MultiArgOption *MOA = dyn_cast<MultiArgOption>(this))
62 llvm::errs() << " NumArgs:" << MOA->getNumArgs();
63
64 llvm::errs() << ">\n";
65}
66
Daniel Dunbar1eb4e642009-03-03 05:55:11 +000067bool Option::matches(const Option *Opt) const {
68 // Aliases are never considered in matching.
69 if (Opt->getAlias())
70 return matches(Opt->getAlias());
71 if (Alias)
72 return Alias->matches(Opt);
73
74 if (this == Opt)
75 return true;
76
77 if (Group)
78 return Group->matches(Opt);
79 return false;
80}
81
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +000082OptionGroup::OptionGroup(const char *Name, const OptionGroup *Group)
83 : Option(Option::GroupClass, Name, Group, 0) {
84}
85
86Arg *OptionGroup::accept(ArgList &Args, unsigned Index) const {
87 assert(0 && "FIXME");
88 return 0;
Daniel Dunbar1eb4e642009-03-03 05:55:11 +000089}
90
91InputOption::InputOption()
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +000092 : Option(Option::InputClass, "<input>", 0, 0) {
93}
94
95Arg *InputOption::accept(ArgList &Args, unsigned Index) const {
96 assert(0 && "FIXME");
97 return 0;
Daniel Dunbar1eb4e642009-03-03 05:55:11 +000098}
99
100UnknownOption::UnknownOption()
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000101 : Option(Option::UnknownClass, "<unknown>", 0, 0) {
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000102}
103
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000104Arg *UnknownOption::accept(ArgList &Args, unsigned Index) const {
105 assert(0 && "FIXME");
106 return 0;
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000107}
108
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000109FlagOption::FlagOption(const char *Name, const OptionGroup *Group,
110 const Option *Alias)
111 : Option(Option::FlagClass, Name, Group, Alias) {
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000112}
113
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000114Arg *FlagOption::accept(ArgList &Args, unsigned Index) const {
115 assert(0 && "FIXME");
116 return 0;
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000117}
118
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000119JoinedOption::JoinedOption(const char *Name, const OptionGroup *Group,
120 const Option *Alias)
121 : Option(Option::JoinedClass, Name, Group, Alias) {
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000122}
123
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000124Arg *JoinedOption::accept(ArgList &Args, unsigned Index) const {
125 assert(0 && "FIXME");
126 return 0;
127}
128
129CommaJoinedOption::CommaJoinedOption(const char *Name, const OptionGroup *Group,
130 const Option *Alias)
131 : Option(Option::CommaJoinedClass, Name, Group, Alias) {
132}
133
134Arg *CommaJoinedOption::accept(ArgList &Args, unsigned Index) const {
135 assert(0 && "FIXME");
136 return 0;
137}
138
139SeparateOption::SeparateOption(const char *Name, const OptionGroup *Group,
140 const Option *Alias)
141 : Option(Option::SeparateClass, Name, Group, Alias) {
142}
143
144Arg *SeparateOption::accept(ArgList &Args, unsigned Index) const {
145 assert(0 && "FIXME");
146 return 0;
147}
148
149MultiArgOption::MultiArgOption(const char *Name, const OptionGroup *Group,
150 const Option *Alias, unsigned _NumArgs)
151 : Option(Option::MultiArgClass, Name, Group, Alias), NumArgs(_NumArgs) {
152}
153
154Arg *MultiArgOption::accept(ArgList &Args, unsigned Index) const {
155 assert(0 && "FIXME");
156 return 0;
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000157}
158
159JoinedOrSeparateOption::JoinedOrSeparateOption(const char *Name,
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000160 const OptionGroup *Group,
161 const Option *Alias)
162 : Option(Option::JoinedOrSeparateClass, Name, Group, Alias) {
163}
164
165Arg *JoinedOrSeparateOption::accept(ArgList &Args, unsigned Index) const {
166 assert(0 && "FIXME");
167 return 0;
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000168}
169
170JoinedAndSeparateOption::JoinedAndSeparateOption(const char *Name,
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000171 const OptionGroup *Group,
172 const Option *Alias)
173 : Option(Option::JoinedAndSeparateClass, Name, Group, Alias) {
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000174}
175
Daniel Dunbar2c6f6f32009-03-04 08:33:23 +0000176Arg *JoinedAndSeparateOption::accept(ArgList &Args, unsigned Index) const {
177 assert(0 && "FIXME");
178 return 0;
179}
Daniel Dunbar1eb4e642009-03-03 05:55:11 +0000180