@@ -990,6 +990,22 @@ algorithm
990990 then
991991 (cache,Values . BOOL (false ),st);
992992
993+ case (cache,_,"getInitialStates" ,{Values . CODE (Absyn . C_TYPENAME (className))},st as GlobalScript . SYMBOLTABLE (ast= p),_)
994+ equation
995+ cr_1 = Absyn . pathToCref(className);
996+ false = Interactive . existClass(cr_1, p);
997+ str = Absyn . pathString(className);
998+ Error . addMessage(Error . LOOKUP_ERROR , {str,"<TOP>" });
999+ then (cache, Values . ARRAY ({},{}), st);
1000+
1001+ case (cache,_,"getInitialStates" ,{Values . CODE (Absyn . C_TYPENAME (className))},st as GlobalScript . SYMBOLTABLE (),_)
1002+ equation
1003+ v = getInitialStates(className, st. ast);
1004+ then (cache, v, st);
1005+
1006+ case (cache,_,"getInitialStates" ,_,st,_)
1007+ then (cache, Values . ARRAY ({},{}), st);
1008+
9931009 case (cache,_,"diffModelicaFileListings" ,{Values . STRING (s1),Values . STRING (s2),Values . ENUM_LITERAL (name= path)},(st as GlobalScript . SYMBOLTABLE ()),_)
9941010 algorithm
9951011 ExecStat . execStatReset();
@@ -6916,6 +6932,73 @@ algorithm
69166932 end matchcontinue;
69176933end getClassComment;
69186934
6935+ protected function getAnnotationInEquation
6936+ "This function takes an `EquationItem \' and returns a comma separated
6937+ string of values from the flat record of an equation annotation that
6938+ is found in the `EquationItem \' ."
6939+ input Absyn . EquationItem inEquationItem;
6940+ output String outString;
6941+ algorithm
6942+ outString := match (inEquationItem)
6943+ local
6944+ String annotationStr;
6945+ list< String > annotationList;
6946+ list< Absyn . ElementArg > annotations;
6947+
6948+ case (Absyn . EQUATIONITEM (comment = SOME (Absyn . COMMENT (SOME (Absyn . ANNOTATION (annotations)),_))))
6949+ equation
6950+ annotationList = getAnnotationInEquationElArgs(annotations);
6951+ annotationStr = stringDelimitList(annotationList, ", " );
6952+ then
6953+ annotationStr;
6954+ case (Absyn . EQUATIONITEM (comment = NONE ()))
6955+ then
6956+ "" ;
6957+ end match;
6958+ end getAnnotationInEquation;
6959+
6960+ protected function getAnnotationInEquationElArgs
6961+ input list< Absyn . ElementArg > inElArgLst;
6962+ output list< String > outStringLst;
6963+ algorithm
6964+ outStringLst := matchcontinue (inElArgLst)
6965+ local
6966+ Absyn . FunctionArgs fargs;
6967+ list< SCode . Element > p_1;
6968+ FCore . Graph env;
6969+ DAE . Exp newexp;
6970+ String gexpstr, gexpstr_1, annName;
6971+ list< String > res;
6972+ list< Absyn . ElementArg > mod, rest;
6973+ FCore . Cache cache;
6974+ DAE . Properties prop;
6975+ Absyn . Program lineProgram;
6976+
6977+ // handle empty
6978+ case ({}) then {};
6979+
6980+ case (Absyn . MODIFICATION (path = Absyn . IDENT (annName), modification = SOME (Absyn . CLASSMOD (mod,_))) :: rest)
6981+ equation
6982+ lineProgram = Interactive . modelicaAnnotationProgram(Config . getAnnotationVersion());
6983+ fargs = Interactive . createFuncargsFromElementargs(mod);
6984+ p_1 = SCodeUtil . translateAbsyn2SCode(lineProgram);
6985+ (cache,env) = Inst . makeEnvFromProgram(p_1);
6986+ (_,newexp,prop) = StaticScript . elabGraphicsExp(cache,env, Absyn . CALL (Absyn . CREF_IDENT (annName,{}),fargs), false ,Prefix . NOPRE (), sourceInfo()) "impl" ;
6987+ (cache, newexp, prop) = Ceval . cevalIfConstant(cache, env, newexp, prop, false , sourceInfo());
6988+ Print . clearErrorBuf() "this is to clear the error-msg generated by the annotations." ;
6989+ gexpstr = ExpressionDump . printExpStr(newexp);
6990+ res = getAnnotationInEquationElArgs(rest);
6991+ then
6992+ (gexpstr :: res);
6993+ case (Absyn . MODIFICATION (path = Absyn . IDENT (annName), modification = SOME (Absyn . CLASSMOD (_,Absyn . NOMOD ()))) :: rest)
6994+ equation
6995+ gexpstr_1 = stringAppendList({annName,"(error)" });
6996+ res = getAnnotationInEquationElArgs(rest);
6997+ then
6998+ (gexpstr_1 :: res);
6999+ end matchcontinue;
7000+ end getAnnotationInEquationElArgs;
7001+
69197002protected function getTransitions
69207003 input Absyn . Path path;
69217004 input Absyn . Program p;
@@ -7004,7 +7087,7 @@ algorithm
70047087 case (((eqItem as Absyn . EQUATIONITEM (equation_ = eq as Absyn . EQ_NORETCALL (functionName = Absyn . CREF_IDENT (name = "transition" )))) :: xs),transitions)
70057088 equation
70067089 transition = getTransitionInEquation(eq);
7007- transition = List . insert(transition, listLength(transition) + 1 , getTransitionAnnotation (eqItem));
7090+ transition = List . insert(transition, listLength(transition) + 1 , getAnnotationInEquation (eqItem));
70087091 transitions = listAppend({transition}, transitions);
70097092 then
70107093 getTransitionsInEquations(xs, transitions);
@@ -7049,72 +7132,133 @@ algorithm
70497132 end match;
70507133end getTransitionInEquation;
70517134
7052- protected function getTransitionAnnotation
7053- "This function takes an `EquationItem \' and returns a comma separated
7054- string of values from the flat record of a connection annotation that
7055- is found in the `EquationItem \' ."
7056- input Absyn . EquationItem inEquationItem;
7057- output String outString;
7135+ protected function getInitialStates
7136+ input Absyn . Path path;
7137+ input Absyn . Program p;
7138+ output Values . Value res;
7139+ protected
7140+ list< list< String >> initialStates;
7141+ Absyn . Class cdef;
70587142algorithm
7059- outString := match (inEquationItem)
7143+ cdef := Interactive . getPathedClassInProgram(path, p);
7144+ initialStates := listReverse(getInitialStatesInClass(cdef));
7145+ res := ValuesUtil . makeArray(List . map(initialStates, ValuesUtil . makeStringArray));
7146+ end getInitialStates;
7147+
7148+ protected function getInitialStatesInClass
7149+ "Gets the list of initial states in a class."
7150+ input Absyn . Class inClass;
7151+ output list< list< String >> outInitialStates;
7152+ algorithm
7153+ outInitialStates := match (inClass)
70607154 local
7061- String annotationStr;
7062- list< String > annotationList;
7063- list< Absyn . ElementArg > annotations;
7155+ list< list< String >> initialStates;
7156+ list< Absyn . ClassPart > parts;
70647157
7065- case ( Absyn . EQUATIONITEM (comment = SOME ( Absyn . COMMENT ( SOME ( Absyn . ANNOTATION (annotations)),_)) ))
7158+ case Absyn . CLASS (body = Absyn . PARTS (classParts = parts ))
70667159 equation
7067- annotationList = getTransitionAnnotationElArgs(annotations);
7068- annotationStr = stringDelimitList(annotationList, ", " );
7160+ initialStates = getInitialStatesInClassParts(parts);
70697161 then
7070- annotationStr;
7071- case (Absyn . EQUATIONITEM (comment = NONE ()))
7162+ initialStates;
7163+
7164+ // handle also the case model extends X end X;
7165+ case Absyn . CLASS (body = Absyn . CLASS_EXTENDS (parts = parts))
7166+ equation
7167+ initialStates = getInitialStatesInClassParts(parts);
70727168 then
7073- "" ;
7169+ initialStates;
7170+
7171+ case Absyn . CLASS (body = Absyn . DERIVED ()) then {};
7172+
70747173 end match;
7075- end getTransitionAnnotation ;
7174+ end getInitialStatesInClass ;
70767175
7077- protected function getTransitionAnnotationElArgs
7078- input list< Absyn . ElementArg > inElArgLst;
7079- output list< String > outStringLst;
7176+ protected function getInitialStatesInClassParts
7177+ "Helper function for getInitialStatesInClass."
7178+ input list< Absyn . ClassPart > inAbsynClassPartLst;
7179+ output list< list< String >> outInitialStates;
70807180algorithm
7081- outStringLst := matchcontinue (inElArgLst )
7181+ outInitialStates := matchcontinue (inAbsynClassPartLst )
70827182 local
7083- Absyn . FunctionArgs fargs;
7084- list< SCode . Element > p_1;
7085- FCore . Graph env;
7086- DAE . Exp newexp;
7087- String gexpstr, gexpstr_1, annName;
7088- list< String > res;
7089- list< Absyn . ElementArg > mod, rest;
7090- FCore . Cache cache;
7091- DAE . Properties prop;
7092- Absyn . Program lineProgram;
7093-
7094- // handle empty
7095- case ({}) then {};
7183+ list< list< String >> initialStates1, initialStates2;
7184+ list< Absyn . EquationItem > eqlist;
7185+ list< Absyn . ClassPart > xs;
70967186
7097- case (Absyn . MODIFICATION (path = Absyn . IDENT (annName), modification = SOME ( Absyn . CLASSMOD (mod,_))) :: rest )
7187+ case (( Absyn . EQUATIONS (contents = eqlist) :: xs) )
70987188 equation
7099- lineProgram = Interactive . modelicaAnnotationProgram(Config . getAnnotationVersion());
7100- fargs = Interactive . createFuncargsFromElementargs(mod);
7101- p_1 = SCodeUtil . translateAbsyn2SCode(lineProgram);
7102- (cache,env) = Inst . makeEnvFromProgram(p_1);
7103- (_,newexp,prop) = StaticScript . elabGraphicsExp(cache,env, Absyn . CALL (Absyn . CREF_IDENT (annName,{}),fargs), false ,Prefix . NOPRE (), sourceInfo()) "impl" ;
7104- (cache, newexp, prop) = Ceval . cevalIfConstant(cache, env, newexp, prop, false , sourceInfo());
7105- Print . clearErrorBuf() "this is to clear the error-msg generated by the annotations." ;
7106- gexpstr = ExpressionDump . printExpStr(newexp);
7107- res = getTransitionAnnotationElArgs(rest);
7189+ initialStates1 = getInitialStatesInEquations(eqlist, {});
7190+ initialStates2 = getInitialStatesInClassParts(xs);
71087191 then
7109- (gexpstr :: res);
7110- case (Absyn . MODIFICATION (path = Absyn . IDENT (annName), modification = SOME (Absyn . CLASSMOD (_,Absyn . NOMOD ()))) :: rest)
7192+ listAppend(initialStates1, initialStates2);
7193+
7194+ case ((_ :: xs))
71117195 equation
7112- gexpstr_1 = stringAppendList({annName,"(error)" });
7113- res = getTransitionAnnotationElArgs(rest);
7196+ initialStates1 = getInitialStatesInClassParts(xs);
71147197 then
7115- (gexpstr_1 :: res);
7198+ initialStates1;
7199+
7200+ case ({})
7201+ then {};
7202+
71167203 end matchcontinue;
7117- end getTransitionAnnotationElArgs;
7204+ end getInitialStatesInClassParts;
7205+
7206+ protected function getInitialStatesInEquations
7207+ "Helper function for getInitialStatesInClass."
7208+ input list< Absyn . EquationItem > inAbsynEquationItemLst;
7209+ input list< list< String >> inInitialStates;
7210+ output list< list< String >> outInitialStates;
7211+ algorithm
7212+ outInitialStates := match (inAbsynEquationItemLst, inInitialStates)
7213+ local
7214+ list< list< String >> initialStates;
7215+ list< String > initialState;
7216+ Absyn . EquationItem eqItem;
7217+ Absyn . Equation eq;
7218+ list< Absyn . EquationItem > xs;
7219+
7220+ case (((eqItem as Absyn . EQUATIONITEM (equation_ = eq as Absyn . EQ_NORETCALL (functionName = Absyn . CREF_IDENT (name = "initialState" )))) :: xs),initialStates)
7221+ equation
7222+ initialState = getInitialStateInEquation(eq);
7223+ initialState = List . insert(initialState, listLength(initialState) + 1 , getAnnotationInEquation(eqItem));
7224+ initialStates = listAppend({initialState}, initialStates);
7225+ then
7226+ getInitialStatesInEquations(xs, initialStates);
7227+
7228+ case ((_ :: xs), _)
7229+ then
7230+ getInitialStatesInEquations(xs, inInitialStates);
7231+
7232+ case ({}, _)
7233+ then
7234+ inInitialStates;
7235+
7236+ end match;
7237+ end getInitialStatesInEquations;
7238+
7239+ protected function getInitialStateInEquation
7240+ "Initial state is a Absyn.EQ_NORETCALL.
7241+ So we read the function arguments and named arguments.
7242+ This function should always return a list with 1 value."
7243+ input Absyn . Equation inEquation;
7244+ output list< String > outInitialState;
7245+ algorithm
7246+ outInitialState := match (inEquation)
7247+ local
7248+ list< Absyn . Exp > expArgs;
7249+ list< Absyn . NamedArg > namedArgs;
7250+ list< String > initialState;
7251+
7252+ case Absyn . EQ_NORETCALL (functionArgs = Absyn . FUNCTIONARGS (args = expArgs, argNames = namedArgs))
7253+ equation
7254+ initialState = List . map(expArgs, Dump . printExpStr);
7255+ then
7256+ initialState;
7257+
7258+ else {"" };
7259+
7260+ end match;
7261+ end getInitialStateInEquation;
71187262
71197263function getComponentInfo
71207264 input Absyn . Element comp;
0 commit comments