Sketch Driver Option classes.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65933 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp
new file mode 100644
index 0000000..46b5c41
--- /dev/null
+++ b/lib/Driver/Option.cpp
@@ -0,0 +1,89 @@
+//===--- Option.cpp - Abstract Driver Options ---------------------------*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Driver/Option.h"
+#include <cassert>
+using namespace clang;
+using namespace clang::driver;
+
+Option::Option(OptionClass _Kind, const char *_Name,
+               OptionGroup *_Group, Option *_Alias) 
+  : Kind(_Kind), Name(_Name), Group(_Group), Alias(_Alias) {
+
+  // Multi-level aliases are not supported, and alias options cannot
+  // have groups. This just simplifies option tracking, it is not an
+  // inherent limitation.
+  assert((!Alias || (!Alias->Alias && !Group)) &&
+         "Multi-level aliases and aliases with groups are unsupported.");    
+}
+
+bool Option::matches(const Option *Opt) const {
+  // Aliases are never considered in matching.
+  if (Opt->getAlias())
+    return matches(Opt->getAlias());
+  if (Alias)
+    return Alias->matches(Opt);
+  
+  if (this == Opt)
+    return true;
+  
+  if (Group)
+    return Group->matches(Opt);
+  return false;
+}
+
+OptionGroup::OptionGroup(const char *Name, OptionGroup *Group)
+  : Option(Option::GroupOption, Name, Group, 0) {
+}
+
+InputOption::InputOption()
+  : Option(Option::InputOption, "<input>", 0, 0) {
+}
+
+UnknownOption::UnknownOption()
+  : Option(Option::UnknownOption, "<unknown>", 0, 0) {
+}
+
+FlagOption::FlagOption(const char *Name, OptionGroup *Group, Option *Alias)
+  : Option(Option::FlagOption, Name, Group, Alias) {
+}
+
+
+JoinedOption::JoinedOption(const char *Name, OptionGroup *Group, Option *Alias)
+  : Option(Option::JoinedOption, Name, Group, Alias) {
+}
+
+CommaJoinedOption::CommaJoinedOption(const char *Name, OptionGroup *Group, 
+                                     Option *Alias)
+  : Option(Option::CommaJoinedOption, Name, Group, Alias) {
+}
+
+SeparateOption::SeparateOption(const char *Name, OptionGroup *Group, 
+                               Option *Alias)
+  : Option(Option::SeparateOption, Name, Group, Alias) {
+}
+
+MultiArgOption::MultiArgOption(const char *Name, OptionGroup *Group, 
+                               Option *Alias, unsigned _NumArgs)
+  : Option(Option::MultiArgOption, Name, Group, Alias), NumArgs(_NumArgs) {
+}
+
+JoinedOrSeparateOption::JoinedOrSeparateOption(const char *Name, 
+                                               OptionGroup *Group, 
+                                               Option *Alias)
+  : Option(Option::JoinedOrSeparateOption, Name, Group, Alias) {
+}
+
+JoinedAndSeparateOption::JoinedAndSeparateOption(const char *Name, 
+                                                 OptionGroup *Group, 
+                                                 Option *Alias)
+  : Option(Option::JoinedAndSeparateOption, Name, Group, Alias) {
+}
+
+