@@ -46,7 +46,9 @@ public import SCodeEnv;
4646
4747public type Env = SCodeEnv . Env ;
4848
49+ protected import Debug ;
4950protected import Error ;
51+ protected import RTOpts ;
5052protected import SCodeLookup ;
5153protected 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;
6265algorithm
63- outProgram := Util . listMap1 (inProgram, flattenClass, inEnv);
66+ ( outProgram, outEnv) := Util . listMapAndFold (inProgram, flattenClass, inEnv);
6467end flattenProgram;
6568
6669public 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;
7974algorithm
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;
84107end flattenClass;
85108
86109protected 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;
91115algorithm
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;
148164end 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;
180197algorithm
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;
196227end 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
211229protected function flattenComponent
212230 input SCode . Element inComponent;
0 commit comments