@@ -443,41 +443,48 @@ and inst_algorithm : (Env, Mod, Prefix, Connect.Sets, ClassInf.State,
443443end
444444
445445and inst_classdef: (Env, Mod, Prefix, Connect.Sets, ClassInf.State,
446- Explode.ClassDef, bool)
446+ Explode.ClassDef, ClassInf.Restriction, bool)
447447 => (DAE.DAEcomp list, Env, Connect.Sets, ClassInf.State,
448448 Types.Var list) =
449449
450450 (* FIXME: propagate prot *)
451- rule inst_element_list(env,mods,pre,csets,ci_state, els)
452- => (dae1,env', csets', ci_state', tys) &
453- inst_list(env',mods,pre,csets',ci_state',inst_equation, eqs)
454- => (dae2,env'',csets'', ci_state'') &
455- inst_list(env'',mods,pre,csets'',ci_state'', inst_algorithm, als)
456- => (dae3,env''',csets''', ci_state''') &
451+ rule ClassInf.trans(ci_state, ClassInf.NEWDEF) => ci_state' &
452+ inst_element_list(env,mods,pre,csets,ci_state', els)
453+ => (dae1,env', csets', ci_state'', tys) &
454+ inst_list(env',mods,pre,csets',ci_state'',inst_equation, eqs)
455+ => (dae2,env'',csets'', ci_state''') &
456+ inst_list(env'',mods,pre,csets'',ci_state''', inst_algorithm, als)
457+ => (dae3,env''',csets''', ci_state'''') &
457458 list_append(dae1,dae2) => dae5 &
458459 list_append(dae5,dae3) => dae
459460 -----------------------------
460461 inst_classdef(env,mods,pre, csets, ci_state,
461- Explode.PARTS(els,eqs,als), prot)
462- => (dae,env''', csets''', ci_state''', tys)
462+ Explode.PARTS(els,eqs,als), re, prot)
463+ => (dae,env''', csets''', ci_state'''', tys)
464+
465+ rule Env.lookup_class(env,cn) => (c as Explode.CLASS(cn2,_,r,_),m) &
466+
467+ ClassInf.start(r, cn2) => new_ci_state &
463468
464- rule Env.lookup_class(env,cn) => (c,m) &
465469 (* FIXME order *)
466470 Mod.merge(mods,m) => mods' &
467471 Mod.merge(mods',mod) => mods'' &
468- inst_class_in(env, mods'', pre, csets, ci_state, c, prot)
469- => (dae,env, csets', ci_state', tys)
472+ inst_class_in(env, mods'', pre, csets, new_ci_state, c, prot)
473+ => (dae,env, csets', ci_state', tys) &
474+
475+ (* Check for restriction violations *)
476+ ClassInf.valid(ci_state', re)
470477 ----------------------------------------
471478 inst_classdef(env,mods,pre, csets, ci_state,
472- Explode.DERIVED(cn,ad,mod), prot)
479+ Explode.DERIVED(cn,ad,mod), re, prot)
473480 => (dae,env, csets', ci_state', tys)
474481
475482 rule not Env.lookup_class(env,cn) => (_,_) &
476483 Exp.path_string(cn) => cns &
477484 print "# unknown class: " & print cns & print "\n"
478485 ----------------------------------------
479486 inst_classdef(env,mods,pre,csets,ci_state,
480- Explode.DERIVED(cn,ad,mod), prot)
487+ Explode.DERIVED(cn,ad,mod), re, prot)
481488 => fail
482489
483490end
@@ -488,14 +495,14 @@ and inst_class_in: (Env, Mod, Prefix, Connect.Sets, ClassInf.State,
488495 Types.Var list) =
489496
490497 rule print " instantiating " & print n & print "\n" &
491- inst_classdef(env,mods,pre,csets,ci_state,d,prot)
498+ inst_classdef(env,mods,pre,csets,ci_state,d,r, prot)
492499 => (l,env', csets', ci_state', tys)
493500 ------------------------------------------------------
494501 inst_class_in(env,mods,pre,csets,ci_state,
495502 c as Explode.CLASS(n,false,r,d), prot)
496503 => (l,env', csets', ci_state', tys)
497504
498- rule print "Can't instantiate partial class " & print n & print "\n"
505+ rule print "# Can't instantiate partial class " & print n & print "\n"
499506 ------------------------------------------------------
500507 inst_class_in(env,mod,pre, csets,ci_state,
501508 Explode.CLASS(n,true,_,_), prot)
0 commit comments