ccc: Make proper synthetic arguments in places we have to construct
"fake" options, allowing Tools to be oblivious to whether an argument
is real or synthetic. This kills off DerivedArg & a number of FIXMEs.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61871 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/ccc/ccclib/Arguments.py b/tools/ccc/ccclib/Arguments.py
index 0636789..934cc72 100644
--- a/tools/ccc/ccclib/Arguments.py
+++ b/tools/ccc/ccclib/Arguments.py
@@ -189,23 +189,6 @@
         return ([self.opt.name + self.getJoinedValue(args)] + 
                 [self.getSeparateValue(args)])
 
-class DerivedArg(ValueArg):
-    """DerivedArg - A synthesized argument which does not correspend
-    to an item in the argument vector."""
-
-    def __init__(self, value):
-        # 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):
-        return self.value
-
-    def render(self, args):
-        return [self.value]
-
 ###
 
 class InputIndex:
@@ -220,7 +203,8 @@
     """ArgList - Collect an input argument vector along with a set of parsed Args
     and supporting information."""
 
-    def __init__(self, argv):
+    def __init__(self, parser, argv):
+        self.parser = parser
         self.argv = list(argv)
         self.syntheticArgv = []
         self.lastArgs = {}
@@ -240,11 +224,27 @@
 
         raise RuntimeError,'Unknown source ID for index.'
 
-    def getSyntheticIndex(self, *strings):
+    def makeIndex(self, *strings):
         pos = len(self.syntheticArgv)
         self.syntheticArgv.extend(strings)
         return InputIndex(1, pos)
 
+    def makeFlagArg(self, option):
+        return Arg(self.makeIndex(option.name),
+                   option)
+
+    def makeInputArg(self, string):
+        return PositionalArg(self.makeIndex(string),
+                             self.parser.inputOption)
+
+    def makeUnknownArg(self, string):
+        return PositionalArg(self.makeIndex(string),
+                             self.parser.unknownOption)
+
+    def makeSeparateArg(self, string, option):
+        return SeparateValueArg(self.makeIndex(option.name, string),
+                                option)
+
     # Support use as a simple arg list.
 
     def __iter__(self):
@@ -483,7 +483,7 @@
 
         iargs = enumerate(argv)
         it = iter(iargs)
-        args = ArgList(argv)
+        args = ArgList(self, argv)
         for pos,a in it:
             i = InputIndex(0, pos)
             # FIXME: Handle '@'