aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-09 17:59:45 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-09 17:59:45 +0100
commitf8174b842a7b2fdab34146c543dade8f92e45b1d (patch)
tree5cf8cf3f67473ab4c0e27028f4e9f5dee988c3af /src/main/java
parent5bddd28d6ba1bcf1b6245771ae3ce715c3079f93 (diff)
Add type checking for string literal
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java9
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedStringLiteralNode.java15
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java29
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java5
-rw-r--r--src/main/java/org/shedlang/compiler/types/StringType.java8
-rw-r--r--src/main/java/org/shedlang/compiler/types/Type.java4
-rw-r--r--src/main/java/org/shedlang/compiler/types/Types.java8
7 files changed, 78 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java
new file mode 100644
index 00000000..f7ce02dc
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java
@@ -0,0 +1,9 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Type;
+
+public sealed interface TypedExpressionNode permits TypedStringLiteralNode {
+ Source source();
+ Type type();
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedStringLiteralNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedStringLiteralNode.java
new file mode 100644
index 00000000..21f81e2c
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedStringLiteralNode.java
@@ -0,0 +1,15 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Type;
+import org.shedlang.compiler.types.Types;
+
+public record TypedStringLiteralNode(
+ String value,
+ Source source
+) implements TypedExpressionNode {
+ @Override
+ public Type type() {
+ return Types.STRING;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
new file mode 100644
index 00000000..d37eb347
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -0,0 +1,29 @@
+package org.shedlang.compiler.typechecker;
+
+import org.shedlang.compiler.ast.typed.TypedExpressionNode;
+import org.shedlang.compiler.ast.typed.TypedStringLiteralNode;
+import org.shedlang.compiler.ast.untyped.UntypedCallNode;
+import org.shedlang.compiler.ast.untyped.UntypedExpressionNode;
+import org.shedlang.compiler.ast.untyped.UntypedReferenceNode;
+import org.shedlang.compiler.ast.untyped.UntypedStringLiteralNode;
+
+public class TypeChecker {
+ private TypeChecker() {
+ }
+
+ public static TypedExpressionNode typeCheckExpression(
+ UntypedExpressionNode untyped,
+ TypeCheckerContext context
+ ) {
+ return switch (untyped) {
+ case UntypedStringLiteralNode untypedStringLiteral ->
+ new TypedStringLiteralNode(untypedStringLiteral.value(), untypedStringLiteral.source());
+
+ case UntypedCallNode untypedCall ->
+ throw new UnsupportedOperationException("TODO");
+
+ case UntypedReferenceNode untypedReference ->
+ throw new UnsupportedOperationException("TODO");
+ };
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
new file mode 100644
index 00000000..261e3e95
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
@@ -0,0 +1,5 @@
+package org.shedlang.compiler.typechecker;
+
+public class TypeCheckerContext {
+ public static final TypeCheckerContext EMPTY = new TypeCheckerContext();
+}
diff --git a/src/main/java/org/shedlang/compiler/types/StringType.java b/src/main/java/org/shedlang/compiler/types/StringType.java
new file mode 100644
index 00000000..9b4351cd
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/StringType.java
@@ -0,0 +1,8 @@
+package org.shedlang.compiler.types;
+
+public final class StringType implements Type {
+ static final StringType INSTANCE = new StringType();
+
+ private StringType() {
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/types/Type.java b/src/main/java/org/shedlang/compiler/types/Type.java
new file mode 100644
index 00000000..df8cebc5
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/Type.java
@@ -0,0 +1,4 @@
+package org.shedlang.compiler.types;
+
+public sealed interface Type permits StringType {
+}
diff --git a/src/main/java/org/shedlang/compiler/types/Types.java b/src/main/java/org/shedlang/compiler/types/Types.java
new file mode 100644
index 00000000..7c3556a5
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/Types.java
@@ -0,0 +1,8 @@
+package org.shedlang.compiler.types;
+
+public class Types {
+ private Types() {
+ }
+
+ public static final Type STRING = StringType.INSTANCE;
+}