public bool TryGetResult(Body input, out TOut result) { InternalResult = default(TOut); input.AcceptVisitor(this); result = InternalResult; return(!Equals(result, default(TOut))); }
public override void AcceptVisitor(StatementVisitor visitor) { visitor.VisitDoStatement(this); Body.AcceptVisitor(visitor); if (Condition != null) { Condition.AcceptVisitor(visitor); } }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public override void AcceptVisitor(StatementVisitor visitor) { visitor.VisitUsingStatement(this); if (Disposable != null) { Disposable.AcceptVisitor(visitor); } Body.AcceptVisitor(visitor); }
//--------------------------------------------------------------------- #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); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public void AcceptVisitor(StatementVisitor visitor) { if (ExceptionType != null) { visitor.VisitReferenceToTypeMember(ExceptionType); } if (ExceptionVariable != null) { visitor.VisitReferenceToLocalVariable(ExceptionVariable); } Body.AcceptVisitor(visitor); }
public override void AcceptVisitor(StatementVisitor visitor) { visitor.VisitForEachStatement(this); if (Enumerable != null) { Enumerable.AcceptVisitor(visitor); } Body.AcceptVisitor(visitor); if (CurrentItem != null) { visitor.VisitReferenceToLocalVariable(CurrentItem); } }
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); } }
//----------------------------------------------------------------------------------------------------------------------------------------------------- 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); }
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); } }
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(); }
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); }
//--------------------------------------------------------------------- #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); }