コード例 #1
0
        internal override string ToString(string indent)
        {
            var sb = new StringBuilder(128);

            sb.AppendFormat("{0}WHEN ", indent);

            if (WhenExpression.OneLine())
            {
                sb.Append(WhenExpression.ToString(""));
            }
            else
            {
                sb.Append("\r\n");
                sb.Append(WhenExpression.ToString(indent + " "));
            }

            sb.Append(" THEN ");

            if (ThenExpression.OneLine())
            {
                sb.Append(ThenExpression.ToString(""));
            }
            else
            {
                sb.Append("\r\n");
                sb.Append(ThenExpression.ToString(indent + " "));
            }

            return(sb.ToString());
        }
コード例 #2
0
        /// <summary>
        /// Tries to evaluate the given expression in the context of
        /// the given environment.
        /// </summary>
        /// <param name="env">Environment in which to evaluate the
        /// expression.</param>
        /// <param name="value">On success, receives the evaluation
        /// result.</param>
        /// <returns>true on success; false otherwise.</returns>
        public override bool TryEvaluate(ExpressionEnvironment env, out string value)
        {
            if (env == null)
            {
                throw new ArgumentNullException(nameof(env));
            }

            if (!Condition.TryEvaluate(env, out string condition) ||
                !ThenExpression.TryEvaluate(env, out string thenValue))
            {
                value = null;
                return(false);
            }

            string elseValue = string.Empty;

            if (ElseExpression.HasValue &&
                !ElseExpression.Value.TryEvaluate(env, out elseValue))
            {
                value = null;
                return(false);
            }

            var conditionValue = !string.IsNullOrEmpty(condition);

            value = conditionValue ? thenValue : elseValue;
            return(true);
        }
コード例 #3
0
 public override int GetHashCode()
 {
     unchecked
     {
         var hashCode = 10 + Condition.GetHashCode();
         hashCode = (hashCode * 397) ^ ThenExpression.GetHashCode();
         hashCode = (hashCode * 397) ^ ElseExpression.GetHashCode();
         return(hashCode);
     }
 }
コード例 #4
0
        /// <inheritdoc />
        protected override EvaluationResult DoEval(Context context, ModuleLiteral env, EvaluationStackFrame frame)
        {
            var condition = ConditionExpression.Eval(context, env, frame);

            if (condition.IsErrorValue)
            {
                return(condition);
            }

            return(IsTruthy(condition.Value) ? ThenExpression.Eval(context, env, frame) : ElseExpression.Eval(context, env, frame));
        }
コード例 #5
0
ファイル: IfThenElseNode.cs プロジェクト: frankcs/tiger
        public override void GenerateCode(CodeGeneration.CodeGenerator cg)
        {
            Label elseeval = cg.IlGenerator.DefineLabel();
            Label endofif  = cg.IlGenerator.DefineLabel();

            IfCondition.GenerateCode(cg);
            cg.IlGenerator.Emit(OpCodes.Brfalse, elseeval);
            ThenExpression.GenerateCode(cg);
            cg.IlGenerator.Emit(OpCodes.Br, endofif);
            cg.IlGenerator.MarkLabel(elseeval);
            ElseExpression.GenerateCode(cg);
            cg.IlGenerator.MarkLabel(endofif);
        }
コード例 #6
0
 internal override bool OneLine()
 {
     return(WhenExpression.OneLine() && ThenExpression.OneLine());
 }
コード例 #7
0
 /// <inheritdoc />
 public override string ToDebugString()
 {
     return(I($"{ConditionExpression.ToDebugString()} ? {ThenExpression.ToDebugString()} : {ElseExpression.ToDebugString()}"));
 }
コード例 #8
0
 /// <inheritdoc />
 protected override void DoSerialize(BuildXLWriter writer)
 {
     ConditionExpression.Serialize(writer);
     ThenExpression.Serialize(writer);
     ElseExpression.Serialize(writer);
 }