From a813625319f423f1afa9d2b5966e23470ade01ec Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 Apr 2016 13:14:48 +0100 Subject: Coerce initial values of local variable declarations --- .../couscous/ast/LocalVariableDeclarationNode.java | 3 ++- .../java/org/zwobble/couscous/ast/TypeCoercionNode.java | 8 ++++++++ .../couscous/frontends/java/JavaExpressionReader.java | 16 +++------------- .../frontends/java/JavaMethodReferenceReader.java | 5 ++--- .../couscous/frontends/java/JavaStatementReader.java | 4 ++-- 5 files changed, 17 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java index 286e8bc..4078adb 100644 --- a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java +++ b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java @@ -5,6 +5,7 @@ import org.zwobble.couscous.types.Type; import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.ast.visitors.StatementNodeMapper; +import static org.zwobble.couscous.ast.TypeCoercionNode.coerce; import static org.zwobble.couscous.ast.VariableDeclaration.var; public class LocalVariableDeclarationNode implements VariableNode, StatementNode { @@ -19,7 +20,7 @@ public class LocalVariableDeclarationNode implements VariableNode, StatementNode public static LocalVariableDeclarationNode localVariableDeclaration( VariableDeclaration declaration, ExpressionNode initialValue) { - return new LocalVariableDeclarationNode(declaration, initialValue); + return new LocalVariableDeclarationNode(declaration, coerce(initialValue, declaration.getType())); } private final VariableDeclaration declaration; diff --git a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java index 266b927..721027f 100644 --- a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java +++ b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java @@ -5,6 +5,14 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; public class TypeCoercionNode implements ExpressionNode { + public static ExpressionNode coerce(ExpressionNode expression, Type type) { + if (type.equals(expression.getType())) { + return expression; + } else { + return new TypeCoercionNode(expression, type); + } + } + public static TypeCoercionNode typeCoercion(ExpressionNode expression, Type type) { return new TypeCoercionNode(expression, type); } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index e9d6195..4c27a75 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -23,7 +23,7 @@ import static org.zwobble.couscous.ast.OperationNode.operation; import static org.zwobble.couscous.ast.Operations.not; import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; -import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion; +import static org.zwobble.couscous.ast.TypeCoercionNode.coerce; import static org.zwobble.couscous.frontends.java.JavaOperators.readOperator; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.types.Types.erasure; @@ -41,15 +41,7 @@ public class JavaExpressionReader { ExpressionNode readExpression(Type targetType, Expression expression) { ExpressionNode couscousExpression = readExpressionWithoutBoxing(expression); - return coerceExpression(targetType, couscousExpression); - } - - static ExpressionNode coerceExpression(Type targetType, ExpressionNode couscousExpression) { - if (targetType.equals(couscousExpression.getType())) { - return couscousExpression; - } else { - return typeCoercion(couscousExpression, targetType); - } + return coerce(couscousExpression, targetType); } private static Type unboxedType(Type type) { @@ -387,9 +379,7 @@ public class JavaExpressionReader { Operator operator = readOperator(expression.getOperator()); return AssignmentNode.assign( left, - coerceExpression( - left.getType(), - readPrimitiveOperation(operator, list(expression.getLeftHandSide(), expression.getRightHandSide())))); + coerce(readPrimitiveOperation(operator, list(expression.getLeftHandSide(), expression.getRightHandSide())), left.getType())); } } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java index d2d5666..db88310 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java @@ -16,6 +16,7 @@ import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall; import static org.zwobble.couscous.ast.ReturnNode.returns; +import static org.zwobble.couscous.ast.TypeCoercionNode.coerce; import static org.zwobble.couscous.ast.sugar.Lambda.lambda; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.util.ExtraLists.eagerMap; @@ -53,9 +54,7 @@ public class JavaMethodReferenceReader { return lambda( formalArguments, - list(returns(JavaExpressionReader.coerceExpression( - typeOf(functionalInterfaceMethod.getReturnType()), - generateValue.apply(arguments))))); + list(returns(coerce(generateValue.apply(arguments), typeOf(functionalInterfaceMethod.getReturnType()))))); } private List formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) { diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java index c668774..4185f88 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -15,10 +15,10 @@ import static com.google.common.collect.Iterables.tryFind; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.IfStatementNode.ifStatement; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; +import static org.zwobble.couscous.ast.TypeCoercionNode.coerce; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.ast.WhileNode.whileLoop; import static org.zwobble.couscous.ast.sugar.SwitchCaseNode.switchCase; -import static org.zwobble.couscous.frontends.java.JavaExpressionReader.coerceExpression; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.util.ExtraLists.*; import static org.zwobble.couscous.util.Fold.foldRight; @@ -127,7 +127,7 @@ class JavaStatementReader { methodCall( reference(switchValueAssignment), "equals", - list(coerceExpression(Types.OBJECT, value)), + list(coerce(value, Types.OBJECT)), Types.BOOLEAN), currentCase.getStatements(), handle))) .orElse(handle))); -- cgit v1.2.3