aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast/MethodNode.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-02 00:29:32 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-02 00:29:32 +0100
commit7fbbbf62b303ee819017844ff8058b764465e246 (patch)
tree4c1966008c3972856d6d7de812000fe9e2d1b0c8 /src/main/java/org/zwobble/couscous/ast/MethodNode.java
parent65503a9acc04d27d7118cd7fc9077aad5e3179a4 (diff)
Defer generation overrides until necessary, don't mangle C# names
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/MethodNode.java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java58
1 files changed, 37 insertions, 21 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index 024541f..8863619 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -31,7 +31,9 @@ public class MethodNode implements Node {
private Type returnType = Types.VOID;
private final ImmutableList.Builder<StatementNode> body =
ImmutableList.builder();
-
+ private final ImmutableList.Builder<MethodSignature> overrides =
+ ImmutableList.builder();
+
public Builder(String name) {
this.name = name;
}
@@ -83,7 +85,8 @@ public class MethodNode implements Node {
name,
arguments.build(),
returnType,
- isAbstract ? Optional.empty() : Optional.of(body.build()));
+ isAbstract ? Optional.empty() : Optional.of(body.build()),
+ overrides.build());
}
}
@@ -93,9 +96,10 @@ public class MethodNode implements Node {
String name,
List<FormalArgumentNode> arguments,
Type returnType,
- Optional<List<StatementNode>> body)
+ Optional<List<StatementNode>> body,
+ List<MethodSignature> overrides)
{
- return new MethodNode(annotations, isStatic, name, arguments, returnType, body);
+ return new MethodNode(annotations, isStatic, name, arguments, returnType, body, overrides);
}
private final List<AnnotationNode> annotations;
@@ -104,14 +108,16 @@ public class MethodNode implements Node {
private final List<FormalArgumentNode> arguments;
private final Type returnType;
private final Optional<List<StatementNode>> body;
-
+ private final List<MethodSignature> overrides;
+
private MethodNode(
List<AnnotationNode> annotations,
boolean isStatic,
String name,
List<FormalArgumentNode> arguments,
Type returnType,
- Optional<List<StatementNode>> body)
+ Optional<List<StatementNode>> body,
+ List<MethodSignature> overrides)
{
this.annotations = annotations;
this.isStatic = isStatic;
@@ -119,6 +125,7 @@ public class MethodNode implements Node {
this.arguments = arguments;
this.returnType = returnType;
this.body = body;
+ this.overrides = overrides;
}
public List<AnnotationNode> getAnnotations() {
@@ -145,6 +152,10 @@ public class MethodNode implements Node {
return body;
}
+ public List<MethodSignature> getOverrides() {
+ return overrides;
+ }
+
public boolean isAbstract() {
return !body.isPresent();
}
@@ -157,7 +168,7 @@ public class MethodNode implements Node {
}
public MethodNode mapBody(Function<List<StatementNode>, List<StatementNode>> function) {
- return new MethodNode(annotations, isStatic, name, arguments, returnType, body.map(function));
+ return new MethodNode(annotations, isStatic, name, arguments, returnType, body.map(function), overrides);
}
@Override
@@ -172,19 +183,8 @@ public class MethodNode implements Node {
transformer.transformMethodName(signature()),
transformer.transformFormalArguments(arguments),
transformer.transform(returnType),
- body.map(transformer::transformStatements));
- }
-
- @Override
- public String toString() {
- return "MethodNode(" +
- "annotations=" + annotations +
- ", isStatic=" + isStatic +
- ", name=" + name +
- ", arguments=" + arguments +
- ", returnType=" + returnType +
- ", body=" + body +
- ')';
+ body.map(transformer::transformStatements),
+ eagerMap(overrides, transformer::transform));
}
@Override
@@ -199,7 +199,8 @@ public class MethodNode implements Node {
if (!name.equals(that.name)) return false;
if (!arguments.equals(that.arguments)) return false;
if (!returnType.equals(that.returnType)) return false;
- return body.equals(that.body);
+ if (!body.equals(that.body)) return false;
+ return overrides.equals(that.overrides);
}
@@ -211,6 +212,21 @@ public class MethodNode implements Node {
result = 31 * result + arguments.hashCode();
result = 31 * result + returnType.hashCode();
result = 31 * result + body.hashCode();
+ result = 31 * result + overrides.hashCode();
return result;
}
+
+ @Override
+ public String toString() {
+ return "MethodNode(" +
+ "annotations=" + annotations +
+ ", isStatic=" + isStatic +
+ ", name=" + name +
+ ", arguments=" + arguments +
+ ", returnType=" + returnType +
+ ", body=" + body +
+ ", overrides=" + overrides +
+ ')';
+ }
+
}