aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-02-25 09:59:13 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2021-02-25 22:58:45 +0200
commitcef5cab23c6fb53e4ddf0d2460cb2258ef64f6d5 (patch)
tree840f2f5c0494996fd1ccfad2ff70df9532b053d0
parent4e5efd3897c5bd03fbcd32fcf43c82879ca8caf4 (diff)
downloadmeson-cef5cab23c6fb53e4ddf0d2460cb2258ef64f6d5.zip
meson-cef5cab23c6fb53e4ddf0d2460cb2258ef64f6d5.tar.gz
meson-cef5cab23c6fb53e4ddf0d2460cb2258ef64f6d5.tar.bz2
Support multiple args in error()
Seems it got forgotten when that was added to warnings() and message(). Fixes: #8414.
-rw-r--r--docs/markdown/Reference-manual.md3
-rw-r--r--docs/markdown/snippets/error_msg.md4
-rw-r--r--mesonbuild/interpreter.py35
-rwxr-xr-xrun_unittests.py5
4 files changed, 24 insertions, 23 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md
index 3693e57..4fb0b63 100644
--- a/docs/markdown/Reference-manual.md
+++ b/docs/markdown/Reference-manual.md
@@ -580,6 +580,9 @@ Returns a [disabler object](#disabler-object).
Print the argument string and halts the build process.
+*(since 0.58.0)* Can take more than one argument that will be separated by
+space.
+
### environment()
``` meson
diff --git a/docs/markdown/snippets/error_msg.md b/docs/markdown/snippets/error_msg.md
new file mode 100644
index 0000000..a17372f
--- /dev/null
+++ b/docs/markdown/snippets/error_msg.md
@@ -0,0 +1,4 @@
+## `error()` with multiple arguments
+
+Just like `warning()` and `message()`, `error()` can now take more than one
+argument that will be separated by space.
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 08c7424..d5a0a84 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -61,16 +61,16 @@ permitted_method_kwargs = {
'sources'},
}
-def stringifyUserArguments(args):
+def stringifyUserArguments(args, quote=False):
if isinstance(args, list):
- return '[%s]' % ', '.join([stringifyUserArguments(x) for x in args])
+ return '[%s]' % ', '.join([stringifyUserArguments(x, True) for x in args])
elif isinstance(args, dict):
- return '{%s}' % ', '.join(['%s : %s' % (stringifyUserArguments(k), stringifyUserArguments(v)) for k, v in args.items()])
+ return '{%s}' % ', '.join(['%s : %s' % (stringifyUserArguments(k, True), stringifyUserArguments(v, True)) for k, v in args.items()])
elif isinstance(args, int):
return str(args)
elif isinstance(args, str):
- return "'%s'" % args
- raise InvalidArguments('Function accepts only strings, integers, lists and lists thereof.')
+ return f"'{args}'" if quote else args
+ raise InvalidArguments('Function accepts only strings, integers, lists, dictionaries and lists thereof.')
class OverrideProgram(dependencies.ExternalProgram):
@@ -3276,26 +3276,12 @@ external dependencies (including libraries) must go to "dependencies".''')
success &= self.add_languages(args, required, MachineChoice.HOST)
return success
- def get_message_string_arg(self, arg):
- if isinstance(arg, list):
- argstr = stringifyUserArguments(arg)
- elif isinstance(arg, dict):
- argstr = stringifyUserArguments(arg)
- elif isinstance(arg, str):
- argstr = arg
- elif isinstance(arg, int):
- argstr = str(arg)
- else:
- raise InvalidArguments('Function accepts only strings, integers, lists and lists thereof.')
-
- return argstr
-
@noArgsFlattening
@noKwargs
def func_message(self, node, args, kwargs):
if len(args) > 1:
FeatureNew.single_use('message with more than one argument', '0.54.0', self.subproject)
- args_str = [self.get_message_string_arg(i) for i in args]
+ args_str = [stringifyUserArguments(i) for i in args]
self.message_impl(args_str)
def message_impl(self, args):
@@ -3357,13 +3343,16 @@ external dependencies (including libraries) must go to "dependencies".''')
def func_warning(self, node, args, kwargs):
if len(args) > 1:
FeatureNew.single_use('warning with more than one argument', '0.54.0', self.subproject)
- args_str = [self.get_message_string_arg(i) for i in args]
+ args_str = [stringifyUserArguments(i) for i in args]
mlog.warning(*args_str, location=node)
+ @noArgsFlattening
@noKwargs
def func_error(self, node, args, kwargs):
- self.validate_arguments(args, 1, [str])
- raise InterpreterException('Problem encountered: ' + args[0])
+ if len(args) > 1:
+ FeatureNew.single_use('error with more than one argument', '0.58.0', self.subproject)
+ args_str = [stringifyUserArguments(i) for i in args]
+ raise InterpreterException('Problem encountered: ' + ' '.join(args_str))
@noKwargs
@noPosargs
diff --git a/run_unittests.py b/run_unittests.py
index a82e476..1989e93 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -5864,6 +5864,11 @@ class FailureTests(BasePlatformTests):
"meson.override_dependency('zlib', declare_dependency())",
"""Tried to override dependency 'zlib' which has already been resolved or overridden""")
+ def test_error_func(self):
+ self.assertMesonRaises("error('a', 'b', ['c', ['d', {'e': 'f'}]], 'g')",
+ "Problem encountered: a b \['c', \['d', {'e' : 'f'}\]\] g")
+
+
@unittest.skipUnless(is_windows() or is_cygwin(), "requires Windows (or Windows via Cygwin)")
class WindowsTests(BasePlatformTests):
'''