Adding dictionary entry using string variable as key.

pull/6172/head
franczc 5 years ago committed by Michael Hirsch, Ph.D
parent 51d0e02292
commit adb4e071e6
  1. 17
      docs/markdown/snippets/add_dictionary_variable_key.md
  2. 13
      mesonbuild/interpreterbase.py
  3. 20
      mesonbuild/mparser.py
  4. 12
      test cases/common/228 add dict variable key/meson.build

@ -0,0 +1,17 @@
## Adding dictionary entry using string variable as key
New dictionary entry can now be added using string variable as key,
in addition to using string literal as key.
```meson
dict = {}
# A variable to be used as a key
key = 'myKey'
# Add new entry using the variable
dict += {key : 'myValue'}
# Test that the stored value is correct
assert(dict[key] == 'myValue', 'Incorrect value retrieved from dictionary')
```

@ -731,7 +731,16 @@ The result of this is undefined and will become a hard error in a future Meson r
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}
new_addition = {}
for (key, value) in addition.items():
if isinstance(key, str):
new_addition[key] = value
elif isinstance(key, mparser.IdNode):
FeatureNew('Adding dictionary entry using string variable as key', '0.53.0').use(self.subproject)
new_addition[self.get_variable(key.value)] = value
else:
raise InvalidArguments('Dictionary key must be a string or string variable')
new_value = {**old_variable, **new_addition}
# Add other data types here.
else:
raise InvalidArguments('The += operator currently only works with arrays, dicts, strings or ints ')
@ -1021,8 +1030,6 @@ The result of this is undefined and will become a hard error in a future Meson r
reduced_pos = [self.evaluate_statement(arg) for arg in args.arguments]
reduced_kw = {}
for key in args.kwargs.keys():
if not isinstance(key, str):
raise InvalidArguments('Keyword argument name is not a string.')
a = args.kwargs[key]
reduced_kw[key] = self.evaluate_statement(a)
self.argument_depth -= 1

@ -676,14 +676,18 @@ class Parser:
while not isinstance(s, EmptyNode):
potential = self.current
if self.accept('colon'):
if not isinstance(s, StringNode):
raise ParseException('Key must be a string.',
self.getline(), s.lineno, s.colno)
if s.value in a.kwargs:
# + 1 to colno to point to the actual string, not the opening quote
raise ParseException('Duplicate dictionary key: {}'.format(s.value),
self.getline(), s.lineno, s.colno + 1)
a.set_kwarg(s.value, self.statement())
if isinstance(s, StringNode):
if s.value in a.kwargs:
# + 1 to colno to point to the actual string, not the opening quote
raise ParseException('Duplicate dictionary key: {}'.format(s.value), self.getline(), s.lineno, s.colno + 1)
a.set_kwarg(s.value, self.statement())
elif isinstance(s, IdNode) and isinstance(s.value, str):
for key in a.kwargs:
if s.value == key.value:
raise ParseException('Duplicate dictionary variable key: {}'.format(s.value), self.getline(), s.lineno, s.colno)
a.set_kwarg(s, self.statement())
else:
raise ParseException('Key must be a string or string variable', self.getline(), s.lineno, s.colno)
potential = self.current
if not self.accept('comma'):
return a

@ -0,0 +1,12 @@
project('add dictionary entry using string variable as key', meson_version: '>=0.52')
dict = {}
# A variable to be used as a key
key = 'myKey'
# Add new entry using the variable
dict += {key : 'myValue'}
# Test that the stored value is correct
assert(dict[key] == 'myValue', 'Incorrect value retrieved from dictionary')
Loading…
Cancel
Save