aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-08-29 17:13:03 +0100
committerMichael Williamson <mike@zwobble.org>2016-08-29 17:13:03 +0100
commita82ecb60d6ee7ee46e5800088f1769f86872077b (patch)
tree8b3c5442a1bd047606de63477839755e88dab2f5 /src/main/java/org/zwobble/couscous/ast
parent1babfdf8daa45ffef3d624db6c717f846d295440 (diff)
Initial support for static methods/fields on interfaces
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/InterfaceNode.java50
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java16
3 files changed, 54 insertions, 17 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
index a567254..4735a2e 100644
--- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
@@ -127,7 +127,10 @@ public class ClassNodeBuilder {
name,
typeParameters.build(),
superTypes.build(),
- methods.build());
+ fields.build(),
+ staticConstructor,
+ methods.build()
+ );
}
public class MethodBuilder<T> {
diff --git a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java
index de151e4..c0444a4 100644
--- a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java
@@ -12,26 +12,34 @@ public class InterfaceNode implements TypeNode {
ScalarType name,
List<FormalTypeParameterNode> typeParameters,
Set<Type> superTypes,
+ List<FieldDeclarationNode> fields,
+ List<StatementNode> staticConstructor,
List<MethodNode> methods)
{
- return new InterfaceNode(name, typeParameters, superTypes, methods);
+ return new InterfaceNode(name, typeParameters, superTypes, fields, staticConstructor, methods);
}
private final ScalarType name;
private final List<FormalTypeParameterNode> typeParameters;
private final Set<Type> superTypes;
+ private final List<FieldDeclarationNode> fields;
+ private final List<StatementNode> staticConstructor;
private final List<MethodNode> methods;
private InterfaceNode(
ScalarType name,
List<FormalTypeParameterNode> typeParameters,
Set<Type> superTypes,
- List<MethodNode> methodNodes)
+ List<FieldDeclarationNode> fields,
+ List<StatementNode> staticConstructor,
+ List<MethodNode> methods)
{
this.name = name;
this.typeParameters = typeParameters;
this.superTypes = superTypes;
- methods = methodNodes;
+ this.fields = fields;
+ this.staticConstructor = staticConstructor;
+ this.methods = methods;
}
@Override
@@ -49,19 +57,17 @@ public class InterfaceNode implements TypeNode {
return superTypes;
}
- @Override
- public List<MethodNode> getMethods() {
- return methods;
+ public List<FieldDeclarationNode> getFields() {
+ return fields;
+ }
+
+ public List<StatementNode> getStaticConstructor() {
+ return staticConstructor;
}
@Override
- public String toString() {
- return "InterfaceNode(" +
- "name=" + name +
- ", typeParameters=" + typeParameters +
- ", superTypes=" + superTypes +
- ", methods=" + methods +
- ')';
+ public List<MethodNode> getMethods() {
+ return methods;
}
@Override
@@ -80,10 +86,24 @@ public class InterfaceNode implements TypeNode {
transformer.transform(name),
transformer.transformFormalTypeParameters(typeParameters),
transformer.transformTypes(superTypes),
+ transformer.transformFields(fields),
+ transformer.transformStatements(staticConstructor),
transformer.transformMethods(methods));
}
@Override
+ public String toString() {
+ return "InterfaceNode(" +
+ "name=" + name +
+ ", typeParameters=" + typeParameters +
+ ", superTypes=" + superTypes +
+ ", fields=" + fields +
+ ", staticConstructor=" + staticConstructor +
+ ", methods=" + methods +
+ ')';
+ }
+
+ @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
@@ -93,6 +113,8 @@ public class InterfaceNode implements TypeNode {
if (!name.equals(that.name)) return false;
if (!typeParameters.equals(that.typeParameters)) return false;
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);
}
@@ -102,6 +124,8 @@ public class InterfaceNode implements TypeNode {
int result = name.hashCode();
result = 31 * result + typeParameters.hashCode();
result = 31 * result + superTypes.hashCode();
+ result = 31 * result + fields.hashCode();
+ result = 31 * result + staticConstructor.hashCode();
result = 31 * result + methods.hashCode();
return result;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
index b2255d2..bcc920e 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
@@ -45,6 +45,7 @@ public class NodeTransformer {
private Function<Type, Type> transformType = type -> type;
private Function<MethodSignature, String> transformMethodName = MethodSignature::getName;
private Function<String, String> transformFieldName = name -> name;
+ private Function<Receiver, Receiver> transformReceiver = receiver -> receiver;
public Builder transformExpression(
Function<ExpressionNode, Optional<ExpressionNode>> transformExpression)
@@ -77,13 +78,19 @@ public class NodeTransformer {
return this;
}
+ public Builder transformReceiver(Function<Receiver, Receiver> receiver) {
+ this.transformReceiver = receiver;
+ return this;
+ }
+
public NodeTransformer build() {
return new NodeTransformer(
transformExpression,
transformStatement,
transformType,
transformMethodName,
- transformFieldName
+ transformFieldName,
+ transformReceiver
);
}
}
@@ -93,19 +100,22 @@ public class NodeTransformer {
private final Function<Type, Type> transformType;
private final Function<MethodSignature, String> transformMethodName;
private final Function<String, String> transformFieldName;
+ private final Function<Receiver, Receiver> transformReceiver;
private NodeTransformer(
Function<ExpressionNode, Optional<ExpressionNode>> transformExpression,
Function<StatementNode, Optional<List<StatementNode>>> transformStatement,
Function<Type, Type> transformType,
Function<MethodSignature, String> transformMethodName,
- Function<String, String> transformFieldName)
+ Function<String, String> transformFieldName,
+ Function<Receiver, Receiver> transformReceiver)
{
this.transformExpression = transformExpression;
this.transformStatement = transformStatement;
this.transformType = transformType;
this.transformMethodName = transformMethodName;
this.transformFieldName = transformFieldName;
+ this.transformReceiver = transformReceiver;
}
public MethodSignature transform(MethodSignature signature) {
@@ -142,7 +152,7 @@ public class NodeTransformer {
}
public Receiver transformReceiver(Receiver receiver) {
- return receiver.transformSubtree(this);
+ return transformReceiver.apply(receiver.transformSubtree(this));
}
public VariableDeclaration transform(VariableDeclaration declaration) {