From f8174b842a7b2fdab34146c543dade8f92e45b1d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 9 Jun 2023 17:59:45 +0100 Subject: Add type checking for string literal --- .../compiler/ast/typed/TypedExpressionNode.java | 9 +++++++ .../compiler/ast/typed/TypedStringLiteralNode.java | 15 +++++++++++ .../shedlang/compiler/typechecker/TypeChecker.java | 29 ++++++++++++++++++++++ .../compiler/typechecker/TypeCheckerContext.java | 5 ++++ .../org/shedlang/compiler/types/StringType.java | 8 ++++++ .../java/org/shedlang/compiler/types/Type.java | 4 +++ .../java/org/shedlang/compiler/types/Types.java | 8 ++++++ 7 files changed, 78 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedStringLiteralNode.java create mode 100644 src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java create mode 100644 src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java create mode 100644 src/main/java/org/shedlang/compiler/types/StringType.java create mode 100644 src/main/java/org/shedlang/compiler/types/Type.java create mode 100644 src/main/java/org/shedlang/compiler/types/Types.java (limited to 'src/main/java') 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; +} -- cgit v1.2.3