def types_from_Compare(self, node): # comparison: `x < y` if isinstance(node.op, vy_ast.In): # x in y left = self.get_possible_types_from_node(node.left) right = self.get_possible_types_from_node(node.right) if next((i for i in left if isinstance(i, ArrayDefinition)), False): raise InvalidOperation( "Left operand in membership comparison cannot be Array type", node.left, ) if next((i for i in right if not isinstance(i, ArrayDefinition)), False): raise InvalidOperation( "Right operand must be Array for membership comparison", node.right) types_list = [ i for i in left if _is_type_in_list(i, [i.value_type for i in right]) ] if not types_list: raise TypeMismatch( "Cannot perform membership comparison between dislike types", node) else: types_list = get_common_types(node.left, node.right) _validate_op(node, types_list, "validate_comparator") return [BoolDefinition()]
def visit_Assert(self, node): if node.msg: _validate_revert_reason(node.msg) try: validate_expected_type(node.test, BoolDefinition()) except InvalidType: raise InvalidType("Assertion test value must be a boolean", node.test)
def visit_If(self, node): validate_expected_type(node.test, BoolDefinition()) with self.namespace.enter_scope(): for n in node.body: self.visit(n) with self.namespace.enter_scope(): for n in node.orelse: self.visit(n)
class AddressDefinition(MemberTypeDefinition): _id = "address" _type_members = { "balance": Uint256Definition(is_immutable=True), "codehash": Bytes32Definition(is_immutable=True), "codesize": Uint256Definition(is_immutable=True), "is_contract": BoolDefinition(is_immutable=True), }
def types_from_BoolOp(self, node): # boolean operation: `x and y` types_list = get_common_types(*node.values) _validate_op(node, types_list, "validate_boolean_op") return [BoolDefinition()]