def visit_arg(self, arg: ast.arg): """ Verifies if the argument of a function has a type annotation :param arg: the python ast arg node """ if arg.annotation is None: self._log_error( CompilerError.TypeHintMissing(arg.lineno, arg.col_offset, symbol_id=arg.arg) ) # continue to walk through the tree self.generic_visit(arg)
def visit_Return(self, ret: ast.Return): """ Verifies if the return of the function is the same type as the return type annotation :param ret: the python ast return node """ ret_value: Any = self.visit(ret.value) if ret.value is not None else None if ret.value is not None and self.get_type(ret.value) is not Type.none: # multiple returns are not allowed if isinstance(ret.value, ast.Tuple): self._log_error( CompilerError.TooManyReturns(ret.lineno, ret.col_offset) ) return # it is returning something, but there is no type hint for return elif self._current_method.return_type is Type.none: self._log_error( CompilerError.TypeHintMissing(ret.lineno, ret.col_offset, symbol_id=self._current_method_id) ) return self.validate_type_variable_assign(ret, ret_value, self._current_method) # continue to walk through the tree self.generic_visit(ret)