@@ -524,23 +524,53 @@ function assignArrayElement
524524 input Expression value;
525525 output Expression result;
526526protected
527- Expression sub;
527+ Expression sub, val ;
528528 list< Subscript > rest_subs;
529529 Integer idx;
530+ list< Expression > subs, vals;
530531algorithm
531532 result := match (arrayExp, subscripts)
532- case (Expression . ARRAY (), { Subscript . INDEX (sub)} ) guard Expression . isScalarLiteral(sub)
533+ case (Expression . ARRAY (), Subscript . INDEX (sub) :: rest_subs ) guard Expression . isScalarLiteral(sub)
533534 algorithm
534535 idx := Expression . toInteger(sub);
535- arrayExp. elements := List . set(arrayExp. elements, idx, value);
536+
537+ if listEmpty(rest_subs) then
538+ arrayExp. elements := List . set(arrayExp. elements, idx, value);
539+ else
540+ arrayExp. elements := List . set(arrayExp. elements, idx,
541+ assignArrayElement(listGet(arrayExp. elements, idx), rest_subs, value));
542+ end if ;
536543 then
537544 arrayExp;
538545
539- case (Expression . ARRAY (), Subscript . INDEX (sub) :: rest_subs) guard Expression . isScalarLiteral(sub )
546+ case (Expression . ARRAY (), Subscript . SLICE (sub) :: rest_subs)
540547 algorithm
541- idx := Expression . toInteger(sub);
542- arrayExp. elements := List . set(arrayExp. elements, idx,
543- assignArrayElement(listGet(arrayExp. elements, idx), rest_subs, value));
548+ subs := Expression . arrayElements(sub);
549+ vals := Expression . arrayElements(value);
550+
551+ if listEmpty(rest_subs) then
552+ for s in subs loop
553+ val :: vals := vals;
554+ idx := Expression . toInteger(s);
555+ arrayExp. elements := List . set(arrayExp. elements, idx, val);
556+ end for ;
557+ else
558+ for s in subs loop
559+ val :: vals := vals;
560+ idx := Expression . toInteger(s);
561+ arrayExp. elements := List . set(arrayExp. elements, idx,
562+ assignArrayElement(listGet(arrayExp. elements, idx), rest_subs, val));
563+ end for ;
564+ end if ;
565+ then
566+ arrayExp;
567+
568+ case (Expression . ARRAY (), Subscript . WHOLE () :: rest_subs)
569+ algorithm
570+ if not listEmpty(rest_subs) then
571+ arrayExp. elements := list(assignArrayElement(e, rest_subs, v) threaded for
572+ e in arrayExp. elements, v in Expression . arrayElements(value));
573+ end if ;
544574 then
545575 arrayExp;
546576
0 commit comments