aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 17:34:54 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 17:34:54 +0100
commitf544626a85a2e5fedaec200c231b69728fbf99e9 (patch)
treef28d30e842082cce2afe58fda60ec5c0e3093376 /src/main/java
parentd6c6abb4e28f851969a40ff207648308be031090 (diff)
Type check assignment to tuple target
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java22
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 -> {