Skip to content

Commit

Permalink
- Changed SCode Option<Absyn.Path> baseClassPath to Option<tuple<Absy…
Browse files Browse the repository at this point in the history
…n.Path,Mod>>.

- When extending a class, we also add the SCode.Mod to the baseclass, so we instantiate the correct class later on.
- Added a testcase that sets the dimensions of a matrix in the extends modifications.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@4721 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Dec 18, 2009
1 parent b146db6 commit 2e1b940
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 60 deletions.
70 changes: 36 additions & 34 deletions Compiler/Inst.mo
Expand Up @@ -4168,7 +4168,7 @@ algorithm
ClassInf.State ci_state;
Boolean impl;
Env.Cache cache;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
output InstanceHierarchy ih;

case (cache,env,ih,pre,{},_,csets,_) then (cache,env,ih,{},csets);
Expand Down Expand Up @@ -4329,11 +4329,11 @@ algorithm
outermod = Mod.lookupModificationP(mod, Absyn.IDENT(cn));
(cache,cenv1,ih,els,eq1,ieq1,alg1,ialg1) = instDerivedClasses(cache,cenv,ih, outermod, c, impl);
(cache,tp_1) = makeFullyQualified(cache,/* adrpo: cenv1?? FIXME */env, tp);
els_1 = addInheritScope(noImportElements(els), tp_1) "Add the scope of the base class to elements" ;
eq1_1 = addEqnInheritScope(eq1, tp_1);
ieq1_1 = addEqnInheritScope(ieq1, tp_1);
alg1_1 = addAlgInheritScope(alg1, tp_1);
ialg1_1 = addAlgInheritScope(ialg1, tp_1);
els_1 = addInheritScope(noImportElements(els), (tp_1,emod)) "Add the scope of the base class to elements" ;
eq1_1 = addEqnInheritScope(eq1, (tp_1,emod));
ieq1_1 = addEqnInheritScope(ieq1, (tp_1,emod));
alg1_1 = addAlgInheritScope(alg1, (tp_1,emod));
ialg1_1 = addAlgInheritScope(ialg1, (tp_1,emod));

