public override void ExitExpectStatement([NotNull] SBP.ExpectStatementContext context) { var isAssert = (context.children[0].GetText() == "assert"); var stack = m_expressionData.PopStackLevel(); var expression = stack.Pop(); expression = this.ResolveForGetOperation(expression); string expressionText = context.GetChild(context.ChildCount - 2).GetChild(1).GetText(); string title = String.Empty; if (context.ChildCount > 3) { title = context.GetChild(1).GetText(); title = title.Substring(1, title.Length - 2); // Strip quotes } //if (expression.ExpressionCode.NodeType == ExpressionType.Equal || // expression.ExpressionCode.NodeType == ExpressionType.NotEqual) //{ // throw new NotImplementedException(); //} if (!(expression.ExpressionCode.Type == typeof(bool))) { m_errors.SymanticError(context.Start.Line, context.Start.Column, false, "Expression for 'expect' statement is not boolean."); } else { LabelTarget returnLabel = Expression.Label(typeof(bool)); var contextParameter = Expression.Parameter(typeof(IScriptCallContext), "context"); var actualValueParameter = Expression.Parameter(typeof(string).MakeByRefType(), "actualValue"); // delegate bool ExpectStatementEvaluationDelegate(IScriptCallContext context, out string actualValue); var evaluationDelegate = Expression.Lambda <ExpectStatementEvaluationDelegate>( Expression.Block( Expression.Condition( expression.ExpressionCode, Expression.Block( Expression.Assign(actualValueParameter, Expression.Constant("<TRUE>")), Expression.Label(returnLabel, Expression.Constant(true))), Expression.Block( Expression.Assign(actualValueParameter, Expression.Constant("<FALSE>")), Expression.Label(returnLabel, Expression.Constant(false))))), contextParameter, actualValueParameter); var expectCall = Expression.Call( s_ExpectStatement, m_currentProcedure.ContextReferenceInternal, evaluationDelegate, isAssert ? Expression.Constant(Verdict.Error) : Expression.Constant(Verdict.Fail), Expression.Constant(title), Expression.Constant(expressionText)); var conditionalReturn = Expression.Condition( expectCall, Expression.Return(m_currentProcedure.ReturnLabel, Expression.Default(m_currentProcedure.ReturnType.Type)), Expression.Empty()); m_scopeStack.Peek().AddStatementCode(conditionalReturn); } }
public override void EnterExpectStatement([NotNull] SBP.ExpectStatementContext context) { this.AddEnterStatement(context); m_expressionData.PushStackLevel("ExpectStatement"); //m_awaitsExpectExpression = true; }