aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 16:26:01 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 16:26:01 +0100
commit99bfde40214711b05043907ad773304bd8ea5e93 (patch)
tree3b21bb7e062c70ca9c8a3c8c89e06512e753c3e9 /src/main/java
parent70659e173011cf7ad5d7052f8a94a20e98c183b8 (diff)
Add untyped tuple target
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java7
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java4
3 files changed, 14 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java
index 4b42a82c..3cea8c2d 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java
@@ -2,8 +2,11 @@ package org.shedlang.compiler.ast.untyped;
import org.shedlang.compiler.sources.Source;
+import java.util.List;
+
public sealed interface UntypedTargetNode extends UntypedNode {
record Reassign(String name, Source source) implements UntypedTargetNode {}
+ record Tuple(List<UntypedTargetNode> elements, Source source) implements UntypedTargetNode {}
record Val(String name, Source source) implements UntypedTargetNode, UntypedVariableDeclarationNode {}
record Var(String name, Source source) implements UntypedTargetNode, UntypedVariableDeclarationNode {}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
index 87823b46..43a087b5 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
@@ -82,6 +82,13 @@ class DeclaredVariables {
case UntypedTargetNode.Reassign reassign ->
variables;
+ case UntypedTargetNode.Tuple tuple -> {
+ for (var element : tuple.elements()) {
+ variables = forTarget(element, variables);
+ }
+ yield variables;
+ }
+
case UntypedTargetNode.Var var ->
variables.plus(new DeclaredVariable(
var.name(),
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 5db00b44..bc5ff8b1 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -829,6 +829,10 @@ public class TypeChecker {
yield context.toResult(new TypedTargetNode.Reassign(reassign.name(), target.source()));
}
+ case UntypedTargetNode.Tuple tuple -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+
case UntypedTargetNode.Val val -> {
context = context.define(
val.name(),