コード例 #1
0
ファイル: Evaluator.cs プロジェクト: Pi-Man/Vivian
        private object EvaluateConversionExpression(BoundConversionExpression node)
        {
            var value = EvaluateExpression(node.Expression);

            if (node.Type == TypeSymbol.Object)
            {
                return(value);
            }
            if ((node.Type.Caps & TypeSymbolCaps.Arithmetic) != TypeSymbolCaps.None)
            {
                if (value is string s)
                {
                    return(s.Equals("true") ?
                           1 :
                           s.Equals("false") ?
                           0 :
                           throw new Exception($"Value {value} can not be cast to type {node.Type}"));
                }
                return(Conversion.Convert(node.Type, value));
            }
            else if (node.Type == TypeSymbol.String)
            {
                if (node.Expression.Type == TypeSymbol.Bool)
                {
                    return((byte)value == 0 ? "false" : "true");
                }
                return(Convert.ToString(value));
            }
            else
            {
                throw new Exception($"Unexpected type {node.Type}");
            }
        }
コード例 #2
0
ファイル: Evaluator.cs プロジェクト: szaboopeeter/minsk
        private object EvaluateConversionExpression(BoundConversionExpression node)
        {
            var value = EvaluateExpression(node.Expression);

            if (node.Type == TypeSymbol.Any)
            {
                return(value);
            }
            else if (node.Type == TypeSymbol.Bool)
            {
                return(Convert.ToBoolean(value));
            }
            else if (node.Type == TypeSymbol.Int)
            {
                return(Convert.ToInt32(value));
            }
            else if (node.Type == TypeSymbol.String)
            {
                return(Convert.ToString(value));
            }
            else
            {
                throw new Exception($"Unexpected type {node.Type}.");
            }
        }
コード例 #3
0
ファイル: Evaluator.cs プロジェクト: nonsensation/Slang
        private object EvaluateConversionExpression(BoundConversionExpression node)
        {
            var value = this.EvaluateExpression(node.Expression);

            if (node.Type == BuiltinTypes.Any)
            {
                return(value !); // TODO: remove !
            }
            else if (node.Type == BuiltinTypes.Bool)
            {
                return(Convert.ToBoolean(value));
            }
            else if (node.Type == BuiltinTypes.Int)
            {
                return(Convert.ToInt32(value));
            }
            else if (node.Type == BuiltinTypes.String)
            {
                return(Convert.ToString(value) !);
            }
            else
            {
                throw new Exception($"Unexpected type {node.Type}");
            }
        }
コード例 #4
0
ファイル: Evaluator.cs プロジェクト: dotjpg3141/minsk
        private object EvaluateConversionExpression(BoundConversionExpression node)
        {
            var value = EvaluateExpression(node.Expression);

            try
            {
                if (node.Type == TypeSymbol.Bool)
                {
                    return(Convert.ToBoolean(value));
                }
                else if (node.Type == TypeSymbol.Int)
                {
                    return(Convert.ToInt32(value));
                }
                else if (node.Type == TypeSymbol.String)
                {
                    return(Convert.ToString(value));
                }
                else
                {
                    throw new Exception($"Unexpected type {node.Type}");
                }
            }
            catch (Exception ex) when(ex is FormatException || ex is OverflowException)
            {
                throw new EvaluatorException($"Cannot convert '{value}' to type '{node.Type}'.", ex);
            }
        }
コード例 #5
0
ファイル: BoundNodePrinter.cs プロジェクト: kthompson/panther
 public override void VisitConversionExpression(BoundConversionExpression node)
 {
     //TODO: writer.WriteIdentifier(node.Type.Name);
     _writer.WriteIdentifier(node.Type.ToString());
     _writer.WritePunctuation("(");
     node.Expression.Accept(this);
     _writer.WritePunctuation(")");
 }
コード例 #6
0
    protected override BoundExpression RewriteConversionExpression(BoundConversionExpression node)
    {
        var rewriteExpression = RewriteExpression(node.Expression);
        var expr = IsSimpleNode(rewriteExpression)
            ? rewriteExpression
            : CreateTemporary(rewriteExpression);

        if (expr == node.Expression)
        {
            return(node);
        }

        return(new BoundConversionExpression(node.Syntax, node.Type, expr));
    }
コード例 #7
0
        private Expression BuildConversionExpression(BoundConversionExpression expression)
        {
            if (expression.Expression.Type.IsNull())
            {
                return(BuildNullValue(expression.Type));
            }

            var input            = BuildCachedExpression(expression.Expression);
            var targetType       = expression.Type;
            var conversionMethod = expression.Conversion.ConversionMethods.SingleOrDefault();

            return
                (Expression.Condition(
                     BuildNullCheck(input),
                     BuildNullValue(targetType),
                     BuildLiftedExpression(
                         Expression.Convert(
                             input,
                             targetType,
                             conversionMethod
                             )
                         )
                     ));
        }
コード例 #8
0
 private static void WriteBoundConversionExpression(this IndentedTextWriter writer, BoundConversionExpression node)
 {
     writer.WriteBlueKeyword(node.ResultType.Name);
     writer.ColorWrite('(');
     writer.WriteBoundNode(node.Expression);
     writer.ColorWrite(')');
 }
コード例 #9
0
 protected virtual void VisitConversionExpression(BoundConversionExpression node)
 {
     VisitExpression(node.Expression);
 }
コード例 #10
0
 public virtual void VisitConversionExpression(BoundConversionExpression node) =>
 this.DefaultVisit(node);
コード例 #11
0
 private void EmitConversionExpression(ILProcessor ilProcessor, BoundConversionExpression node)
 {
     throw new NotImplementedException();
 }