aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java9
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java6
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java7
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java13
-rw-r--r--src/main/java/org/zwobble/couscous/values/ObjectValues.java1
-rw-r--r--src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java1
-rw-r--r--src/main/java/org/zwobble/couscous/values/PrimitiveValues.java6
-rw-r--r--src/main/java/org/zwobble/couscous/values/TypeValue.java44
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();
+ }
+}