示例#1
0
 public bool TryGetResult(Body input, out TOut result)
 {
     InternalResult = default(TOut);
     input.AcceptVisitor(this);
     result = InternalResult;
     return(!Equals(result, default(TOut)));
 }
示例#2
0
        public override void AcceptVisitor(StatementVisitor visitor)
        {
            visitor.VisitDoStatement(this);

            Body.AcceptVisitor(visitor);

            if (Condition != null)
            {
                Condition.AcceptVisitor(visitor);
            }
        }
示例#3
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public override void AcceptVisitor(StatementVisitor visitor)
        {
            visitor.VisitUsingStatement(this);

            if (Disposable != null)
            {
                Disposable.AcceptVisitor(visitor);
            }

            Body.AcceptVisitor(visitor);
        }
示例#4
0
        //---------------------------------------------------------------------

        #region Saving bodies

        /// <summary>
        /// Повесим на тело нужные event-ы, создадим физическое тело и запомним его
        /// </summary>
        /// <param name="body"></param>
        private static void AcquireBody(Body body)
        {
            body.ChildAdded   += BodyChildAdded;
            body.ChildRemoved += BodyChildRemoved;
            if (!body.IsMaterial)
            {
                SaveBody(body, null);
                return;
            }

            body.PropertyChanged += BodyPropertyChanged;
            body.AcceptVisitor(BodyCreatorVisitor);
        }
示例#5
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public void AcceptVisitor(StatementVisitor visitor)
        {
            if (ExceptionType != null)
            {
                visitor.VisitReferenceToTypeMember(ExceptionType);
            }

            if (ExceptionVariable != null)
            {
                visitor.VisitReferenceToLocalVariable(ExceptionVariable);
            }

            Body.AcceptVisitor(visitor);
        }
示例#6
0
        public override void AcceptVisitor(StatementVisitor visitor)
        {
            visitor.VisitForEachStatement(this);

            if (Enumerable != null)
            {
                Enumerable.AcceptVisitor(visitor);
            }

            Body.AcceptVisitor(visitor);

            if (CurrentItem != null)
            {
                visitor.VisitReferenceToLocalVariable(CurrentItem);
            }
        }
示例#7
0
        public override void AcceptVisitor(StatementVisitor visitor)
        {
            visitor.VisitLockStatement(this);

            if (SyncRoot != null)
            {
                SyncRoot.AcceptVisitor(visitor);
            }

            if (EnterTimeout != null)
            {
                EnterTimeout.AcceptVisitor(visitor);
            }

            if (Body != null)
            {
                Body.AcceptVisitor(visitor);
            }
        }
示例#8
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public override void AcceptVisitor(StatementVisitor visitor)
        {
            visitor.VisitForStatement(this);

            foreach (var initializer in Initializers)
            {
                initializer.AcceptVisitor(visitor);
            }

            if (Condition != null)
            {
                Condition.AcceptVisitor(visitor);
            }

            foreach (var iterator in Iterators)
            {
                iterator.AcceptVisitor(visitor);
            }

            Body.AcceptVisitor(visitor);
        }
示例#9
0
        public void AcceptVisitor(StatementVisitor visitor)
        {
            if (ConstantMatch != null)
            {
                ConstantMatch.AcceptVisitor(visitor);
            }

            if (PatternMatchType != null)
            {
                visitor.VisitReferenceToTypeMember(PatternMatchType);
            }

            if (PatternMatchCondition != null)
            {
                PatternMatchCondition.AcceptVisitor(visitor);
            }

            if (Body != null)
            {
                Body.AcceptVisitor(visitor);
            }
        }
