diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-01-31 15:42:19 +0100 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-01-31 15:43:04 +0100 |
commit | 56558652460104cbc74a4f1fa328d3aa34eebf0c (patch) | |
tree | cea1cbe1a60b076a792a87f400a7c28932f6f9a2 | |
parent | c64d80cf2fa94c458e4fc528723bb7ed11daa3a0 (diff) | |
download | meson-56558652460104cbc74a4f1fa328d3aa34eebf0c.zip meson-56558652460104cbc74a4f1fa328d3aa34eebf0c.tar.gz meson-56558652460104cbc74a4f1fa328d3aa34eebf0c.tar.bz2 |
Added test case
-rw-r--r-- | mesonbuild/ast/introspection.py | 6 | ||||
-rw-r--r-- | mesonbuild/rewriter.py | 42 | ||||
-rwxr-xr-x | run_unittests.py | 64 | ||||
-rw-r--r-- | test cases/rewrite/3 kwargs/add.json | 29 | ||||
-rw-r--r-- | test cases/rewrite/3 kwargs/delete.json | 20 | ||||
-rw-r--r-- | test cases/rewrite/3 kwargs/info.json | 14 | ||||
-rw-r--r-- | test cases/rewrite/3 kwargs/meson.build | 5 | ||||
-rw-r--r-- | test cases/rewrite/3 kwargs/remove.json | 29 | ||||
-rw-r--r-- | test cases/rewrite/3 kwargs/set.json | 24 |
9 files changed, 220 insertions, 13 deletions
diff --git a/mesonbuild/ast/introspection.py b/mesonbuild/ast/introspection.py index 0a4d73a..67a0fe7 100644 --- a/mesonbuild/ast/introspection.py +++ b/mesonbuild/ast/introspection.py @@ -163,10 +163,8 @@ class IntrospectionInterpreter(AstInterpreter): if elemetary_nodes: source_nodes += [curr] - # Filter out kwargs from other target types. For example 'soversion' - # passed to library() when default_library == 'static'. - kwargs = {k: v for k, v in kwargs.items() if k in targetclass.known_kwargs} - + # Make sure nothing can crash when creating the build class + kwargs = {} is_cross = False objects = [] empty_sources = [] # Passing the unresolved sources list causes errors diff --git a/mesonbuild/rewriter.py b/mesonbuild/rewriter.py index cad6a5e..4a7f595 100644 --- a/mesonbuild/rewriter.py +++ b/mesonbuild/rewriter.py @@ -232,7 +232,7 @@ class MesonIDList(MesonList): super().__init__(node) def _new_element_node(self, value): - return mparser.StringNode(mparser.Token('', '', 0, 0, 0, None, str(value))) + return mparser.IdNode(mparser.Token('', '', 0, 0, 0, None, str(value))) def _check_is_equal(self, node, value): if isinstance(node, mparser.IdNode): @@ -246,7 +246,7 @@ rewriter_keys = { 'kwargs': { 'function': (str, None, None), 'id': (str, None, None), - 'operation': (str, None, ['set', 'delete', 'add', 'remove']), + 'operation': (str, None, ['set', 'delete', 'add', 'remove', 'info']), 'kwargs': (dict, {}, None) }, 'target': { @@ -355,16 +355,40 @@ class Rewriter: # Find the function node to modify node = None + arg_node = None if cmd['function'] == 'project': node = self.interpreter.project_node + arg_node = node.args elif cmd['function'] == 'target': tmp = self.find_target(cmd['id']) if tmp: node = tmp['node'] + arg_node = node.args if not node: mlog.error('Unable to find the function node') assert(isinstance(node, mparser.FunctionNode)) - + assert(isinstance(arg_node, mparser.ArgumentNode)) + + # Print kwargs info + if cmd['operation'] == 'info': + info_data = {} + for key, val in arg_node.kwargs.items(): + info_data[key] = None + if isinstance(val, mparser.ElementaryNode): + info_data[key] = val.value + elif isinstance(val, mparser.ArrayNode): + data_list = [] + for i in val.args.arguments: + element = None + if isinstance(i, mparser.ElementaryNode): + element = i.value + data_list += [element] + info_data[key] = data_list + + self.add_info('kwargs', '{}#{}'.format(cmd['function'], cmd['id']), info_data) + return # Nothing else to do + + # Modify the kwargs num_changed = 0 for key, val in cmd['kwargs'].items(): if key not in kwargs_def: @@ -373,17 +397,17 @@ class Rewriter: # Remove the key from the kwargs if cmd['operation'] == 'delete': - if key in node.args.kwargs: + if key in arg_node.kwargs: mlog.log(' -- Deleting', mlog.bold(key), 'from the kwargs') - del node.args.kwargs[key] + del arg_node.kwargs[key] num_changed += 1 else: mlog.log(' -- Key', mlog.bold(key), 'is already deleted') continue - if key not in node.args.kwargs: - node.args.kwargs[key] = None - modifyer = kwargs_def[key](node.args.kwargs[key]) + if key not in arg_node.kwargs: + arg_node.kwargs[key] = None + modifyer = kwargs_def[key](arg_node.kwargs[key]) if not modifyer.can_modify(): mlog.log(' -- Skipping', mlog.bold(key), 'because it is to complex to modify') @@ -400,7 +424,7 @@ class Rewriter: modifyer.remove_value(val) # Write back the result - node.args.kwargs[key] = modifyer.get_node() + arg_node.kwargs[key] = modifyer.get_node() num_changed += 1 if num_changed > 0 and node not in self.modefied_nodes: diff --git a/run_unittests.py b/run_unittests.py index d68912f..18290f2 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -5130,6 +5130,70 @@ class RewriterTests(BasePlatformTests): out = self.extract_test_data(out) self.assertDictEqual(list(out['target'].values())[0], expected) + def test_kwargs_info(self): + self.prime('3 kwargs') + out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json')) + out = self.extract_test_data(out) + expected = { + 'kwargs': { + 'project#': {'version': '0.0.1'}, + 'target#tgt1': {'build_by_default': True} + } + } + self.assertDictEqual(out, expected) + + def test_kwargs_set(self): + self.prime('3 kwargs') + self.rewrite(self.builddir, os.path.join(self.builddir, 'set.json')) + out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json')) + out = self.extract_test_data(out) + expected = { + 'kwargs': { + 'project#': {'version': '0.0.2', 'meson_version': '0.50.0', 'license': ['GPL', 'MIT']}, + 'target#tgt1': {'build_by_default': False, 'build_rpath': '/usr/local', 'dependencies': 'dep1'} + } + } + self.assertDictEqual(out, expected) + + def test_kwargs_add(self): + self.prime('3 kwargs') + self.rewrite(self.builddir, os.path.join(self.builddir, 'add.json')) + out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json')) + out = self.extract_test_data(out) + expected = { + 'kwargs': { + 'project#': {'version': '0.0.1', 'license': ['GPL', 'MIT', 'BSD']}, + 'target#tgt1': {'build_by_default': True} + } + } + self.assertDictEqual(out, expected) + + def test_kwargs_remove(self): + self.prime('3 kwargs') + self.rewrite(self.builddir, os.path.join(self.builddir, 'remove.json')) + out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json')) + out = self.extract_test_data(out) + expected = { + 'kwargs': { + 'project#': {'version': '0.0.1', 'license': 'GPL'}, + 'target#tgt1': {'build_by_default': True} + } + } + self.assertDictEqual(out, expected) + + def test_kwargs_delete(self): + self.prime('3 kwargs') + self.rewrite(self.builddir, os.path.join(self.builddir, 'delete.json')) + out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json')) + out = self.extract_test_data(out) + expected = { + 'kwargs': { + 'project#': {}, + 'target#tgt1': {} + } + } + self.assertDictEqual(out, expected) + class NativeFileTests(BasePlatformTests): def setUp(self): diff --git a/test cases/rewrite/3 kwargs/add.json b/test cases/rewrite/3 kwargs/add.json new file mode 100644 index 0000000..e398b7b --- /dev/null +++ b/test cases/rewrite/3 kwargs/add.json @@ -0,0 +1,29 @@ +[ + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "set", + "kwargs": { + "license": "GPL" + } + }, + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "add", + "kwargs": { + "license": ["MIT"] + } + }, + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "add", + "kwargs": { + "license": "BSD" + } + } +] diff --git a/test cases/rewrite/3 kwargs/delete.json b/test cases/rewrite/3 kwargs/delete.json new file mode 100644 index 0000000..2f75484 --- /dev/null +++ b/test cases/rewrite/3 kwargs/delete.json @@ -0,0 +1,20 @@ +[ + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "delete", + "kwargs": { + "version": null + } + }, + { + "type": "kwargs", + "function": "target", + "id": "helloWorld", + "operation": "delete", + "kwargs": { + "build_by_default": false + } + } +] diff --git a/test cases/rewrite/3 kwargs/info.json b/test cases/rewrite/3 kwargs/info.json new file mode 100644 index 0000000..55a543e --- /dev/null +++ b/test cases/rewrite/3 kwargs/info.json @@ -0,0 +1,14 @@ +[ + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "info" + }, + { + "type": "kwargs", + "function": "target", + "id": "tgt1", + "operation": "info" + } +] diff --git a/test cases/rewrite/3 kwargs/meson.build b/test cases/rewrite/3 kwargs/meson.build new file mode 100644 index 0000000..3090f7d --- /dev/null +++ b/test cases/rewrite/3 kwargs/meson.build @@ -0,0 +1,5 @@ +project('rewritetest', 'cpp', version: '0.0.1') + +dep1 = dependency('zlib', required: false) + +tgt1 = executable('helloWorld', 'main.cpp', build_by_default: true) diff --git a/test cases/rewrite/3 kwargs/remove.json b/test cases/rewrite/3 kwargs/remove.json new file mode 100644 index 0000000..bd7596f --- /dev/null +++ b/test cases/rewrite/3 kwargs/remove.json @@ -0,0 +1,29 @@ +[ + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "set", + "kwargs": { + "license": ["GPL", "MIT", "BSD"] + } + }, + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "remove", + "kwargs": { + "license": ["MIT"] + } + }, + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "remove", + "kwargs": { + "license": "BSD" + } + } +] diff --git a/test cases/rewrite/3 kwargs/set.json b/test cases/rewrite/3 kwargs/set.json new file mode 100644 index 0000000..9bc87a2 --- /dev/null +++ b/test cases/rewrite/3 kwargs/set.json @@ -0,0 +1,24 @@ +[ + { + "type": "kwargs", + "function": "project", + "id": "", + "operation": "set", + "kwargs": { + "version": "0.0.2", + "meson_version": "0.50.0", + "license": ["GPL", "MIT"] + } + }, + { + "type": "kwargs", + "function": "target", + "id": "helloWorld", + "operation": "set", + "kwargs": { + "build_by_default": false, + "build_rpath": "/usr/local", + "dependencies": "dep1" + } + } +] |