From 1ef4865a040ae94b69a5c4dabcb5dca837cae67c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 30 Oct 2016 23:55:19 +0000 Subject: Defer generation of classes for lambdas --- .../zwobble/couscous/ast/sugar/AnonymousClass.java | 86 ++++++++++++++++++---- 1 file changed, 72 insertions(+), 14 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java') diff --git a/src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java b/src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java index 08bb9a3..0722705 100644 --- a/src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java +++ b/src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java @@ -1,38 +1,63 @@ package org.zwobble.couscous.ast.sugar; -import org.zwobble.couscous.ast.FieldDeclarationNode; -import org.zwobble.couscous.ast.MethodNode; +import org.zwobble.couscous.ast.*; +import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.frontends.java.AnonymousType; import org.zwobble.couscous.types.Type; import java.util.List; import java.util.Optional; -import java.util.Set; -public class AnonymousClass { - private final Optional type; - private final Set superTypes; +import static com.google.common.collect.Iterables.concat; + +public class AnonymousClass implements ExpressionNode { + private final Optional anonymousType; + private final Type superType; private final List fields; private final List methods; public AnonymousClass( - Optional type, - Set superTypes, + Optional anonymousType, + Type superType, List fields, List methods) { - this.type = type; - this.superTypes = superTypes; + this.anonymousType = anonymousType; + this.superType = superType; this.fields = fields; this.methods = methods; } - public Optional getType() { - return type; + @Override + public Type getType() { + return superType; + } + + public Optional getAnonymousType() { + return anonymousType; + } + + @Override + public int nodeType() { + return NodeTypes.ANONYMOUS_CLASS; + } + + @Override + public Iterable childNodes() { + return concat( + fields, + methods + ); } - public Set getSuperTypes() { - return superTypes; + @Override + public ExpressionNode transformSubtree(NodeTransformer transformer) { + return new AnonymousClass( + anonymousType, + transformer.transform(superType), + transformer.transformFields(fields), + transformer.transformMethods(methods) + ); } public List getFields() { @@ -42,4 +67,37 @@ public class AnonymousClass { public List getMethods() { return methods; } + + @Override + public String toString() { + return "AnonymousClass(" + + "anonymousType=" + anonymousType + + ", superType=" + superType + + ", fields=" + fields + + ", methods=" + methods + + ')'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + AnonymousClass that = (AnonymousClass) o; + + if (!anonymousType.equals(that.anonymousType)) return false; + if (!superType.equals(that.superType)) return false; + if (!fields.equals(that.fields)) return false; + return methods.equals(that.methods); + + } + + @Override + public int hashCode() { + int result = anonymousType.hashCode(); + result = 31 * result + superType.hashCode(); + result = 31 * result + fields.hashCode(); + result = 31 * result + methods.hashCode(); + return result; + } } -- cgit v1.2.3