private void WriteOnEntryExit(CodeTypeDeclaration stateCode, StateType state, ActionsType action, string onEntryExit) { CodeMemberMethod onMethod = new CodeMemberMethod( ); //ext OnWriteOnEntryExitStarting(stateCode, state, action, onEntryExit, onMethod); //------------------- onMethod.Comments.Add(new CodeCommentStatement(onEntryExit)); onMethod.Name = onEntryExit; onMethod.Attributes = MemberAttributes.Public | MemberAttributes.Override; onMethod.Parameters.Add(new CodeParameterDeclarationExpression(GetContextClassName(state), Model.settings.context.instance)); //ext OnWriteOnEntryExitEnding(stateCode, state, action, onEntryExit, onMethod, "Starting"); if (onEntryExit == "OnExit") { // context.SaveState(); WriteOnExitHistory(state, onMethod); WriteOnExitParallel(onMethod, state); } if (Options.NoObserver == false) { // context.Observer var contextDotObserver = new CodeFieldReferenceExpression( new CodeVariableReferenceExpression(Model.settings.context.instance), "Observer"); // param context.Name var contextDotName = new CodeFieldReferenceExpression( new CodeVariableReferenceExpression(Model.settings.context.instance), "Name"); // param StateRunning.Instance var stateLeafDotInstance = new CodeFieldReferenceExpression( new CodeVariableReferenceExpression(GetStateClassName(state)), "Instance"); // param StateTop.Instance.Name var stateLeafDotInstanceDotName = new CodeFieldReferenceExpression(stateLeafDotInstance, "Name"); // context.Observer.OnExit(context.Name, StateTop.Instance.Name); var onMethodInvoke = new CodeMethodInvokeExpression( contextDotObserver, onEntryExit, new CodeExpression[] { contextDotName, stateLeafDotInstanceDotName }); onMethod.Statements.Add(onMethodInvoke); var codeContextReference = new CodeFieldReferenceExpression( ); codeContextReference.FieldName = Model.settings.context.instance; } if (action != null) //? { WriteActuatorParameterDeclaration(onMethod); CodeStatementCollection statements = new CodeStatementCollection( ); //ext OnWrite_StateEntryExit_ActionsStarting(statements, state, action.action, action.Items, onMethod); WriteActions(statements, state, action.action, action.Items); #region OnStateEntryExitACtions TESTS onMethod.Comments .Add(new CodeCommentStatement( $@"SomeActions : {action .action} <-- and items")); if (action.Items != null) { if (action.Items.Length > 0) { foreach (var item in action.Items) { onMethod.Comments .Add(new CodeCommentStatement( $@" --> {item .ToString ( )} ")); } } } #endregion onMethod.Statements.AddRange(statements); //ext OnWrite_StateEntryExit_ActionsEnding(statements, state, action.action, action.Items, onMethod); } if (onEntryExit == "OnEntry") { WriteOnEntryParallel(onMethod, state); } stateCode.Members.Add(onMethod); //------------- //ext OnWriteOnEntryExitEnding(stateCode, state, action, onEntryExit, onMethod, "Ending"); //Now I Want to add : // context.CallControl_callControl.State = (CallControlStateEnum)Enum.Parse(typeof(CallControlStateEnum), Name); }
//public override void OnEntry(HelloWorldContext context) //{ // context.Observer.OnEntry(context.Name, StateTop.Instance.Name); //} private void WriteOnEntryExit(CodeTypeDeclaration stateCode, StateType state, ActionsType action, string onEntryExit) { CodeMemberMethod onMethod = new CodeMemberMethod(); onMethod.Comments.Add(new CodeCommentStatement(onEntryExit)); onMethod.Name = onEntryExit; onMethod.Attributes = MemberAttributes.Public | MemberAttributes.Override; onMethod.Parameters.Add(new CodeParameterDeclarationExpression(GetContextClassName(state), Model.settings.context.instance)); if (onEntryExit == "OnExit") { // context.SaveState(); WriteOnExitHistory(state, onMethod); WriteOnExitParallel(onMethod, state); } if (Options.NoObserver == false) { // context.Observer var contextDotObserver = new CodeFieldReferenceExpression( new CodeVariableReferenceExpression(Model.settings.context.instance), "Observer"); // param context.Name var contextDotName = new CodeFieldReferenceExpression( new CodeVariableReferenceExpression(Model.settings.context.instance), "Name"); // param StateRunning.Instance var stateLeafDotInstance = new CodeFieldReferenceExpression( new CodeVariableReferenceExpression(GetStateClassName(state)), "Instance"); // param StateTop.Instance.Name var stateLeafDotInstanceDotName = new CodeFieldReferenceExpression(stateLeafDotInstance, "Name"); // context.Observer.OnExit(context.Name, StateTop.Instance.Name); var onMethodInvoke = new CodeMethodInvokeExpression( contextDotObserver, onEntryExit, new CodeExpression[] { contextDotName, stateLeafDotInstanceDotName }); onMethod.Statements.Add(onMethodInvoke); } if (action != null) { WriteActuatorParameterDeclaration(onMethod); CodeStatementCollection statements = new CodeStatementCollection(); WriteActions(statements, state, action.action, action.Items); onMethod.Statements.AddRange(statements); } if (onEntryExit == "OnEntry") { WriteOnEntryParallel(onMethod, state); } stateCode.Members.Add(onMethod); }
partial void OnWriteOnEntryExitEnding(CodeTypeDeclaration stateCode, StateType state, ActionsType action, string onEntryExit, CodeMemberMethod onMethod, string x);
partial void OnWriteOnEntryExitStarting(CodeTypeDeclaration stateCode, StateType state, ActionsType action, string onEntryExit, CodeMemberMethod onMethod) { if (partialInvokers == null) { partialInvokers = new Dictionary <string, string>(); } //explore what data we can get from the base class string baseContext = GetContextBaseClassName(state); string contextClassName = GetContextClassName(state); #region Partial OnEntryExit Extention writePartialDeclaration(onEntryExit, onMethod, contextClassName, "Starting"); writePartialDeclaration(onEntryExit, onMethod, contextClassName, "Ending"); #endregion #region Feeder Object state set //I want // context._instance.State = CurrentState; //todo Put all that into a Method.... writeStateEntryStateSetter(state, onMethod, onEntryExit); #endregion }