Modified cpp code generation to build read/write methods for each non-primitive type rather than inlining all serialization in client/server function handlers

Modified parser to assign negative numbers to autogenerated struct fields and function args.
			       


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664744 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/src/parser.py b/compiler/src/parser.py
index 9d1e507..edafccb 100644
--- a/compiler/src/parser.py
+++ b/compiler/src/parser.py
@@ -1,3 +1,4 @@
+#!python
 """ Thrift IDL parser/compiler
     
     This parser uses the Python PLY LALR parser generator to build a parser for the Thrift IDL grammar.
@@ -18,7 +19,6 @@
 import os
 import pickle
 import string
-import sys
 import yacc
 
 class Error(object):
@@ -106,6 +106,7 @@
 	Type.__init__(self, None, name)
 
 
+STOP_TYPE =  PrimitiveType("stop")
 VOID_TYPE =  PrimitiveType("void")
 BOOL_TYPE = PrimitiveType("bool")
 STRING_TYPE =PrimitiveType("utf7")
@@ -124,6 +125,7 @@
 FLOAT_TYPE = PrimitiveType("float")
 
 PRIMITIVE_MAP = {
+    "stop" : STOP_TYPE,
     "void" : VOID_TYPE,
     "bool" : BOOL_TYPE,
     "string": UTF7_TYPE,
@@ -272,6 +274,27 @@
     if len(errors):
 	raise ErrorException(errors)
 
+    def assignId(field, currentId, ids):
+	'Finds the next available id number for a field'
+	id= currentId - 1
+
+	while id in ids:
+	    id -= 1
+	    
+	field.id = id
+
+	ids[field.id] = field
+	
+	return id
+
+    # assign ids for all fields with unspecified ids
+	
+    currentId = 0
+	
+    for fields in fieldList:
+	if not field.id:
+	    currentId = assignId(field, currentId, ids)
+	
 class Struct(Type):
 
     def __init__(self, symbols, name, fieldList):
@@ -379,9 +402,10 @@
 
     def addCollection(self, collection):
 	if collection.name in self.collectionMap:
-	    return
+	    return self.collectionMap[collection.name]
 	else:
 	    self.collectionMap[collection.name] = collection
+	    return collection
 
     def getType(self, parent, symbol):
 	""" Get the type definition for a symbol"""
@@ -439,12 +463,13 @@
             except ErrorException, e:
                 errors+= e.errors
 
-        # Verify that service fuunction result and arg list types exist and replace type name with reference to definition
+        # Verify that service function result and arg list types exist and replace type name with reference to definition
 
 	for service in self.serviceMap.values():
+
 	    for function in service.functionList:
 		try:
-		    function.resultType  = self.getType(service, function.resultType)
+		    function.resultType = self.getType(service, function.resultType)
 		except ErrorException, e:
 		    errors+= e.errors
 
@@ -817,20 +842,17 @@
     def p_collectiontype_1(self, p):
         'collectiontype : maptype'
 	self.pdebug("p_collectiontype_1", p)
-	p[0] = p[1]
-	self.program.addCollection(p[0])
+	p[0] = self.program.addCollection(p[1])
 
     def p_collectiontype_2(self, p):
         'collectiontype : settype'
 	self.pdebug("p_collectiontype_2", p)
-	p[0] = p[1]
-	self.program.addCollection(p[0])
+	p[0] = self.program.addCollection(p[1])
 
     def p_collectiontype_3(self, p):
         'collectiontype : listtype'
 	self.pdebug("p_collectiontype_3", p)
-	p[0] = p[1]
-	self.program.addCollection(p[0])
+	p[0] = self.program.addCollection(p[1])
 
     def p_maptype(self, p):
         'maptype : MAP LANGLE fieldtype COMMA fieldtype RANGLE'
@@ -900,8 +922,3 @@
 
 	    pickle.dump(self.program, outf)
 
-if __name__ == '__main__':
-
-    parser = Parser(debug=True);
-
-    parser.parse(sys.argv[1])