aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-09 19:13:02 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-09 19:13:02 +0100
commitbf55e95953edeefad8e83c034bfb4920d99c29ba (patch)
tree7e5e5060bf88af358e90e4d03cccc4c80f7630a3 /src/main/java
parentde846b1c61ba146da38be8a347d1c70dece75e52 (diff)
Add UntypedBlockNode
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedConditionalBranchNode.java4
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java5
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java21
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java4
6 files changed, 32 insertions, 15 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java
new file mode 100644
index 00000000..2d686147
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java
@@ -0,0 +1,11 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+import java.util.List;
+
+public record UntypedBlockNode(
+ List<UntypedFunctionStatementNode> statements,
+ Source source
+) implements UntypedNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedConditionalBranchNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedConditionalBranchNode.java
index 7f9e96aa..b2558e46 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedConditionalBranchNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedConditionalBranchNode.java
@@ -2,11 +2,9 @@ package org.shedlang.compiler.ast.untyped;
import org.shedlang.compiler.sources.Source;
-import java.util.List;
-
public record UntypedConditionalBranchNode(
UntypedExpressionNode condition,
- List<UntypedFunctionStatementNode> body,
+ UntypedBlockNode body,
Source source
) implements UntypedNode {
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
index 7c01256d..a8a6fa71 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
@@ -5,7 +5,6 @@ import org.pcollections.PVector;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.sources.Sources;
-import java.util.List;
import java.util.Optional;
public record UntypedFunctionDefinitionNode(
@@ -13,7 +12,7 @@ public record UntypedFunctionDefinitionNode(
UntypedParamsNode params,
Optional<UntypedTypeLevelExpressionNode> effect,
UntypedTypeLevelExpressionNode returnType,
- List<UntypedFunctionStatementNode> body,
+ UntypedBlockNode body,
Source source
) implements UntypedNamespaceStatementNode {
public static Builder builder() {
@@ -41,7 +40,7 @@ public record UntypedFunctionDefinitionNode(
new UntypedParamsNode(positionalParams, namedParams, Sources.NULL),
effect,
returnType,
- body,
+ new UntypedBlockNode(body, Sources.NULL),
Sources.NULL
);
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java
index 6baff19c..96f6172a 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java
@@ -6,7 +6,7 @@ import java.util.List;
public record UntypedIfNode(
List<UntypedConditionalBranchNode> conditionalBranches,
- List<UntypedFunctionStatementNode> elseBody,
+ UntypedBlockNode elseBody,
Source source
) implements UntypedExpressionNode {
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 3243eb17..184c3fdd 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -104,11 +104,16 @@ public class Parser {
return new UntypedArgsNode(positional, named, argsSource);
}
- private static List<UntypedFunctionStatementNode> parseBlock(TokenIterator<TokenType> tokens) {
+ private static UntypedBlockNode parseBlock(TokenIterator<TokenType> tokens) {
+ var start = tokens.position();
+
tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
if (tokens.trySkip(TokenType.SYMBOL_BRACE_CLOSE)) {
- return List.of();
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedBlockNode(List.of(), source);
}
var body = new ArrayList<UntypedFunctionStatementNode>();
@@ -123,7 +128,11 @@ public class Parser {
statement.behaviour() == UntypedFunctionStatementBehaviour.BLOCK_RETURN
) {
tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
- return body;
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedBlockNode(body, source);
}
}
}
@@ -273,7 +282,7 @@ public class Parser {
var start = tokens.position();
var conditionalBranches = new ArrayList<UntypedConditionalBranchNode>();
- var elseBody = List.<UntypedFunctionStatementNode>of();
+ var elseBody = Optional.<UntypedBlockNode>empty();
while (true) {
var conditionalBranch = parseConditionalBranch(tokens);
@@ -284,7 +293,7 @@ public class Parser {
}
if (!tokens.isNext(TokenType.KEYWORD_IF)) {
- elseBody = parseBlock(tokens);
+ elseBody = Optional.of(parseBlock(tokens));
break;
}
@@ -295,7 +304,7 @@ public class Parser {
return new UntypedIfNode(
conditionalBranches,
- elseBody,
+ elseBody.orElseGet(() -> new UntypedBlockNode(List.of(), end)),
source
);
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index a604ae0b..60df3484 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -344,7 +344,7 @@ public class TypeChecker {
);
}
- for (var statement : untyped.body()) {
+ for (var statement : untyped.body().statements()) {
for (var targetVariable : targetVariables(statement)) {
bodyEnvironment = bodyEnvironment.add(
targetVariable.name(),
@@ -361,7 +361,7 @@ public class TypeChecker {
);
var bodyResult = bodyContext.mapWithContext(
- untyped.body(),
+ untyped.body().statements(),
TypeChecker::typeCheckFunctionStatement
);
var typedBody = bodyResult.value();