diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-11-22 11:27:23 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-11-22 11:27:23 +0000 |
| commit | 485753856e0e97d64c5e36dbb5b81afa6efbe06a (patch) | |
| tree | 679b14025d6040ccfbc047fc1737cb7247c01c05 | |
| parent | 7b13fe3b90542a276355e8b8de1fe49afe68c7b3 (diff) | |
Read lambdas with arguments
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); + } +} |
