interpreter: Add support for dict addition

pull/3906/head
Xavier Claessens 7 years ago committed by Jussi Pakkanen
parent 219dec39c0
commit 4f088365e4
  1. 3
      docs/markdown/Reference-manual.md
  2. 10
      docs/markdown/snippets/dict_add.md
  3. 14
      mesonbuild/interpreterbase.py
  4. 12
      test cases/common/197 dict/meson.build

@ -1859,6 +1859,9 @@ statement](Syntax.md#foreach-statements).
Dictionaries are available since 0.47.0.
Since 0.48.0 dictionaries can be added (e.g. `d1 = d2 + d3` and `d1 += d2`).
Values from the second dictionary overrides values from the first.
## Returned objects
These are objects returned by the [functions listed above](#functions).

@ -0,0 +1,10 @@
## Dictionary addition
Dictionaries can now be added, values from the second dictionary overrides values
from the first
```meson
d1 = {'a' : 'b'}
d3 = d1 + {'a' : 'c'}
d3 += {'d' : 'e'}
```

@ -573,6 +573,8 @@ The result of this is undefined and will become a hard error in a future Meson r
return r
if cur.operation == 'add':
if isinstance(l, dict) and isinstance(r, dict):
return {**l, **r}
try:
return l + r
except Exception as e:
@ -651,14 +653,18 @@ The result of this is undefined and will become a hard error in a future Meson r
if not isinstance(addition, int):
raise InvalidArguments('The += operator requires an int on the right hand side if the variable on the left is an int')
new_value = old_variable + addition
elif not isinstance(old_variable, list):
raise InvalidArguments('The += operator currently only works with arrays, strings or ints ')
# Add other data types here.
else:
elif isinstance(old_variable, list):
if isinstance(addition, list):
new_value = old_variable + addition
else:
new_value = old_variable + [addition]
elif isinstance(old_variable, dict):
if not isinstance(addition, dict):
raise InvalidArguments('The += operator requires a dict on the right hand side if the variable on the left is a dict')
new_value = {**old_variable, **addition}
# Add other data types here.
else:
raise InvalidArguments('The += operator currently only works with arrays, dicts, strings or ints ')
self.set_variable(varname, new_value)
def evaluate_indexing(self, node):

@ -21,3 +21,15 @@ empty_dict = {}
foreach key, value : empty_dict
assert(false, 'This dict should be empty')
endforeach
d1 = empty_dict + {'a' : 'b'}
assert(d1 == {'a' : 'b'}, 'dict addition is not working')
d2 = d1 + {'a' : 'b2', 'c' : 'd'}
assert(d2 == {'a' : 'b2', 'c' : 'd'}, 'dict addition is not working')
assert(d1 == {'a' : 'b'}, 'dict should be immutable')
d3 = d2
d3 += {'e' : 'f'}
assert(d3 == {'a' : 'b2', 'c' : 'd', 'e' : 'f'}, 'dict plusassign is not working')
assert(d2 == {'a' : 'b2', 'c' : 'd'}, 'dict should be immutable')

Loading…
Cancel
Save