aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-06 08:31:13 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-06 08:31:13 +0000
commitb69c8f7c8e2c16aade681ceaae046456a5ef2a85 (patch)
tree6737fa9da75bc4dc5cd9cf620ac6b8f686aebae6 /src/main/java/org/zwobble/couscous/ast
parente4229671c4cf6db860fc6cf68bcfb8fdd69fdcb8 (diff)
Partially implement method overloading
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodSignature.java44
-rw-r--r--src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java4
4 files changed, 60 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index f65a9ae..ba50f17 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -111,6 +111,10 @@ public class MethodCallNode implements ExpressionNode {
public TypeName getType() {
return type;
}
+
+ public MethodSignature signature() {
+ return new MethodSignature(methodName, eagerMap(arguments, argument -> argument.getType()));
+ }
@Override
public <T> T accept(ExpressionNodeMapper<T> visitor) {
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index 5763b11..86ae649 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -6,6 +6,8 @@ import org.zwobble.couscous.ast.visitors.NodeMapper;
import java.util.List;
import java.util.function.Function;
+import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+
public class MethodNode implements CallableNode {
public static Builder staticMethod(String name) {
return builder(name).isStatic(true);
@@ -116,6 +118,12 @@ public class MethodNode implements CallableNode {
return body;
}
+ public MethodSignature signature() {
+ return new MethodSignature(
+ name,
+ eagerMap(arguments, argument -> argument.getType()));
+ }
+
public MethodNode mapBody(Function<List<StatementNode>, List<StatementNode>> function) {
return new MethodNode(annotations, isStatic, name, arguments, function.apply(body));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodSignature.java b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
new file mode 100644
index 0000000..fb2dc64
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
@@ -0,0 +1,44 @@
+package org.zwobble.couscous.ast;
+
+import java.util.List;
+import java.util.Objects;
+
+public class MethodSignature {
+ private String name;
+ private List<TypeName> arguments;
+
+ public MethodSignature(String name, List<TypeName> arguments) {
+ this.name = name;
+ this.arguments = arguments;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List<TypeName> getArguments() {
+ return arguments;
+ }
+
+ @Override
+ public String toString() {
+ return "MethodSignature(" +
+ "name='" + name + '\'' +
+ ", arguments=" + arguments +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ MethodSignature that = (MethodSignature) o;
+ return Objects.equals(name, that.name) &&
+ Objects.equals(arguments, that.arguments);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, arguments);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java
index 7c3b90b..1309c6e 100644
--- a/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/StaticMethodCallNode.java
@@ -81,6 +81,10 @@ public class StaticMethodCallNode implements ExpressionNode {
public TypeName getType() {
return type;
}
+
+ public MethodSignature signature() {
+ return new MethodSignature(methodName, eagerMap(arguments, argument -> argument.getType()));
+ }
@Override
public <T> T accept(ExpressionNodeMapper<T> visitor) {