diff options
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
7 files changed, 110 insertions, 18 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNode.java b/src/main/java/org/zwobble/couscous/ast/ClassNode.java index 0d37130..ce27694 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNode.java @@ -9,6 +9,7 @@ import org.zwobble.couscous.util.ExtraIterables; import java.util.List; import java.util.Set; +import static org.zwobble.couscous.util.ExtraLists.concat; import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap; import static org.zwobble.couscous.util.ExtraLists.list; @@ -138,6 +139,15 @@ public class ClassNode implements TypeNode { @Override public TypeNode stripInnerTypes() { + return withInnerTypes(list()); + } + + @Override + public TypeNode addInnerTypes(List<TypeNode> types) { + return withInnerTypes(concat(innerTypes, types)); + } + + private TypeNode withInnerTypes(List<TypeNode> types) { return new ClassNode( name, typeParameters, @@ -146,7 +156,7 @@ public class ClassNode implements TypeNode { staticConstructor, constructor, methods, - list() + types ); } diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index 4d39b01..71c226a 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableSet; import org.zwobble.couscous.ast.identifiers.Identifier; import org.zwobble.couscous.types.ScalarType; import org.zwobble.couscous.types.Type; +import org.zwobble.couscous.types.TypeParameter; import org.zwobble.couscous.types.Types; import java.util.List; @@ -46,6 +47,11 @@ public class ClassNodeBuilder { return this; } + public ClassNodeBuilder addTypeParameter(TypeParameter typeParameter) { + this.typeParameters.add(formalTypeParameter(typeParameter)); + return this; + } + public ClassNodeBuilder addSuperType(String type) { this.superTypes.add(ScalarType.topLevel(type)); return this; @@ -55,7 +61,7 @@ public class ClassNodeBuilder { return field(FieldDeclarationNode.staticField(name, type)); } - public ClassNodeBuilder field(String name, ScalarType type) { + public ClassNodeBuilder field(String name, Type type) { return field(FieldDeclarationNode.field(name, type)); } diff --git a/src/main/java/org/zwobble/couscous/ast/EnumNode.java b/src/main/java/org/zwobble/couscous/ast/EnumNode.java index 4a41a03..1b5941f 100644 --- a/src/main/java/org/zwobble/couscous/ast/EnumNode.java +++ b/src/main/java/org/zwobble/couscous/ast/EnumNode.java @@ -77,6 +77,11 @@ public class EnumNode implements TypeNode { } @Override + public TypeNode addInnerTypes(List<TypeNode> types) { + throw new UnsupportedOperationException(); + } + + @Override public String toString() { return "EnumNode(" + "name=" + name + diff --git a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java index 6a56a6b..1392aee 100644 --- a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java +++ b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java @@ -8,6 +8,7 @@ import org.zwobble.couscous.types.Type; import java.util.List; import java.util.Set; +import static org.zwobble.couscous.util.ExtraLists.concat; import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap; import static org.zwobble.couscous.util.ExtraLists.list; @@ -116,6 +117,15 @@ public class InterfaceNode implements TypeNode { @Override public TypeNode stripInnerTypes() { + return withInnerTypes(list()); + } + + @Override + public TypeNode addInnerTypes(List<TypeNode> types) { + return withInnerTypes(concat(innerTypes, types)); + } + + private TypeNode withInnerTypes(List<TypeNode> types) { return new InterfaceNode( name, typeParameters, @@ -123,7 +133,7 @@ public class InterfaceNode implements TypeNode { fields, staticConstructor, methods, - list() + types ); } diff --git a/src/main/java/org/zwobble/couscous/ast/NodeTypes.java b/src/main/java/org/zwobble/couscous/ast/NodeTypes.java index ac37540..c3710bb 100644 --- a/src/main/java/org/zwobble/couscous/ast/NodeTypes.java +++ b/src/main/java/org/zwobble/couscous/ast/NodeTypes.java @@ -1,5 +1,6 @@ package org.zwobble.couscous.ast; +import org.zwobble.couscous.ast.sugar.AnonymousClass; import org.zwobble.couscous.ast.sugar.SwitchCaseNode; import org.zwobble.couscous.ast.sugar.SwitchNode; @@ -51,6 +52,7 @@ public class NodeTypes { public static final int FOR = register(ForNode.class); public static final int FOR_EACH = register(ForEachNode.class); public static final int STATEMENT_BLOCK = register(StatementBlockNode.class); + public static final int ANONYMOUS_CLASS = register(AnonymousClass.class); private NodeTypes() { } diff --git a/src/main/java/org/zwobble/couscous/ast/TypeNode.java b/src/main/java/org/zwobble/couscous/ast/TypeNode.java index 01b033b..07d3f1a 100644 --- a/src/main/java/org/zwobble/couscous/ast/TypeNode.java +++ b/src/main/java/org/zwobble/couscous/ast/TypeNode.java @@ -1,8 +1,8 @@ package org.zwobble.couscous.ast; +import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.types.ScalarType; import org.zwobble.couscous.types.Type; -import org.zwobble.couscous.ast.visitors.NodeTransformer; import java.util.List; import java.util.Set; @@ -15,4 +15,5 @@ public interface TypeNode extends Node { List<TypeNode> getInnerTypes(); TypeNode transformSubtree(NodeTransformer transformer); TypeNode stripInnerTypes(); + TypeNode addInnerTypes(List<TypeNode> types); } 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; + } } |
