From de58ca8b2a4afa65f111292bbc3283aa9427ec8f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 9 Jun 2023 18:49:21 +0100 Subject: Add Bool and Int types --- .../java/org/shedlang/compiler/types/BoolType.java | 18 ++++++++++++++ .../org/shedlang/compiler/types/FunctionType.java | 29 ++++++++++++++++++++++ .../java/org/shedlang/compiler/types/IntType.java | 18 ++++++++++++++ .../org/shedlang/compiler/types/StringType.java | 10 ++++++++ .../java/org/shedlang/compiler/types/Type.java | 3 ++- .../java/org/shedlang/compiler/types/Types.java | 2 ++ .../java/org/shedlang/compiler/types/UnitType.java | 12 ++++++++- 7 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/types/BoolType.java create mode 100644 src/main/java/org/shedlang/compiler/types/IntType.java (limited to 'src/main/java') 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 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 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(); + } } -- cgit v1.2.3