aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-09 22:44:29 +0000
committerMichael Williamson <mike@zwobble.org>2016-03-10 16:43:05 +0000
commit2a182825a88b6ee957e205862f5cf3a505b3a173 (patch)
tree2054c8a0c4252bd4b3f161de0b34482158ee7728 /src/main/java/org/zwobble/couscous/ast
parent20dc1e124d606cf4298d5112b6d3c4f6c74e9b68 (diff)
Initial implementation of generics for C#
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java13
-rw-r--r--src/main/java/org/zwobble/couscous/ast/types/BoundTypeParameter.java55
-rw-r--r--src/main/java/org/zwobble/couscous/ast/types/ParameterizedType.java57
-rw-r--r--src/main/java/org/zwobble/couscous/ast/types/Type.java3
-rw-r--r--src/main/java/org/zwobble/couscous/ast/types/TypeParameter.java51
-rw-r--r--src/main/java/org/zwobble/couscous/ast/types/Types.java17
6 files changed, 191 insertions, 5 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
index bb38562..df2b87c 100644
--- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
@@ -1,10 +1,13 @@
package org.zwobble.couscous.ast;
+import org.zwobble.couscous.ast.types.ParameterizedType;
import org.zwobble.couscous.ast.types.ScalarType;
+import org.zwobble.couscous.ast.types.Type;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.values.*;
+import static org.zwobble.couscous.util.ExtraLists.list;
import static org.zwobble.couscous.values.PrimitiveValues.value;
public class LiteralNode implements ExpressionNode {
@@ -27,22 +30,22 @@ public class LiteralNode implements ExpressionNode {
}
public static LiteralNode literal(ScalarType type) {
- return new LiteralNode(value(type), ObjectValues.CLASS);
+ return new LiteralNode(value(type), new ParameterizedType(ObjectValues.CLASS, list(type)));
}
- public static LiteralNode of(PrimitiveValue value, ScalarType type) {
+ public static LiteralNode of(PrimitiveValue value, Type type) {
return new LiteralNode(value, type);
}
private final PrimitiveValue value;
- private final ScalarType type;
+ private final Type type;
- private LiteralNode(PrimitiveValue value, ScalarType type) {
+ private LiteralNode(PrimitiveValue value, Type type) {
this.value = value;
this.type = type;
}
- public ScalarType getType() {
+ public Type getType() {
return type;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/types/BoundTypeParameter.java b/src/main/java/org/zwobble/couscous/ast/types/BoundTypeParameter.java
new file mode 100644
index 0000000..abb8906
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/types/BoundTypeParameter.java
@@ -0,0 +1,55 @@
+package org.zwobble.couscous.ast.types;
+
+public class BoundTypeParameter implements Type {
+ public static BoundTypeParameter boundTypeParameter(TypeParameter parameter, Type value) {
+ return new BoundTypeParameter(parameter, value);
+ }
+
+ private final TypeParameter parameter;
+ private final Type value;
+
+ public BoundTypeParameter(TypeParameter parameter, Type value) {
+ this.parameter = parameter;
+ this.value = value;
+ }
+
+ public TypeParameter getParameter() {
+ return parameter;
+ }
+
+ public Type getValue() {
+ return value;
+ }
+
+ @Override
+ public <T> T accept(Visitor<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public String toString() {
+ return "BoundTypeParameter(" +
+ "parameter=" + parameter +
+ ", value=" + value +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ BoundTypeParameter that = (BoundTypeParameter) o;
+
+ if (!parameter.equals(that.parameter)) return false;
+ return value.equals(that.value);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = parameter.hashCode();
+ result = 31 * result + value.hashCode();
+ return result;
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/types/ParameterizedType.java b/src/main/java/org/zwobble/couscous/ast/types/ParameterizedType.java
new file mode 100644
index 0000000..a23fdc0
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/types/ParameterizedType.java
@@ -0,0 +1,57 @@
+package org.zwobble.couscous.ast.types;
+
+import java.util.List;
+
+public class ParameterizedType implements Type {
+ public static ParameterizedType parameterizedType(ScalarType rawType, List<Type> parameters) {
+ return new ParameterizedType(rawType, parameters);
+ }
+
+ private final ScalarType rawType;
+ private final List<Type> parameters;
+
+ public ParameterizedType(ScalarType rawType, List<Type> parameters) {
+ this.rawType = rawType;
+ this.parameters = parameters;
+ }
+
+ public ScalarType getRawType() {
+ return rawType;
+ }
+
+ public List<Type> getParameters() {
+ return parameters;
+ }
+
+ @Override
+ public <T> T accept(Visitor<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public String toString() {
+ return "ParameterizedType(" +
+ "rawType=" + rawType +
+ ", parameters=" + parameters +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ParameterizedType that = (ParameterizedType) o;
+
+ if (!rawType.equals(that.rawType)) return false;
+ return parameters.equals(that.parameters);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = rawType.hashCode();
+ result = 31 * result + parameters.hashCode();
+ return result;
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/types/Type.java b/src/main/java/org/zwobble/couscous/ast/types/Type.java
index e936279..2a64341 100644
--- a/src/main/java/org/zwobble/couscous/ast/types/Type.java
+++ b/src/main/java/org/zwobble/couscous/ast/types/Type.java
@@ -5,5 +5,8 @@ public interface Type {
interface Visitor<T> {
T visit(ScalarType type);
+ T visit(TypeParameter parameter);
+ T visit(ParameterizedType type);
+ T visit(BoundTypeParameter type);
}
}
diff --git a/src/main/java/org/zwobble/couscous/ast/types/TypeParameter.java b/src/main/java/org/zwobble/couscous/ast/types/TypeParameter.java
new file mode 100644
index 0000000..0dee75e
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/types/TypeParameter.java
@@ -0,0 +1,51 @@
+package org.zwobble.couscous.ast.types;
+
+public class TypeParameter implements Type {
+ public static TypeParameter typeParameter(ScalarType declaringType, String name) {
+ return new TypeParameter(declaringType, name);
+ }
+
+ private final ScalarType declaringType;
+ private final String name;
+
+ public TypeParameter(ScalarType declaringType, String name) {
+ this.declaringType = declaringType;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public <T> T accept(Visitor<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public String toString() {
+ return "TypeParameter(" +
+ "declaringType=" + declaringType +
+ ", name=" + name +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ TypeParameter that = (TypeParameter) o;
+
+ if (!declaringType.equals(that.declaringType)) return false;
+ return name.equals(that.name);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = declaringType.hashCode();
+ result = 31 * result + name.hashCode();
+ return result;
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/types/Types.java b/src/main/java/org/zwobble/couscous/ast/types/Types.java
index c222c54..5fb079b 100644
--- a/src/main/java/org/zwobble/couscous/ast/types/Types.java
+++ b/src/main/java/org/zwobble/couscous/ast/types/Types.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.ast.types;
+import org.zwobble.couscous.values.ObjectValues;
+
public class Types {
public static ScalarType erasure(Type type) {
return type.accept(new Type.Visitor<ScalarType>() {
@@ -7,6 +9,21 @@ public class Types {
public ScalarType visit(ScalarType type) {
return type;
}
+
+ @Override
+ public ScalarType visit(TypeParameter parameter) {
+ return ObjectValues.OBJECT;
+ }
+
+ @Override
+ public ScalarType visit(ParameterizedType type) {
+ return type.getRawType();
+ }
+
+ @Override
+ public ScalarType visit(BoundTypeParameter type) {
+ return erasure(type.getParameter());
+ }
});
}
}