Option.h revision d35e63106d7b4b76275c85c88ee715c4356f2a6b
11eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//===--- Option.h - Abstract Driver Options ---------------------*- C++ -*-===// 21eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// 31eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// The LLVM Compiler Infrastructure 41eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// 51eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// This file is distributed under the University of Illinois Open Source 61eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// License. See LICENSE.TXT for details. 71eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// 81eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//===----------------------------------------------------------------------===// 91eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#ifndef CLANG_DRIVER_OPTION_H_ 111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#define CLANG_DRIVER_OPTION_H_ 121eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 131eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace clang { 141eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace driver { 151eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class Arg; 161eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class ArgList; 171eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class OptionGroup; 181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 191eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// Option - Abstract representation for a single form of driver 201eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// argument. 211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// 221eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// An Option class represents a form of option that the driver 231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// takes, for example how many arguments the option has and how 241eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// they can be provided. Individual option instances store 251eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// additional information about what group the option is a member 261eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// of (if any), if the option is an alias, and a number of 271eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// flags. At runtime the driver parses the command line into 281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// concrete Arg instances, each of which corresponds to a 291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// particular Option instance. 301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class Option { 311eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar enum OptionClass { 331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar GroupOption = 0, 341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar InputOption, 351eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar UnknownOption, 361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar FlagOption, 371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar JoinedOption, 381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar SeparateOption, 391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar CommaJoinedOption, 401eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar MultiArgOption, 411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar JoinedOrSeparateOption, 421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar JoinedAndSeparateOption 431eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 441eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 451eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar private: 461eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar OptionClass Kind; 471eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 481eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// The option name. 491eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const char *Name; 501eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 511eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// Group this option is a member of, if any. 521eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const OptionGroup *Group; 531eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 541eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// Option that this is an alias for, if any. 551eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const Option *Alias; 561eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 571eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar protected: 581eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar Option(OptionClass Kind, const char *Name, 591eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar OptionGroup *Group, Option *Alias); 60d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar public: 61d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar virtual ~Option(); 621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 631eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar OptionClass getKind() const { return Kind; } 641eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const char *getName() const { return Name; } 651eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const OptionGroup *getGroup() const { return Group; } 661eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const Option *getAlias() const { return Alias; } 671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// getUnaliasedOption - Return the final option this option 691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// aliases (itself, if the option has no alias). 701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const Option *getUnaliasedOption() const { 711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar if (Alias) return Alias->getUnaliasedOption(); 721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar return this; 731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar } 741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// getRenderName - Return the name to use when rendering this 761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// option. 771eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const char *getRenderName() const { 781eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar return getUnaliasedOption()->getName(); 791eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar } 801eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 811eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// matches - Predicate for whether this option is part of the 821eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// given option (which may be a group). 831eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar bool matches(const Option *Opt) const; 841eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 851eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// accept - Potentially accept the current argument, returning a 861eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// new Arg instance, or 0 if the option does not accept this 871eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// argument. 881eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// 891eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// May issue a missing argument error. 901eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const = 0; 911eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 921eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 931eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// OptionGroup - A set of options which are can be handled uniformly 941eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// by the driver. 951eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class OptionGroup : public Option { 961eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar OptionGroup *Group; 971eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 981eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 991eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar OptionGroup(const char *Name, OptionGroup *Group); 1001eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1011eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1021eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1031eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar // Dummy option classes. 1051eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// InputOption - Dummy option class for representing driver inputs. 1071eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class InputOption : public Option { 1081eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 1091eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar InputOption(); 1101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1121eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1131eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1141eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// UnknownOption - Dummy option class for represent unknown arguments. 1151eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class UnknownOption : public Option { 1161eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 1171eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar UnknownOption(); 1181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1191eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1201eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1221eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar // Normal options. 1231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1241eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class FlagOption : public Option { 1251eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 1261eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar FlagOption(const char *Name, OptionGroup *Group, Option *Alias); 1271eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1311eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class JoinedOption : public Option { 1321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar JoinedOption(const char *Name, OptionGroup *Group, Option *Alias); 1331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1351eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class CommaJoinedOption : public Option { 1381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar CommaJoinedOption(const char *Name, OptionGroup *Group, Option *Alias); 1391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1401eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1431eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class SeparateOption : public Option { 1441eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar SeparateOption(const char *Name, OptionGroup *Group, Option *Alias); 1451eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1461eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1471eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1481eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1491eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// MultiArgOption - An option which takes multiple arguments (these 1501eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// are always separate arguments). 1511eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class MultiArgOption : public Option { 1521eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar unsigned NumArgs; 1531eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1541eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 1551eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar MultiArgOption(const char *Name, OptionGroup *Group, Option *Alias, 1561eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar unsigned NumArgs); 1571eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1581eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar unsigned getNumArgs() const { return NumArgs; } 1591eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1601eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1611eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1631eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// JoinedOrSeparateOption - An option which either literally 1641eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// prefixes its (non-empty) value, or is follwed by a value. 1651eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class JoinedOrSeparateOption : public Option { 1661eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar JoinedOrSeparateOption(const char *Name, OptionGroup *Group, Option *Alias); 1671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// JoinedAndSeparateOption - An option which literally prefixes its 1721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// value and is followed by another value. 1731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class JoinedAndSeparateOption : public Option { 1741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar JoinedAndSeparateOption(const char *Name, OptionGroup *Group, Option *Alias); 1751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar virtual Arg *accept(ArgList &Args, unsigned Index) const; 1771eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1781eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1791eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace driver 1801eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace clang 1811eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1821eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#endif 183