From ec9845967d37ad678249e9857e253af4c04e8e4e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 2 Mar 2025 19:22:23 +0000 Subject: Type check native type methods --- .../shedlang/compiler/typechecker/TypeChecker.java | 64 ++++++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) (limited to 'src/main/java') 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 typeOrConstructor, + List typedMethodNodes + ) { + } + private static TypeCheckSteps 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(), @@ -1748,16 +1759,59 @@ public class TypeChecker { ); } + @Override + public TypeCheckerContext declareFunctions(TypeCheckerContext context) { + var state = context.getLexicalState( + TypeCheckNativeTypeDeclarationState.class, + untyped.name() + ); + var typedMethodNodes = new ArrayList(); + + 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 finish(TypeCheckerContext context) { - var typeOrConstructor = (TypeOrConstructor) 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() )); } -- cgit v1.2.3