Esempio n. 1
0
        protected JSExpression Translate_UnaryOp(ILExpression node, JSUnaryOperator op)
        {
            var inner = TranslateNode(node.Arguments[0]);
            var innerType = JSExpression.DeReferenceType(inner.GetExpectedType(TypeSystem));

            // Detect the weird pattern '!(x = y as z)' and transform it into '(x = y as z) != null'
            if (
                (op == JSOperator.LogicalNot) &&
                !TypesAreAssignable(TypeSystem.Boolean, innerType)
            ) {
                return new JSBinaryOperatorExpression(
                    JSOperator.Equal, inner, new JSDefaultValueLiteral(innerType), TypeSystem.Boolean
                );
            }

            return new JSUnaryOperatorExpression(
                op, inner, node.ExpectedType ?? node.InferredType
            );
        }
Esempio n. 2
0
        protected JSExpression Translate_UnaryOp(ILExpression node, JSUnaryOperator op)
        {
            var inner = TranslateNode(node.Arguments[0]);
            var innerType = JSExpression.DeReferenceType(inner.GetExpectedType(TypeSystem));

            // Detect the weird pattern '!(x = y as z)' and transform it into '(x = y as z) != null'
            if (
                (op == JSOperator.LogicalNot) &&
                !TypesAreAssignable(TypeSystem.Boolean, innerType)
            ) {
                return new JSBinaryOperatorExpression(
                    JSOperator.Equal, inner, new JSDefaultValueLiteral(innerType), TypeSystem.Boolean
                );
            }

            // Insert correct casts when unary operators are applied to enums.
            if (IsEnum(innerType) && IsEnum(node.ExpectedType ?? node.InferredType)) {
                return JSCastExpression.New(
                    new JSUnaryOperatorExpression(
                        op,
                        JSCastExpression.New(inner, TypeSystem.Int32, TypeSystem),
                        TypeSystem.Int32
                    ),
                    node.ExpectedType ?? node.InferredType, TypeSystem
                );
            }

            return new JSUnaryOperatorExpression(
                op, inner, node.ExpectedType ?? node.InferredType
            );
        }