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;
 }