diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-10-30 23:55:19 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-10-30 23:56:10 +0000 |
| commit | 1ef4865a040ae94b69a5c4dabcb5dca837cae67c (patch) | |
| tree | 581f7a0fdc72e616f748333fc5d061c5b1e01fd8 /src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java | |
| parent | 62ea20e20ed1c0d6b2564f8fff862d380da15fce (diff) | |
Defer generation of classes for lambdas
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/sugar/AnonymousClass.java | 86 |
1 files changed, 72 insertions, 14 deletions
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<AnonymousType> type; - private final Set<Type> superTypes; +import static com.google.common.collect.Iterables.concat; + +public class AnonymousClass implements ExpressionNode { + private final Optional<AnonymousType> anonymousType; + private final Type superType; private final List<FieldDeclarationNode> fields; private final List<MethodNode> methods; public AnonymousClass( - Optional<AnonymousType> type, - Set<Type> superTypes, + Optional<AnonymousType> anonymousType, + Type superType, List<FieldDeclarationNode> fields, List<MethodNode> methods) { - this.type = type; - this.superTypes = superTypes; + this.anonymousType = anonymousType; + this.superType = superType; this.fields = fields; this.methods = methods; } - public Optional<AnonymousType> getType() { - return type; + @Override + public Type getType() { + return superType; + } + + public Optional<AnonymousType> getAnonymousType() { + return anonymousType; + } + + @Override + public int nodeType() { + return NodeTypes.ANONYMOUS_CLASS; + } + + @Override + public Iterable<? extends Node> childNodes() { + return concat( + fields, + methods + ); } - public Set<Type> getSuperTypes() { - return superTypes; + @Override + public ExpressionNode transformSubtree(NodeTransformer transformer) { + return new AnonymousClass( + anonymousType, + transformer.transform(superType), + transformer.transformFields(fields), + transformer.transformMethods(methods) + ); } public List<FieldDeclarationNode> getFields() { @@ -42,4 +67,37 @@ public class AnonymousClass { public List<MethodNode> 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; + } } |
