From d58b27ee89a014aa294b25baffd53c7a96a64be3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 30 Oct 2016 17:21:10 +0000 Subject: Extract inner type hoisting to separate step --- .../java/org/zwobble/couscous/ast/ClassNode.java | 47 ++++++++++++++++++---- .../org/zwobble/couscous/ast/ClassNodeBuilder.java | 9 ++++- .../java/org/zwobble/couscous/ast/EnumNode.java | 10 +++++ .../org/zwobble/couscous/ast/InterfaceNode.java | 42 ++++++++++++++++--- .../java/org/zwobble/couscous/ast/TypeNode.java | 2 + .../couscous/ast/sugar/TypeDeclarationBody.java | 22 ++++++++-- 6 files changed, 115 insertions(+), 17 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/ast') diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNode.java b/src/main/java/org/zwobble/couscous/ast/ClassNode.java index 3a53cfd..322a32a 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNode.java @@ -9,6 +9,9 @@ import org.zwobble.couscous.util.ExtraIterables; import java.util.List; import java.util.Set; +import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap; +import static org.zwobble.couscous.util.ExtraLists.list; + public class ClassNode implements TypeNode { public static ClassNodeBuilder builder(ScalarType name) { return new ClassNodeBuilder(name); @@ -24,9 +27,11 @@ public class ClassNode implements TypeNode { List fields, List staticConstructor, ConstructorNode constructor, - List methods) + List methods, + List innerTypes + ) { - return new ClassNode(name, typeParameters, superTypes, fields, staticConstructor, constructor, methods); + return new ClassNode(name, typeParameters, superTypes, fields, staticConstructor, constructor, methods, innerTypes); } private final ScalarType name; @@ -36,7 +41,8 @@ public class ClassNode implements TypeNode { private final List staticConstructor; private final ConstructorNode constructor; private final List methods; - + private final List innerTypes; + public ClassNode( ScalarType name, List typeParameters, @@ -44,7 +50,9 @@ public class ClassNode implements TypeNode { List fields, List staticConstructor, ConstructorNode constructor, - List methodNodes) + List methodNodes, + List innerTypes + ) { this.name = name; this.typeParameters = typeParameters; @@ -53,6 +61,7 @@ public class ClassNode implements TypeNode { this.staticConstructor = staticConstructor; this.constructor = constructor; methods = methodNodes; + this.innerTypes = innerTypes; } @Override @@ -86,7 +95,12 @@ public class ClassNode implements TypeNode { public List getMethods() { return methods; } - + + @Override + public List getInnerTypes() { + return innerTypes; + } + public String getSimpleName() { return name.getSimpleName(); } @@ -114,7 +128,23 @@ public class ClassNode implements TypeNode { transformer.transformFields(fields), transformer.transformStatements(staticConstructor), transformer.transformConstructor(constructor), - transformer.transformMethods(methods)); + transformer.transformMethods(methods), + eagerFlatMap(innerTypes, transformer::transformTypeDeclaration) + ); + } + + @Override + public TypeNode stripInnerTypes() { + return new ClassNode( + name, + typeParameters, + superTypes, + fields, + staticConstructor, + constructor, + methods, + list() + ); } @Override @@ -127,6 +157,7 @@ public class ClassNode implements TypeNode { ", staticConstructor=" + staticConstructor + ", constructor=" + constructor + ", methods=" + methods + + ", innerTypes=" + innerTypes + ')'; } @@ -143,7 +174,8 @@ public class ClassNode implements TypeNode { if (!fields.equals(classNode.fields)) return false; if (!staticConstructor.equals(classNode.staticConstructor)) return false; if (!constructor.equals(classNode.constructor)) return false; - return methods.equals(classNode.methods); + if (!methods.equals(classNode.methods)) return false; + return innerTypes.equals(classNode.innerTypes); } @@ -156,6 +188,7 @@ public class ClassNode implements TypeNode { result = 31 * result + staticConstructor.hashCode(); result = 31 * result + constructor.hashCode(); result = 31 * result + methods.hashCode(); + result = 31 * result + innerTypes.hashCode(); return result; } } diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index 4735a2e..ec17c9b 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -24,6 +24,7 @@ public class ClassNodeBuilder { private List staticConstructor; private Optional constructor; private final ImmutableList.Builder methods; + private final ImmutableList.Builder innerTypes; public ClassNodeBuilder(ScalarType name) { this.name = name; @@ -33,6 +34,7 @@ public class ClassNodeBuilder { staticConstructor = list(); this.constructor = Optional.empty(); this.methods = ImmutableList.builder(); + this.innerTypes = ImmutableList.builder(); } public ClassNodeBuilder(String name) { @@ -119,7 +121,9 @@ public class ClassNodeBuilder { fields.build(), staticConstructor, constructor.orElse(ConstructorNode.DEFAULT), - methods.build()); + methods.build(), + innerTypes.build() + ); } public InterfaceNode buildInterface() { @@ -129,7 +133,8 @@ public class ClassNodeBuilder { superTypes.build(), fields.build(), staticConstructor, - methods.build() + methods.build(), + innerTypes.build() ); } diff --git a/src/main/java/org/zwobble/couscous/ast/EnumNode.java b/src/main/java/org/zwobble/couscous/ast/EnumNode.java index 92084dd..4a41a03 100644 --- a/src/main/java/org/zwobble/couscous/ast/EnumNode.java +++ b/src/main/java/org/zwobble/couscous/ast/EnumNode.java @@ -49,6 +49,11 @@ public class EnumNode implements TypeNode { return list(); } + @Override + public List getInnerTypes() { + return list(); + } + @Override public int nodeType() { return NodeTypes.ENUM; @@ -66,6 +71,11 @@ public class EnumNode implements TypeNode { eagerMap(values, transformer::transformFieldName)); } + @Override + public TypeNode stripInnerTypes() { + return this; + } + @Override public String toString() { return "EnumNode(" + diff --git a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java index c0444a4..3159d03 100644 --- a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java +++ b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java @@ -7,6 +7,9 @@ import org.zwobble.couscous.types.Type; import java.util.List; import java.util.Set; +import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap; +import static org.zwobble.couscous.util.ExtraLists.list; + public class InterfaceNode implements TypeNode { public static InterfaceNode declareInterface( ScalarType name, @@ -14,9 +17,11 @@ public class InterfaceNode implements TypeNode { Set superTypes, List fields, List staticConstructor, - List methods) + List methods, + List innerTypes + ) { - return new InterfaceNode(name, typeParameters, superTypes, fields, staticConstructor, methods); + return new InterfaceNode(name, typeParameters, superTypes, fields, staticConstructor, methods, innerTypes); } private final ScalarType name; @@ -25,6 +30,7 @@ public class InterfaceNode implements TypeNode { private final List fields; private final List staticConstructor; private final List methods; + private final List innerTypes; private InterfaceNode( ScalarType name, @@ -32,7 +38,9 @@ public class InterfaceNode implements TypeNode { Set superTypes, List fields, List staticConstructor, - List methods) + List methods, + List innerTypes + ) { this.name = name; this.typeParameters = typeParameters; @@ -40,6 +48,7 @@ public class InterfaceNode implements TypeNode { this.fields = fields; this.staticConstructor = staticConstructor; this.methods = methods; + this.innerTypes = innerTypes; } @Override @@ -70,6 +79,11 @@ public class InterfaceNode implements TypeNode { return methods; } + @Override + public List getInnerTypes() { + return innerTypes; + } + @Override public int nodeType() { return NodeTypes.INTERFACE; @@ -88,7 +102,22 @@ public class InterfaceNode implements TypeNode { transformer.transformTypes(superTypes), transformer.transformFields(fields), transformer.transformStatements(staticConstructor), - transformer.transformMethods(methods)); + transformer.transformMethods(methods), + eagerFlatMap(innerTypes, transformer::transformTypeDeclaration) + ); + } + + @Override + public TypeNode stripInnerTypes() { + return new InterfaceNode( + name, + typeParameters, + superTypes, + fields, + staticConstructor, + methods, + list() + ); } @Override @@ -100,6 +129,7 @@ public class InterfaceNode implements TypeNode { ", fields=" + fields + ", staticConstructor=" + staticConstructor + ", methods=" + methods + + ", innerTypes=" + innerTypes + ')'; } @@ -115,7 +145,8 @@ public class InterfaceNode implements TypeNode { if (!superTypes.equals(that.superTypes)) return false; if (!fields.equals(that.fields)) return false; if (!staticConstructor.equals(that.staticConstructor)) return false; - return methods.equals(that.methods); + if (!methods.equals(that.methods)) return false; + return innerTypes.equals(that.innerTypes); } @@ -127,6 +158,7 @@ public class InterfaceNode implements TypeNode { result = 31 * result + fields.hashCode(); result = 31 * result + staticConstructor.hashCode(); result = 31 * result + methods.hashCode(); + result = 31 * result + innerTypes.hashCode(); return result; } } diff --git a/src/main/java/org/zwobble/couscous/ast/TypeNode.java b/src/main/java/org/zwobble/couscous/ast/TypeNode.java index 9aa9cfb..01b033b 100644 --- a/src/main/java/org/zwobble/couscous/ast/TypeNode.java +++ b/src/main/java/org/zwobble/couscous/ast/TypeNode.java @@ -12,5 +12,7 @@ public interface TypeNode extends Node { List getTypeParameters(); Set getSuperTypes(); List getMethods(); + List getInnerTypes(); TypeNode transformSubtree(NodeTransformer transformer); + TypeNode stripInnerTypes(); } diff --git a/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java b/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java index 381c521..99b7c06 100644 --- a/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java +++ b/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java @@ -19,6 +19,7 @@ public class TypeDeclarationBody { private final ImmutableList.Builder instanceInitializers = ImmutableList.builder(); private ConstructorNode constructor = ConstructorNode.DEFAULT; private final ImmutableList.Builder methods = ImmutableList.builder(); + private final ImmutableList.Builder innerTypes = ImmutableList.builder(); private Builder() { } @@ -43,6 +44,10 @@ public class TypeDeclarationBody { this.methods.add(method); } + public void addInnerType(TypeNode typeDeclaration) { + this.innerTypes.add(typeDeclaration); + } + public TypeDeclarationBody build() { return new TypeDeclarationBody( fields.build(), @@ -50,7 +55,9 @@ public class TypeDeclarationBody { ConstructorNode.constructor( constructor.getArguments(), ExtraLists.concat(instanceInitializers.build(), constructor.getBody())), - methods.build()); + methods.build(), + innerTypes.build() + ); } } @@ -58,16 +65,21 @@ public class TypeDeclarationBody { private final List staticConstructor; private final ConstructorNode constructor; private final List methods; + private final List innerTypes; public TypeDeclarationBody( List fields, - List staticConstructor, ConstructorNode constructor, - List methods) + List staticConstructor, + ConstructorNode constructor, + List methods, + List innerTypes + ) { this.fields = fields; this.staticConstructor = staticConstructor; this.constructor = constructor; this.methods = methods; + this.innerTypes = innerTypes; } public List getFields() { @@ -85,4 +97,8 @@ public class TypeDeclarationBody { public List getMethods() { return methods; } + + public List getInnerTypes() { + return innerTypes; + } } -- cgit v1.2.3