From f7c39ae4a91e4a3b8388cd6e93a8800f2d54d84d Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Sun, 11 Aug 2024 21:16:02 +0200 Subject: [PATCH] Recursively follow interfaces when looking up method. --- releasenotes.md | 1 + src/compiler/sema_name_resolution.c | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/releasenotes.md b/releasenotes.md index d7c7d8f3f..0dd9bf52a 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -62,6 +62,7 @@ - Fix issues when checking methods and interfaces hasn't been resolved yet. - Fix Vec2.angle - Update to libc::setjmp on Win32, to do no stack unwinding. +- Recursively follow interfaces when looking up method. ### Stdlib changes diff --git a/src/compiler/sema_name_resolution.c b/src/compiler/sema_name_resolution.c index d803fbb39..4bdeba920 100644 --- a/src/compiler/sema_name_resolution.c +++ b/src/compiler/sema_name_resolution.c @@ -66,6 +66,15 @@ void sema_decl_stack_push(Decl *decl) compiler.context.decl_stack_top = current; } +static void add_interface_to_decl_stack(Decl *decl) +{ + FOREACH(TypeInfo *, parent_interface, decl->interfaces) + { + add_interface_to_decl_stack(parent_interface->type->decl); + } + FOREACH(Decl *, interface, decl->interface_methods) sema_decl_stack_push(interface); +} + static void add_members_to_decl_stack(Decl *decl) { FOREACH(Decl *, func, decl->methods) @@ -84,14 +93,7 @@ static void add_members_to_decl_stack(Decl *decl) } if (decl->decl_kind == DECL_INTERFACE) { - FOREACH(TypeInfo *, parent_interface, decl->interfaces) - { - FOREACH(Decl *, interface, parent_interface->type->decl->interface_methods) - { - sema_decl_stack_push(interface); - } - } - FOREACH(Decl *, interface, decl->interface_methods) sema_decl_stack_push(interface); + add_interface_to_decl_stack(decl); } if (decl_is_struct_type(decl) || decl->decl_kind == DECL_BITSTRUCT) {