From a3887cd8bd6acedca45a1e76e48d1d0ed9b63942 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Mar 2024 11:20:57 +0000 Subject: Include type-level params in TypedFunctionSignatureNode --- .../typed/TypedFunctionSignatureNodeMatcher.java | 7 +++++ .../TypeCheckerFunctionSignatureTests.java | 30 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNodeMatcher.java index ca2e64ae..d6038729 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNodeMatcher.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNodeMatcher.java @@ -3,6 +3,7 @@ package org.shedlang.compiler.ast.typed; import org.pcollections.Empty; import org.pcollections.PVector; import org.shedlang.compiler.testing.MatcherBuilder; +import org.shedlang.compiler.types.TypeParam; import org.zwobble.precisely.Matcher; import java.util.Optional; @@ -48,4 +49,10 @@ public class TypedFunctionSignatureNodeMatcher extends MatcherBuilder< public TypedFunctionSignatureNodeMatcher withReturnType(Matcher> returnType) { return with(has("returnType", x -> x.returnType(), isOptionalOf(returnType))); } + + public TypedFunctionSignatureNodeMatcher withTypeLevelParams( + Matcher>> typeLevelParams + ) { + return with(has("typeLevelParams", x -> x.typeLevelParams(), typeLevelParams)); + } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java index f0d13333..c1557bbc 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java @@ -94,6 +94,36 @@ public class TypeCheckerFunctionSignatureTests { ); } + @Test + public void typeLevelParamsAreTypedChecked() { + var untyped = UntypedFunctionSignatureNode.builder() + .withTypeLevelParams(List.of( + Untyped.typeLevelParam("T") + )) + .build(); + var namespaceName = NamespaceName.of("Example"); + var context = TypeCheckerContext.EMPTY + .enterNamespace(namespaceName, P.map()); + + var typed = typeCheckFunctionSignature( + untyped, + Optional.of(new Scope.Function(namespaceName, "f")), + context + ); + + assertThat( + typed, + isTypedFunctionSignatureNode() + .withTypeLevelParams(isOptionalOf(isSequence( + equalTo(TypeParam.forFunction( + namespaceName, + "f", + "T" + )) + ))) + ); + } + @Test public void paramTypesCanReferenceTypeLevelParams() { var untyped = UntypedFunctionSignatureNode.builder() -- cgit v1.2.3