From 71a8ca11b03331a92bb271cbd1fbcb877e587300 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 2 Jul 2023 12:19:46 +0100 Subject: Check call to function with effect is marked with effects --- .../compiler/typechecker/TypeCheckerCallTests.java | 22 ++++++++++++++++++++++ .../TypeCheckerFunctionDefinitionTests.java | 3 ++- .../typechecker/TypeCheckerNamespaceTests.java | 7 ++----- 3 files changed, 26 insertions(+), 6 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java index 24ded26f..ad1ab07e 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.typechecker.errors.*; import org.shedlang.compiler.typechecker.typesets.TypeSets; +import org.shedlang.compiler.types.Effects; import org.shedlang.compiler.types.FunctionType; import org.shedlang.compiler.types.Types; import org.shedlang.compiler.util.P; @@ -252,4 +253,25 @@ public class TypeCheckerCallTests { assertThat(error.argName(), equalTo("x")); } + + @Test + public void givenFunctionHasEffectsWhenCallingFunctionWithoutExplicitEffectsThenErrorIsThrown() { + var untyped = Untyped.call( + Untyped.reference("f"), + List.of() + ); + var functionType = FunctionType.builder() + .withEffect(Effects.IO) + .withReturnType(Types.UNIT) + .build(); + var context = TypeCheckerContext.EMPTY + .enter(P.map(Map.entry("f", functionType))); + + var error = assertThrows( + CallIsMissingEffectsError.class, + () -> TypeChecker.typeCheckExpression(untyped, context) + ); + + assertThat(error.effect(), equalTo(Effects.IO)); + } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java index 26ea2693..b7b2d66e 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java @@ -36,7 +36,7 @@ public class TypeCheckerFunctionDefinitionTests { .withEffect(isOptionalEmpty()) .withReturnType(isTypedTypeLevelReferenceNode("Unit", Types.UNIT)) .withBody(isSequence()) - .withType(new FunctionType(List.of(), List.of(), Types.UNIT)) + .withType(new FunctionType(List.of(), List.of(), Effects.NONE, Types.UNIT)) ); } @@ -68,6 +68,7 @@ public class TypeCheckerFunctionDefinitionTests { .withType(new FunctionType( List.of(Types.STRING), List.of(new NamedParam("y", Types.INT)), + Effects.NONE, Types.UNIT )) ); diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java index b9b6679c..8d537515 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java @@ -3,10 +3,7 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedFunctionDefinitionNode; -import org.shedlang.compiler.types.FunctionType; -import org.shedlang.compiler.types.NamespaceName; -import org.shedlang.compiler.types.NamespaceTypeInfo; -import org.shedlang.compiler.types.Types; +import org.shedlang.compiler.types.*; import org.shedlang.compiler.util.P; import java.util.List; @@ -77,7 +74,7 @@ public class TypeCheckerNamespaceTests { assertThat( result.context().namespaceTypeInfo().get(namespaceName), equalTo(new NamespaceTypeInfo(P.orderedMap( - Map.entry("f", new FunctionType(List.of(), List.of(), Types.UNIT)) + Map.entry("f", new FunctionType(List.of(), List.of(), Effects.NONE, Types.UNIT)) ))) ); } -- cgit v1.2.3