@@ -283,6 +283,13 @@ public
283283 Type ty;
284284 end TUPLE_ELEMENT ;
285285
286+ record RECORD_ELEMENT
287+ Expression recordExp;
288+ Integer index;
289+ String fieldName;
290+ Type ty;
291+ end RECORD_ELEMENT ;
292+
286293 record BOX "MetaModelica boxed value"
287294 Expression exp;
288295 end BOX ;
@@ -613,6 +620,17 @@ public
613620 then
614621 comp;
615622
623+ case RECORD_ELEMENT ()
624+ algorithm
625+ RECORD_ELEMENT (recordExp = e1, index = i) := exp2;
626+ comp := Util . intCompare(exp1. index, i);
627+
628+ if comp == 0 then
629+ comp := compare(exp1. recordExp, e1);
630+ end if ;
631+ then
632+ comp;
633+
616634 else
617635 algorithm
618636 Error . assertion(false , getInstanceName() + " got unknown expression." , sourceInfo());
@@ -694,6 +712,7 @@ public
694712 case UNBOX () then exp. ty;
695713 case SUBSCRIPTED_EXP () then exp. ty;
696714 case TUPLE_ELEMENT () then exp. ty;
715+ case RECORD_ELEMENT () then exp. ty;
697716 case BOX () then Type . METABOXED (typeOf(exp. exp));
698717 case MUTABLE () then typeOf(Mutable . access(exp. exp));
699718 case EMPTY () then exp. ty;
@@ -723,6 +742,7 @@ public
723742 case UNBOX () algorithm exp. ty := ty; then ();
724743 case SUBSCRIPTED_EXP () algorithm exp. ty := ty; then ();
725744 case TUPLE_ELEMENT () algorithm exp. ty := ty; then ();
745+ case RECORD_ELEMENT () algorithm exp. ty := ty; then ();
726746 else ();
727747 end match;
728748 end setType;
@@ -1351,6 +1371,7 @@ public
13511371 case CAST () then "CAST(" + Type . toString(exp. ty) + ", " + toString(exp. exp) + ")" ;
13521372 case SUBSCRIPTED_EXP () then toString(exp. exp) + Subscript . toStringList(exp. subscripts);
13531373 case TUPLE_ELEMENT () then toString(exp. tupleExp) + "[" + intString(exp. index) + "]" ;
1374+ case RECORD_ELEMENT () then toString(exp. recordExp) + "[field: " + exp. fieldName + "]" ;
13541375 case MUTABLE () then toString(Mutable . access(exp. exp));
13551376 case EMPTY () then "#EMPTY#" ;
13561377
@@ -1502,6 +1523,9 @@ public
15021523 case TUPLE_ELEMENT ()
15031524 then DAE . TSUB (toDAE(exp. tupleExp), exp. index, Type . toDAE(exp. ty));
15041525
1526+ case RECORD_ELEMENT ()
1527+ then DAE . RSUB (toDAE(exp. recordExp), exp. index, exp. fieldName, Type . toDAE(exp. ty));
1528+
15051529 else
15061530 algorithm
15071531 Error . assertion(false , getInstanceName() + " got unknown expression '" + toString(exp) + "'" , sourceInfo());
@@ -1714,6 +1738,12 @@ public
17141738 then
17151739 if referenceEq(exp. tupleExp, e1) then exp else TUPLE_ELEMENT (e1, exp. index, exp. ty);
17161740
1741+ case RECORD_ELEMENT ()
1742+ algorithm
1743+ e1 := map(exp. recordExp, func );
1744+ then
1745+ if referenceEq(exp. recordExp, e1) then exp else RECORD_ELEMENT (e1, exp. index, exp. fieldName, exp. ty);
1746+
17171747 case BOX ()
17181748 algorithm
17191749 e1 := map(exp. exp, func );
@@ -2040,6 +2070,12 @@ public
20402070 then
20412071 if referenceEq(exp. tupleExp, e1) then exp else TUPLE_ELEMENT (e1, exp. index, exp. ty);
20422072
2073+ case RECORD_ELEMENT ()
2074+ algorithm
2075+ e1 := func (exp. recordExp);
2076+ then
2077+ if referenceEq(exp. recordExp, e1) then exp else RECORD_ELEMENT (e1, exp. index, exp. fieldName, exp. ty);
2078+
20432079 case BOX ()
20442080 algorithm
20452081 e1 := func (exp. exp);
@@ -2341,6 +2377,7 @@ public
23412377 List . fold(exp. subscripts, function Subscript . foldExp(func = func ), result);
23422378
23432379 case TUPLE_ELEMENT () then fold(exp. tupleExp, func , arg);
2380+ case RECORD_ELEMENT () then fold(exp. recordExp, func , arg);
23442381 case BOX () then fold(exp. exp, func , arg);
23452382 case MUTABLE () then fold(Mutable . access(exp. exp), func , arg);
23462383 else arg;
@@ -2596,6 +2633,7 @@ public
25962633 ();
25972634
25982635 case TUPLE_ELEMENT () algorithm apply(exp. tupleExp, func ); then ();
2636+ case RECORD_ELEMENT () algorithm apply(exp. recordExp, func ); then ();
25992637 case BOX () algorithm apply(exp. exp, func ); then ();
26002638 case MUTABLE () algorithm apply(Mutable . access(exp. exp), func ); then ();
26012639 else ();
@@ -2912,6 +2950,12 @@ public
29122950 then
29132951 if referenceEq(exp. tupleExp, e1) then exp else TUPLE_ELEMENT (e1, exp. index, exp. ty);
29142952
2953+ case RECORD_ELEMENT ()
2954+ algorithm
2955+ (e1, arg) := mapFold(exp. recordExp, func , arg);
2956+ then
2957+ if referenceEq(exp. recordExp, e1) then exp else RECORD_ELEMENT (e1, exp. index, exp. fieldName, exp. ty);
2958+
29152959 case MUTABLE ()
29162960 algorithm
29172961 (e1, arg) := mapFold(Mutable . access(exp. exp), func , arg);
@@ -3225,6 +3269,12 @@ public
32253269 then
32263270 if referenceEq(exp. tupleExp, e1) then exp else TUPLE_ELEMENT (e1, exp. index, exp. ty);
32273271
3272+ case RECORD_ELEMENT ()
3273+ algorithm
3274+ (e1, arg) := func (exp. recordExp, arg);
3275+ then
3276+ if referenceEq(exp. recordExp, e1) then exp else RECORD_ELEMENT (e1, exp. index, exp. fieldName, exp. ty);
3277+
32283278 case MUTABLE ()
32293279 algorithm
32303280 (e1, arg) := func (Mutable . access(exp. exp), arg);
@@ -3535,6 +3585,9 @@ public
35353585 case TUPLE_ELEMENT ()
35363586 then contains(exp. tupleExp, func );
35373587
3588+ case RECORD_ELEMENT ()
3589+ then contains(exp. recordExp, func );
3590+
35383591 case BOX () then contains(exp. exp, func );
35393592 else false ;
35403593 end match;
@@ -4171,6 +4224,7 @@ public
41714224 case SUBSCRIPTED_EXP ()
41724225 then Prefixes . variabilityMax(variability(exp. exp), Subscript . variabilityList(exp. subscripts));
41734226 case TUPLE_ELEMENT () then variability(exp. tupleExp);
4227+ case RECORD_ELEMENT () then variability(exp. recordExp);
41744228 case BOX () then variability(exp. exp);
41754229 else
41764230 algorithm
@@ -4303,6 +4357,37 @@ public
43034357 end match;
43044358 end tupleElement;
43054359
4360+ function recordElement
4361+ input String elementName;
4362+ input Expression recordExp;
4363+ output Expression outExp;
4364+ algorithm
4365+ outExp := match recordExp
4366+ local
4367+ InstNode node;
4368+ Class cls;
4369+ Type ty;
4370+ Integer index;
4371+
4372+ case RECORD (ty = Type . COMPLEX (cls = node))
4373+ algorithm
4374+ cls := InstNode . getClass(node);
4375+ index := Class . lookupComponentIndex(elementName, cls);
4376+ then
4377+ listGet(recordExp. elements, index);
4378+
4379+ else
4380+ algorithm
4381+ Type . COMPLEX (cls = node) := typeOf(recordExp);
4382+ cls := InstNode . getClass(node);
4383+ index := Class . lookupComponentIndex(elementName, cls);
4384+ ty := InstNode . getType(Class . nthComponent(index, cls));
4385+ then
4386+ RECORD_ELEMENT (recordExp, index, elementName, ty);
4387+
4388+ end match;
4389+ end recordElement;
4390+
43064391 function splitRecord
43074392 input Expression recordExp;
43084393 output list< Expression > recordFields;
0 commit comments