ccc: Use dummy InputOption and UnknownOption classes instead of
InputArg and UnknownArg.
- Every argument now always corresponds to some option, which
simplifies other code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61783 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/ccc/ccclib/Arguments.py b/tools/ccc/ccclib/Arguments.py
index 57793cb..5b5dbfe 100644
--- a/tools/ccc/ccclib/Arguments.py
+++ b/tools/ccc/ccclib/Arguments.py
@@ -17,6 +17,24 @@
return '<%s name=%r>' % (self.__class__.__name__,
self.name)
+# Dummy options
+
+class InputOption(Option):
+ def __init__(self):
+ super(InputOption, self).__init__('<input>')
+
+ def accept(self):
+ raise RuntimeError,"accept() should never be used on InputOption instance."
+
+class UnknownOption(Option):
+ def __init__(self):
+ super(UnknownOption, self).__init__('<unknown>')
+
+ def accept(self):
+ raise RuntimeError,"accept() should never be used on UnknownOption instance."
+
+# Normal options
+
class FlagOption(Option):
"""An option which takes no arguments."""
@@ -90,6 +108,7 @@
class Arg(object):
"""Arg - Base class for actual driver arguments."""
def __init__(self, index, opt):
+ assert opt is not None
self.index = index
self.opt = opt
@@ -115,9 +134,8 @@
def setValue(self, args, value):
abstract
-class UnknownArg(ValueArg):
- def __init__(self, index):
- super(UnknownArg, self).__init__(index, None)
+class PositionalArg(ValueArg):
+ """PositionalArg - A simple positional argument."""
def getValue(self, args):
return args[self.index]
@@ -129,6 +147,9 @@
return [args[self.index]]
class JoinedValueArg(ValueArg):
+ """JoinedValueArg - A single value argument where the value is
+ joined (suffixed) to the option."""
+
def getValue(self, args):
return args[self.index][len(self.opt.name):]
@@ -140,6 +161,9 @@
return [self.opt.name + self.getValue(args)]
class SeparateValueArg(ValueArg):
+ """SeparateValueArg - A single value argument where the value
+ follows the option in the argument vector."""
+
def getValue(self, args):
return args[self.index+1]
@@ -150,6 +174,11 @@
return [self.opt.name, self.getValue(args)]
class MultipleValuesArg(Arg):
+ """MultipleValuesArg - An argument with multiple values which
+ follow the option in the argument vector."""
+
+ # FIXME: Should we unify this with SeparateValueArg?
+
def getValues(self, args):
return args[self.index + 1:self.index + 1 + self.opt.numArgs]
@@ -183,27 +212,15 @@
return ([self.opt.name + self.getJoinedValue(args)] +
[self.getSeparateValue(args)])
-class InputArg(ValueArg):
- """InputArg - An input file (positional) argument."""
-
- def __init__(self, index):
- super(ValueArg, self).__init__(index, None)
-
- def getValue(self, args):
- return args[self.index]
-
- def setValue(self, args, value):
- args[self.index] = value
-
- def render(self, args):
- return [self.getValue(args)]
-
class DerivedArg(ValueArg):
"""DerivedArg - A synthesized argument which does not correspend
- to the actual input arguments array."""
+ to an item in the argument vector."""
def __init__(self, value):
- super(ValueArg, self).__init__(-1, None)
+ # FIXME: The UnknownOption() here is a total hack so we can
+ # rely on arg.opt not being nil. Ok for now since DerivedArg
+ # is dying.
+ super(DerivedArg, self).__init__(-1, UnknownOption())
self.value = value
def getValue(self, args):
@@ -216,7 +233,7 @@
return [self.value]
class ArgList:
- """ArgList - Collect an input argv along with a set of parsed Args
+ """ArgList - Collect an input argument vector along with a set of parsed Args
and supporting information."""
def __init__(self, argv):
@@ -248,7 +265,9 @@
class OptionParser:
def __init__(self):
self.options = []
-
+ self.inputOption = InputOption()
+ self.unknownOption = UnknownOption()
+
def addOption(self, opt):
self.options.append(opt)
@@ -274,15 +293,15 @@
elif a[0] == '-' and a != '-':
args.append(self.lookupOptForArg(i, a, it))
else:
- args.append(InputArg(i))
+ args.append(PositionalArg(i, self.inputOption))
return args
- def lookupOptForArg(self, i, arg, it):
- for op in self.options:
- opt = op.accept(i, arg, it)
- if opt is not None:
- return opt
- return UnknownArg(i)
+ def lookupOptForArg(self, i, string, it):
+ for o in self.options:
+ arg = o.accept(i, string, it)
+ if arg is not None:
+ return arg
+ return PositionalArg(i, self.unknownOption)
def createOptionParser():
op = OptionParser()