Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit bac7d12

Browse files
perostOpenModelica-Hudson
authored andcommitted
[NF] Improve typing of record field dimensions.
- Handle typing of record field dimensions where the record instance has a binding. Belonging to [master]: - #2711 - OpenModelica/OpenModelica-testsuite#1048
1 parent 521d55e commit bac7d12

File tree

6 files changed

+247
-23
lines changed

6 files changed

+247
-23
lines changed

Compiler/NFFrontEnd/NFBinding.mo

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,46 @@ public
250250
end match;
251251
end isRecordExp;
252252

253+
function recordFieldBinding
254+
input String fieldName;
255+
input Binding recordBinding;
256+
output Binding fieldBinding = recordBinding;
257+
protected
258+
Expression exp;
259+
Type ty;
260+
Variability var;
261+
algorithm
262+
fieldBinding := match fieldBinding
263+
case UNTYPED_BINDING()
264+
algorithm
265+
fieldBinding.bindingExp := Expression.recordElement(fieldName, fieldBinding.bindingExp);
266+
then
267+
fieldBinding;
268+
269+
case TYPED_BINDING()
270+
algorithm
271+
exp := Expression.recordElement(fieldName, fieldBinding.bindingExp);
272+
ty := Expression.typeOf(exp);
273+
var := Expression.variability(exp);
274+
then
275+
TYPED_BINDING(exp, ty, var, fieldBinding.parents, fieldBinding.isEach, fieldBinding.info);
276+
277+
case FLAT_BINDING()
278+
algorithm
279+
exp := Expression.recordElement(fieldName, fieldBinding.bindingExp);
280+
var := Expression.variability(exp);
281+
then
282+
FLAT_BINDING(exp, var);
283+
284+
case CEVAL_BINDING()
285+
algorithm
286+
fieldBinding.bindingExp := Expression.recordElement(fieldName, fieldBinding.bindingExp);
287+
then
288+
fieldBinding;
289+
290+
end match;
291+
end recordFieldBinding;
292+
253293
function variability
254294
input Binding binding;
255295
output Variability var;

Compiler/NFFrontEnd/NFCeval.mo

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ algorithm
239239
then
240240
Expression.tupleElement(exp1, exp.ty, exp.index);
241241

242+
case Expression.RECORD_ELEMENT()
243+
then evalRecordElement(exp, target);
244+
242245
case Expression.MUTABLE()
243246
algorithm
244247
exp1 := evalExp(Mutable.access(exp.exp), target);
@@ -2800,6 +2803,30 @@ algorithm
28002803
result := Expression.applySubscripts(subs, result);
28012804
end evalSubscriptedExp;
28022805

2806+
function evalRecordElement
2807+
input Expression exp;
2808+
input EvalTarget target;
2809+
output Expression result;
2810+
protected
2811+
Expression e;
2812+
Integer index;
2813+
algorithm
2814+
Expression.RECORD_ELEMENT(recordExp = e, index = index) := exp;
2815+
e := evalExp(e, target);
2816+
2817+
result := match e
2818+
case Expression.RECORD()
2819+
then listGet(e.elements, index);
2820+
2821+
else
2822+
algorithm
2823+
Error.assertion(false, getInstanceName() + " could not evaluate " +
2824+
Expression.toString(exp), sourceInfo());
2825+
then
2826+
fail();
2827+
end match;
2828+
end evalRecordElement;
2829+
28032830
protected
28042831

28052832
function printUnboundError

Compiler/NFFrontEnd/NFClass.mo

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,22 @@ uniontype Class
206206
(node, isImport) := ClassTree.lookupElement(name, classTree(cls));
207207
end lookupElement;
208208

209+
function lookupComponentIndex
210+
input String name;
211+
input Class cls;
212+
output Integer index;
213+
algorithm
214+
index := ClassTree.lookupComponentIndex(name, classTree(cls));
215+
end lookupComponentIndex;
216+
217+
function nthComponent
218+
input Integer index;
219+
input Class cls;
220+
output InstNode component;
221+
algorithm
222+
component := ClassTree.nthComponent(index, classTree(cls));
223+
end nthComponent;
224+
209225
function lookupAttributeBinding
210226
input String name;
211227
input Class cls;

Compiler/NFFrontEnd/NFClassTree.mo

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,19 @@ public
861861
LookupTree.get(lookupTree(tree), name);
862862
end lookupComponentIndex;
863863

864+
function nthComponent
865+
input Integer index;
866+
input ClassTree tree;
867+
output InstNode component;
868+
algorithm
869+
component := match tree
870+
case PARTIAL_TREE() then arrayGet(tree.components, index);
871+
case EXPANDED_TREE() then arrayGet(tree.components, index);
872+
case INSTANTIATED_TREE() then Mutable.access(arrayGet(tree.components, index));
873+
case FLAT_TREE() then arrayGet(tree.components, index);
874+
end match;
875+
end nthComponent;
876+
864877
function mapClasses
865878
input ClassTree tree;
866879
input FuncT func;

Compiler/NFFrontEnd/NFExpression.mo

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)