def get_args_and_retval(cls, dct): from itypes.typedb import TypeDB args = [arg.strip() for arg in dct['args'].split(',')] if args == ['']: args = [] else: args = [TypeDB.get_type_by_name(arg) for arg in args] retval = TypeDB.get_type_by_name(dct['retval']) return args, retval
def visit_ListComp(self, node): from parser.functions import FunctionImplementation # calculate result type if len(node.generators) > 1: raise InvalidOperation( "Only one for statement permitted in comprehensions") comp = node.generators[0] if len(comp.ifs) > 1: raise InvalidOperation( "Only one if statement allowed in List Comprehension") assign_node = ast.Assign(targets=[comp.target], value=ast.Subscript(value=comp.iter, slice=ast.Index( ast.Num(0)))) return_node = ast.Return(value=node.elt) function_node = ast.FunctionDef(name="temp", args=ast.arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[assign_node, return_node]) function_interpreter = FunctionImplementation(function_node, (), self.context) result_type = TypeDB.get_list([function_interpreter.retval.tp]) # create temp list to hold values result = self.context.get_temp_var(result_type) self.prepends.append( f"{result.code} = {result_type.as_literal([])};\n") # create for expression append_node = ast.Expr( ast.Call(func=ast.Attribute(value=ast.Name(id=result.code, ctx=ast.Load()), attr="append", ctx=ast.Load()), args=[node.elt], keywords=[])) if comp.ifs: body = ast.If(test=comp.ifs[0], body=[append_node], orelse=[]) else: body = append_node for_node = ast.For(target=comp.target, iter=comp.iter, body=[body], orelse=[]) self.prepends.append(for_node) return result
def visit_ClassDef(self, node: ast.ClassDef): cls = ClassParser(node, self) self.context[node.name] = Code(tp=cls.get_type(), code=node.name) tp = cls.get_type() TypeDB.add_type(tp) TypeDB.add_type(tp.instance)
def visit_FunctionDef(self, node: ast.FunctionDef): tp = MultiFunction(node, self.context) self.context[node.name] = Code(tp=tp, code=node.name) TypeDB.add_type(tp)
def visit_List(self, node): types_and_codes = [self.visit(n) for n in node.elts] tp = TypeDB.get_list([t.tp for t in types_and_codes]) code = tp.as_literal([t.code for t in types_and_codes]) return Code(tp=tp, code=code)
def visit_NameConstant(self, node): return Code(tp=TypeDB.get_type_by_value(node.value), code=self.CONSTANTS_MAP[node.value])
def visit_Bytes(self, node): tp = TypeDB.get_string() return Code(tp=tp, code=tp.as_literal(str(node.s, 'utf-8')))
def visit_Str(self, node): tp = TypeDB.get_string() return Code(tp=tp, code=tp.as_literal(node.s))
def visit_Num(self, node): return Code(tp=TypeDB.get_type_by_value(node.n), code=str(node.n))
def setUp(self) -> None: TypeDB.reset()