aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2022-06-14 22:55:12 -0400
committerEli Schwartz <eschwartz@archlinux.org>2022-06-17 14:33:02 -0400
commitca52dac38ba2cfcbfb47a7b2fa8733b73cea070a (patch)
tree23449788a2b000d3e718a80ba2e81d37e390a9d4 /mesonbuild/interpreter
parentb13a95c30156c0c9ebf11ceb664acee08a835b2c (diff)
downloadmeson-ca52dac38ba2cfcbfb47a7b2fa8733b73cea070a.zip
meson-ca52dac38ba2cfcbfb47a7b2fa8733b73cea070a.tar.gz
meson-ca52dac38ba2cfcbfb47a7b2fa8733b73cea070a.tar.bz2
refactor logic for parsing dependency variables into type_checking module
We will momentarily use this to implement typed_kwargs, but not for all usage sites.
Diffstat (limited to 'mesonbuild/interpreter')
-rw-r--r--mesonbuild/interpreter/interpreter.py22
-rw-r--r--mesonbuild/interpreter/type_checking.py31
2 files changed, 41 insertions, 12 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 5cadf52..07afdce 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -77,6 +77,8 @@ from .type_checking import (
REQUIRED_KW,
NoneType,
in_set_validator,
+ variables_validator,
+ variables_convertor,
env_convertor_with_method
)
from . import primitives as P_OBJ
@@ -633,23 +635,19 @@ class Interpreter(InterpreterBase, HoldableObject):
if dict_new and variables:
FeatureNew.single_use(f'{argname} as dictionary', '0.56.0', self.subproject, location=self.current_node)
else:
- varlist = mesonlib.stringlistify(variables)
+ variables = mesonlib.stringlistify(variables)
if list_new:
FeatureNew.single_use(f'{argname} as list of strings', '0.56.0', self.subproject, location=self.current_node)
- variables = {}
- for v in varlist:
- try:
- (key, value) = v.split('=', 1)
- except ValueError:
- raise InterpreterException(f'Variable {v!r} must have a value separated by equals sign.')
- variables[key.strip()] = value.strip()
+
+ invalid_msg = variables_validator(variables)
+ if invalid_msg is not None:
+ raise InterpreterException(invalid_msg)
+
+ variables = variables_convertor(variables)
for k, v in variables.items():
- if not k or not v:
- raise InterpreterException('Empty variable name or value')
- if any(c.isspace() for c in k):
- raise InterpreterException(f'Invalid whitespace in variable name "{k}"')
if not isinstance(v, str):
raise InterpreterException('variables values must be strings.')
+
return variables
@FeatureNewKwargs('declare_dependency', '0.46.0', ['link_whole'])
diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py
index ec23f36..864153c 100644
--- a/mesonbuild/interpreter/type_checking.py
+++ b/mesonbuild/interpreter/type_checking.py
@@ -107,6 +107,37 @@ def _lower_strlist(input: T.List[str]) -> T.List[str]:
return [i.lower() for i in input]
+def variables_validator(contents: T.Union[T.List[str], T.Dict[str, str]]) -> T.Optional[str]:
+ if isinstance(contents, dict):
+ variables = contents
+ else:
+ variables = {}
+ for v in contents:
+ try:
+ key, val = v.split('=', 1)
+ except ValueError:
+ return f'variable {v!r} must have a value separated by equals sign.'
+ variables[key.strip()] = val.strip()
+ for k, v in variables.items():
+ if not k:
+ return 'empty variable name'
+ if not v:
+ return 'empty variable value'
+ if any(c.isspace() for c in k):
+ return f'invalid whitespace in variable name {k!r}'
+ return None
+
+
+def variables_convertor(contents: T.Union[T.List[str], T.Dict[str, str]]) -> T.Dict[str, str]:
+ if isinstance(contents, dict):
+ return contents
+ variables = {}
+ for v in contents:
+ key, val = v.split('=', 1)
+ variables[key.strip()] = val.strip()
+ return variables
+
+
NATIVE_KW = KwargInfo(
'native', bool,
default=False,