From 6a369dbd094d825812454eb39bfaaf84c1ce2148 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 1 Jan 2016 11:30:58 +0000 Subject: Add capture fields to anonymous class definition --- .../java/org/zwobble/couscous/frontends/java/JavaReader.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/main/java/org') 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 freeVariables = findFreeVariables(bodyDeclarations.getNodes()); + Iterable captureFields = transform( + freeVariables, + freeVariable -> field(freeVariable.getName(), freeVariable.getType())); + List fields = ImmutableList.copyOf(Iterables.concat(bodyDeclarations.getFields(), captureFields)); + List 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 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 readMethods(List methods) { -- cgit v1.2.3