From dfced83cd4ba6e49c395ea4106fc6f9fd7250de0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Mar 2024 14:07:54 +0000 Subject: Introduce TypeLevelParam --- .../ast/typed/TypedFunctionSignatureNode.java | 4 +-- .../shedlang/compiler/typechecker/TypeChecker.java | 29 +++++++++++++++------- .../compiler/typechecker/TypeCheckerSubTyping.java | 8 +++--- .../compiler/types/ConstructedStructType.java | 2 +- .../compiler/types/ConstructedSumType.java | 2 +- .../shedlang/compiler/types/ConstructedType.java | 2 +- .../org/shedlang/compiler/types/EffectParam.java | 2 +- .../org/shedlang/compiler/types/FunctionType.java | 10 ++++---- .../shedlang/compiler/types/TypeConstructor.java | 2 +- .../shedlang/compiler/types/TypeLevelParam.java | 5 ++++ .../shedlang/compiler/types/TypeLevelValue.java | 2 +- .../org/shedlang/compiler/types/TypeParam.java | 2 +- .../shedlang/compiler/types/TypeSubstitution.java | 3 ++- .../compiler/types/TypeSubstitutionMap.java | 15 +++++------ .../java/org/shedlang/compiler/types/Types.java | 8 +++--- 15 files changed, 58 insertions(+), 38 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/types/TypeLevelParam.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java index f5900768..4e66b819 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java @@ -6,13 +6,13 @@ import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.Effect; import org.shedlang.compiler.types.Type; -import org.shedlang.compiler.types.TypeParam; +import org.shedlang.compiler.types.TypeLevelParam; import java.util.List; import java.util.Optional; public record TypedFunctionSignatureNode( - Optional> typeLevelParams, + Optional> typeLevelParams, TypedParamsNode params, Optional> effect, Optional> returnType, diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 61e7eb9d..13319913 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -73,7 +73,8 @@ public class TypeChecker { var typeLevelArgs = receiverType.typeLevelParams() .map(typeLevelParams -> typeLevelParams.stream() - .map(param -> new TypeArg(param)) + // TODO: handle effect params + .map(param -> new TypeArg((TypeParam) param)) .toList() ); @@ -1077,7 +1078,7 @@ public class TypeChecker { typeLevelParams.orElse(List.of()).stream() .map(typeLevelParam -> Map.entry( typeLevelParam.name(), - Variable.defined(Types.metaType(typeLevelParam), VariableType.PARAM) + Variable.defined(Types.typeLevelValueType(typeLevelParam), VariableType.PARAM) )) .collect(PCollectors.toMap()) ); @@ -2119,18 +2120,28 @@ public class TypeChecker { return context.toResult(typed); } - static TypeParam typeCheckTypeLevelParam( + static TypeLevelParam typeCheckTypeLevelParam( UntypedTypeLevelParamNode untyped, Scope scope ) { - return new TypeParam( - scope, - untyped.name() - ); + return switch (untyped) { + case UntypedEffectParamNode untypedEffectParam -> + new EffectParam( + scope, + untyped.name() + ); + + case UntypedTypeParamNode untypedTypeParam -> + new TypeParam( + scope, + untyped.name() + ); + }; + } - private static List typeCheckTypeLevelParams( + private static List typeCheckTypeLevelParams( List typeLevelParamNodes, Scope scope ) { @@ -2350,7 +2361,7 @@ public class TypeChecker { // TODO: proper source environment = environment.add( param.name(), - Variable.defined(Types.metaType(param), VariableType.CONSTANT), + Variable.defined(Types.typeLevelValueType(param), VariableType.CONSTANT), Sources.NULL ); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java index 3a7c026b..1a0c0509 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java @@ -104,7 +104,7 @@ public class TypeCheckerSubTyping { ? upperBound : lowerBound; - return Map.entry(typeArg.param(), inferredType); + return Map.entry(typeArg.param(), inferredType); }) .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue())); @@ -196,13 +196,15 @@ public class TypeCheckerSubTyping { var subtypeArg = subtypeConstructed.args().get(i); var supertypeArg = supertypeConstructed.args().get(i); - var result1 = tryAddSubtypeConstraint(subtypeArg, supertypeArg, constraints); + // TODO: support effect params + var result1 = tryAddSubtypeConstraint((Type) subtypeArg, (Type) supertypeArg, constraints); if (result1.isEmpty()) { return Optional.empty(); } constraints = result1.get(); - var result2 = tryAddSubtypeConstraint(supertypeArg, subtypeArg, constraints); + // TODO: support effect params + var result2 = tryAddSubtypeConstraint((Type) supertypeArg, (Type) subtypeArg, constraints); if (result2.isEmpty()) { return Optional.empty(); } diff --git a/src/main/java/org/shedlang/compiler/types/ConstructedStructType.java b/src/main/java/org/shedlang/compiler/types/ConstructedStructType.java index d0906f94..bf7cf4d5 100644 --- a/src/main/java/org/shedlang/compiler/types/ConstructedStructType.java +++ b/src/main/java/org/shedlang/compiler/types/ConstructedStructType.java @@ -4,7 +4,7 @@ import java.util.List; public record ConstructedStructType( TypeConstructor constructor, - List args + List args ) implements ConstructedType, StructType { @Override public SimpleStructType rawType() { diff --git a/src/main/java/org/shedlang/compiler/types/ConstructedSumType.java b/src/main/java/org/shedlang/compiler/types/ConstructedSumType.java index b001e43b..c32389ff 100644 --- a/src/main/java/org/shedlang/compiler/types/ConstructedSumType.java +++ b/src/main/java/org/shedlang/compiler/types/ConstructedSumType.java @@ -4,6 +4,6 @@ import java.util.List; public record ConstructedSumType( TypeConstructor constructor, - List args + List args ) implements ConstructedType, SumType { } diff --git a/src/main/java/org/shedlang/compiler/types/ConstructedType.java b/src/main/java/org/shedlang/compiler/types/ConstructedType.java index 4a3d941e..e49b3520 100644 --- a/src/main/java/org/shedlang/compiler/types/ConstructedType.java +++ b/src/main/java/org/shedlang/compiler/types/ConstructedType.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; public sealed interface ConstructedType extends Type permits ConstructedStructType, ConstructedSumType { TypeConstructor constructor(); - List args(); + List args(); @Override default String describe() { diff --git a/src/main/java/org/shedlang/compiler/types/EffectParam.java b/src/main/java/org/shedlang/compiler/types/EffectParam.java index e8ae6121..2331ed01 100644 --- a/src/main/java/org/shedlang/compiler/types/EffectParam.java +++ b/src/main/java/org/shedlang/compiler/types/EffectParam.java @@ -1,6 +1,6 @@ package org.shedlang.compiler.types; -public record EffectParam(Scope scope, String name) implements Effect { +public record EffectParam(Scope scope, String name) implements Effect, TypeLevelParam { public static EffectParam forFunction( NamespaceName namespaceName, String functionName, diff --git a/src/main/java/org/shedlang/compiler/types/FunctionType.java b/src/main/java/org/shedlang/compiler/types/FunctionType.java index 621a2364..fbc17df7 100644 --- a/src/main/java/org/shedlang/compiler/types/FunctionType.java +++ b/src/main/java/org/shedlang/compiler/types/FunctionType.java @@ -9,7 +9,7 @@ import java.util.Optional; import static org.shedlang.compiler.util.Iterables.forEachInterspersed; public record FunctionType( - Optional> typeLevelParams, + Optional> typeLevelParams, List positionalParams, List namedParams, Effect effect, @@ -54,11 +54,11 @@ public record FunctionType( return description.toString(); } - public FunctionType withTypeLevelParams(List typeLevelParams) { + public FunctionType withTypeLevelParams(List typeLevelParams) { return withTypeLevelParams(Optional.of(typeLevelParams)); } - private FunctionType withTypeLevelParams(Optional> typeLevelParams) { + private FunctionType withTypeLevelParams(Optional> typeLevelParams) { return new FunctionType( typeLevelParams, this.positionalParams, @@ -101,7 +101,7 @@ public record FunctionType( } public record Builder( - Optional> typeLevelParams, + Optional> typeLevelParams, PVector positionalParams, PVector namedParams, Effect effect, @@ -117,7 +117,7 @@ public record FunctionType( ); } - public Builder withTypeLevelParams(List typeLevelParams) { + public Builder withTypeLevelParams(List typeLevelParams) { return new Builder( Optional.of(typeLevelParams), this.positionalParams, diff --git a/src/main/java/org/shedlang/compiler/types/TypeConstructor.java b/src/main/java/org/shedlang/compiler/types/TypeConstructor.java index ba4b44b9..9fb8296d 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeConstructor.java +++ b/src/main/java/org/shedlang/compiler/types/TypeConstructor.java @@ -3,7 +3,7 @@ package org.shedlang.compiler.types; import java.util.List; public record TypeConstructor( - List params, + List params, T genericType ) implements TypeLevelValue { @Override diff --git a/src/main/java/org/shedlang/compiler/types/TypeLevelParam.java b/src/main/java/org/shedlang/compiler/types/TypeLevelParam.java new file mode 100644 index 00000000..615c5880 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/types/TypeLevelParam.java @@ -0,0 +1,5 @@ +package org.shedlang.compiler.types; + +public sealed interface TypeLevelParam extends TypeLevelValue permits EffectParam, TypeParam { + String name(); +} diff --git a/src/main/java/org/shedlang/compiler/types/TypeLevelValue.java b/src/main/java/org/shedlang/compiler/types/TypeLevelValue.java index a002c88a..f250c05c 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeLevelValue.java +++ b/src/main/java/org/shedlang/compiler/types/TypeLevelValue.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.types; -public sealed interface TypeLevelValue permits Effect, Type, TypeConstructor { +public sealed interface TypeLevelValue permits Effect, Type, TypeConstructor, TypeLevelParam { String describe(); } diff --git a/src/main/java/org/shedlang/compiler/types/TypeParam.java b/src/main/java/org/shedlang/compiler/types/TypeParam.java index c7d0c88d..45262cc4 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeParam.java +++ b/src/main/java/org/shedlang/compiler/types/TypeParam.java @@ -1,6 +1,6 @@ package org.shedlang.compiler.types; -public record TypeParam(Scope scope, String name) implements Type { +public record TypeParam(Scope scope, String name) implements Type, TypeLevelParam { public static TypeParam forFunction( NamespaceName namespaceName, String functionName, diff --git a/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java b/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java index 4b29895c..de055e1d 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java +++ b/src/main/java/org/shedlang/compiler/types/TypeSubstitution.java @@ -96,7 +96,8 @@ public class TypeSubstitution { return createConstructedType.apply( constructedType.constructor(), constructedType.args().stream() - .map(arg -> substituteType(arg, map)) + // TODO: handle effects + .map(arg -> substituteType((Type) arg, map)) .toList() ); } diff --git a/src/main/java/org/shedlang/compiler/types/TypeSubstitutionMap.java b/src/main/java/org/shedlang/compiler/types/TypeSubstitutionMap.java index 6e6bd03a..02c602af 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeSubstitutionMap.java +++ b/src/main/java/org/shedlang/compiler/types/TypeSubstitutionMap.java @@ -7,15 +7,15 @@ import java.util.Objects; public class TypeSubstitutionMap { @SafeVarargs - public static TypeSubstitutionMap of(Map.Entry... map) { + public static TypeSubstitutionMap of(Map.Entry... map) { return new TypeSubstitutionMap(Map.ofEntries(map)); } public static TypeSubstitutionMap from( - List params, - List args + List params, + List args ) { - var map = new HashMap(); + var map = new HashMap(); for (var argIndex = 0; argIndex < args.size(); argIndex++) { var param = params.get(argIndex); @@ -26,14 +26,15 @@ public class TypeSubstitutionMap { return new TypeSubstitutionMap(map); } - private final Map map; + private final Map map; - public TypeSubstitutionMap(Map map) { + public TypeSubstitutionMap(Map map) { this.map = map; } public Type substitute(TypeParam typeParam) { - return this.map.getOrDefault(typeParam, typeParam); + // TODO: Validate map? Check here? + return (Type) this.map.getOrDefault(typeParam, typeParam); } @Override diff --git a/src/main/java/org/shedlang/compiler/types/Types.java b/src/main/java/org/shedlang/compiler/types/Types.java index 8c26d890..a8c3aef5 100644 --- a/src/main/java/org/shedlang/compiler/types/Types.java +++ b/src/main/java/org/shedlang/compiler/types/Types.java @@ -50,7 +50,7 @@ public class Types { } public static TypeConstructor typeConstructor( - List params, + List params, T genericType ) { return new TypeConstructor<>(params, genericType); @@ -59,7 +59,7 @@ public class Types { @SuppressWarnings("unchecked") public static ConstructedType constructedType( TypeConstructor constructor, - List args + List args ) { return switch (constructor.genericType()) { case SimpleStructType structType -> @@ -71,14 +71,14 @@ public class Types { public static ConstructedStructType constructedStructType( TypeConstructor constructor, - List args + List args ) { return new ConstructedStructType(constructor, args); } public static ConstructedSumType constructedSumType( TypeConstructor constructor, - List args + List args ) { return new ConstructedSumType(constructor, args); } -- cgit v1.2.3