Skip to content

Commit b467744

Browse files
committed
- Changed SCodeFlattenImports to also update and return the environment.
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@8713 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent c8fbbfd commit b467744

File tree

5 files changed

+124
-66
lines changed

5 files changed

+124
-66
lines changed

Compiler/FrontEnd/SCode.mo

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3749,17 +3749,11 @@ public function addElementToClass
37493749
input Element inClassDef;
37503750
output Element outClassDef;
37513751
protected
3752-
Ident n;
3753-
Prefixes pf;
3754-
Encapsulated ep;
3755-
Partial pp;
3756-
Restriction r;
37573752
ClassDef cdef;
3758-
Absyn.Info i;
37593753
algorithm
3760-
CLASS(n, pf, ep, pp, r, cdef, i) := inClassDef;
3754+
CLASS(classDef = cdef) := inClassDef;
37613755
cdef := addElementToCompositeClassDef(inElement, cdef);
3762-
outClassDef := CLASS(n, pf, ep, pp, r, cdef, i);
3756+
outClassDef := setElementClassDefinition(cdef, inClassDef);
37633757
end addElementToClass;
37643758

37653759
public function addElementToCompositeClassDef
@@ -3779,6 +3773,22 @@ algorithm
37793773
outClassDef := PARTS(inElement :: el, nel, iel, nal, ial, ed, annl, c);
37803774
end addElementToCompositeClassDef;
37813775

3776+
public function setElementClassDefinition
3777+
input ClassDef inClassDef;
3778+
input Element inElement;
3779+
output Element outElement;
3780+
protected
3781+
Ident n;
3782+
Prefixes pf;
3783+
Partial pp;
3784+
Encapsulated ep;
3785+
Restriction r;
3786+
Absyn.Info i;
3787+
algorithm
3788+
CLASS(n, pf, ep, pp, r, _, i) := inElement;
3789+
outElement := CLASS(n, pf, ep, pp, r, inClassDef, i);
3790+
end setElementClassDefinition;
3791+
37823792
public function flowStr
37833793
input Flow inFlow;
37843794
output String str;

Compiler/FrontEnd/SCodeEnv.mo

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,37 @@ algorithm
490490
outEnv := FRAME(name, ty, tree, exts, imps, is_used) :: rest;
491491
end extendEnvWithItem;
492492

493+
public function updateItemInEnv
494+
"Updates an item in the environment by replacing an existing item."
495+
input Item inItem;
496+
input Env inEnv;
497+
input String inItemName;
498+
output Env outEnv;
499+
protected
500+
Option<String> name;
501+
AvlTree tree;
502+
ExtendsTable exts;
503+
ImportTable imps;
504+
FrameType ty;
505+
Env rest;
506+
Util.StatefulBoolean is_used;
507+
algorithm
508+
FRAME(name, ty, tree, exts, imps, is_used) :: rest := inEnv;
509+
tree := avlTreeReplace(tree, inItemName, inItem);
510+
outEnv := FRAME(name, ty, tree, exts, imps, is_used) :: rest;
511+
end updateItemInEnv;
512+
513+
public function getItemInEnv
514+
input String inItemName;
515+
input Env inEnv;
516+
output Item outItem;
517+
protected
518+
AvlTree tree;
519+
algorithm
520+
FRAME(clsAndVars = tree) :: _ := inEnv;
521+
outItem := avlTreeGet(tree, inItemName);
522+
end getItemInEnv;
523+
493524
protected function extendEnvWithImport
494525
"Extends the environment with an import element."
495526
input SCode.Element inImport;

Compiler/FrontEnd/SCodeFlatten.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ algorithm
130130
env = SCodeEnv.updateExtendsInEnv(env);
131131

132132
(prog, env) = SCodeDependency.analyse(inClassName, env, prog);
133-
prog = SCodeFlattenImports.flattenProgram(prog, env);
133+
(prog, env) = SCodeFlattenImports.flattenProgram(prog, env);
134134
prog = SCodeFlattenExtends.flattenProgram(prog, env);
135135

136136
//System.stopTimer();

Compiler/FrontEnd/SCodeFlattenImports.mo

Lines changed: 74 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ public import SCodeEnv;
4646

4747
public type Env = SCodeEnv.Env;
4848

49+
protected import Debug;
4950
protected import Error;
51+
protected import RTOpts;
5052
protected import SCodeLookup;
5153
protected import Util;
5254

