[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[certi-cvs] certi/scripts GenerateMessages.py
From: |
certi-cvs |
Subject: |
[certi-cvs] certi/scripts GenerateMessages.py |
Date: |
Fri, 11 Sep 2009 18:02:23 +0000 |
CVSROOT: /sources/certi
Module name: certi
Changes by: Eric NOULARD <erk> 09/09/11 18:02:23
Modified files:
scripts : GenerateMessages.py
Log message:
Check return and parameter types of factory methods.
Add MessageType enum generation.
Still some issue with native merger.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.20&r2=1.21
Patches:
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- GenerateMessages.py 6 Sep 2009 13:47:49 -0000 1.20
+++ GenerateMessages.py 11 Sep 2009 18:02:23 -0000 1.21
@@ -19,7 +19,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenerateMessages.py,v 1.20 2009/09/06 13:47:49 erk Exp $
+## $Id: GenerateMessages.py,v 1.21 2009/09/11 18:02:23 erk Exp $
## ----------------------------------------------------------------------------
"""
@@ -134,12 +134,12 @@
'BOOL_VALUE',
'RBRACE','LBRACE',
'RPAREN','LPAREN',
- 'RBRACKET','LBRACKET',
+# 'RBRACKET','LBRACKET',
'COMMA',
'EQUAL',
'COLON',
'PERIOD',
- 'NEWLINE',
+# 'NEWLINE',
'LANGLINE',
] + list(reserved.values())
@@ -188,8 +188,8 @@
t_LBRACE = r'{'
t_RBRACE = r'}'
-t_LBRACKET = r'\['
-t_RBRACKET = r'\]'
+#t_LBRACKET = r'\['
+#t_RBRACKET = r'\]'
t_LPAREN = r'\('
t_RPAREN = r'\)'
t_COMMA = r','
@@ -631,6 +631,7 @@
def p_factory(p):
'''factory : FACTORY ID LBRACE factory_creator factory_receiver RBRACE'''
p[0] = Factory(p[2],p[4],p[5])
+ p[0].linespan = (p.linespan(1)[0],p.linespan(6)[1])
def p_factory_creator(p):
'''factory_creator : FACTORY_CREATOR ID ID LPAREN ID RPAREN'''
@@ -839,7 +840,10 @@
return
# check if all field used in message have known types
+ # At the same time build the enum values for MessageTypes
+ msgTypeEnumVals = [EnumType.EnumValue("NOT_USED",None)]
for msg in AST.messages:
+ msgTypeEnumVals.append(EnumType.EnumValue(msg.name.upper(),None))
for f in msg.fields:
if not AST.isDefined(f.typeid):
self.logger.fatal("The type <%s> used for field <%s.%s> is
unknown (not a builtin, nor native, nor message)" % (f.typeid,msg.name,f.name))
@@ -848,6 +852,8 @@
return
else:
f.typeid = AST.getType(f.typeid)
+ msgTypeEnumVals.append(EnumType.EnumValue("LAST",None))
+
AST.add(EnumType(AST.name.split(".")[0]+"_MessageType",msgTypeEnumVals))
# @todo
# Should check if the default value of a field
@@ -866,6 +872,30 @@
return
else:
msg.merge = AST.getType(msg.merge)
+
+ # check the factory methods
+ if AST.hasFactory():
+ if not AST.isDefined(AST.factory.creator[0]):
+ self.logger.fatal("The return type <%s> of the creator factory
method is unknown (not a builtin, nor native, nor message)" %
AST.factory.creator[0])
+ self.logger.fatal(" --> Check lines (%d,%d)" %
(AST.factory.linespan) + " of <%s>" % AST.name )
+ AST.checked = False
+ return
+ if not AST.isDefined(AST.factory.creator[2]):
+ self.logger.fatal("The parameter type <%s> of the creator
factory method is unknown (not a builtin, nor native, nor message)" %
AST.factory.creator[2])
+ self.logger.fatal(" --> Check lines (%d,%d)" %
(AST.factory.linespan) + " of <%s>" % AST.name )
+ AST.checked = False
+ return
+ if not AST.isDefined(AST.factory.receiver[0]):
+ self.logger.fatal("The return type <%s> of the receiver
factory method is unknown (not a builtin, nor native, nor message)" %
AST.factory.receiver[0])
+ self.logger.fatal(" --> Check lines (%d,%d)" %
(AST.factory.linespan) + " of <%s>" % AST.name )
+ AST.checked = False
+ return
+ if not AST.isDefined(AST.factory.receiver[2]):
+ self.logger.fatal("The parameter type <%s> of the receiver
factory method is unknown (not a builtin, nor native, nor message)" %
AST.factory.receiver[2])
+ self.logger.fatal(" --> Check lines (%d,%d)" %
(AST.factory.linespan) + " of <%s>" % AST.name )
+ AST.checked = False
+ return
+
AST.checked = True
class CodeGenerator(object):
@@ -1079,7 +1109,7 @@
# we may have nested namespace
nameSpaceList = self.AST.package.name.split(".")
for ns in nameSpaceList:
- stream.write(self.getIndent()+"namespace %s {\n" % ns)
+ stream.write(self.getIndent()+"namespace %s {\n\n" % ns)
self.indent()
def closeNamespaces(self, stream):
@@ -1176,7 +1206,11 @@
if not factoryOnly:
# Native type should be defined in included header
stream.write(self.getIndent()+self.commentLineBeginWith)
- stream.write("Native types has been defined by included headers
(or here with typedef)\n")
+ stream.write(" Native types has been defined:\n");
+ stream.write(self.getIndent()+self.commentLineBeginWith)
+ stream.write(" - by included headers (see above)\n")
+ stream.write(self.getIndent()+self.commentLineBeginWith)
+ stream.write(" - with typedef (see below [if any])\n")
for native in self.AST.natives:
line = native.getLanguage("CXX").statement
# we are only interested in native statement
@@ -1190,7 +1224,7 @@
for enum in self.AST.enums:
self.writeComment(stream, enum)
stream.write(self.getIndent())
- stream.write("enum %s {\n" % enum.name)
+ stream.write("typedef enum %s {\n" % enum.name)
self.indent()
first = True
for enumval in enum.values:
@@ -1204,7 +1238,8 @@
self.writeComment(stream, enumval)
self.unIndent()
stream.write(self.getIndent())
- stream.write("}"+ self.commentLineBeginWith + "end of enum %s
\n" % enum.name)
+ stream.write("} %s_t; " % enum.name)
+ stream.write(self.commentLineBeginWith + "end of enum %s \n" %
enum.name)
# Generate message type
for msg in self.AST.messages:
@@ -1267,8 +1302,8 @@
# begin public
stream.write(self.getIndent()+"public:\n")
self.indent()
- stream.write(self.getIndent()+"static %s* %s(%s) throw
(RTIinternalError);\n"% self.AST.factory.creator)
- stream.write(self.getIndent()+"static %s* %s(%s) throw
(RTIinternalError);\n"% self.AST.factory.receiver)
+ stream.write(self.getIndent()+"static %s* %s(%s type) throw
(RTIinternalError);\n"% self.AST.factory.creator)
+ stream.write(self.getIndent()+"static %s* %s(%s stream) throw
(RTIinternalError);\n"% self.AST.factory.receiver)
self.unIndent()
#end public
#begin protected
@@ -1293,7 +1328,7 @@
def writeInitFieldStatement(self,stream,field):
if field.hasDefaultValue():
stream.write(self.getIndent())
- stream.write(field.name+"="+field.defaultValue+";\n")
+ stream.write(field.name+"="+str(field.defaultValue)+";\n")
else:
stream.write(self.getIndent())
stream.write(self.commentLineBeginWith)