示例#10
0
        protected void EmitGeneratorBody()
        {
            BeginBlock();

            var asyncTryVisitor = new AsyncTryVisitor();

            Node.AcceptChildren(asyncTryVisitor);
            var needTry = true;

            Emitter.AsyncVariables.Add(JS.Vars.ASYNC_JUMP);
            if (needTry)
            {
                Emitter.AsyncVariables.Add(JS.Vars.ASYNC_RETURN_VALUE);

                WriteTry();
                BeginBlock();
            }

            WriteFor();
            Write("(;;) ");
            BeginBlock();

            WriteSwitch();
            Write("(" + JS.Vars.ASYNC_STEP + ") ");
            BeginBlock();

            Step = 0;
            var writer = SaveWriter();

            AddAsyncStep();

            Body.AcceptVisitor(Emitter);

            RestoreWriter(writer);

            InjectSteps();

            WriteNewLine();
            EndBlock();

            WriteNewLine();
            EndBlock();

            if (needTry)
            {
                if (!Emitter.Locals.ContainsKey(JS.Vars.ASYNC_E))
                {
                    AddLocal(JS.Vars.ASYNC_E, null, AstType.Null);
                }

                WriteNewLine();
                EndBlock();
                Write(" catch(" + JS.Vars.ASYNC_E1 + ") ");
                BeginBlock();
                Write(JS.Vars.ASYNC_E + " = " + JS.Types.System.Exception.CREATE + "(" + JS.Vars.ASYNC_E1 + ");");
                WriteNewLine();
                InjectCatchHandlers();

                WriteNewLine();
                EndBlock();
            }

            WriteNewLine();
            EndBlock();
        }
示例#11
0
        protected void EmitAsyncBody()
        {
            BeginBlock();

            var asyncTryVisitor = new AsyncTryVisitor();

            Node.AcceptChildren(asyncTryVisitor);
            var needTry = asyncTryVisitor.Found || IsTaskReturn;

            Emitter.AsyncVariables.Add(JS.Vars.ASYNC_JUMP);
            if (needTry)
            {
                if (IsTaskReturn)
                {
                    Emitter.AsyncVariables.Add(JS.Vars.ASYNC_TCS + " = new " + JS.Types.TASK_COMPLETION_SOURCE + "()");
                }

                Emitter.AsyncVariables.Add(JS.Vars.ASYNC_RETURN_VALUE);

                Write("try");
                WriteSpace();
                BeginBlock();
            }

            Write("for (;;) ");
            BeginBlock();
            WriteIndent();
            int checkerPos = Emitter.Output.Length;

            WriteNewLine();
            Write("switch (" + JS.Vars.ASYNC_STEP + ") ");

            BeginBlock();

            Step = 0;
            var writer = SaveWriter();

            AddAsyncStep();

            if (Body.Parent is LambdaExpression && Body is Expression && IsTaskReturn && ReturnType.FullName == "System.Threading.Tasks.Task" && ReturnType.TypeParameterCount > 0)
            {
                new ReturnBlock(Emitter, (Expression)Body).Emit();
            }
            else
            {
                var level = Emitter.InitialLevel;
                ((Emitter)Emitter).InitialLevel = 0;
                Emitter.ResetLevel();
                Body.AcceptVisitor(Emitter);
                ((Emitter)Emitter).InitialLevel = level;
            }

            RestoreWriter(writer);

            InjectSteps();

            WriteNewLine();
            EndBlock();

            InjectStepsChecker(checkerPos);
            WriteNewLine();
            EndBlock();

            if (needTry)
            {
                if (!Emitter.Locals.ContainsKey(JS.Vars.ASYNC_E))
                {
                    AddLocal(JS.Vars.ASYNC_E, null, AstType.Null);
                }

                WriteNewLine();
                EndBlock();
                Write(" catch(" + JS.Vars.ASYNC_E1 + ") ");
                BeginBlock();
                Write(JS.Vars.ASYNC_E + " = " + JS.Types.System.Exception.CREATE + "(" + JS.Vars.ASYNC_E1 + ");");
                WriteNewLine();
                InjectCatchHandlers();

                WriteNewLine();
                EndBlock();
            }

            WriteNewLine();
            EndBlock();
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public override void AcceptVisitor(StatementVisitor visitor)
        {
            visitor.VisitAnonymousDelegateExpression(this);
            Body.AcceptVisitor(visitor);
        }
示例#13
0
		//---------------------------------------------------------------------

		#region Saving bodies	
	
		/// <summary>
		/// Повесим на тело нужные event-ы, создадим физическое тело и запомним его
		/// </summary>
		/// <param name="body"></param>
		private void AcquireBody(Body body)
		{
			body.ChildAdded += BodyChildAdded;
			body.ChildRemoved += BodyChildRemoved;
			if (!body.IsMaterial)
			{
				SaveBody(body, null);
				return;
			}

			body.PropertyChanged += BodyPropertyChanged;			
			body.AcceptVisitor(BodyCreatorVisitor);
		}