From f544626a85a2e5fedaec200c231b69728fbf99e9 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 Sep 2023 17:34:54 +0100 Subject: Type check assignment to tuple target --- .../shedlang/compiler/typechecker/TypeChecker.java | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 2c2a9e0b..eafa9f47 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -864,8 +864,26 @@ public class TypeChecker { yield context.toResult(new TypedTargetNode.Reassign(reassign.name(), target.source())); } - case UntypedTargetNode.Tuple tuple -> { - throw new UnsupportedOperationException("TODO"); + case UntypedTargetNode.Tuple targetTuple -> { + var tupleType = (TupleType) expressionType; + + var typedTargetElements = new ArrayList(); + + for (var elementIndex = 0; elementIndex < targetTuple.elements().size(); elementIndex++) { + var untypedTargetElement = targetTuple.elements().get(elementIndex); + var elementType = tupleType.elements().get(elementIndex); + + var typedTargetElementResult = typeCheckTarget(untypedTargetElement, elementType, context); + var typedTargetElement = typedTargetElementResult.value(); + context = typedTargetElementResult.context(); + + typedTargetElements.add(typedTargetElement); + } + + yield context.toResult(new TypedTargetNode.Tuple( + typedTargetElements, + targetTuple.source() + )); } case UntypedTargetNode.Val val -> { -- cgit v1.2.3