@@ -59,37 +61,59 @@ public function flattenProgram
5961
input SCode.Program inProgram;
6062
input Env inEnv;
6163
output SCode.Program outProgram;
64+
output Env outEnv;
6265
algorithm
63-
outProgram := Util.listMap1(inProgram, flattenClass, inEnv);
66+
(outProgram, outEnv) := Util.listMapAndFold(inProgram, flattenClass, inEnv);
6467
end flattenProgram;
6568

6669
public function flattenClass
6770
input SCode.Element inClass;
6871
input Env inEnv;
6972
output SCode.Element outClass;
70-
protected
71-
SCode.Ident name;
72-
SCode.Partial part_pre;
73-
SCode.Encapsulated encap_pre;
74-
SCode.Prefixes prefixes;
75-
SCode.Restriction restriction;
76-
SCode.ClassDef cdef;
77-
Absyn.Info info;
78-
Env env;
73+
output Env outEnv;
7974
algorithm
80-
SCode.CLASS(name, prefixes, encap_pre, part_pre, restriction, cdef, info) := inClass;
81-
env := SCodeEnv.enterScope(inEnv, name);
82-
cdef := flattenClassDef(cdef, env, info);
83-
outClass := SCode.CLASS(name, prefixes, encap_pre, part_pre, restriction, cdef, info);
75+
(outClass, outEnv) := matchcontinue(inClass, inEnv)
76+
local
77+
SCode.Ident name;
78+
SCode.ClassDef cdef;
79+
Absyn.Info info;
80+
Item item;
81+
Env env;
82+
SCodeEnv.Frame cls_env;
83+
SCode.Element cls;
84+
SCodeEnv.ClassType cls_ty;
85+
86+
case (SCode.CLASS(name = name, classDef = cdef, info = info), _)
87+
equation
88+
SCodeEnv.CLASS(env = {cls_env}, classType = cls_ty) =
89+
SCodeEnv.getItemInEnv(name, inEnv);
90+
env = SCodeEnv.enterFrame(cls_env, inEnv);
91+
92+
(cdef, cls_env :: env) = flattenClassDef(cdef, env, info);
93+
cls = SCode.setElementClassDefinition(cdef, inClass);
94+
item = SCodeEnv.newClassItem(cls, {cls_env}, cls_ty);
95+
env = SCodeEnv.updateItemInEnv(item, env, name);
96+
then
97+
(cls, env);
98+
99+
else
100+
equation
101+
true = RTOpts.debugFlag("failtrace");
102+
Debug.traceln("- SCodeFlattenImports.flattenClass failed on " +&
103+
SCode.elementName(inClass) +& " in " +& SCodeEnv.getEnvName(inEnv));
104+
then
105+
fail();
106+
end matchcontinue;
84107
end flattenClass;
85108

86109
protected function flattenClassDef
87110
input SCode.ClassDef inClassDef;
88111
input Env inEnv;
89112
input Absyn.Info inInfo;
90113
output SCode.ClassDef outClassDef;
114+
output Env outEnv;
91115
algorithm
92-
outClassDef := match(inClassDef, inEnv, inInfo)
116+
(outClassDef, outEnv) := match(inClassDef, inEnv, inInfo)
93117
local
94118
list<SCode.Element> el, ex, cl, im, co, ud;
95119
list<SCode.Equation> neql, ieql;
@@ -102,37 +126,29 @@ algorithm
102126
SCode.Attributes attr;
103127
Env env;
104128
SCode.Ident bc;
129+
SCode.ClassDef cdef;
105130

106131
case (SCode.PARTS(el, neql, ieql, nal, ial, extdecl, annl, cmt), _, _)
107132
equation
108133
// Lookup elements.
109-
el = Util.listMap1(el, flattenElement, inEnv);
110134
el = Util.listFilter(el, isNotImport);
135+
(el, env) = Util.listMapAndFold(el, flattenElement, inEnv);
111136

112137
// Lookup equations and algorithm names.
113-
neql = Util.listMap1(neql, flattenEquation, inEnv);
114-
ieql = Util.listMap1(ieql, flattenEquation, inEnv);
115-
nal = Util.listMap1(nal, flattenAlgorithm, inEnv);
116-
ial = Util.listMap1(ial, flattenAlgorithm, inEnv);
138+
neql = Util.listMap1(neql, flattenEquation, env);
139+
ieql = Util.listMap1(ieql, flattenEquation, env);
140+
nal = Util.listMap1(nal, flattenAlgorithm, env);
141+
ial = Util.listMap1(ial, flattenAlgorithm, env);
117142
then
118-
SCode.PARTS(el, neql, ieql, nal, ial, extdecl, annl, cmt);
143+
(SCode.PARTS(el, neql, ieql, nal, ial, extdecl, annl, cmt), env);
119144

