aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-09 18:49:21 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-09 18:49:21 +0100
commitde58ca8b2a4afa65f111292bbc3283aa9427ec8f (patch)
tree3212c4bb0b54066ed733c801c27636f1fb097a36 /src/main/java
parentfed4d43be44186694f1dc351bbfb673f740364ca (diff)
Add Bool and Int types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/types/BoolType.java18
-rw-r--r--src/main/java/org/shedlang/compiler/types/FunctionType.java29
-rw-r--r--src/main/java/org/shedlang/compiler/types/IntType.java18
-rw-r--r--src/main/java/org/shedlang/compiler/types/StringType.java10
-rw-r--r--src/main/java/org/shedlang/compiler/types/Type.java3
-rw-r--r--src/main/java/org/shedlang/compiler/types/Types.java2
-rw-r--r--src/main/java/org/shedlang/compiler/types/UnitType.java12
7 files changed, 90 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/types/BoolType.java b/src/main/java/org/shedlang/compiler/types/BoolType.java
new file mode 100644
index 00000000..8bf9ed25
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/BoolType.java
@@ -0,0 +1,18 @@
+package org.shedlang.compiler.types;
+
+public final class BoolType implements Type {
+ private BoolType() {
+ }
+
+ static final BoolType INSTANCE = new BoolType();
+
+ @Override
+ public String describe() {
+ return "Bool";
+ }
+
+ @Override
+ public String toString() {
+ return describe();
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/types/FunctionType.java b/src/main/java/org/shedlang/compiler/types/FunctionType.java
index 07505821..ad0f56d3 100644
--- a/src/main/java/org/shedlang/compiler/types/FunctionType.java
+++ b/src/main/java/org/shedlang/compiler/types/FunctionType.java
@@ -1,9 +1,38 @@
package org.shedlang.compiler.types;
+import org.pcollections.Empty;
+import org.pcollections.PVector;
+
import java.util.List;
public record FunctionType(
List<Type> positionalArgs,
Type returnType
) implements Type {
+ public static Builder builder() {
+ return new Builder(Empty.vector(), Types.UNIT);
+ }
+
+ @Override
+ public String describe() {
+ // TODO: implement this sensibly
+ return toString();
+ }
+
+ public record Builder(
+ PVector<Type> positionalParams,
+ Type returnType
+ ) {
+ public FunctionType build() {
+ return new FunctionType(positionalParams, returnType);
+ }
+
+ public Builder addPositionalParam(Type param) {
+ return new Builder(positionalParams.plus(param), returnType);
+ }
+
+ public Builder withReturnType(Type returnType) {
+ return new Builder(positionalParams, returnType);
+ }
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/types/IntType.java b/src/main/java/org/shedlang/compiler/types/IntType.java
new file mode 100644
index 00000000..01faa16f
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/IntType.java
@@ -0,0 +1,18 @@
+package org.shedlang.compiler.types;
+
+public final class IntType implements Type {
+ private IntType() {
+ }
+
+ static final IntType INSTANCE = new IntType();
+
+ @Override
+ public String describe() {
+ return "Int";
+ }
+
+ @Override
+ public String toString() {
+ return describe();
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/types/StringType.java b/src/main/java/org/shedlang/compiler/types/StringType.java
index 9b4351cd..eb2374a3 100644
--- a/src/main/java/org/shedlang/compiler/types/StringType.java
+++ b/src/main/java/org/shedlang/compiler/types/StringType.java
@@ -5,4 +5,14 @@ public final class StringType implements Type {
private StringType() {
}
+
+ @Override
+ public String describe() {
+ return "String";
+ }
+
+ @Override
+ public String toString() {
+ return describe();
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/types/Type.java b/src/main/java/org/shedlang/compiler/types/Type.java
index 267fdcb8..5077776c 100644
--- a/src/main/java/org/shedlang/compiler/types/Type.java
+++ b/src/main/java/org/shedlang/compiler/types/Type.java
@@ -1,4 +1,5 @@
package org.shedlang.compiler.types;
-public sealed interface Type permits FunctionType, StringType, UnitType {
+public sealed interface Type permits BoolType, FunctionType, IntType, StringType, UnitType {
+ String describe();
}
diff --git a/src/main/java/org/shedlang/compiler/types/Types.java b/src/main/java/org/shedlang/compiler/types/Types.java
index 0151f7ad..9655d2bb 100644
--- a/src/main/java/org/shedlang/compiler/types/Types.java
+++ b/src/main/java/org/shedlang/compiler/types/Types.java
@@ -4,6 +4,8 @@ public class Types {
private Types() {
}
+ public static final Type BOOL = BoolType.INSTANCE;
+ public static final Type INT = IntType.INSTANCE;
public static final Type STRING = StringType.INSTANCE;
public static final Type UNIT = UnitType.INSTANCE;
}
diff --git a/src/main/java/org/shedlang/compiler/types/UnitType.java b/src/main/java/org/shedlang/compiler/types/UnitType.java
index a84b66bd..acc7aad0 100644
--- a/src/main/java/org/shedlang/compiler/types/UnitType.java
+++ b/src/main/java/org/shedlang/compiler/types/UnitType.java
@@ -1,8 +1,18 @@
package org.shedlang.compiler.types;
public final class UnitType implements Type {
+ static final UnitType INSTANCE = new UnitType();
+
private UnitType() {
}
- static final UnitType INSTANCE = new UnitType();
+ @Override
+ public String describe() {
+ return "Unit";
+ }
+
+ @Override
+ public String toString() {
+ return describe();
+ }
}