diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-17 17:52:53 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-17 17:52:53 +0100 |
| commit | 65e3321942082459badd006f0fed8efee474e8e0 (patch) | |
| tree | 24eebce3fab94f84aeda17c68cebca653f047668 /src/main/java | |
| parent | 3224f1c3cd303ef1ed2ea13eb7a2ba4328a64ead (diff) | |
Type check tuples
Diffstat (limited to 'src/main/java')
4 files changed, 41 insertions, 2 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 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<TypedExpressionNode> 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<? extends TypedExpressionNode> typeCheckTuple( + UntypedTupleNode untyped, + TypeCheckerContext context + ) { + var typedElements = new ArrayList<TypedExpressionNode>(); + + 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 |
