diff options
Diffstat (limited to 'src/main/java/org')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/MethodCallNode.java | 4 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/MethodNode.java | 8 | ||||
| -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.java | 4 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java | 11 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Interpreter.java | 1 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java | 2 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java | 17 |
8 files changed, 40 insertions, 19 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()); } |
