From 188006a7a103106924fd7e16edb1cafb352eb78c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 7 Nov 2023 16:41:51 +0000 Subject: Add (unsound) basic type-checking for resume statements --- .../org/shedlang/compiler/ast/typed/TypedNodeMatchers.java | 11 ++++++++++- .../compiler/typechecker/TypeCheckerFunctionReturnTests.java | 2 +- .../shedlang/compiler/typechecker/TypeCheckerTryTests.java | 11 +++++------ .../compiler/typechecker/TypeCheckerUnitLiteralTests.java | 4 ++-- 4 files changed, 18 insertions(+), 10 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java index ec392e5c..1c0cad87 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -250,6 +250,15 @@ public class TypedNodeMatchers { ); } + public static Matcher isTypedResumeNode( + Matcher expression + ) { + return instanceOf( + TypedResumeNode.class, + has("expression", x -> x.expression(), expression) + ); + } + public static Matcher isTypedStringAddNode( Matcher left, Matcher right @@ -361,7 +370,7 @@ public class TypedNodeMatchers { return isTypedTypeLevelReferenceNode(name, equalTo(value)); } - public static Matcher isTypedUnitNode() { + public static Matcher isTypedUnitLiteralNode() { return instanceOf(TypedUnitLiteralNode.class); } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionReturnTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionReturnTests.java index 32908c34..da130bcc 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionReturnTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionReturnTests.java @@ -37,7 +37,7 @@ public class TypeCheckerFunctionReturnTests { var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); - assertThat(typed.value(), isTypedFunctionReturnNode(isTypedUnitNode())); + assertThat(typed.value(), isTypedFunctionReturnNode(isTypedUnitLiteralNode())); } @Test diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java index d48eaf79..cffae60a 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java @@ -232,8 +232,7 @@ public class TypeCheckerTryTests { .addHandlerField( UntypedFunctionDefinitionNode.builder() .addPositionalParam("x", Untyped.typeLevelReference("String")) - // TODO: support type-checking resume - //.addStatement(Untyped.resume()) + .addStatement(Untyped.resume()) .withName("mark") .build() ) @@ -279,8 +278,7 @@ public class TypeCheckerTryTests { .withHandledEffect(Untyped.typeLevelReference(handledEffect.name())) .addHandlerField( UntypedFunctionDefinitionNode.builder() - // TODO: support type-checking resume - //.addStatement(Untyped.resume()) + .addStatement(Untyped.resume()) .withName("mark") .build() ) @@ -294,7 +292,6 @@ public class TypeCheckerTryTests { ) .enterFunction( P.map( - Map.entry("String", Variable.defined(Types.metaType(Types.STRING), VariableType.CONSTANT)), Map.entry(handledEffect.name(), Variable.defined(Types.effectType(handledEffect), VariableType.CONSTANT)) ), Effects.NONE, @@ -309,7 +306,9 @@ public class TypeCheckerTryTests { .withHandlerFields(isSequence( isTypedFunctionDefinitionNode() .withName("mark") - .withBodyBlock(isTypedBlockNode(isSequence())) + .withBodyBlock(isTypedBlockNode(isSequence( + isTypedResumeNode(isTypedUnitLiteralNode()) + ))) )) ); } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerUnitLiteralTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerUnitLiteralTests.java index 07f57003..21e35974 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerUnitLiteralTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerUnitLiteralTests.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.types.Types; -import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedUnitNode; +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedUnitLiteralNode; import static org.shedlang.compiler.typechecker.TypeCheckerTesting.typeCheckExpression; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; @@ -16,7 +16,7 @@ public class TypeCheckerUnitLiteralTests { var typed = typeCheckExpression(untyped, TypeCheckerContext.EMPTY); - assertThat(typed.value(), isTypedUnitNode()); + assertThat(typed.value(), isTypedUnitLiteralNode()); assertThat(typed.value().type(), equalTo(Types.UNIT)); } } -- cgit v1.2.3