(operator: MesonOperator,
                   types: T.Union[T.Type, T.Tuple[T.Type, ...]])
return inner
Decorator that does type checking for operator calls.

    The principle here is similar to typed_pos_args, however much simpler
    since only one other object ever is passed
Decorator that does type checking for operator calls.
Decorator that does type checking for operator calls .
def typed_operator(operator: MesonOperator,
                   types: T.Union[T.Type, T.Tuple[T.Type, ...]]) -> T.Callable[['_TV_FN_Operator'], '_TV_FN_Operator']:
    """Decorator that does type checking for operator calls.

    The principle here is similar to typed_pos_args, however much simpler
    since only one other object ever is passed
    """
    def inner(f: '_TV_FN_Operator') -> '_TV_FN_Operator':
        @wraps(f)
        def wrapper(self: 'InterpreterObject', other: TYPE_var) -> TYPE_var:
            if not isinstance(other, types):
                raise InvalidArguments(f'The `{operator.value}` of {self.display_name()} does not accept objects of type {type(other).__name__} ({other})')
            return f(self, other)
        return T.cast('_TV_FN_Operator', wrapper)
    return inner
def typed_operator ( operator : MesonOperator , types : T . Union [ T . Type , T . Tuple [ T . Type , ... ] ] ) -> T . Callable [ [ '_TV_FN_Operator' ] , '_TV_FN_Operator' ] : def inner ( f : '_TV_FN_Operator' ) -> '_TV_FN_Operator' : @ wraps ( f ) def wrapper ( self : 'InterpreterObject' , other : TYPE_var ) -> TYPE_var : if not isinstance ( other , types ) : raise InvalidArguments ( f'The `{operator.value}` of {self.display_name()} does not accept objects of type {type(other).__name__} ({other})' ) return f ( self , other ) return T . cast ( '_TV_FN_Operator' , wrapper ) return inner