From bd717883dd37d4e3578c1e46c3dba484b6ad4f79 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 5 Oct 2015 18:15:10 +0100 Subject: Support String::length in Python backend --- .../backends/python/PythonCodeGenerator.java | 37 ++++++++++++++++------ .../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; @@ -14,13 +12,6 @@ import com.google.common.collect.ImmutableList; 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(); -- cgit v1.2.3