aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-11-22 11:27:23 +0000
committerMichael Williamson <mike@zwobble.org>2015-11-22 11:27:23 +0000
commit485753856e0e97d64c5e36dbb5b81afa6efbe06a (patch)
tree679b14025d6040ccfbc047fc1737cb7247c01c05 /src
parent7b13fe3b90542a276355e8b8de1fe49afe68c7b3 (diff)
Read lambdas with arguments
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java45
-rw-r--r--src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java13
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java9
-rw-r--r--src/test/resources/java/lambda/com/example/Lambda.java10
4 files changed, 61 insertions, 16 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
index ba80bf4..cca29dc 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -2,14 +2,11 @@ package org.zwobble.couscous.frontends.java;
import com.google.common.collect.ImmutableList;
import org.eclipse.jdt.core.dom.*;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ClassNodeBuilder;
-import org.zwobble.couscous.ast.StatementNode;
-import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.ast.*;
+import org.zwobble.couscous.ast.VariableDeclaration;
import java.io.IOException;
import java.nio.file.Path;
-import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
@@ -114,7 +111,7 @@ public class JavaReader {
private interface FunctionDeclaration {
List<IAnnotationBinding> getAnnotations();
- List<SingleVariableDeclaration> parameters();
+ Stream<FormalArgumentNode> getFormalArguments();
// TODO: add tests around void methods
Stream<StatementNode> getBody();
}
@@ -131,10 +128,11 @@ public class JavaReader {
return asList(method.resolveBinding().getAnnotations());
}
- @SuppressWarnings("unchecked")
@Override
- public List<SingleVariableDeclaration> parameters() {
- return method.parameters();
+ public Stream<FormalArgumentNode> getFormalArguments() {
+ @SuppressWarnings("unchecked")
+ List<SingleVariableDeclaration> parameters = method.parameters();
+ return parameters.stream().map(parameter -> readSingleVariableDeclaration(parameter));
}
@Override
@@ -164,8 +162,21 @@ public class JavaReader {
}
@Override
- public List<SingleVariableDeclaration> parameters() {
- return Collections.emptyList();
+ public Stream<FormalArgumentNode> getFormalArguments() {
+ return ((List<?>)expression.parameters()).stream()
+ .map(this::readParameter);
+ }
+
+ private FormalArgumentNode readParameter(Object parameter) {
+ if (parameter instanceof SingleVariableDeclaration) {
+ return readSingleVariableDeclaration((SingleVariableDeclaration) parameter);
+ } else {
+ VariableDeclarationFragment fragment = (VariableDeclarationFragment)parameter;
+ return FormalArgumentNode.formalArg(VariableDeclaration.var(
+ fragment.resolveBinding().getKey(),
+ fragment.getName().getIdentifier(),
+ typeOf(fragment.resolveBinding().getType())));
+ }
}
@SuppressWarnings("unchecked")
@@ -191,10 +202,7 @@ public class JavaReader {
for (IAnnotationBinding annotation : method.getAnnotations()) {
builder.annotation(typeOf(annotation.getAnnotationType()));
}
- for (Object parameterObject : method.parameters()) {
- SingleVariableDeclaration parameter = (SingleVariableDeclaration)parameterObject;
- builder.argument(parameter.resolveBinding().getKey(), parameter.getName().getIdentifier(), typeOf(parameter.resolveBinding()));
- }
+ method.getFormalArguments().forEach(builder::argument);
method.getBody().forEach(builder::statement);
return builder;
}
@@ -210,6 +218,13 @@ public class JavaReader {
return ast.getPackage().getName().getFullyQualifiedName() + "." + type.getName().getFullyQualifiedName();
}
+ private FormalArgumentNode readSingleVariableDeclaration(SingleVariableDeclaration parameter) {
+ return FormalArgumentNode.formalArg(VariableDeclaration.var(
+ parameter.resolveBinding().getKey(),
+ parameter.getName().getIdentifier(),
+ typeOf(parameter.resolveBinding())));
+ }
+
private JavaExpressionReader expressionReader() {
return new JavaExpressionReader(this);
}
diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
index 6b7b5d3..cc0e5af 100644
--- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
@@ -82,7 +82,7 @@ public class JavaToPythonTests {
}
@Test
- public void anonymousClasses() throws Exception {
+ public void anonymousClassesWithoutCapture() throws Exception {
assertEquals(
value(42),
execTestProgram(
@@ -91,6 +91,17 @@ public class JavaToPythonTests {
"value",
asList()));
}
+
+ @Test
+ public void lambdasWithoutCapture() throws Exception {
+ assertEquals(
+ value(42),
+ execTestProgram(
+ "lambda",
+ TypeName.of("com.example.Lambda"),
+ "value",
+ asList()));
+ }
private PrimitiveValue execTestProgram(
String directoryName,
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
index 9dfe8b8..1be1abb 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
@@ -175,6 +175,15 @@ public class JavaReaderTests {
readClasses(generateMethodSource("void",
"java.util.function.Supplier<Integer> supplier = () -> { return 42; };")));
}
+
+ @Test
+ public void lambdaWithInferredArgumentsAndBlockBodyIsReadAsAnonymousClassCreation() {
+ assertEquals(
+ readClasses(generateMethodSource("void",
+ "java.util.function.Function<Integer, Integer> function = x -> x;")),
+ readClasses(generateMethodSource("void",
+ "java.util.function.Function<Integer, Integer> function = (Integer x) -> x;")));
+ }
@Test
public void argumentIsBoxedIfNecessary() {
diff --git a/src/test/resources/java/lambda/com/example/Lambda.java b/src/test/resources/java/lambda/com/example/Lambda.java
new file mode 100644
index 0000000..be8404e
--- /dev/null
+++ b/src/test/resources/java/lambda/com/example/Lambda.java
@@ -0,0 +1,10 @@
+package com.example;
+
+import java.util.function.Function;
+
+public class Lambda {
+ public static int value() {
+ Function<Integer, Integer> function = value -> value * 2;
+ return function.apply(21);
+ }
+}