@@ -136,8 +136,6 @@ protected import Util;
136136
137137public type Env = NFSCodeEnv.Env;
138138
139- protected type AvlTree = NFSCodeEnv.AvlTree;
140- protected type AvlTreeValue = NFSCodeEnv.AvlTreeValue;
141139protected type ClassType = NFSCodeEnv.ClassType;
142140protected type Extends = NFSCodeEnv.Extends;
143141protected type Frame = NFSCodeEnv.Frame;
@@ -147,6 +145,8 @@ protected type Item = NFSCodeEnv.Item;
147145
148146protected type ExtendsTableArray = array< ExtendsWrapper> ;
149147
148+ import NFSCodeEnv.EnvTree;
149+
150150public constant String BASECLASS_NOT_FOUND_ERROR = "$1" ;
151151public constant String BASECLASS_INHERITED_ERROR = "$2" ;
152152public constant String BASECLASS_REPLACEABLE_ERROR = "$3" ;
@@ -244,57 +244,39 @@ protected
244244 list< SCode.Element> re;
245245 Option< SCode.Element> cei;
246246 Env env;
247- AvlTree tree;
247+ EnvTree.Tree tree;
248248algorithm
249249 // Qualify the extends in this scope.
250250 env := qualifyLocalScope(inEnv, inClassType, inExtendsTable);
251251
252252 // Recurse down the tree.
253253 NFSCodeEnv.FRAME(clsAndVars = tree) :: _ := env;
254- SOME(tree) := qualify3(SOME(tree), env, inExtendsTable);
254+ tree := EnvTree.map(tree,
255+ function qualify3 (inEnv = env, inExtendsTable = inExtendsTable));
255256 outEnv := NFSCodeEnv.setEnvClsAndVars(tree, env);
256257end qualify2;
257258
258259protected function qualify3
259- input Option< AvlTree> inTree;
260+ input String name;
261+ input output Item item;
260262 input Env inEnv;
261263 input ExtendsTableArray inExtendsTable;
262- output Option< AvlTree> outTree;
263264algorithm
264- outTree := match(inTree, inEnv, inExtendsTable)
265+ item := match item
265266 local
266- String name;
267267 SCode.Element cls;
268268 Frame cls_env;
269269 ClassType cls_ty;
270- Integer h;
271- Option< AvlTree> left, right;
272270 Env env, rest_env;
273- Item item;
274- Option< AvlTreeValue> value;
275-
276- // Empty leaf, do nothing.
277- case (NONE(), _, _) then inTree;
278271
279- case (SOME(NFSCodeEnv.AVLTREENODE(SOME(NFSCodeEnv.AVLTREEVALUE(
280- name, NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty))), h, left, right)), _, _)
281- equation
282- env = NFSCodeEnv.enterFrame(cls_env, inEnv);
283- cls_env :: rest_env = qualify2(env, cls_ty, inExtendsTable);
284- left = qualify3(left, rest_env, inExtendsTable);
285- right = qualify3(right, rest_env, inExtendsTable);
286- item = NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
287- value = SOME(NFSCodeEnv.AVLTREEVALUE(name, item));
272+ case NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty)
273+ algorithm
274+ env := NFSCodeEnv.enterFrame(cls_env, inEnv);
275+ cls_env :: rest_env := qualify2(env, cls_ty, inExtendsTable);
288276 then
289- SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
290-
291- case (SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right)), _, _)
292- equation
293- left = qualify3(left, inEnv, inExtendsTable);
294- right = qualify3(right, inEnv, inExtendsTable);
295- then
296- SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
277+ NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
297278
279+ else item;
298280 end match;
299281end qualify3;
300282
@@ -1117,64 +1099,45 @@ protected
11171099 Env env, rest_env;
11181100 Option< String > name;
11191101 FrameType ty;
1120- AvlTree tree;
1102+ EnvTree.Tree tree;
11211103 list< Extends> bcl;
11221104 list< SCode.Element> re;
11231105 NFSCodeEnv.ImportTable imps;
11241106 Option< Util.StatefulBoolean> iu;
11251107algorithm
11261108 NFSCodeEnv.FRAME(name, ty, tree,
11271109 NFSCodeEnv.EXTENDS_TABLE(bcl, re, _), imps, iu) :: rest_env := inEnv;
1128- SOME( tree) := update3(SOME( tree), inEnv);
1110+ tree := EnvTree.map( tree, function update3 ( inEnv = inEnv) );
11291111 env := NFSCodeEnv.FRAME(name, ty, tree,
11301112 NFSCodeEnv.EXTENDS_TABLE(bcl, {}, NONE()), imps, iu) :: rest_env;
11311113 outEnv := NFSCodeFlattenRedeclare.addElementRedeclarationsToEnv(re, env);
11321114end update2;
11331115
11341116protected function update3
1135- input Option< AvlTree> inTree;
1117+ input String name;
1118+ input output Item item;
11361119 input Env inEnv;
1137- output Option< AvlTree> outTree;
11381120algorithm
1139- outTree := match(inTree, inEnv)
1121+ () := match item
11401122 local
1141- String name;
1142- Integer h;
1143- Option< AvlTree> left, right;
11441123 Env rest_env, env;
11451124 SCode.Element cls;
1146- Frame cls_env;
1147- Option< NFSCodeEnv.AvlTreeValue> value;
1148- Item item;
11491125 ClassType cls_ty;
1126+ Frame cls_env;
11501127
1151- case (NONE(), _) then inTree;
1152-
1153- case (SOME(NFSCodeEnv.AVLTREENODE(SOME(NFSCodeEnv.AVLTREEVALUE(
1154- name, NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty))), h, left, right)), _)
1155- equation
1128+ case NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty)
1129+ algorithm
11561130 // Enter the class' frame and update the class extends in it.
1157- env = NFSCodeEnv.enterFrame(cls_env, inEnv);
1158- (cls, env) = updateClassExtends(cls, env, cls_ty);
1131+ env : = NFSCodeEnv.enterFrame(cls_env, inEnv);
1132+ (cls, env) : = updateClassExtends(cls, env, cls_ty);
11591133 // Call update2 on the class' environment to update the extends.
1160- cls_env :: rest_env = update2(env);
1161- // Recurse into left and right branch of the tree.
1162- left = update3(left, rest_env);
1163- right = update3(right, rest_env);
1134+ cls_env :: rest_env := update2(env);
11641135 // Rebuild the class item with the updated information.
1165- item = NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
1166- value = SOME(NFSCodeEnv.AVLTREEVALUE(name, item));
1136+ item := NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
11671137 then
1168- SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
1169-
1170- case (SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right)), _)
1171- equation
1172- // Recurse into left and right branch of the tree.
1173- left = update3(left, inEnv);
1174- right = update3(right, inEnv);
1175- then
1176- SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
1138+ ();
11771139
1140+ else ();
11781141 end match;
11791142end update3;
11801143
0 commit comments