120-
case (SCode.CLASS_EXTENDS(bc, mods, SCode.PARTS(el, neql, ieql, nal, ial, extdecl, annl, cmt)), _, _)
145+
case (SCode.CLASS_EXTENDS(bc, mods, cdef), _, _)
121146
equation
122-
// Lookup elements.
123-
el = Util.listMap1(el, flattenElement, inEnv);
124-
el = Util.listFilter(el, isNotImport);
125-
126-
// Lookup equations and algorithm names.
127-
neql = Util.listMap1(neql, flattenEquation, inEnv);
128-
ieql = Util.listMap1(ieql, flattenEquation, inEnv);
129-
nal = Util.listMap1(nal, flattenAlgorithm, inEnv);
130-
ial = Util.listMap1(ial, flattenAlgorithm, inEnv);
131-
132-
mods = flattenModifier(mods, inEnv, inInfo);
147+
(cdef, env) = flattenClassDef(cdef, inEnv, inInfo);
148+
mods = flattenModifier(mods, env, inInfo);
133149
then
134-
SCode.CLASS_EXTENDS(bc, mods, SCode.PARTS(el, neql, ieql, nal, ial, extdecl, annl, cmt));
135-
150+
(SCode.CLASS_EXTENDS(bc, mods, cdef), env);
151+
136152
case (SCode.DERIVED(ty, mods, attr, cmt), env, _)
137153
equation
138154
mods = flattenModifier(mods, env, inInfo);
@@ -141,9 +157,9 @@ algorithm
141157
env = SCodeEnv.removeExtendsFromLocalScope(env);
142158
ty = flattenTypeSpec(ty, env, inInfo);
143159
then
144-
SCode.DERIVED(ty, mods, attr, cmt);
160+
(SCode.DERIVED(ty, mods, attr, cmt), inEnv);
145161

146-
else then inClassDef;
162+
else then (inClassDef, inEnv);
147163
end match;
148164
end flattenClassDef;
149165

@@ -177,36 +193,38 @@ protected function flattenElement
177193
input SCode.Element inElement;
178194
input Env inEnv;
179195
output SCode.Element outElement;
196+
output Env outEnv;
180197
algorithm
181-
outElement := match(inElement, inEnv)
198+
(outElement, outEnv) := match(inElement, inEnv)
199+
local
200+
Env env;
201+
SCode.Element elem;
202+
String name;
203+
Item item;
204+
182205
// Lookup component types, modifications and conditions.
183-
case (SCode.COMPONENT(name = _), _)
184-
then flattenComponent(inElement, inEnv);
206+
case (SCode.COMPONENT(name = name), _)
207+
equation
208+
elem = flattenComponent(inElement, inEnv);
209+
item = SCodeEnv.newVarItem(elem, true);
210+
env = SCodeEnv.updateItemInEnv(item, inEnv, name);
211+
then
212+
(elem, env);
185213

186214
// Lookup class definitions.
187215
case (SCode.CLASS(name = _), _)
188-
then flattenClassDefElements(inElement, inEnv);
216+
equation
217+
(elem, env) = flattenClass(inElement, inEnv);
218+
then
219+
(elem, env);
189220

190221
// Lookup base class and modifications in extends clauses.
191222
case (SCode.EXTENDS(baseClassPath = _), _)
192-
then flattenExtends(inElement, inEnv);
223+
then (flattenExtends(inElement, inEnv), inEnv);
193224

194-
else then inElement;
225+
else then (inElement, inEnv);
195226
end match;
196227
end flattenElement;
197-
198-
protected function flattenClassDefElements
199-
input SCode.Element inClassDefElement;
200-
input Env inEnv;
201-
output SCode.Element outClassDefElement;
202-
protected
203-
SCode.Ident name;
204-
SCode.Element cls;
205-
algorithm
206-
SCode.CLASS(name = _) := inClassDefElement;
207-
cls := flattenClass(inClassDefElement, inEnv);
208-
outClassDefElement := cls;
209-
end flattenClassDefElements;
210228

211229
protected function flattenComponent
212230
input SCode.Element inComponent;

Compiler/FrontEnd/SCodeUtil.mo

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ algorithm
104104
// retrieve the expandable connector presence external flag
105105
// hasExpandableConnectors = System.getHasExpandableConnectors();
106106
// (ih, sp) = ExpandableConnectors.elaborateExpandableConnectors(sp, hasExpandableConnectors);
107-
// sp = SCodeFlatten.flatten(sp);
108107
then
109108
sp;
110109
end match;

0 commit comments

Comments
 (0)