diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-01 11:30:58 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-01 11:30:58 +0000 |
| commit | 6a369dbd094d825812454eb39bfaaf84c1ce2148 (patch) | |
| tree | 22ea5b1f3503d60659a0e670452da578c6ca144b /src/main/java | |
| parent | 95e3c79f5b39b96064034ac8af0c6b73f02528ae (diff) | |
Add capture fields to anonymous class definition
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 12 |
1 files changed, 10 insertions, 2 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 ce705ca..70dc160 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -1,6 +1,7 @@ package org.zwobble.couscous.frontends.java; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import org.eclipse.jdt.core.dom.*; import org.zwobble.couscous.ast.*; @@ -14,11 +15,13 @@ import java.util.Map; import java.util.Optional; import java.util.function.Function; +import static com.google.common.collect.Iterables.transform; import static java.util.Arrays.asList; import static org.zwobble.couscous.ast.AnnotationNode.annotation; import static org.zwobble.couscous.ast.AssignmentNode.assignStatement; import static org.zwobble.couscous.ast.ConstructorNode.constructor; import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; +import static org.zwobble.couscous.ast.FieldDeclarationNode.field; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.ReturnNode.returns; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; @@ -135,12 +138,17 @@ public class JavaReader { TypeDeclarationBody bodyDeclarations = readTypeDeclarationBody(declaration.bodyDeclarations()); List<VariableDeclaration> freeVariables = findFreeVariables(bodyDeclarations.getNodes()); + Iterable<FieldDeclarationNode> captureFields = transform( + freeVariables, + freeVariable -> field(freeVariable.getName(), freeVariable.getType())); + List<FieldDeclarationNode> fields = ImmutableList.copyOf(Iterables.concat(bodyDeclarations.getFields(), captureFields)); + List<MethodNode> methods = eagerMap(bodyDeclarations.getMethods(), method -> method.mapBody(body -> replaceCaptureReferences(className, body, freeVariables))); ClassNode classNode = ClassNode.declareClass( className, - bodyDeclarations.getFields(), + fields, buildConstructor(className, freeVariables), methods); classes.add(classNode); @@ -213,7 +221,7 @@ public class JavaReader { List<VariableDeclarationFragment> fragments = field.fragments(); TypeName type = typeOf(field.getType()); return eagerMap(fragments, fragment -> - FieldDeclarationNode.field(fragment.getName().getIdentifier(), type)); + field(fragment.getName().getIdentifier(), type)); } private List<CallableNode> readMethods(List<MethodDeclaration> methods) { |
