aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-26 17:48:05 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-26 17:48:05 +0000
commit92431737b02154be7500d5df18a5b4fc883c5fd1 (patch)
treef5f030aa52f92a98cdd64fdd2254947302c37dad /src/main/java
parent0e0bec6bf3698801624283c44af061858561bb6f (diff)
Extract receiverTypeToFunctionType() that accepts type
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index f42a4030..2eef55f1 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -363,15 +363,27 @@ public class TypeChecker {
TypedExpressionNode typedReceiver,
TypeCheckerContext context
) {
- if (typedReceiver.type() instanceof FunctionType receiverType) {
- return receiverType;
+ return receiverTypeToFunctionType(
+ typedReceiver.type(),
+ typedReceiver.source(),
+ context
+ );
+ }
+
+ private static FunctionType receiverTypeToFunctionType(
+ Type receiverType,
+ Source receiverSource,
+ TypeCheckerContext context
+ ) {
+ if (receiverType instanceof FunctionType receiverTypeFunction) {
+ return receiverTypeFunction;
}
if (
- typedReceiver.type() instanceof TypeLevelValueType typeLevelValueType &&
- typeLevelValueType.value() instanceof StructType structType
+ receiverType instanceof TypeLevelValueType typeLevelValueType &&
+ typeLevelValueType.value() instanceof StructType structType
) {
- var structTypeInfo = context.structTypeInfo(structType, typedReceiver.source());
+ var structTypeInfo = context.structTypeInfo(structType, receiverSource);
var namedParams = structTypeInfo.fields().stream()
.map(field -> new NamedParam(field.name(), field.type()))
@@ -387,10 +399,9 @@ public class TypeChecker {
throw new UnexpectedTypeError(
TypeSets.FUNCTION,
- typedReceiver.type(),
- typedReceiver.source()
+ receiverType,
+ receiverSource
);
-
}
private static TypeCheckerResult<TypedConditionalBranchNode> typeCheckConditionalBranch(