aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java10
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java16
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java18
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java2
4 files changed, 38 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
index 32d4272..67f66ea 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
@@ -11,8 +11,8 @@ import org.zwobble.couscous.values.TypeReference;
import com.google.common.collect.ImmutableMap;
import static java.util.Arrays.asList;
-import static org.zwobble.couscous.backends.python.ast.PythonAttributeAccessNode.pythonAttributeAccess;
import static org.zwobble.couscous.backends.python.ast.PythonCallNode.pythonCall;
+import static org.zwobble.couscous.backends.python.ast.PythonGetSliceNode.pythonGetSlice;
import static org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode.pythonVariableReference;
public class PrimitiveMethods {
@@ -25,13 +25,7 @@ public class PrimitiveMethods {
asList(receiver)))
.put("substring", (receiver, arguments) ->
- pythonCall(
- pythonAttributeAccess(
- receiver,
- "__getitem__"),
- asList(pythonCall(
- pythonVariableReference("slice"),
- arguments))))
+ pythonGetSlice(receiver, arguments))
.build();
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
index 1e10315..abab1bf 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
@@ -9,6 +9,7 @@ import org.zwobble.couscous.backends.python.ast.PythonClassNode;
import org.zwobble.couscous.backends.python.ast.PythonConditionalExpressionNode;
import org.zwobble.couscous.backends.python.ast.PythonExpressionNode;
import org.zwobble.couscous.backends.python.ast.PythonFunctionDefinitionNode;
+import org.zwobble.couscous.backends.python.ast.PythonGetSliceNode;
import org.zwobble.couscous.backends.python.ast.PythonIntegerLiteralNode;
import org.zwobble.couscous.backends.python.ast.PythonModuleNode;
import org.zwobble.couscous.backends.python.ast.PythonNode;
@@ -96,6 +97,21 @@ public class PythonSerializer implements PythonNodeVisitor {
}
@Override
+ public void visit(PythonGetSliceNode getSlice) {
+ writeParenthesised(getSlice.getReceiver());
+ writer.writeSymbol("[");
+ // TODO: remove this duplication
+ if (!getSlice.getArguments().isEmpty()) {
+ write(getSlice.getArguments().get(0));
+ for (val argumentName : skip(getSlice.getArguments(), 1)) {
+ writer.writeSymbol(":");
+ write(argumentName);
+ }
+ }
+ writer.writeSymbol("]");
+ }
+
+ @Override
public void visit(PythonReturnNode pythonReturn) {
writer.writeStatement(() -> {
writer.writeKeyword("return");
diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java
new file mode 100644
index 0000000..27c191e
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java
@@ -0,0 +1,18 @@
+package org.zwobble.couscous.backends.python.ast;
+
+import java.util.List;
+
+import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor;
+
+import lombok.Value;
+
+@Value(staticConstructor="pythonGetSlice")
+public class PythonGetSliceNode implements PythonExpressionNode {
+ PythonExpressionNode receiver;
+ List<PythonExpressionNode> arguments;
+
+ @Override
+ public void accept(PythonNodeVisitor visitor) {
+ visitor.visit(this);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java b/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java
index 2e38d3b..29d6108 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java
@@ -7,6 +7,7 @@ import org.zwobble.couscous.backends.python.ast.PythonCallNode;
import org.zwobble.couscous.backends.python.ast.PythonClassNode;
import org.zwobble.couscous.backends.python.ast.PythonConditionalExpressionNode;
import org.zwobble.couscous.backends.python.ast.PythonFunctionDefinitionNode;
+import org.zwobble.couscous.backends.python.ast.PythonGetSliceNode;
import org.zwobble.couscous.backends.python.ast.PythonIntegerLiteralNode;
import org.zwobble.couscous.backends.python.ast.PythonModuleNode;
import org.zwobble.couscous.backends.python.ast.PythonPassNode;
@@ -22,6 +23,7 @@ public interface PythonNodeVisitor {
void visit(PythonConditionalExpressionNode conditional);
void visit(PythonAttributeAccessNode attributeAccess);
void visit(PythonCallNode call);
+ void visit(PythonGetSliceNode getSlice);
void visit(PythonReturnNode pythonReturn);
void visit(PythonPassNode pass);