def resolve_FuncDef(self, func): # self.logger.debug('resolve_FuncDef', func.name, func.resolved, func.cls, func) assert func.owner, (func, func.owner) owner = func.owner assert isinstance(owner, ast.ClassDef) or isinstance( owner, ast.CodeUnit) or isinstance( owner, ast.ExtensionDef ), 'resolve_ClassDef owner is invalid: %s %s' % (owner, func) #assert isinstance(owner, ast.ClassDef) or isinstance(owner, ast.CodeUnit), 'resolve_FuncDef owner=%s' % owner if func.resolved: # assert func.spec.returnType, (func.name, func.spec.returnType, func) return func.resolved = True # self.logger.debug('resolve_FuncDef start', func, func.name) for param in func.spec.params: param.visit(self) if func.cls is None and isinstance(owner, ast.ClassDef): func.cls = owner func.spec.visit(self) func.body.visit(self) if func.spec.returnType is None: if len(func.body.statements) == 0: func.spec.returnType = ast.makePrimitiveType('void') else: lastStmt = func.body.statements[-1] # self.logger.debug('resolve_FuncDef rettype', func.name, func, lastStmt) if isinstance(lastStmt, ast.Return) and lastStmt.value: assert func.spec.returnType is None, (func, func.spec) func.spec.returnType = lastStmt.value.getType().clone() # self.logger.debug('resolve_FuncDef rettype with return', lastStmt, lastStmt.value.getType(), func, func.spec) else: func.spec.returnType = ast.makePrimitiveType('void') self.setupNewItem(func.spec.returnType, func.spec, True) if func.spec.returnType is None: assert False, (func, func.spec)
def __init__(self, genericArgs): super(GenericSetClassImpl, self).__init__(GenericSetClassImpl.genericParams, genericArgs) self.addDef(SimpleTypeFunc(self, 'size() => int')) self.addDef(SimpleTypeFunc(self, 'clear()')) self.addDef(CustomTypeFunc(self, makeFuncProto('add', ast.makePrimitiveType('void'), [self.createElementType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('remove', ast.makePrimitiveType('void'), [self.createElementType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('contains', ast.makePrimitiveType('bool'), [self.createElementType()]))) self.addDef(GenericSetEachFunc(self))
def __init__(self, genericArgs): super(GenericDictClassImpl, self).__init__(GenericDictClassImpl.genericParams, genericArgs) self.addDef(SimpleTypeFunc(self, 'size() => int', evaluator=len)) self.addDef(SimpleTypeFunc(self, 'clear()', evaluator=lambda d:d.clear())) self.addDef(CustomTypeFunc(self, makeFuncProto('get', self.createValueType(), [self.createKeyType(), self.createValueType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('set', ast.makePrimitiveType('void'), [self.createKeyType(), self.createValueType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('add', ast.makePrimitiveType('void'), [self.createKeyType(), self.createValueType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('remove', ast.makePrimitiveType('void'), [self.createKeyType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('contains', ast.makePrimitiveType('bool'), [self.createKeyType()]))) self.addDef(GenericDictEachFunc(self))
def insertToString(self, cls, basecls, visitor): # visitor.logger.debug('insertToString', cls, basecls) name = 'toString' if name not in cls.symbols: # visitor.logger.debug('insertToString do', cls, basecls) clsname = ast.Call(ast.Identifier('getClassName'), []) thisptr = ast.Call(ast.Identifier('formatId'), []) expr = None if 'name' in cls.symbols: # visitor.logger.debug('insertToString with name', cls, basecls, clsname, thisptr) expr = ast.BinaryOp( '%', ast.makeLiteral('%s(name=%s,id=%s)'), ast.TupleLiteral( [clsname, ast.Identifier('name'), thisptr])) else: # visitor.logger.debug('insertToString without name', cls, basecls, clsname, thisptr) expr = ast.BinaryOp('%', ast.makeLiteral('%s(id=%s)'), ast.TupleLiteral([clsname, thisptr])) func = ast.FuncDef([], name, ast.FuncSpec([], ast.makePrimitiveType('string')), ast.StatementBody([ast.Return(expr)])) # visitor.logger.debug('insertFunc ok', name, cls, basecls, cls.primaryVars, func) cls.definitions.append(func) func.setOwner(cls) visitor.visitNewItem(func)
class ScriptClass_Logging(object): loggerLevel = logging.WARNING def ScriptFunc_initLogging(visitor, level): 'initLogging(int)' ScriptUnit_sys.ScriptClass_Logging.loggerLevel = level # logging.basicConfig(level=level) logging.basicConfig(level=level, format='[%(name)s] %(message)s') def ScriptFunc_getLogger(visitor, name): 'getLogger(string) => Logger' # return createScriptObject(visitor, 'Logger', ScriptUnit_sys.ScriptClass_Logger, [logging.getLogger(name)]) return ScriptUnit_sys.ScriptClass_Logger(logging.getLogger(name)) ScriptDefinitions = [ LibLiteral('DEBUG', ast.makePrimitiveType('int'), logging.DEBUG), LibLiteral('INFO', ast.makePrimitiveType('int'), logging.INFO), LibLiteral('WARNING', ast.makePrimitiveType('int'), logging.WARNING), LibLiteral('EVENT', ast.makePrimitiveType('int'), logging.WARNING), LibLiteral('ERROR', ast.makePrimitiveType('int'), logging.ERROR), LibLiteral('CRITICAL', ast.makePrimitiveType('int'), logging.CRITICAL), LibLiteral('FATAL', ast.makePrimitiveType('int'), logging.CRITICAL) ]
def cacheName_FuncProto(self, func): # self.logger.debug('cacheName_FuncProto', func, func.name, func.owner) assert not isinstance(func.owner, ast.FuncDef), (func) if func.spec.returnType is None: func.spec.returnType = ast.makePrimitiveType('void') func.spec.returnType.setOwner(func.spec) func.visitChildren(self) func.owner.functions.append(func) func.owner.addSymbol(func) assert func.name != 'StringTypeClass' or isinstance(func.owner, ast.ClassDef)
class ScriptUnit_sys_lang(object): ScriptDefinitions = [ LibLiteral('true', ast.makePrimitiveType('bool'), True), LibLiteral('false', ast.makePrimitiveType('bool'), False), builtins.StringClass(), builtins.CharClass(), builtins.BoolClass(), builtins.VoidClass(), builtins.GenericClass('Dict', builtins.GenericDictClassImpl), builtins.GenericClass('Set', builtins.GenericSetClassImpl), builtins.GenericClass('List', builtins.GenericListClassImpl), builtins.GenericClass('Array', builtins.GenericArrayClassImpl), builtins.GenericClass('Tuple', builtins.GenericTupleClassImpl), builtins.FloatingClass('float'), builtins.FloatingClass('double'), builtins.LogClass() ] + [builtins.IntegerClass(typename) for typename in builtinIntegerNames] class ScriptClass_builtins(object): ScriptDefinitions = [ ast.builtinCharType, ast.builtinBoolType, ast.builtinStringType, ast.builtinIntType, ast.builtinLongType, ast.builtinFloatType ]
def __init__(self, genericArgs): super(GenericListClassImpl, self).__init__(GenericListClassImpl.genericParams, genericArgs) self.addDef(SimpleTypeFunc(self, 'size() => int', evaluator=len)) self.addDef(SimpleTypeFunc(self, 'empty() => bool', evaluator=lambda left:len(left)==0)) self.addDef(SimpleTypeFunc(self, 'clear()', evaluator=del_list)) self.addDef(CustomTypeFunc(self, makeFuncProto('set', ast.makePrimitiveType('void'), [ast.makePrimitiveType('int'), self.createElementType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('flatten', self.createElementType(), [self.createCollectionType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('swap', ast.makePrimitiveType('void'), [self.createCollectionType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('append', ast.makePrimitiveType('void'), [self.createElementType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('extend', ast.makePrimitiveType('void'), [self.createCollectionType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('insert', ast.makePrimitiveType('void'), [ast.makePrimitiveType('int'), self.createElementType()]))) self.addDef(CustomTypeFunc(self, makeFuncProto('remove', ast.makePrimitiveType('void'), [self.createElementType()]))) self.addDef(CustomTypeFunc(self, 'removeAt(int)')) self.addDef(CustomTypeFunc(self, makeFuncProto('contains', ast.makePrimitiveType('bool'), [self.createElementType()]))) self.addDef(GenericListEachFunc(self)) self.ops = {'==' : operator.eq, '!=':operator.ne, '+':operator.add,'*':operator.mul}
def __init__(self, cls): argtype = makeFuncSpec(ast.makePrimitiveType('void'), [cls.createType()]) super(IntegerTimesFunc, self).__init__(cls, makeFuncProto('times', ast.makePrimitiveType('void'), [argtype]))
def createType(self): return ast.makePrimitiveType(self.name)
def __init__(self, cls): argtype = makeFuncSpec(ast.makePrimitiveType('void'), [cls.createElementType(), ast.makePrimitiveType('int')]) super(GenericArrayEachFunc, self).__init__(cls, makeFuncProto('each', ast.makePrimitiveType('void'), [argtype]))
def __init__(self, cls): argtype = makeFuncSpec(ast.makePrimitiveType('void'), [cls.createKeyType(), cls.createValueType()]) super(GenericDictEachFunc, self).__init__(cls, makeFuncProto('each', ast.makePrimitiveType('void'), [argtype]))
def __init__(self): ast.ScriptFunction.__init__(self) self.name = 'getClassName' self.type = ast.makePrimitiveType('string') self.target = None