aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-03-02 19:22:23 +0000
committerMichael Williamson <mike@zwobble.org>2025-03-02 19:22:23 +0000
commitec9845967d37ad678249e9857e253af4c04e8e4e (patch)
treee1f2d552c29c6e7959c02b8d6ae153b6e485b4c2 /src/main/java
parentfe0cb0f6ed1be2da385a10fcb72734b5e01d57ca (diff)
Type check native type methods
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java64
1 files changed, 59 insertions, 5 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index d7f15fc4..59f961ab 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1722,6 +1722,12 @@ public class TypeChecker {
};
}
+ private record TypeCheckNativeTypeDeclarationState(
+ TypeOrConstructor<SimpleNativeType> typeOrConstructor,
+ List<TypedNativeFunctionDeclarationNode> typedMethodNodes
+ ) {
+ }
+
private static TypeCheckSteps<TypedNativeTypeDeclarationNode> typeCheckStepsNativeTypeDeclaration(
UntypedNativeTypeDeclarationNode untyped
) {
@@ -1739,7 +1745,12 @@ public class TypeChecker {
new Scope.NativeType(type)
);
- context = context.addLexicalState(untyped.name(), typeOrConstructor);
+ var state = new TypeCheckNativeTypeDeclarationState(
+ typeOrConstructor,
+ List.of()
+ );
+
+ context = context.addLexicalState(untyped.name(), state);
return context.declareVariableType(
untyped.name(),
@@ -1749,15 +1760,58 @@ public class TypeChecker {
}
@Override
+ public TypeCheckerContext declareFunctions(TypeCheckerContext context) {
+ var state = context.getLexicalState(
+ TypeCheckNativeTypeDeclarationState.class,
+ untyped.name()
+ );
+ var typedMethodNodes = new ArrayList<TypedNativeFunctionDeclarationNode>();
+
+ for (var untypedMethodNode : untyped.methods()) {
+ context = context.enterBlock(P.map(
+ Map.entry(
+ "This",
+ Variable.defined(
+ Types.metaType(state.typeOrConstructor.toType()),
+ VariableType.VAL
+ )
+ )
+ ));
+
+ var typeCheckSignatureResult = typeCheckFunctionType(
+ untypedMethodNode.signature(),
+ context
+ );
+ var typedSignatureNode = typeCheckSignatureResult.value();
+ context = typeCheckSignatureResult.context();
+
+ context = context.exit();
+
+ var typedMethodNode = new TypedNativeFunctionDeclarationNode(
+ untypedMethodNode.name(),
+ typedSignatureNode,
+ untypedMethodNode.source()
+ );
+ typedMethodNodes.add(typedMethodNode);
+ }
+
+ var newState = new TypeCheckNativeTypeDeclarationState(
+ state.typeOrConstructor,
+ typedMethodNodes
+ );
+ return context.addLexicalState(untyped.name(), newState);
+ }
+
+ @Override
public TypeCheckerResult<TypedNativeTypeDeclarationNode> finish(TypeCheckerContext context) {
- var typeOrConstructor = (TypeOrConstructor<SimpleNativeType>) context.getLexicalState(
- TypeOrConstructor.class,
+ var state = context.getLexicalState(
+ TypeCheckNativeTypeDeclarationState.class,
untyped.name()
);
return context.toResult(new TypedNativeTypeDeclarationNode(
- typeOrConstructor,
- List.of(),
+ state.typeOrConstructor,
+ state.typedMethodNodes,
untyped.source()
));
}