aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreterbase.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2020-03-12 14:36:52 -0400
committerJussi Pakkanen <jpakkane@gmail.com>2020-03-19 23:01:58 +0200
commit4d6faf6a136018405e4de17e2173df76d37b48dd (patch)
treea4800ea1a3a2b542424b9e5d4a995d734dcc54a3 /mesonbuild/interpreterbase.py
parent673ca982f150200e27db7654ae38684b97f43b27 (diff)
downloadmeson-4d6faf6a136018405e4de17e2173df76d37b48dd.zip
meson-4d6faf6a136018405e4de17e2173df76d37b48dd.tar.gz
meson-4d6faf6a136018405e4de17e2173df76d37b48dd.tar.bz2
interpreterbase: Add warning when built-in object method has no kwargs
Diffstat (limited to 'mesonbuild/interpreterbase.py')
-rw-r--r--mesonbuild/interpreterbase.py42
1 files changed, 29 insertions, 13 deletions
diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py
index a3acc75..1a7aa38 100644
--- a/mesonbuild/interpreterbase.py
+++ b/mesonbuild/interpreterbase.py
@@ -150,6 +150,19 @@ def noPosargs(f):
return f(*wrapped_args, **wrapped_kwargs)
return wrapped
+def builtinMethodNoKwargs(f):
+ @wraps(f)
+ def wrapped(*wrapped_args, **wrapped_kwargs):
+ node = wrapped_args[0].current_node
+ method_name = wrapped_args[2]
+ kwargs = wrapped_args[4]
+ if kwargs:
+ mlog.warning('Method {!r} does not take keyword arguments.'.format(method_name),
+ 'This will become a hard error in the future',
+ location=node)
+ return f(*wrapped_args, **wrapped_kwargs)
+ return wrapped
+
def noKwargs(f):
@wraps(f)
def wrapped(*wrapped_args, **wrapped_kwargs):
@@ -199,7 +212,6 @@ class permittedKwargs:
return f(*wrapped_args, **wrapped_kwargs)
return wrapped
-
class FeatureCheckBase:
"Base class for feature version checks"
@@ -455,6 +467,7 @@ class InterpreterBase:
i += 1 # In THE FUTURE jump over blocks and stuff.
def evaluate_statement(self, cur: mparser.BaseNode) -> T.Optional[TYPE_var]:
+ self.current_node = cur
if isinstance(cur, mparser.FunctionNode):
return self.function_call(cur)
elif isinstance(cur, mparser.AssignmentNode):
@@ -813,8 +826,6 @@ The result of this is undefined and will become a hard error in a future Meson r
func_args = posargs # type: T.Any
if not getattr(func, 'no-args-flattening', False):
func_args = flatten(posargs)
-
- self.current_node = node
return func(node, func_args, self.kwargs_string_keys(kwargs))
else:
self.unknown_function_called(func_name)
@@ -832,15 +843,15 @@ The result of this is undefined and will become a hard error in a future Meson r
if is_disabled(args, kwargs):
return Disabler()
if isinstance(obj, str):
- return self.string_method_call(obj, method_name, args)
+ return self.string_method_call(obj, method_name, args, kwargs)
if isinstance(obj, bool):
- return self.bool_method_call(obj, method_name, args)
+ return self.bool_method_call(obj, method_name, args, kwargs)
if isinstance(obj, int):
- return self.int_method_call(obj, method_name, args)
+ return self.int_method_call(obj, method_name, args, kwargs)
if isinstance(obj, list):
- return self.array_method_call(obj, method_name, args)
+ return self.array_method_call(obj, method_name, args, kwargs)
if isinstance(obj, dict):
- return self.dict_method_call(obj, method_name, args)
+ return self.dict_method_call(obj, method_name, args, kwargs)
if isinstance(obj, mesonlib.File):
raise InvalidArguments('File object "%s" is not callable.' % obj)
if not isinstance(obj, InterpreterObject):
@@ -859,7 +870,8 @@ The result of this is undefined and will become a hard error in a future Meson r
obj.current_node = node
return obj.method_call(method_name, args, self.kwargs_string_keys(kwargs))
- def bool_method_call(self, obj: bool, method_name: str, posargs: T.List[TYPE_nvar]) -> T.Union[str, int]:
+ @builtinMethodNoKwargs
+ def bool_method_call(self, obj: bool, method_name: str, posargs: T.List[TYPE_nvar], kwargs: T.Dict[str, T.Any]) -> T.Union[str, int]:
if method_name == 'to_string':
if not posargs:
if obj:
@@ -881,7 +893,8 @@ The result of this is undefined and will become a hard error in a future Meson r
else:
raise InterpreterException('Unknown method "%s" for a boolean.' % method_name)
- def int_method_call(self, obj: int, method_name: str, posargs: T.List[TYPE_nvar]) -> T.Union[str, bool]:
+ @builtinMethodNoKwargs
+ def int_method_call(self, obj: int, method_name: str, posargs: T.List[TYPE_nvar], kwargs: T.Dict[str, T.Any]) -> T.Union[str, bool]:
if method_name == 'is_even':
if not posargs:
return obj % 2 == 0
@@ -913,7 +926,8 @@ The result of this is undefined and will become a hard error in a future Meson r
return s
return None
- def string_method_call(self, obj: str, method_name: str, posargs: T.List[TYPE_nvar]) -> T.Union[str, int, bool, T.List[str]]:
+ @builtinMethodNoKwargs
+ def string_method_call(self, obj: str, method_name: str, posargs: T.List[TYPE_nvar], kwargs: T.Dict[str, T.Any]) -> T.Union[str, int, bool, T.List[str]]:
if method_name == 'strip':
s1 = self._get_one_string_posarg(posargs, 'strip')
if s1 is not None:
@@ -982,7 +996,8 @@ The result of this is undefined and will become a hard error in a future Meson r
def unknown_function_called(self, func_name: str) -> None:
raise InvalidCode('Unknown function "%s".' % func_name)
- def array_method_call(self, obj: list, method_name: str, posargs: T.List[TYPE_nvar]) -> TYPE_var:
+ @builtinMethodNoKwargs
+ def array_method_call(self, obj: list, method_name: str, posargs: T.List[TYPE_nvar], kwargs: T.Dict[str, T.Any]) -> TYPE_var:
if method_name == 'contains':
def check_contains(el: list) -> bool:
if len(posargs) != 1:
@@ -1022,7 +1037,8 @@ The result of this is undefined and will become a hard error in a future Meson r
m = 'Arrays do not have a method called {!r}.'
raise InterpreterException(m.format(method_name))
- def dict_method_call(self, obj: dict, method_name: str, posargs: T.List[TYPE_nvar]) -> TYPE_var:
+ @builtinMethodNoKwargs
+ def dict_method_call(self, obj: dict, method_name: str, posargs: T.List[TYPE_nvar], kwargs: T.Dict[str, T.Any]) -> TYPE_var:
if method_name in ('has_key', 'get'):
if method_name == 'has_key':
if len(posargs) != 1: