aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java14
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java23
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java6
-rw-r--r--src/main/resources/python/runtime/java/lang/Integer.py8
-rw-r--r--src/test/resources/java/static-method-overloads/com/example/StaticMethodOverloads.java6
7 files changed, 50 insertions, 15 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;
diff --git a/src/main/resources/python/runtime/java/lang/Integer.py b/src/main/resources/python/runtime/java/lang/Integer.py
index 0cf55af..b9e9097 100644
--- a/src/main/resources/python/runtime/java/lang/Integer.py
+++ b/src/main/resources/python/runtime/java/lang/Integer.py
@@ -1,12 +1,16 @@
class Integer(object):
@staticmethod
- def parseInt_1(value):
+ def parseInt__java_lang_String(value):
return int(value)
+
+ @staticmethod
+ def valueOf__int(value):
+ return value
def __init__(self, value):
self._value = value
- def equals_1(self, other):
+ def equals__java_lang_Object(self, other):
# TODO: test this properly
return isinstance(other, Integer) and other._value == self._value
diff --git a/src/test/resources/java/static-method-overloads/com/example/StaticMethodOverloads.java b/src/test/resources/java/static-method-overloads/com/example/StaticMethodOverloads.java
index 657b119..10c6a0e 100644
--- a/src/test/resources/java/static-method-overloads/com/example/StaticMethodOverloads.java
+++ b/src/test/resources/java/static-method-overloads/com/example/StaticMethodOverloads.java
@@ -6,6 +6,10 @@ public class StaticMethodOverloads {
}
public static int value(int x) {
- return x * 2;
+ return x * value(Integer.valueOf(x).toString());
+ }
+
+ public static int value(String value) {
+ return value.length();
}
}