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);
        }
Ejemplo n.º 2
0
        //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
        }