diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-10 17:28:48 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-10 17:28:48 +0000 |
| commit | 7dab9cb11a7181094144e4319716c4d91262a289 (patch) | |
| tree | aac0c439a4c3445837c8703c002d6bd23f5df3bf /src/main/java | |
| parent | a76af2307f7d4e67ac949559de43afb0bd1e8da1 (diff) | |
Add reading of type literals
Diffstat (limited to 'src/main/java')
9 files changed, 78 insertions, 11 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java index 1aa3293..ed2aaf0 100644 --- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java +++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java @@ -1,10 +1,7 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; -import org.zwobble.couscous.values.BooleanValue; -import org.zwobble.couscous.values.IntegerValue; -import org.zwobble.couscous.values.PrimitiveValue; -import org.zwobble.couscous.values.StringValue; +import org.zwobble.couscous.values.*; import java.util.function.Function; @@ -26,6 +23,10 @@ public class LiteralNode implements ExpressionNode { public static LiteralNode literal(boolean value) { return new LiteralNode(value(value), BooleanValue.REF); } + + public static LiteralNode literal(TypeName type) { + return new LiteralNode(value(type), ObjectValues.CLASS); + } public static LiteralNode of(PrimitiveValue value, TypeName type) { return new LiteralNode(value, type); diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java index 4390207..311d065 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -131,6 +131,12 @@ public class PythonCodeGenerator { public PythonExpressionNode visit(UnitValue unitValue) { throw new UnsupportedOperationException(); } + + @Override + public PythonExpressionNode visit(TypeValue value) { + // TODO: + throw new UnsupportedOperationException(); + } }); } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index 4200a98..114e4ef 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -66,6 +66,9 @@ public class JavaExpressionReader { case ASTNode.STRING_LITERAL: return readStringLiteral((StringLiteral)expression); + case ASTNode.TYPE_LITERAL: + return readTypeLiteral((TypeLiteral)expression); + case ASTNode.SIMPLE_NAME: return readSimpleName((SimpleName)expression); @@ -122,6 +125,10 @@ public class JavaExpressionReader { return literal(expression.getLiteralValue()); } + private ExpressionNode readTypeLiteral(TypeLiteral expression) { + return literal(typeOf(expression.getType())); + } + private ExpressionNode readSimpleName(SimpleName expression) { IBinding binding = expression.resolveBinding(); if (binding.getKind() == IBinding.VARIABLE) { diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java index 8eb7e62..19a9126 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java @@ -24,7 +24,7 @@ class JavaTypes { } static TypeName typeOf(ITypeBinding typeBinding) { - return TypeName.of(typeBinding.getQualifiedName()); + return TypeName.of(typeBinding.getErasure().getQualifiedName()); } static Set<TypeName> superTypes(TypeDeclaration declaration) { diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java index 6b9d0b5..c405fe3 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java @@ -1,11 +1,6 @@ package org.zwobble.couscous.interpreter.values; -import org.zwobble.couscous.values.BooleanValue; -import org.zwobble.couscous.values.IntegerValue; -import org.zwobble.couscous.values.PrimitiveValue; -import org.zwobble.couscous.values.PrimitiveValueVisitor; -import org.zwobble.couscous.values.StringValue; -import org.zwobble.couscous.values.UnitValue; +import org.zwobble.couscous.values.*; public class InterpreterValues { public static final UnitInterpreterValue UNIT = UnitInterpreterValue.UNIT; @@ -41,6 +36,12 @@ public class InterpreterValues { public InterpreterValue visit(UnitValue unitValue) { return UNIT; } + + @Override + public InterpreterValue visit(TypeValue value) { + // TODO: + throw new UnsupportedOperationException(); + } }); } } diff --git a/src/main/java/org/zwobble/couscous/values/ObjectValues.java b/src/main/java/org/zwobble/couscous/values/ObjectValues.java index 2554e94..2681259 100644 --- a/src/main/java/org/zwobble/couscous/values/ObjectValues.java +++ b/src/main/java/org/zwobble/couscous/values/ObjectValues.java @@ -3,6 +3,7 @@ package org.zwobble.couscous.values; import org.zwobble.couscous.ast.TypeName; public class ObjectValues { + public static final TypeName CLASS = TypeName.of("java.lang.Class"); public static final TypeName OBJECT = TypeName.of("java.lang.Object"); public static final TypeName BOXED_INT = TypeName.of("java.lang.Integer"); public static final TypeName BOXED_BOOLEAN = TypeName.of("java.lang.Boolean"); diff --git a/src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java b/src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java index 07047b8..9b31b05 100644 --- a/src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java +++ b/src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java @@ -5,4 +5,5 @@ public interface PrimitiveValueVisitor<T> { T visit(StringValue value); T visit(BooleanValue value); T visit(UnitValue unitValue); + T visit(TypeValue value); } diff --git a/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java b/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java index 2d4f91c..8022a9d 100644 --- a/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java +++ b/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java @@ -1,5 +1,7 @@ package org.zwobble.couscous.values; +import org.zwobble.couscous.ast.TypeName; + public class PrimitiveValues { public static final PrimitiveValue UNIT = UnitValue.UNIT; public static final PrimitiveValue TRUE = new BooleanValue(true); @@ -16,4 +18,8 @@ public class PrimitiveValues { public static PrimitiveValue value(boolean value) { return value ? TRUE : FALSE; } + + public static PrimitiveValue value(TypeName type) { + return new TypeValue(type); + } } diff --git a/src/main/java/org/zwobble/couscous/values/TypeValue.java b/src/main/java/org/zwobble/couscous/values/TypeValue.java new file mode 100644 index 0000000..43dfc33 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/values/TypeValue.java @@ -0,0 +1,44 @@ +package org.zwobble.couscous.values; + +import org.zwobble.couscous.ast.TypeName; + +public class TypeValue implements PrimitiveValue { + private final TypeName type; + + public TypeValue(TypeName type) { + this.type = type; + } + + @Override + public <T> T accept(PrimitiveValueVisitor<T> visitor) { + return visitor.visit(this); + } + + @Override + public TypeName getType() { + return ObjectValues.CLASS; + } + + @Override + public String toString() { + return "TypeValue(" + + "type=" + type + + ')'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TypeValue typeValue = (TypeValue) o; + + return type.equals(typeValue.type); + + } + + @Override + public int hashCode() { + return type.hashCode(); + } +} |
