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