diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-03-02 19:22:23 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-03-02 19:22:23 +0000 |
| commit | ec9845967d37ad678249e9857e253af4c04e8e4e (patch) | |
| tree | e1f2d552c29c6e7959c02b8d6ae153b6e485b4c2 /src/main/java | |
| parent | fe0cb0f6ed1be2da385a10fcb72734b5e01d57ca (diff) | |
Type check native type methods
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 64 |
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() )); } |