cenv3 = Env.openScope(cenv1, encf, SOME(cn));
new_ci_state = ClassInf.start(r, cn);
Expand Down Expand Up @@ -4473,7 +4473,7 @@ algorithm
list<tuple<SCode.Element, Mod>> rest,elsAndMods;
SCode.Mod mods;
Mod mod,mod1,mod2,emod;
Option<Absyn.Path> baseClassPath1,baseClassPath2;
SCode.OptBaseClass baseClassPath1,baseClassPath2;
Option<Absyn.ConstrainClass> cc1,cc2;
case (emod,name1,classExtendsElt,(SCode.CLASSDEF(name2,finalPrefix2,replaceablePrefix2,cl,baseClassPath2,cc2),mod1)::rest)
equation
Expand Down Expand Up @@ -4598,7 +4598,7 @@ algorithm
outermod = Mod.lookupModificationP(mod, Absyn.IDENT(cn));
(cache,cenv1,ih,els,eq1,ieq1,alg1,ialg1) = instDerivedClasses(cache,cenv,ih, outermod, c, impl);
(cache,tp_1) = makeFullyQualified(cache, /* adrpo: CHECK cenv1? */ env, tp);
els_1 = addInheritScope(noImportElements(els), tp_1) "Add the scope of the base class to elements" ;
els_1 = addInheritScope(noImportElements(els), (tp_1,emod)) "Add the scope of the base class to elements" ;
cenv3 = Env.openScope(cenv1, encf, SOME(cn));
new_ci_state = ClassInf.start(r, cn);
(els_1,classextendselts) = splitClassExtendsElts(els_1);
Expand Down Expand Up @@ -4661,18 +4661,18 @@ protected function addInheritScope
be able to look up classes, etc. from the scope where the component is
defined."
input list<SCode.Element> inSCodeElementLst;
input Absyn.Path inPath;
input SCode.BaseClass inPathMod;
output list<SCode.Element> outSCodeElementLst;
algorithm
outSCodeElementLst := matchcontinue (inSCodeElementLst,inPath)
outSCodeElementLst := matchcontinue (inSCodeElementLst,inPathMod)
local
list<SCode.Element> res,xs;
String a;
Boolean b,c,d;
Boolean o2,i2;
SCode.Attributes e;
Absyn.TypeSpec f;
Absyn.Path tp;
SCode.BaseClass tp;
SCode.Mod g;
Option<SCode.Comment> comment;
SCode.Element x;
Expand Down Expand Up @@ -4720,14 +4720,14 @@ protected function addEqnInheritScope
to be able to look up e.g. constants, etc. from the scope where the
equation is defined."
input list<SCode.Equation> inSCodeEquationLst;
input Absyn.Path inPath;
input SCode.BaseClass inPathMod;
output list<SCode.Equation> outSCodeEquationLst;
algorithm
outSCodeEquationLst := matchcontinue (inSCodeEquationLst,inPath)
outSCodeEquationLst := matchcontinue (inSCodeEquationLst,inPathMod)
local
list<SCode.Equation> res,xs;
SCode.EEquation e;
Absyn.Path tp;
SCode.BaseClass tp;
case ({},_) then {};
case ((SCode.EQUATION(eEquation = e) :: xs),tp)
equation
Expand All @@ -4745,14 +4745,14 @@ protected function addAlgInheritScope
to be able to look up e.g. constants, etc. from the scope where the
algorithm is defined."
input list<SCode.Algorithm> inSCodeAlgorithmLst;
input Absyn.Path inPath;
input SCode.BaseClass inPathMod;
output list<SCode.Algorithm> outSCodeAlgorithmLst;
algorithm
outSCodeAlgorithmLst := matchcontinue (inSCodeAlgorithmLst,inPath)
outSCodeAlgorithmLst := matchcontinue (inSCodeAlgorithmLst,inPathMod)
local
list<SCode.Algorithm> res,xs;
list<Absyn.Algorithm> a;
Absyn.Path tp;
SCode.BaseClass tp;
case ({},_) then {};
case ((SCode.ALGORITHM(statements = a) :: xs),tp)
equation
Expand Down Expand Up @@ -5460,7 +5460,7 @@ algorithm
Absyn.Direction dir;
Absyn.TypeSpec t;
SCode.Mod m;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment;
list<tuple<SCode.Element, Mod>> xs,allcomps,comps;
list<SCode.Equation> eqns;
Expand Down Expand Up @@ -5599,7 +5599,7 @@ algorithm
Absyn.Direction dir;
Absyn.TypeSpec t;
SCode.Mod m;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment;
list<tuple<SCode.Element, Mod>> xs,comps;
InstDims inst_dims;
Expand Down Expand Up @@ -5759,7 +5759,7 @@ algorithm
Absyn.Direction dir;
Absyn.Path t;
SCode.Mod m;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment;
Option<DAE.EqMod> eq;
list<DimExp> dims;
Expand Down Expand Up @@ -6329,7 +6329,7 @@ protected function getDerivedEnv
input Env.Cache inCache;
input Env inEnv;
input InstanceHierarchy inIH;
input Option<Absyn.Path> inAbsynPathOption;
input SCode.OptBaseClass inAbsynPathOption;
output Env.Cache outCache;
output Env outEnv;
output InstanceHierarchy outIH;
Expand All @@ -6348,10 +6348,12 @@ algorithm
Env.AvlTree cl;
list<Env.Item> imps;
tuple<list<DAE.ComponentRef>,DAE.ComponentRef> crs;
SCode.BaseClass bc;
Absyn.Path tp,envpath,newTp;
Env.Cache cache;
InstanceHierarchy ih;
list<SCode.Element> defineUnits;
SCode.Mod mod;

/* case (cache,env,NONE,ih) then (cache,env,ih); adrpo: CHECK if needed! */

Expand All @@ -6365,12 +6367,12 @@ algorithm
* will be instantiated over and over again, see testcase packages2.mo
*/
case (cache,
(env as (Env.FRAME(id,cl,tps,imps,_,crs,enc,defineUnits) :: fs)),ih,SOME(tp))
(env as (Env.FRAME(id,cl,tps,imps,_,crs,enc,defineUnits) :: fs)),ih,SOME((tp,mod)))
equation
SOME(envpath) = Env.getEnvPath(env);
true = Absyn.pathPrefixOf(envpath,tp);
newTp = Absyn.removePrefix(envpath,tp);
(cache,env_2) = Lookup.lookupAndInstantiate(cache,env,newTp,true);
(cache,env_2) = Lookup.lookupAndInstantiate(cache,env,newTp,mod,true);
then
(cache,Env.FRAME(id,cl,tps,imps,env_2,crs,enc,defineUnits) :: fs,ih);

