diff options
| -rw-r--r-- | src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java | 37 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerEvalTests.java | 9 |
2 files changed, 28 insertions, 18 deletions
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 690375d..023d257 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -156,20 +156,39 @@ public class PythonCodeGenerator { @Override public PythonExpressionNode visit(MethodCallNode methodCall) { - val arguments = methodCall.getArguments().stream() - .map(PythonCodeGenerator::generateExpression) - .collect(Collectors.toList()); - return pythonCall( - pythonAttributeAccess( - generateExpression(methodCall.getReceiver()), - methodCall.getMethodName()), - arguments); + if (isPrimitive(methodCall.getReceiver())) { + val isStringLength = methodCall.getReceiver().getType().equals(StringValue.REF) && + methodCall.getMethodName() == "length"; + if (isStringLength) { + return pythonCall( + pythonVariableReference("len"), + asList(generateExpression(methodCall.getReceiver()))); + } else { + throw new UnsupportedOperationException(); + } + } else { + val arguments = methodCall.getArguments().stream() + .map(PythonCodeGenerator::generateExpression) + .collect(Collectors.toList()); + return pythonCall( + pythonAttributeAccess( + generateExpression(methodCall.getReceiver()), + methodCall.getMethodName()), + arguments); + } } @Override public PythonExpressionNode visit(StaticMethodCallNode staticMethodCall) { throw new UnsupportedOperationException(); } - + } + + private static boolean isPrimitive(ExpressionNode value) { + val type = value.getType(); + return type.equals(IntegerValue.REF) || + type.equals(StringValue.REF) || + type.equals(BooleanValue.REF) || + type.equals(UnitValue.REF); } } diff --git a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerEvalTests.java b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerEvalTests.java index ff51f60..6f19eb3 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerEvalTests.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerEvalTests.java @@ -1,7 +1,5 @@ package org.zwobble.couscous.tests.backends.python; -import org.junit.Ignore; -import org.junit.Test; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.MethodNode; @@ -15,13 +13,6 @@ import lombok.val; public class PythonCompilerEvalTests extends BackendEvalTests { @Override - @Test - @Ignore("Work in progress") - public void canCallMethodWithNoArgumentsOnBuiltin() { - - } - - @Override protected PrimitiveValue evalExpression(ExpressionNode expression) { val runner = new PythonMethodRunner(); return runner.runMethod( |
