diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-03-09 22:44:29 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-03-10 16:43:05 +0000 |
| commit | 2a182825a88b6ee957e205862f5cf3a505b3a173 (patch) | |
| tree | 2054c8a0c4252bd4b3f161de0b34482158ee7728 /src/main/java/org/zwobble/couscous/ast | |
| parent | 20dc1e124d606cf4298d5112b6d3c4f6c74e9b68 (diff) | |
Initial implementation of generics for C#
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
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()); + } }); } } |
