diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-17 17:34:54 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-17 17:34:54 +0100 |
| commit | f544626a85a2e5fedaec200c231b69728fbf99e9 (patch) | |
| tree | f28d30e842082cce2afe58fda60ec5c0e3093376 /src/main/java | |
| parent | d6c6abb4e28f851969a40ff207648308be031090 (diff) | |
Type check assignment to tuple target
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 22 |
1 files changed, 20 insertions, 2 deletions
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<TypedTargetNode>(); + + 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 -> { |
