aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-10-30 17:21:10 +0000
committerMichael Williamson <mike@zwobble.org>2016-10-30 17:21:10 +0000
commitd58b27ee89a014aa294b25baffd53c7a96a64be3 (patch)
tree6dcd100dd36c54b481dd49d07fab76bd747dc851 /src/main/java/org/zwobble/couscous/ast
parentbefd7c344ba8a7c3402d4c678f1b81017fd65947 (diff)
Extract inner type hoisting to separate step
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNode.java47
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java9
-rw-r--r--src/main/java/org/zwobble/couscous/ast/EnumNode.java10
-rw-r--r--src/main/java/org/zwobble/couscous/ast/InterfaceNode.java42
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TypeNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java22
6 files changed, 115 insertions, 17 deletions
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<FieldDeclarationNode> fields,
List<StatementNode> staticConstructor,
ConstructorNode constructor,
- List<MethodNode> methods)
+ List<MethodNode> methods,
+ List<TypeNode> 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<StatementNode> staticConstructor;
private final ConstructorNode constructor;
private final List<MethodNode> methods;
-
+ private final List<TypeNode> innerTypes;
+
public ClassNode(
ScalarType name,
List<FormalTypeParameterNode> typeParameters,
@@ -44,7 +50,9 @@ public class ClassNode implements TypeNode {
List<FieldDeclarationNode> fields,
List<StatementNode> staticConstructor,
ConstructorNode constructor,
- List<MethodNode> methodNodes)
+ List<MethodNode> methodNodes,
+ List<TypeNode> 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<MethodNode> getMethods() {
return methods;
}
-
+
+ @Override
+ public List<TypeNode> 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<StatementNode> staticConstructor;
private Optional<ConstructorNode> constructor;
private final ImmutableList.Builder<MethodNode> methods;
+ private final ImmutableList.Builder<TypeNode> 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
@@ -50,6 +50,11 @@ public class EnumNode implements TypeNode {
}
@Override
+ public List<TypeNode> getInnerTypes() {
+ return list();
+ }
+
+ @Override
public int nodeType() {
return NodeTypes.ENUM;
}
@@ -67,6 +72,11 @@ public class EnumNode implements TypeNode {
}
@Override
+ public TypeNode stripInnerTypes() {
+ return this;
+ }
+
+ @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 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<Type> superTypes,
List<FieldDeclarationNode> fields,
List<StatementNode> staticConstructor,
- List<MethodNode> methods)
+ List<MethodNode> methods,
+ List<TypeNode> 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<FieldDeclarationNode> fields;
private final List<StatementNode> staticConstructor;
private final List<MethodNode> methods;
+ private final List<TypeNode> innerTypes;
private InterfaceNode(
ScalarType name,
@@ -32,7 +38,9 @@ public class InterfaceNode implements TypeNode {
Set<Type> superTypes,
List<FieldDeclarationNode> fields,
List<StatementNode> staticConstructor,
- List<MethodNode> methods)
+ List<MethodNode> methods,
+ List<TypeNode> 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
@@ -71,6 +80,11 @@ public class InterfaceNode implements TypeNode {
}
@Override
+ public List<TypeNode> 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<FormalTypeParameterNode> getTypeParameters();
Set<Type> getSuperTypes();
List<MethodNode> getMethods();
+ List<TypeNode> 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<StatementNode> instanceInitializers = ImmutableList.builder();
private ConstructorNode constructor = ConstructorNode.DEFAULT;
private final ImmutableList.Builder<MethodNode> methods = ImmutableList.builder();
+ private final ImmutableList.Builder<TypeNode> 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<StatementNode> staticConstructor;
private final ConstructorNode constructor;
private final List<MethodNode> methods;
+ private final List<TypeNode> innerTypes;
public TypeDeclarationBody(
List<FieldDeclarationNode> fields,
- List<StatementNode> staticConstructor, ConstructorNode constructor,
- List<MethodNode> methods)
+ List<StatementNode> staticConstructor,
+ ConstructorNode constructor,
+ List<MethodNode> methods,
+ List<TypeNode> innerTypes
+ )
{
this.fields = fields;
this.staticConstructor = staticConstructor;
this.constructor = constructor;
this.methods = methods;
+ this.innerTypes = innerTypes;
}
public List<FieldDeclarationNode> getFields() {
@@ -85,4 +97,8 @@ public class TypeDeclarationBody {
public List<MethodNode> getMethods() {
return methods;
}
+
+ public List<TypeNode> getInnerTypes() {
+ return innerTypes;
+ }
}