From 65e3321942082459badd006f0fed8efee474e8e0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 Sep 2023 17:52:53 +0100 Subject: Type check tuples --- .../compiler/ast/typed/TypedExpressionNode.java | 2 +- .../compiler/ast/typed/TypedTupleNode.java | 13 +++++++++++ .../shedlang/compiler/stackir/StackCompiler.java | 3 +++ .../shedlang/compiler/typechecker/TypeChecker.java | 25 +++++++++++++++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedTupleNode.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 index 9c9ddbf0..8d0d323e 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java @@ -4,6 +4,6 @@ import org.shedlang.compiler.types.Type; public sealed interface TypedExpressionNode extends TypedNode - permits TypedBinaryOperationNode, TypedBoolLiteralNode, TypedCallNode, TypedIfNode, TypedIntLiteralNode, TypedReferenceNode, TypedStringLiteralNode { + permits TypedBinaryOperationNode, TypedBoolLiteralNode, TypedCallNode, TypedIfNode, TypedIntLiteralNode, TypedReferenceNode, TypedStringLiteralNode, TypedTupleNode { Type type(); } diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedTupleNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedTupleNode.java new file mode 100644 index 00000000..d03bd91c --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedTupleNode.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.ast.typed; + +import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.types.Type; + +import java.util.List; + +public record TypedTupleNode( + List elements, + Type type, + Source source +) implements TypedExpressionNode { +} diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index 31dffc42..61932ada 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -132,6 +132,9 @@ public class StackCompiler { case TypedStringLiteralNode typedStringLiteralNode -> compileStringLiteral(typedStringLiteralNode, context); + + case TypedTupleNode typedTupleNode -> + throw new UnsupportedOperationException("TODO"); }; } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index ebdb7161..8f0d363a 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -373,7 +373,7 @@ public class TypeChecker { typeCheckStringLiteral(untypedStringLiteral, context); case UntypedTupleNode untypedTuple -> - throw new UnsupportedOperationException("TODO"); + typeCheckTuple(untypedTuple, context); }; } @@ -796,6 +796,29 @@ public class TypeChecker { }; } + private static TypeCheckerResult typeCheckTuple( + UntypedTupleNode untyped, + TypeCheckerContext context + ) { + var typedElements = new ArrayList(); + + for (var untypedElement : untyped.elements()) { + var typedElementResult = typeCheckExpression(untypedElement, context); + var typedElement = typedElementResult.value(); + context = typedElementResult.context(); + + typedElements.add(typedElement); + } + + var type = new TupleType( + typedElements.stream() + .map(typedElement -> typedElement.type()) + .toList() + ); + + return context.toResult(new TypedTupleNode(typedElements, type, untyped.source())); + } + private static TypedTupleTypeNode typeCheckTupleType( UntypedTupleTypeNode untyped, TypeCheckerContext context -- cgit v1.2.3