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