Option.h revision bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2
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
139e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar#include "clang/Driver/OptSpecifier.h"
14bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor#include "llvm/ADT/StringRef.h"
152c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "llvm/Support/Casting.h"
162c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::isa;
172c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::cast;
182c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::cast_or_null;
192c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::dyn_cast;
202c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::dyn_cast_or_null;
212c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
221eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace clang {
231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace driver {
241eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class Arg;
25785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar  class ArgList;
261eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class OptionGroup;
271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// Option - Abstract representation for a single form of driver
291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// argument.
301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  ///
311eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// An Option class represents a form of option that the driver
321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// takes, for example how many arguments the option has and how
331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// they can be provided. Individual option instances store
341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// additional information about what group the option is a member
351eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// of (if any), if the option is an alias, and a number of
361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// flags. At runtime the driver parses the command line into
371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// concrete Arg instances, each of which corresponds to a
381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// particular Option instance.
391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class Option {
401eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    enum OptionClass {
422c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      GroupClass = 0,
432c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      InputClass,
442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      UnknownClass,
452c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      FlagClass,
462c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedClass,
472c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      SeparateClass,
482c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      CommaJoinedClass,
492c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      MultiArgClass,
502c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedOrSeparateClass,
512c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedAndSeparateClass
521eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    };
531eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
54e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    enum RenderStyleKind {
55e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderCommaJoinedStyle,
56e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderJoinedStyle,
57e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderSeparateStyle,
58e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderValuesStyle
59e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    };
60e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar
611eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  private:
621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    OptionClass Kind;
631eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
649e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    /// The option ID.
659e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    OptSpecifier ID;
6630b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar
671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// The option name.
68bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor    llvm::StringRef Name;
691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// Group this option is a member of, if any.
711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const OptionGroup *Group;
721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// Option that this is an alias for, if any.
741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const Option *Alias;
751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
76e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    /// Unsupported options will be rejected.
770f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool Unsupported : 1;
780f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
790f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    /// Treat this option like a linker input?
800f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool LinkerInput : 1;
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
820f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    /// When rendering as an input, don't render the option.
830f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
840f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    // FIXME: We should ditch the render/renderAsInput distinction.
850f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool NoOptAsInput : 1;
860f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
87e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    /// The style to using when rendering arguments parsed by this option.
88e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    unsigned RenderStyle : 2;
890f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
901e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    /// This option is only consumed by the driver.
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool DriverOption : 1;
926d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar
931e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    /// This option should not report argument unused errors.
941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool NoArgumentUnused : 1;
951e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
96caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    /// This option should not be implicitly forwarded.
97caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    bool NoForward : 1;
98caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar
991eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  protected:
1009e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    Option(OptionClass Kind, OptSpecifier ID, const char *Name,
1012c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar           const OptionGroup *Group, const Option *Alias);
102d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar  public:
103d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar    virtual ~Option();
1041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1059e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    unsigned getID() const { return ID.getID(); }
1061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    OptionClass getKind() const { return Kind; }
107bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor    llvm::StringRef getName() const { return Name; }
1081eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const OptionGroup *getGroup() const { return Group; }
1091eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const Option *getAlias() const { return Alias; }
1101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1110f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool isUnsupported() const { return Unsupported; }
1120f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setUnsupported(bool Value) { Unsupported = Value; }
1130f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1140f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool isLinkerInput() const { return LinkerInput; }
1150f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setLinkerInput(bool Value) { LinkerInput = Value; }
1160f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1176d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar    bool hasNoOptAsInput() const { return NoOptAsInput; }
1180f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setNoOptAsInput(bool Value) { NoOptAsInput = Value; }
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    RenderStyleKind getRenderStyle() const {
121e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      return RenderStyleKind(RenderStyle);
122e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    }
123e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    void setRenderStyle(RenderStyleKind Value) { RenderStyle = Value; }
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
125f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar    bool isDriverOption() const { return DriverOption; }
126f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar    void setDriverOption(bool Value) { DriverOption = Value; }
127f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar
1281e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    bool hasNoArgumentUnused() const { return NoArgumentUnused; }
1291e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    void setNoArgumentUnused(bool Value) { NoArgumentUnused = Value; }
1301e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
131caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    bool hasNoForward() const { return NoForward; }
132caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    void setNoForward(bool Value) { NoForward = Value; }
133caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar
134caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    bool hasForwardToGCC() const {
135caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar      return !NoForward && !DriverOption && !LinkerInput;
136caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    }
1370f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// getUnaliasedOption - Return the final option this option
1391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// aliases (itself, if the option has no alias).
1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const Option *getUnaliasedOption() const {
1411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      if (Alias) return Alias->getUnaliasedOption();
1421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      return this;
1431eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    }
1441eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1451eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// getRenderName - Return the name to use when rendering this
1461eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// option.
147bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor    llvm::StringRef getRenderName() const {
1481eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      return getUnaliasedOption()->getName();
1491eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    }
1501eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1511eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// matches - Predicate for whether this option is part of the
1521eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// given option (which may be a group).
153b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    ///
154b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// Note that matches against options which are an alias should never be
155b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// done -- aliases do not participate in matching and so such a query will
156b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// always be false.
1579e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    bool matches(OptSpecifier ID) const;
1581eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1591eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// accept - Potentially accept the current argument, returning a
1601eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// new Arg instance, or 0 if the option does not accept this
161b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// argument (or the argument is missing values).
1621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    ///
163b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// If the option accepts the current argument, accept() sets
164b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// Index to the position where argument parsing should resume
165b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// (even if the argument is missing values).
166785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const = 0;
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1682c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    void dump() const;
1692c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1702c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const Option *) { return true; }
1711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// OptionGroup - A set of options which are can be handled uniformly
1741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// by the driver.
1751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class OptionGroup : public Option {
1761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
1779e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    OptionGroup(OptSpecifier ID, const char *Name, const OptionGroup *Group);
1781eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
179785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
1802c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::GroupClass;
1832c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
1842c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const OptionGroup *) { return true; }
1851eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1871eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  // Dummy option classes.
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1891eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// InputOption - Dummy option class for representing driver inputs.
1901eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class InputOption : public Option {
1911eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
192a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar    InputOption(OptSpecifier ID);
1931eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
194785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
1952c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::InputClass;
1982c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
1992c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const InputOption *) { return true; }
2001eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2011eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2021eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// UnknownOption - Dummy option class for represent unknown arguments.
2031eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class UnknownOption : public Option {
2041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
205a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar    UnknownOption(OptSpecifier ID);
2061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
207785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2082c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::UnknownClass;
2112c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2122c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const UnknownOption *) { return true; }
2131eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2141eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2151eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  // Normal options.
2161eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2171eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class FlagOption : public Option {
2181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
2199e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    FlagOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
22030b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar               const Option *Alias);
2211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
222785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2232c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::FlagClass;
2262c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2272c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const FlagOption *) { return true; }
2281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedOption : public Option {
2312c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2329e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
2332c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar                 const Option *Alias);
2341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
235785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2362c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedClass;
2392c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2402c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedOption *) { return true; }
2411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2432c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  class SeparateOption : public Option {
2442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2459e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    SeparateOption(OptSpecifier ID, const char *Name,
2469e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                   const OptionGroup *Group, const Option *Alias);
2471eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
248785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2492c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::SeparateClass;
2522c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2532c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const SeparateOption *) { return true; }
2541eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2551eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2562c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  class CommaJoinedOption : public Option {
2572c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2589e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    CommaJoinedOption(OptSpecifier ID, const char *Name,
25930b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                      const OptionGroup *Group, const Option *Alias);
2601eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
261785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2622c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::CommaJoinedClass;
2652c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2662c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const CommaJoinedOption *) { return true; }
2671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2693c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar  // FIXME: Fold MultiArgOption into SeparateOption?
2703c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar
2711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// MultiArgOption - An option which takes multiple arguments (these
2721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// are always separate arguments).
2731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class MultiArgOption : public Option {
2741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    unsigned NumArgs;
2751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
2779e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    MultiArgOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
2782c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar                   const Option *Alias, unsigned NumArgs);
2791eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2801eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    unsigned getNumArgs() const { return NumArgs; }
2811eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
282785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2832c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::MultiArgClass;
2862c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2872c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const MultiArgOption *) { return true; }
2881eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2891eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2901eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// JoinedOrSeparateOption - An option which either literally
2911eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// prefixes its (non-empty) value, or is follwed by a value.
2921eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedOrSeparateOption : public Option {
2932c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2949e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
29530b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                           const OptionGroup *Group, const Option *Alias);
2961eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
297785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2982c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedOrSeparateClass;
3012c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
3022c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedOrSeparateOption *) { return true; }
3031eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
3041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3051eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// JoinedAndSeparateOption - An option which literally prefixes its
3061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// value and is followed by another value.
3071eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedAndSeparateOption : public Option {
3082c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
3099e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedAndSeparateOption(OptSpecifier ID, const char *Name,
31030b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                            const OptionGroup *Group, const Option *Alias);
3111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
312785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
3132c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
3141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedAndSeparateClass;
3162c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
3172c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedAndSeparateOption *) { return true; }
3181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
3191eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3201eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace driver
3211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace clang
3221eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#endif
324