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 ++++++++++++++++------ 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'src/main') 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); } } -- cgit v1.2.3