From 284d439f4db00be49de12862b2610a40d84cfc81 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 14 Jul 2016 16:35:31 +0100 Subject: Remove NodeMapper in favour of a DynamicNodeMapper --- .../couscous/frontends/java/FreeVariables.java | 68 +++++++++++++--------- 1 file changed, 39 insertions(+), 29 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/frontends') diff --git a/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java b/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java index 9fcec11..623179d 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java @@ -1,12 +1,14 @@ package org.zwobble.couscous.frontends.java; import com.google.common.collect.ImmutableSet; +import net.bytebuddy.description.type.TypeDescription; import org.zwobble.couscous.ast.*; -import org.zwobble.couscous.ast.visitors.NodeMapperWithDefault; +import org.zwobble.couscous.ast.visitors.DynamicNodeMapper; import org.zwobble.couscous.types.*; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -18,37 +20,45 @@ import static org.zwobble.couscous.util.ExtraLists.list; import static org.zwobble.couscous.util.ExtraStreams.toStream; public class FreeVariables { + private static final Function> findFreeTypeParameters = + DynamicNodeMapper.>build( + FindReferencedTypes.class, + new TypeDescription.ForLoadedType(Stream.class), + "visit" + ).instantiate(new FindReferencedTypes()); + + public static class FindReferencedTypes { + public Stream visit(Node node) { + return Stream.empty(); + } + + public Stream visit(FieldDeclarationNode declaration) { + return Stream.of(declaration.getType()); + } + + public Stream visit(LocalVariableDeclarationNode localVariableDeclaration) { + return Stream.of(localVariableDeclaration.getType()); + } + + public Stream visit(MethodNode methodNode) { + return Stream.concat( + methodNode.getArguments().stream().map(argument -> argument.getType()), + Stream.of(methodNode.getReturnType())); + } + + public Stream visit(ConstructorCallNode call) { + return Stream.of(call.getType()); + } + + public Stream visit(MethodCallNode methodCall) { + return methodCall.getTypeParameters().stream(); + } + } + public static Set findFreeTypeParameters(Node root) { // TODO: this assumes that *all* type parameters are free, which is often but not always true in inner types Iterable types = iterable(() -> descendantNodesAndSelf(root) - .flatMap(node -> node.accept(new NodeMapperWithDefault>(Stream.empty()) { - @Override - public Stream visit(FieldDeclarationNode declaration) { - return Stream.of(declaration.getType()); - } - - @Override - public Stream visit(LocalVariableDeclarationNode localVariableDeclaration) { - return Stream.of(localVariableDeclaration.getType()); - } - - @Override - public Stream visit(MethodNode methodNode) { - return Stream.concat( - methodNode.getArguments().stream().map(argument -> argument.getType()), - Stream.of(methodNode.getReturnType())); - } - - @Override - public Stream visit(ConstructorCallNode call) { - return Stream.of(call.getType()); - } - - @Override - public Stream visit(MethodCallNode methodCall) { - return methodCall.getTypeParameters().stream(); - } - }))); + .flatMap(findFreeTypeParameters)); return ImmutableSet.copyOf(lazyFlatMap(types, type -> type.accept(new Type.Visitor>() { @Override -- cgit v1.2.3