aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodSignature.java (renamed from src/main/java/org/zwobble/couscous/interpreter/MethodSignature.java)12
-rw-r--r--src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java11
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Interpreter.java1
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java17
-rw-r--r--src/main/resources/python/runtime/java/lang/Integer.py4
9 files changed, 42 insertions, 21 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index f65a9ae..ba50f17 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -111,6 +111,10 @@ public class MethodCallNode implements ExpressionNode {
public TypeName getType() {
return type;
}
+
+ public MethodSignature signature() {
+ return new MethodSignature(methodName, eagerMap(arguments, argument -> argument.getType()));
+ }
@Override
public <T> T accept(ExpressionNodeMapper<T> visitor) {
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index 5763b11..86ae649 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -6,6 +6,8 @@ import org.zwobble.couscous.ast.visitors.NodeMapper;
import java.util.List;
import java.util.function.Function;
+import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+
public class MethodNode implements CallableNode {
public static Builder staticMethod(String name) {
return builder(name).isStatic(true);
@@ -116,6 +118,12 @@ public class MethodNode implements CallableNode {
return body;
}
+ public MethodSignature signature() {
+ return new MethodSignature(
+ name,
+ eagerMap(arguments, argument -> argument.getType()));
+ }
+
public MethodNode mapBody(Function<List<StatementNode>, List<StatementNode>> function) {
return new MethodNode(annotations, isStatic, name, arguments, function.apply(body));
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/MethodSignature.java b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
index 708bc9a..fb2dc64 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/MethodSignature.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
@@ -1,6 +1,4 @@
-package org.zwobble.couscous.interpreter;
-
-import org.zwobble.couscous.ast.TypeName;
+package org.zwobble.couscous.ast;
import java.util.List;
import java.util.Objects;
@@ -14,6 +12,14 @@ public class MethodSignature {
this.arguments = arguments;
}
+ public String getName() {
+ return name;
+ }
+
+ public List<TypeName> getArguments() {
+ return arguments;
+ }
+
@Override
public String toString() {
return "MethodSignature(" +
diff --git a/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java
index 7c3b90b..1309c6e 100644
--- a/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java
@@ -81,6 +81,10 @@ public class StaticMethodCallNode implements ExpressionNode {
public TypeName getType() {
return type;
}
+
+ public MethodSignature signature() {
+ return new MethodSignature(methodName, eagerMap(arguments, argument -> argument.getType()));
+ }
@Override
public <T> T accept(ExpressionNodeMapper<T> visitor) {
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 2320a5a..95f8b9e 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -140,7 +140,7 @@ public class PythonCodeGenerator {
method.isStatic() ? Collections.<String>emptyList() : asList("self"),
explicitArgumentNames);
List<PythonStatementNode> pythonBody = generateStatements(method.getBody());
- return pythonFunctionDefinition(method.getName(), ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody));
+ return pythonFunctionDefinition(toName(method.signature()), ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody));
}
private static List<PythonStatementNode> generateStatements(List<StatementNode> statements) {
@@ -233,7 +233,7 @@ public class PythonCodeGenerator {
PrimitiveMethodGenerator primitiveMethodGenerator = PrimitiveMethods.getPrimitiveMethod(methodCall.getReceiver().getType(), methodCall.getMethodName()).get();
return primitiveMethodGenerator.generate(receiver, arguments);
} else {
- return pythonCall(pythonAttributeAccess(receiver, methodCall.getMethodName()), arguments);
+ return pythonCall(pythonAttributeAccess(receiver, toName(methodCall.signature())), arguments);
}
}
@@ -241,7 +241,8 @@ public class PythonCodeGenerator {
public PythonExpressionNode visit(StaticMethodCallNode staticMethodCall) {
TypeName className = staticMethodCall.getClassName();
PythonVariableReferenceNode classReference = pythonVariableReference(className.getSimpleName());
- PythonAttributeAccessNode methodReference = pythonAttributeAccess(classReference, staticMethodCall.getMethodName());
+ PythonAttributeAccessNode methodReference =
+ pythonAttributeAccess(classReference, toName(staticMethodCall.signature()));
List<PythonExpressionNode> arguments = generateExpressions(staticMethodCall.getArguments());
return PrimitiveMethods.getPrimitiveStaticMethod(className, staticMethodCall.getMethodName())
@@ -292,6 +293,10 @@ public class PythonCodeGenerator {
}
}
+ public static String toName(MethodSignature signature) {
+ return signature.getName() + "_" + signature.getArguments().size();
+ }
+
private static boolean isPrimitive(ExpressionNode value) {
return PrimitiveMethods.isPrimitive(value.getType());
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
index b506fdf..da84de0 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.interpreter;
import java.util.List;
import java.util.Optional;
+import org.zwobble.couscous.ast.MethodSignature;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.interpreter.values.ConcreteType;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
diff --git a/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java b/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java
index 1bb934e..734c254 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.interpreter;
+import org.zwobble.couscous.ast.MethodSignature;
+
public final class NoSuchMethod extends InterpreterException {
private static final long serialVersionUID = 1L;
private MethodSignature signature;
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
index 536aeb3..6abb56c 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
@@ -3,16 +3,13 @@ package org.zwobble.couscous.interpreter.values;
import java.util.*;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.FormalArgumentNode;
-import org.zwobble.couscous.ast.MethodNode;
-import org.zwobble.couscous.ast.TypeName;
+
+import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.interpreter.*;
import org.zwobble.couscous.util.Casts;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import static java.util.stream.Collectors.toMap;
-import static org.zwobble.couscous.util.ExtraLists.eagerMap;
public class ConcreteType {
@@ -74,7 +71,7 @@ public class ConcreteType {
Map<MethodSignature, MethodValue> methods = classNode.getMethods()
.stream()
.filter(method -> !method.isStatic())
- .collect(toMap(method -> signature(method), method -> {
+ .collect(toMap(method -> method.signature(), method -> {
List<TypeName> argumentTypes = getArgumentTypes(method.getArguments());
return new MethodValue(argumentTypes, (environment, arguments) -> {
return Executor.callMethod(environment, method, Optional.of(arguments.getReceiver()), arguments.getPositionalArguments());
@@ -83,7 +80,7 @@ public class ConcreteType {
Map<MethodSignature, StaticMethodValue> staticMethods = classNode.getMethods()
.stream()
.filter(method -> method.isStatic())
- .collect(toMap(method -> signature(method), method -> {
+ .collect(toMap(method -> method.signature(), method -> {
List<TypeName> argumentTypes = getArgumentTypes(method.getArguments());
return new StaticMethodValue(argumentTypes, (environment, arguments) -> {
return Executor.callMethod(environment, method, Optional.empty(), arguments);
@@ -92,12 +89,6 @@ public class ConcreteType {
return new ConcreteType(classNode.getName(), classNode.getSuperTypes(), fields, constructor, methods, staticMethods);
}
- private static MethodSignature signature(MethodNode method) {
- return new MethodSignature(
- method.getName(),
- eagerMap(method.getArguments(), argument -> argument.getType()));
- }
-
private static List<TypeName> getArgumentTypes(List<FormalArgumentNode> arguments) {
return arguments.stream().map(arg -> arg.getType()).collect(Collectors.toList());
}
diff --git a/src/main/resources/python/runtime/java/lang/Integer.py b/src/main/resources/python/runtime/java/lang/Integer.py
index 8ea30a4..0cf55af 100644
--- a/src/main/resources/python/runtime/java/lang/Integer.py
+++ b/src/main/resources/python/runtime/java/lang/Integer.py
@@ -1,12 +1,12 @@
class Integer(object):
@staticmethod
- def parseInt(value):
+ def parseInt_1(value):
return int(value)
def __init__(self, value):
self._value = value
- def equals(self, other):
+ def equals_1(self, other):
# TODO: test this properly
return isinstance(other, Integer) and other._value == self._value