From cef5cab23c6fb53e4ddf0d2460cb2258ef64f6d5 Mon Sep 17 00:00:00 2001
From: Xavier Claessens <xavier.claessens@collabora.com>
Date: Thu, 25 Feb 2021 09:59:13 -0500
Subject: Support multiple args in error()

Seems it got forgotten when that was added to warnings() and message().

Fixes: #8414.
---
 mesonbuild/interpreter.py | 35 ++++++++++++-----------------------
 1 file changed, 12 insertions(+), 23 deletions(-)

(limited to 'mesonbuild/interpreter.py')

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
-- 
cgit v1.1