diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-09 18:48:41 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-09 18:48:41 +0100 |
| commit | d6212e2189d315fe2c423919ae9c27010a886316 (patch) | |
| tree | a1a93bb71c3205c8f789f0f23c66ab07cb668f21 /src/main/java | |
| parent | e87797aff31cd99a6a08e46cb52aff61e1c7d75d (diff) | |
Add behaviour to untyped function statements
Diffstat (limited to 'src/main/java')
7 files changed, 28 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockReturnNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockReturnNode.java index 55d6cca0..9afbab90 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockReturnNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockReturnNode.java @@ -6,4 +6,8 @@ public record UntypedBlockReturnNode( UntypedExpressionNode expression, Source source ) implements UntypedFunctionStatementNode { + @Override + public UntypedFunctionStatementBehaviour behaviour() { + return UntypedFunctionStatementBehaviour.BLOCK_RETURN; + } } diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionStatementNode.java index dadc4be6..34b275c6 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionStatementNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionStatementNode.java @@ -6,4 +6,8 @@ public record UntypedExpressionStatementNode( UntypedExpressionNode expression, Source source ) implements UntypedFunctionStatementNode { + @Override + public UntypedFunctionStatementBehaviour behaviour() { + return UntypedFunctionStatementBehaviour.NONE; + } } diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionReturnNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionReturnNode.java index c3f5663e..94eb7a65 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionReturnNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionReturnNode.java @@ -6,4 +6,8 @@ public record UntypedFunctionReturnNode( UntypedExpressionNode expression, Source source ) implements UntypedFunctionStatementNode { + @Override + public UntypedFunctionStatementBehaviour behaviour() { + return UntypedFunctionStatementBehaviour.TERMINATE; + } } diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementBehaviour.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementBehaviour.java new file mode 100644 index 00000000..71cfef75 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementBehaviour.java @@ -0,0 +1,7 @@ +package org.shedlang.compiler.ast.untyped; + +public enum UntypedFunctionStatementBehaviour { + TERMINATE, + BLOCK_RETURN, + NONE, +} diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java index c3e0466d..62322251 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java @@ -1,4 +1,5 @@ package org.shedlang.compiler.ast.untyped; public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedBlockReturnNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedValNode { + UntypedFunctionStatementBehaviour behaviour(); } diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java index 7f9926ea..13826cb7 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java @@ -7,4 +7,8 @@ public record UntypedValNode( UntypedExpressionNode expression, Source source ) implements UntypedFunctionStatementNode, UntypedNamespaceStatementNode { + @Override + public UntypedFunctionStatementBehaviour behaviour() { + return UntypedFunctionStatementBehaviour.NONE; + } } diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index bfb9c822..3243eb17 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -118,7 +118,10 @@ public class Parser { body.add(statement); - if (tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE) || statement instanceof UntypedBlockReturnNode) { + if ( + tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE) || + statement.behaviour() == UntypedFunctionStatementBehaviour.BLOCK_RETURN + ) { tokens.skip(TokenType.SYMBOL_BRACE_CLOSE); return body; } |
