Skip to content

Commit cfd6503

Browse files
committed
rewriter: fix kwargs info for dict-valued kwargs
We can't modify dict-valued kwargs (#14739) but this lets us at least read them.
1 parent 0ef1590 commit cfd6503

File tree

4 files changed

+52
-1
lines changed

4 files changed

+52
-1
lines changed

mesonbuild/rewriter.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from mesonbuild.mesonlib import MesonException, setup_vsenv, relpath
1717
from . import mlog, environment
1818
from functools import wraps
19-
from .mparser import Token, ArrayNode, ArgumentNode, ArithmeticNode, AssignmentNode, BaseNode, StringNode, BooleanNode, ElementaryNode, IdNode, FunctionNode, PlusAssignmentNode
19+
from .mparser import Token, ArrayNode, ArgumentNode, ArithmeticNode, AssignmentNode, BaseNode, StringNode, BooleanNode, DictNode, ElementaryNode, IdNode, FunctionNode, PlusAssignmentNode
2020
from .mintro import IntrospectionEncoder
2121
import json, os, re, sys, codecs
2222
import typing as T
@@ -569,6 +569,16 @@ def process_kwargs(self, cmd: T.Dict[str, T.Any]) -> None:
569569
element = i.value
570570
data_list += [element]
571571
info_data[key] = data_list
572+
elif isinstance(val, DictNode):
573+
data_dict = {}
574+
for k, v in val.args.kwargs.items():
575+
if not isinstance(k, StringNode):
576+
continue
577+
value = None
578+
if isinstance(v, ElementaryNode):
579+
value = v.value
580+
data_dict[k.value] = value
581+
info_data[key] = data_dict
572582

573583
self.add_info('kwargs', '{}#{}'.format(cmd['function'], cmd['id']), info_data)
574584
return # Nothing else to do
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[
2+
{
3+
"type": "kwargs",
4+
"function": "project",
5+
"id": "/",
6+
"operation": "info"
7+
},
8+
{
9+
"type": "kwargs",
10+
"function": "dependency",
11+
"id": "dep1",
12+
"operation": "info"
13+
}
14+
]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
project(
2+
'rewritetest', 'cpp',
3+
version: '0.0.1',
4+
default_options: {
5+
'c_std': 'c11',
6+
'cpp_std': 'c++17',
7+
},
8+
)
9+
10+
dep1 = dependency('zlib', required: false, default_options: {'foo': 'bar'})

unittests/rewritetests.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,23 @@ def test_kwargs_info(self):
289289
}
290290
self.assertDictEqual(out, expected)
291291

292+
def test_kwargs_info_dict(self):
293+
self.prime('8 kwargs dict')
294+
out = self.rewrite(self.builddir, os.path.join(self.builddir, 'info.json'))
295+
expected = {
296+
'kwargs': {
297+
'project#/': {
298+
'default_options': {'c_std': 'c11', 'cpp_std': 'c++17'},
299+
'version': '0.0.1'
300+
},
301+
'dependency#dep1': {
302+
'default_options': {'foo': 'bar'},
303+
'required': False
304+
}
305+
}
306+
}
307+
self.assertDictEqual(out, expected)
308+
292309
def test_kwargs_set(self):
293310
self.prime('3 kwargs')
294311
self.rewrite(self.builddir, os.path.join(self.builddir, 'set.json'))

0 commit comments

Comments
 (0)