Expand All @@ -6379,10 +6381,10 @@ algorithm
* by this and therefore should search from top scope directly.
*/
case (cache,
(env as (Env.FRAME(id,cl,tps,imps,_,crs,enc,defineUnits) :: fs)),ih,SOME(tp))
(env as (Env.FRAME(id,cl,tps,imps,_,crs,enc,defineUnits) :: fs)),ih,SOME((tp,mod)))
equation
top_frame = Env.topFrame(env);
(cache,env_2) = Lookup.lookupAndInstantiate(cache,{top_frame},tp,true);
(cache,env_2) = Lookup.lookupAndInstantiate(cache,{top_frame},tp,mod,true);
then
(cache,Env.FRAME(id,cl,tps,imps,env_2,crs,enc,defineUnits) :: fs,ih);

Expand Down Expand Up @@ -6464,7 +6466,7 @@ algorithm
Boolean finalPrefix,repl,prot,repl2,prot2,impl,redfin;
Absyn.TypeSpec t,t2;
SCode.Mod mod,old_mod;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment,comment2;
list<tuple<SCode.Element, Mod>> rest;
Prefix.Prefix pre;
Expand Down Expand Up @@ -7453,7 +7455,7 @@ algorithm
Absyn.Direction dir;
Absyn.Path t;
SCode.Mod m;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment;
DAE.Mod cmod,m_1,classmod,mm,mod,mod_1,mod_2,mod_3,mods;
SCode.Class cl;
Expand Down Expand Up @@ -8234,7 +8236,7 @@ algorithm
SCode.Variability param;
Absyn.Direction dir;
SCode.Mod m,m_1;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment;
DAE.Mod cmod,cmod_1,m_2,mod_2;
DAE.EqMod eq;
Expand Down Expand Up @@ -10495,7 +10497,7 @@ algorithm
DAE.Mod mods;
Prefix.Prefix pre;
SCode.EEquation eq;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Boolean impl;
Env.Cache cache;
ConnectionGraph.ConnectionGraph graph;
Expand Down Expand Up @@ -10600,7 +10602,7 @@ algorithm
DAE.Mod mods;
Prefix.Prefix pre;
SCode.EEquation eq;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Boolean impl;
Env.Cache cache;
ConnectionGraph.ConnectionGraph graph;
Expand Down Expand Up @@ -11755,7 +11757,7 @@ algorithm
Connect.Sets csets;
ClassInf.State ci_state;
list<Absyn.Algorithm> statements;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Boolean impl;
Env.Cache cache;
Prefix pre;
Expand Down Expand Up @@ -11808,7 +11810,7 @@ algorithm
Connect.Sets csets;
ClassInf.State ci_state;
list<Absyn.Algorithm> statements;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Boolean impl;
Env.Cache cache;
Prefix pre;
Expand Down Expand Up @@ -14470,7 +14472,7 @@ algorithm
Absyn.Direction dir;
Absyn.Path t;
SCode.Mod mod;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment;
SCode.Element elt;
Env.Cache cache;
Expand Down Expand Up @@ -15681,7 +15683,7 @@ algorithm oltuple := matchcontinue(ltuple)
Ident c1;
Absyn.InnerOuter c2;
Boolean c3,c4,c5;
Option<Absyn.Path> c9;
SCode.OptBaseClass c9;
Option<SCode.Comment> c10;
Option<Absyn.Exp> c11;
Option<Absyn.Info> c12;
Expand Down
2 changes: 1 addition & 1 deletion Compiler/InstanceHierarchy.mo
Expand Up @@ -637,7 +637,7 @@ algorithm
outString := matchcontinue (inElement)
local
String str,res,n,mod_str,s,vs;
Option<Absyn.Path> pathOpt;
SCode.OptBaseClass pathOpt;
Absyn.TypeSpec typath;
SCode.Mod mod;
Boolean finalPrefix,repl,prot;
Expand Down
21 changes: 12 additions & 9 deletions Compiler/Lookup.mo
Expand Up @@ -1406,11 +1406,12 @@ return its environment. Helper function used e.g by Inst.mo"
input Env.Cache inCache;
input Env.Env env;
input Absyn.Path path;
input SCode.Mod mod;
input Boolean msg;
output Env.Cache outCache;
output Env.Env classEnv;
algorithm
(outCache,classEnv) := matchcontinue(cache,env,path,msg)
(outCache,classEnv) := matchcontinue(cache,env,path,mod,msg)
local Env.Cache cache;
String cn2;
Boolean enc2,enc;
Expand All @@ -1420,32 +1421,34 @@ algorithm
Absyn.Path scope;
SCode.Class c;
Absyn.Ident ident;
DAE.Mod dmod;

