diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-07 16:41:51 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-07 16:41:51 +0000 |
| commit | 188006a7a103106924fd7e16edb1cafb352eb78c (patch) | |
| tree | ca04a8b711c020f1bbd3c5517dfee939c8afe39d /src/main/java | |
| parent | c22e9652e8a2904829bc7d5586074f38ded966f3 (diff) | |
Add (unsound) basic type-checking for resume statements
Diffstat (limited to 'src/main/java')
4 files changed, 34 insertions, 3 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java index 57a585a0..a79437ec 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.ast.typed; -public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedWhileNode, TypedAssignNode, TypedBlockReturnNode, TypedExpressionStatementNode, TypedFunctionReturnNode { +public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedAssignNode, TypedBlockReturnNode, TypedExpressionStatementNode, TypedFunctionReturnNode, TypedResumeNode, TypedWhileNode { TypedFunctionStatementBehaviour behaviour(); } diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedResumeNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedResumeNode.java new file mode 100644 index 00000000..6511d3b6 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedResumeNode.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.ast.typed; + +import org.shedlang.compiler.sources.Source; + +public record TypedResumeNode( + TypedExpressionNode expression, + Source source +) implements TypedFunctionStatementNode { + @Override + public TypedFunctionStatementBehaviour behaviour() { + return TypedFunctionStatementBehaviour.TERMINATE; + } +} diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index 8564a66d..0d467c0d 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -314,6 +314,9 @@ public class StackCompiler { case TypedFunctionReturnNode functionReturn -> compileFunctionReturn(functionReturn, context); + case TypedResumeNode resume -> + throw new UnsupportedOperationException("TODO"); + case TypedWhileNode while_ -> compileWhile(while_, context); }; diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 8dbf0927..5e1fc6e2 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -611,7 +611,10 @@ public class TypeChecker { returnType = implicitLowerBound.type(); } case ReturnTypeState.ImplicitUnknown implicitUnknown -> { - throw new UnsupportedOperationException("TODO"); + // If we've reached this point, then there are no returns + // statements, nor a block return, so this function must never + // return. + returnType = Types.BOTTOM; } case ReturnTypeState.NotInFunction notInFunction -> { // TODO: better error @@ -945,7 +948,7 @@ public class TypeChecker { typeCheckAssign(assign, context); case UntypedResumeNode resume -> - throw new UnsupportedOperationException("TODO"); + typeCheckResume(resume, context); case UntypedBlockReturnNode blockReturn -> typeCheckBlockReturn(blockReturn, context); @@ -1274,6 +1277,18 @@ public class TypeChecker { }); } + private static TypeCheckerResult<TypedResumeNode> typeCheckResume( + UntypedResumeNode untyped, + TypeCheckerContext context + ) { + context = typeCheckFunctionReturnValue(Types.UNIT, untyped.source(), context); + + return context.toResult(new TypedResumeNode( + new TypedUnitLiteralNode(untyped.source()), + untyped.source() + )); + } + private static TypeCheckerResult<TypedStringLiteralNode> typeCheckStringLiteral( UntypedStringLiteralNode untyped, TypeCheckerContext context |
