aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-31 11:25:32 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-31 11:25:32 +0000
commitfe34bc3d273b902ab0abd38c9547741274fdc14a (patch)
treed27cd83e90947bc073394a3797dc45d17d447e95 /src/main/java
parent0dccfde55d3bba5e7c75ff35fc9d6a1c657a3d85 (diff)
Add type-level params to FunctionType
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ShedBuiltins.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionExpressionNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedTryHandlerMethodNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/config/ConfigChecker.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java5
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java1
-rw-r--r--src/main/java/org/shedlang/compiler/types/FunctionType.java52
-rw-r--r--src/main/java/org/shedlang/compiler/types/TypeSubstitution.java3
9 files changed, 65 insertions, 9 deletions
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<List<TypeParam>> typeLevelParams,
List<Type> positionalParams,
List<NamedParam> 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<List<TypeParam>> typeLevelParams,
PVector<Type> positionalParams,
PVector<NamedParam> 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(),