// Try to find in cache.
case(cache,env,path,msg)
case(cache,env,path,mod,msg) /* Should we only lookup if it is SCode.NOMOD? */
equation
(cache,(c as SCode.CLASS(cn2,_,enc2,r,_)),cenv) = lookupClass2(cache,env, path, msg);
(cache,(c as SCode.CLASS(cn2,_,enc2,r,_)),cenv) = lookupClass2(cache,env,path,msg);
SOME(scope) = Env.getEnvPath(cenv);
ident = Absyn.pathLastIdent(path);
classEnv = Env.cacheGet(scope,Absyn.IDENT(ident),cache);
then (cache,classEnv);

// Not found in cache, lookup and instantiate.
case(cache,env,path,msg)
case(cache,env,path,mod,msg)
equation
(cache,(c as SCode.CLASS(cn2,_,enc2,r,_)),cenv) = lookupClass2(cache,env, path, msg);
cenv_2 = Env.openScope(cenv, enc2, SOME(cn2));
new_ci_state = ClassInf.start(r, cn2);
new_ci_state = ClassInf.start(r, cn2);
dmod = Mod.elabUntypedMod(mod,env,Prefix.NOPRE());
(cache,classEnv,_,_) =
Inst.partialInstClassIn(
cache,cenv_2,InstanceHierarchy.emptyInstanceHierarchy,
DAE.NOMOD(), Prefix.NOPRE(), Connect.emptySet,
dmod, Prefix.NOPRE(), Connect.emptySet,
new_ci_state, c, false, {});
then (cache,classEnv);
case(cache,env,path,msg)
case(cache,env,path,mod,msg)
equation
true = RTOpts.debugFlag("failtrace");
Debug.traceln( "- Lookup.lookupAndInstantiate failed " +& Absyn.pathString(path) +& " in scope " +& Env.printEnvPathStr(env));
Debug.traceln( "- Lookup.lookupAndInstantiate failed " +& Absyn.pathString(path) +& " with mod: " +& SCode.printModStr(mod) +& " in scope " +& Env.printEnvPathStr(env));
then fail();
end matchcontinue;
end lookupAndInstantiate;
Expand Down Expand Up @@ -1999,7 +2002,7 @@ algorithm
Absyn.Direction dir;
Absyn.TypeSpec tp;
SCode.Mod mod;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> comment;
list<Env.Frame> env_1;
Option<Absyn.Exp> cond;
Expand Down
4 changes: 2 additions & 2 deletions Compiler/Mod.mo
Expand Up @@ -166,7 +166,7 @@ algorithm
Absyn.InnerOuter io;
list<SCode.Element> elts;
SCode.Ident cn,cn2,compname;
Option<Absyn.Path> bc;
SCode.OptBaseClass bc;
Option<SCode.Comment> cmt;
SCode.Restriction restr;
Absyn.TypeSpec tp,tp1;
Expand Down Expand Up @@ -1428,7 +1428,7 @@ algorithm
SCode.Attributes attr;
Absyn.TypeSpec tp;
SCode.Mod m1,m2;
Option<Absyn.Path> bc,bc2;
SCode.OptBaseClass bc,bc2;
Option<SCode.Comment> comment,comment2;
list<Env.Frame> env;
Prefix.Prefix pre;
Expand Down

0 comments on commit 2e1b940

Please sign in to comment.