aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-25 22:10:29 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-25 22:10:29 +0100
commit452e8a4775c6524f2985834cf278fc1ad2d1127f (patch)
treeb86554f4a5bf63e0955043f6c591ecb9374903e7 /src/main/java
parent7287138ce5c02aac9cbe7b59d1bd988799710563 (diff)
Extract typeCheckFunctionBody()
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java90
1 files changed, 59 insertions, 31 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 6bf20edb..1c763bba 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -464,38 +464,17 @@ public class TypeChecker {
}
}
- private static TypeCheckSteps<TypedFunctionDefinitionNode> typeCheckStepsFunctionDefinition(
- UntypedFunctionDefinitionNode untyped
+ private record TypedFunctionBody(
+ FreeVariables freeVariables,
+ TypedBlockNode block
) {
- return new TypeCheckSteps<TypedFunctionDefinitionNode>() {
- @Override
- public TypeCheckerContext declareFunctions(TypeCheckerContext context) {
- return declareFunctionDefinition(untyped, context);
- }
-
- @Override
- public TypeCheckerResult<TypedFunctionDefinitionNode> finish(TypeCheckerContext context) {
- return defineFunctionDefinition(untyped, context);
- }
- };
}
- private static TypeCheckerContext declareFunctionDefinition(
- UntypedFunctionDefinitionNode untyped,
- TypeCheckerContext context
- ) {
- var typedSignature = typeCheckFunctionSignature(untyped.signature(), context);
-
- return context
- .define(untyped.name(), typedSignature.type(), untyped.source())
- .addLexicalState(untyped.name(), typedSignature);
- }
-
- private static TypeCheckerResult<TypedFunctionDefinitionNode> defineFunctionDefinition(
- UntypedFunctionDefinitionNode untyped,
+ private static TypeCheckerResult<TypedFunctionBody> typeCheckFunctionBody(
+ UntypedBlockNode untyped,
+ TypedFunctionSignatureNode typedSignature,
TypeCheckerContext context
) {
- var typedSignature = context.getLexicalState(TypedFunctionSignatureNode.class, untyped.name());
var functionType = typedSignature.type();
var bodyEnvironment = EnvironmentBuilder.EMPTY;
@@ -510,7 +489,7 @@ public class TypeChecker {
// TODO: pass interface to collect variables?
var declaredVariables = DeclaredVariables.forFunctionStatements(
- untyped.body().statements(),
+ untyped.statements(),
P.vector()
);
bodyEnvironment = bodyEnvironment.addUndefined(declaredVariables);
@@ -521,7 +500,7 @@ public class TypeChecker {
functionType.returnType()
);
- var bodyResult = typeCheckBlock(untyped.body(), bodyEnvironment.names(), context);
+ var bodyResult = typeCheckBlock(untyped, bodyEnvironment.names(), context);
var typedBody = bodyResult.value();
context = bodyResult.context();
@@ -553,11 +532,60 @@ public class TypeChecker {
}
}
+ var typed = new TypedFunctionBody(
+ freeVariables,
+ typedBody
+ );
+
+ return context.toResult(typed);
+ }
+
+ private static TypeCheckSteps<TypedFunctionDefinitionNode> typeCheckStepsFunctionDefinition(
+ UntypedFunctionDefinitionNode untyped
+ ) {
+ return new TypeCheckSteps<TypedFunctionDefinitionNode>() {
+ @Override
+ public TypeCheckerContext declareFunctions(TypeCheckerContext context) {
+ return declareFunctionDefinition(untyped, context);
+ }
+
+ @Override
+ public TypeCheckerResult<TypedFunctionDefinitionNode> finish(TypeCheckerContext context) {
+ return defineFunctionDefinition(untyped, context);
+ }
+ };
+ }
+
+ private static TypeCheckerContext declareFunctionDefinition(
+ UntypedFunctionDefinitionNode untyped,
+ TypeCheckerContext context
+ ) {
+ var typedSignature = typeCheckFunctionSignature(untyped.signature(), context);
+
+ return context
+ .define(untyped.name(), typedSignature.type(), untyped.source())
+ .addLexicalState(untyped.name(), typedSignature);
+ }
+
+ private static TypeCheckerResult<TypedFunctionDefinitionNode> defineFunctionDefinition(
+ UntypedFunctionDefinitionNode untyped,
+ TypeCheckerContext context
+ ) {
+ var typedSignature = context.getLexicalState(TypedFunctionSignatureNode.class, untyped.name());
+
+ var typedBodyResult = typeCheckFunctionBody(
+ untyped.body(),
+ typedSignature,
+ context
+ );
+ var typedBody = typedBodyResult.value();
+ context = typedBodyResult.context();
+
var typed = new TypedFunctionDefinitionNode(
untyped.name(),
typedSignature,
- freeVariables,
- typedBody,
+ typedBody.freeVariables,
+ typedBody.block,
untyped.source()
);