AssertionError when unparsing variable with more than one + or - operation
This error was introduced with commit c9733a46 and occurs when unparsing variables with more than one +/- operation.
Code:
import finesse
base = finesse.Model()
base.parse("""
l l1
# these are ok
var v_ok1 (&l1.P + &l1.P)
var v_ok2 (&l1.P + &l1.P * &l1.P)
var v_ok3 (&l1.P + &l1.P * &l1.P * &l1.P)
var v_ok4 (&l1.P + 1 * 1)
# these fail with AssertionError
var v_fail1 (&l1.P + &l1.P + &l1.P)
var v_fail2 (&l1.P + 1 + 1)
""")
base.unparse();
Output:
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
/tmp/ipykernel_151753/2111079225.py in <module>
17 """)
18
---> 19 base.unparse();
~/Repos/ligo/finesse/finesse3/src/finesse/model.py in unparse(self, inplace)
1987 from .script import unparse
1988
-> 1989 return unparse(self, ref_graph=self.syntax_graph if inplace else None)
1990
1991 def unparse_file(self, path, inplace=True):
~/Repos/ligo/finesse/finesse3/src/finesse/script/__init__.py in unparse(item, **kwargs)
161
162 unbuilder = KatUnbuilder()
--> 163 return unbuilder.unbuild(item, **kwargs)
164
165
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in unbuild(self, *args, **kwargs)
137 def unbuild(self, *args, **kwargs):
138 fobj = StringIO()
--> 139 self.unbuild_file(fobj, *args, **kwargs)
140 fobj.seek(0)
141 return fobj.read()
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in unbuild_file(self, fobj, item, ref_graph, ref_node, directive_defaults, argument_defaults, prefer_keywords)
226
227 # Fill the graph.
--> 228 if self._fill(item, ROOT_NODE_NAME, ref_node=ref_node, ref_extras=ref_extras):
229 # Generate KatScript from the graph.
230 unfiller = KatUnfiller()
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill(self, value, path, ref_node, ref_extras, **attributes)
291 )
292
--> 293 if filled_attributes := self._do_fill(
294 value, path, ref_node=ref_node, ref_extras=ref_extras
295 ):
~/miniconda3/envs/f3/lib/python3.9/functools.py in _method(*args, **kwargs)
912 def _method(*args, **kwargs):
913 method = self.dispatcher.dispatch(args[0].__class__)
--> 914 return method.__get__(obj, cls)(*args, **kwargs)
915
916 _method.__isabstractmethod__ = self.__isabstractmethod__
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _(self, model, path, ref_node, ref_extras)
393
394 argument_path = self.graph.item_node_name(order, path)
--> 395 if self._fill(dump, argument_path, node):
396 self.graph.add_edge(
397 argument_path, path, type=KatEdgeType.ARGUMENT, order=order
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill(self, value, path, ref_node, ref_extras, **attributes)
291 )
292
--> 293 if filled_attributes := self._do_fill(
294 value, path, ref_node=ref_node, ref_extras=ref_extras
295 ):
~/miniconda3/envs/f3/lib/python3.9/functools.py in _method(*args, **kwargs)
912 def _method(*args, **kwargs):
913 method = self.dispatcher.dispatch(args[0].__class__)
--> 914 return method.__get__(obj, cls)(*args, **kwargs)
915
916 _method.__isabstractmethod__ = self.__isabstractmethod__
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _(self, dump, path, ref_node, ref_extras)
490 # Fill in the arguments.
491 extra_tokens.extend(
--> 492 self._fill_element_args(
493 dump.parameters, path, ref_node=ref_node, ref_extras=ref_extras
494 )
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill_element_args(self, parameters, path, **kwargs)
906
907 def _fill_element_args(self, parameters, path, **kwargs):
--> 908 return self._fill_directive_args(
909 parameters, path, self._delimit_element_arg, **kwargs
910 )
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill_directive_args(self, parameters, path, delimiter_handler, ref_node, **kwargs)
927 )
928
--> 929 return self._fill_delimited_args(
930 arg_map,
931 var_arg,
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill_delimited_args(self, positional, var_positional, keyword, var_keyword, path, delimiter_handler, ref_args, ref_kwargs, ref_extras)
1219 )
1220
-> 1221 self._fill_arg(value, order, path, arg_ref_node, arg_ref_extras)
1222 order += 1
1223
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill_arg(self, value, order, path, ref_node, ref_extras)
1345 def _fill_arg(self, value, order, path, ref_node, ref_extras):
1346 argument_path = self.graph.item_node_name(order, path)
-> 1347 self._fill(value, argument_path, ref_node, ref_extras)
1348 self.graph.add_edge(argument_path, path, type=KatEdgeType.ARGUMENT, order=order)
1349
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill(self, value, path, ref_node, ref_extras, **attributes)
291 )
292
--> 293 if filled_attributes := self._do_fill(
294 value, path, ref_node=ref_node, ref_extras=ref_extras
295 ):
~/miniconda3/envs/f3/lib/python3.9/functools.py in _method(*args, **kwargs)
912 def _method(*args, **kwargs):
913 method = self.dispatcher.dispatch(args[0].__class__)
--> 914 return method.__get__(obj, cls)(*args, **kwargs)
915
916 _method.__isabstractmethod__ = self.__isabstractmethod__
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _(self, argument, path, ref_node, ref_extras)
581 }
582
--> 583 return self._fill(argument.value, path, ref_node, ref_extras)
584
585 @_do_fill.register(Parameter)
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill(self, value, path, ref_node, ref_extras, **attributes)
291 )
292
--> 293 if filled_attributes := self._do_fill(
294 value, path, ref_node=ref_node, ref_extras=ref_extras
295 ):
~/miniconda3/envs/f3/lib/python3.9/functools.py in _method(*args, **kwargs)
912 def _method(*args, **kwargs):
913 method = self.dispatcher.dispatch(args[0].__class__)
--> 914 return method.__get__(obj, cls)(*args, **kwargs)
915
916 _method.__isabstractmethod__ = self.__isabstractmethod__
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _(self, parameter, path, ref_node, ref_extras)
585 @_do_fill.register(Parameter)
586 def _(self, parameter, path, ref_node, ref_extras):
--> 587 return self._fill(parameter.value, path, ref_node, ref_extras)
588
589 @_do_fill.register(ParameterRef)
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _fill(self, value, path, ref_node, ref_extras, **attributes)
291 )
292
--> 293 if filled_attributes := self._do_fill(
294 value, path, ref_node=ref_node, ref_extras=ref_extras
295 ):
~/miniconda3/envs/f3/lib/python3.9/functools.py in _method(*args, **kwargs)
912 def _method(*args, **kwargs):
913 method = self.dispatcher.dispatch(args[0].__class__)
--> 914 return method.__get__(obj, cls)(*args, **kwargs)
915
916 _method.__isabstractmethod__ = self.__isabstractmethod__
~/Repos/ligo/finesse/finesse3/src/finesse/script/generator.py in _(self, operation, path, ref_node, ref_extras)
773
774 if op in self.spec.binary_operators:
--> 775 assert len(operation.args) == 2
776 extra_tokens.append(self._use_token(self._literal_token("(")))
777 make_arg(operation.args[0], 0)
AssertionError: