diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-05 18:15:10 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-05 18:15:10 +0100 |
| commit | bd717883dd37d4e3578c1e46c3dba484b6ad4f79 (patch) | |
| tree | 9c67f3c6e6a607ffaba5ae830588366a9f3bc0b9 /src | |
| parent | 27ffd2d94482ccdcd10acbb1111ce0a0ddae6c01 (diff) | |
Support String::length in Python backend
Diffstat (limited to 'src')
| -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( |
