def visit(self, node:ast.Assignment, scope:Scope, errors): try: instanceType = scope.getTypeFor(node.instance.name) exprType = self.visit(node.expr, scope, errors) if not instanceType < exprType : raise CheckSemanticError(f'{tb} doesn\'t conform {node.return_type}') return exprType except: raise CheckSemanticError(f'Symbol {node.instance.name} not defined in the Scope.')
def visit(self, node:ast.DynamicDispatch, scope:Scope, errors): instanceType = scope.getTypeFor(node.instance) if not instanceType.is_method(node.method): raise CheckSemanticError(f'method {node.method} not defined') argsType = instanceType.get_method_args(node.method) if len(argsType) != len(node.arguments): raise CheckSemanticError(f'{node.method} require {len(argsType)} arguments') for x, y in argsType, node.arguments: t = self.visit(y, scope, errors) if not t < x: raise CheckSemanticError(f'{str(t)} doesn\'t conform {str(x)}') method = instanceType.get_method(node.method) return method.return_type
def visit(self, node: ast.Assignment, scope: Scope): instance_type = scope.getTypeFor(node.instance.name) expr_type = self.visit(node.expr, scope) if expr_type.name == 'SELF_TYPE': r_type = scope.getType(scope.classname) if r_type < instance_type: return r_type raise CheckSemanticError( f'{r_type} doesn\'t conform {instance_type}') if not expr_type < instance_type: raise CheckSemanticError( f'{expr_type} doesn\'t conform {instance_type}') node.static_type = expr_type return expr_type
def visit(self, node: ast.Object, scope: Scope): node.static_type = scope.getTypeFor(node.name) return scope.getTypeFor(node.name)
def visit(self, node:ast.Object, scope:Scope, errors): return scope.getTypeFor(node.name)