diff options
Diffstat (limited to 'src/main/java/org')
5 files changed, 39 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java index d2721ae..d2f89ba 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java @@ -4,9 +4,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import com.google.common.collect.ImmutableList; import org.zwobble.couscous.ast.Operator; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.backends.python.ast.PythonBinaryOperation; +import org.zwobble.couscous.backends.python.ast.PythonCallNode; import org.zwobble.couscous.backends.python.ast.PythonExpressionNode; import org.zwobble.couscous.backends.python.ast.PythonNotNode; import org.zwobble.couscous.values.*; @@ -47,6 +49,9 @@ public class PrimitiveMethods { static { ImmutableMap.Builder<String, PrimitiveMethodGenerator> methods = ImmutableMap.builder(); + + methods.put("toString", (receiver, arguments) -> + pythonCall(pythonVariableReference("str"), ImmutableList.of(receiver))); addOperation(methods, Operator.ADD.getMethodName(), "+"); addOperation(methods, Operator.SUBTRACT.getMethodName(), "-"); @@ -91,6 +96,7 @@ public class PrimitiveMethods { .put(StringValue.REF, STRING_METHODS) .put(BooleanValue.REF, BOOLEAN_METHODS) .put(IntegerValue.REF, INT_METHODS) + .put(ObjectValues.BOXED_INT, INT_METHODS) .build(); private static final Map<String, PrimitiveStaticMethodGenerator> INTERNAL_METHODS = diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java index 95f8b9e..104854c 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -1,5 +1,6 @@ package org.zwobble.couscous.backends.python; +import com.google.common.base.Joiner; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; @@ -20,6 +21,7 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Iterators.singletonIterator; import static java.util.Arrays.asList; import static org.zwobble.couscous.backends.python.ast.PythonAssignmentNode.pythonAssignment; @@ -50,7 +52,7 @@ public class PythonCodeGenerator { PythonFunctionDefinitionNode constructor = generateConstructor(classNode.getConstructor()); - Iterable<PythonFunctionDefinitionNode> pythonMethods = Iterables.transform( + Iterable<PythonFunctionDefinitionNode> pythonMethods = transform( classNode.getMethods(), PythonCodeGenerator::generateFunction); @@ -128,14 +130,14 @@ public class PythonCodeGenerator { } private static PythonFunctionDefinitionNode generateConstructor(ConstructorNode constructor) { - Iterable<String> explicitArgumentNames = Iterables.transform(constructor.getArguments(), argument -> argument.getName()); + Iterable<String> explicitArgumentNames = transform(constructor.getArguments(), argument -> argument.getName()); Iterable<String> argumentNames = Iterables.concat(asList("self"), explicitArgumentNames); List<PythonStatementNode> pythonBody = constructor.getBody().stream().map(PythonCodeGenerator::generateStatement).collect(Collectors.toList()); return pythonFunctionDefinition("__init__", ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody)); } private static PythonFunctionDefinitionNode generateFunction(MethodNode method) { - Iterable<String> explicitArgumentNames = Iterables.transform(method.getArguments(), argument -> argument.getName()); + Iterable<String> explicitArgumentNames = transform(method.getArguments(), argument -> argument.getName()); Iterable<String> argumentNames = Iterables.concat( method.isStatic() ? Collections.<String>emptyList() : asList("self"), explicitArgumentNames); @@ -195,7 +197,7 @@ public class PythonCodeGenerator { } private static List<PythonExpressionNode> generateExpressions(Iterable<? extends ExpressionNode> expressions) { - return ImmutableList.copyOf(Iterables.transform(expressions, PythonCodeGenerator::generateExpression)); + return ImmutableList.copyOf(transform(expressions, PythonCodeGenerator::generateExpression)); } private static final ExpressionGenerator EXPRESSION_GENERATOR = new ExpressionGenerator(); @@ -294,7 +296,9 @@ public class PythonCodeGenerator { } public static String toName(MethodSignature signature) { - return signature.getName() + "_" + signature.getArguments().size(); + return Joiner.on("__").join(Iterables.concat( + ImmutableList.of(signature.getName()), + transform(signature.getArguments(), argument -> argument.getQualifiedName().replace('.', '_')))); } private static boolean isPrimitive(ExpressionNode value) { diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index 1271d72..c04cb3e 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -113,7 +113,7 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> { // TODO: boxing booleans InterpreterValue value = eval(typeCoercion.getExpression()); if (isIntegerBox(typeCoercion)) { - return ((IntegerInterpreterValue)value).box(); + return BoxedIntegerInterpreterValue.of(((IntegerInterpreterValue)value)); } else if (isIntegerUnbox(typeCoercion)) { return value.getField("value"); } else { diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java index 3ffa244..9bf6a51 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java @@ -8,6 +8,16 @@ import org.zwobble.couscous.values.StringValue; import static java.util.Arrays.asList; public class BoxedIntegerInterpreterValue { + public static ObjectInterpreterValue of(int value) { + return of(new IntegerInterpreterValue(value)); + } + + public static ObjectInterpreterValue of(IntegerInterpreterValue value) { + ObjectInterpreterValue obj = new ObjectInterpreterValue(TYPE); + obj.setField("value", value); + return obj; + } + public static final ConcreteType TYPE = ConcreteType.classBuilder("java.lang.Integer") .field("value", IntegerValue.REF) @@ -17,6 +27,12 @@ public class BoxedIntegerInterpreterValue { return new IntegerInterpreterValue(Integer.parseInt(value.getValue())); }) + .staticMethod("valueOf", asList(IntegerValue.REF), + (environment, arguments) -> { + IntegerInterpreterValue value = (IntegerInterpreterValue)arguments.get(0); + return of(value); + }) + .method(Operator.EQUALS.getMethodName(), asList(ObjectValues.OBJECT), (environment, arguments) -> { InterpreterValue right = arguments.getPositionalArguments().get(0); @@ -28,5 +44,12 @@ public class BoxedIntegerInterpreterValue { return new BooleanInterpreterValue(false); } }) + + .method("toString", asList(), + (environment, arguments) -> { + IntegerInterpreterValue value = (IntegerInterpreterValue)arguments.getReceiver().getField("value"); + return new StringInterpreterValue(Integer.toString(value.getValue())); + }) + .build(); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java index be58d56..3e80a21 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java @@ -106,12 +106,6 @@ public final class IntegerInterpreterValue implements InterpreterValue { return this.value; } - public InterpreterValue box() { - ObjectInterpreterValue box = new ObjectInterpreterValue(BoxedIntegerInterpreterValue.TYPE); - box.setField("value", this); - return box; - } - @java.lang.Override public boolean equals(final java.lang.Object o) { if (o == this) return true; |
