From fe34bc3d273b902ab0abd38c9547741274fdc14a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 31 Dec 2023 11:25:32 +0000 Subject: Add type-level params to FunctionType --- .../java/org/shedlang/compiler/ShedBuiltins.java | 2 + .../ast/typed/TypedFunctionDefinitionNode.java | 3 +- .../ast/typed/TypedFunctionExpressionNode.java | 3 +- .../ast/typed/TypedTryHandlerMethodNode.java | 3 +- .../shedlang/compiler/config/ConfigChecker.java | 2 + .../shedlang/compiler/typechecker/TypeChecker.java | 5 +++ .../compiler/typechecker/TypeCheckerSubTyping.java | 1 + .../org/shedlang/compiler/types/FunctionType.java | 52 +++++++++++++++++++--- .../shedlang/compiler/types/TypeSubstitution.java | 3 ++ 9 files changed, 65 insertions(+), 9 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ShedBuiltins.java b/src/main/java/org/shedlang/compiler/ShedBuiltins.java index 14a2e6ce..d08644ff 100644 --- a/src/main/java/org/shedlang/compiler/ShedBuiltins.java +++ b/src/main/java/org/shedlang/compiler/ShedBuiltins.java @@ -6,6 +6,7 @@ import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.types.Types; import java.util.List; +import java.util.Optional; public class ShedBuiltins { private ShedBuiltins() { @@ -16,6 +17,7 @@ public class ShedBuiltins { public static final String PRINT_NAME = "print"; public static final FunctionType PRINT_TYPE = new FunctionType( + Optional.empty(), List.of(Types.STRING), List.of(), Effects.IO, diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java index 5e19816c..3d1089b0 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java @@ -7,6 +7,7 @@ import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.*; import java.util.List; +import java.util.Optional; public record TypedFunctionDefinitionNode( String name, @@ -22,7 +23,7 @@ public record TypedFunctionDefinitionNode( FreeVariables.builder(), Empty.vector(), Empty.vector(), - new FunctionType(List.of(), List.of(), Effects.NONE, Types.UNIT) + new FunctionType(Optional.empty(), List.of(), List.of(), Effects.NONE, Types.UNIT) ); } diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionExpressionNode.java index 765f0891..8c9103b5 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionExpressionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionExpressionNode.java @@ -7,6 +7,7 @@ import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.*; import java.util.List; +import java.util.Optional; public record TypedFunctionExpressionNode( TypedFunctionSignatureNode signature, @@ -20,7 +21,7 @@ public record TypedFunctionExpressionNode( FreeVariables.builder(), Empty.vector(), Empty.vector(), - new FunctionType(List.of(), List.of(), Effects.NONE, Types.UNIT) + new FunctionType(Optional.empty(), List.of(), List.of(), Effects.NONE, Types.UNIT) ); } diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedTryHandlerMethodNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedTryHandlerMethodNode.java index 209c0942..8d0373ce 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedTryHandlerMethodNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedTryHandlerMethodNode.java @@ -7,6 +7,7 @@ import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.*; import java.util.List; +import java.util.Optional; public record TypedTryHandlerMethodNode( String name, @@ -24,7 +25,7 @@ public record TypedTryHandlerMethodNode( FreeVariables.builder(), Empty.vector(), Empty.vector(), - new FunctionType(List.of(), List.of(), Effects.NONE, Types.UNIT), + new FunctionType(Optional.empty(), List.of(), List.of(), Effects.NONE, Types.UNIT), Types.BOTTOM ); } diff --git a/src/main/java/org/shedlang/compiler/config/ConfigChecker.java b/src/main/java/org/shedlang/compiler/config/ConfigChecker.java index 5ffa074c..8648b8a7 100644 --- a/src/main/java/org/shedlang/compiler/config/ConfigChecker.java +++ b/src/main/java/org/shedlang/compiler/config/ConfigChecker.java @@ -7,6 +7,7 @@ import org.shedlang.compiler.types.FunctionType; import org.shedlang.compiler.types.Types; import java.util.List; +import java.util.Optional; import static org.shedlang.compiler.config.MainFunction.MAIN_FUNCTION_NAME; @@ -32,6 +33,7 @@ public class ConfigChecker { )); var expectedMainType = new FunctionType( + Optional.empty(), List.of(), List.of(), Effects.IO, diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 39ab0e28..f47e1273 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -481,6 +481,7 @@ public class TypeChecker { .toList(); return new FunctionType( + Optional.empty(), List.of(), namedParams, Effects.NONE, @@ -887,6 +888,7 @@ public class TypeChecker { ); var type = new FunctionType( + Optional.empty(), positionalParams.stream() .map(param -> param.type()) .toList(), @@ -949,6 +951,7 @@ public class TypeChecker { context = typedBodyResult.context(); var type = new FunctionType( + Optional.empty(), partialSignature.positionalParams().stream() .map(x -> x.type()) .toList(), @@ -1200,6 +1203,7 @@ public class TypeChecker { return new TypedFunctionTypeNode( new FunctionType( + Optional.empty(), positionalParams, namedParams, effect, @@ -2060,6 +2064,7 @@ public class TypeChecker { context = typedBodyResult.context(); var type = new FunctionType( + Optional.empty(), partialSignature.positionalParams().stream() .map(x -> x.type()) .toList(), diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java index e96d433f..d6a254cc 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java @@ -142,6 +142,7 @@ public class TypeCheckerSubTyping { supertype instanceof FunctionType supertypeFunction && subtype instanceof FunctionType subtypeFunction ) { + // TODO: handle type params if (subtypeFunction.positionalParams().size() != supertypeFunction.positionalParams().size()) { return Optional.empty(); } diff --git a/src/main/java/org/shedlang/compiler/types/FunctionType.java b/src/main/java/org/shedlang/compiler/types/FunctionType.java index e217fbd4..026b3bd0 100644 --- a/src/main/java/org/shedlang/compiler/types/FunctionType.java +++ b/src/main/java/org/shedlang/compiler/types/FunctionType.java @@ -4,10 +4,12 @@ import org.pcollections.Empty; import org.pcollections.PVector; import java.util.List; +import java.util.Optional; import static org.shedlang.compiler.util.Iterables.forEachInterspersed; public record FunctionType( + Optional> typeLevelParams, List positionalParams, List namedParams, Effect effect, @@ -54,6 +56,7 @@ public record FunctionType( public FunctionType withEffect(Effect effect) { return new FunctionType( + this.typeLevelParams, this.positionalParams, this.namedParams, effect, @@ -62,34 +65,71 @@ public record FunctionType( } public static Builder builder() { - return new Builder(Empty.vector(), Empty.vector(), Effects.NONE, Types.UNIT); + return new Builder( + Optional.empty(), + Empty.vector(), + Empty.vector(), + Effects.NONE, + Types.UNIT + ); } public record Builder( + Optional> typeLevelParams, PVector positionalParams, PVector namedParams, Effect effect, Type returnType ) { public FunctionType build() { - return new FunctionType(positionalParams, namedParams, effect, returnType); + return new FunctionType( + typeLevelParams, + positionalParams, + namedParams, + effect, + returnType + ); } public Builder addNamedParam(String name, Type type) { var namedParam = new NamedParam(name, type); - return new Builder(positionalParams, namedParams.plus(namedParam), effect, returnType); + return new Builder( + this.typeLevelParams, + this.positionalParams, + this.namedParams.plus(namedParam), + this.effect, + this.returnType + ); } public Builder addPositionalParam(Type type) { - return new Builder(positionalParams.plus(type), namedParams, effect, returnType); + return new Builder( + this.typeLevelParams, + this.positionalParams.plus(type), + this.namedParams, + this.effect, + this.returnType + ); } public Builder withEffect(Effect effect) { - return new Builder(positionalParams, namedParams, effect, returnType); + return new Builder( + this.typeLevelParams, + this.positionalParams, + this.namedParams, + effect, + this.returnType + ); } public Builder withReturnType(Type returnType) { - return new Builder(positionalParams, namedParams, effect, returnType); + return new Builder( + this.typeLevelParams, + this.positionalParams, + this.namedParams, + this.effect, + returnType + ); } } } diff --git a/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java b/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java index e03ff225..e8511065 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java +++ b/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java @@ -1,5 +1,7 @@ package org.shedlang.compiler.types; +import java.util.Optional; + public class TypeSubstitution { private TypeSubstitution() {} @@ -15,6 +17,7 @@ public class TypeSubstitution { substituteConstructedType(constructedType, map); case FunctionType functionType -> new FunctionType( + Optional.empty(), functionType.positionalParams().stream() .map(param -> substitute(param, map)) .toList(), -- cgit v1.2.3