aboutsummaryrefslogtreecommitdiff
path: root/types.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-05-12 15:18:46 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-05-12 15:18:46 -0400
commit4dbe046866a6280cf304c7e0ec6471d872bc8e27 (patch)
tree293b94a73769a8fd10cdc5135a3af8da82c4d334 /types.c
parent8ada56c4248e9e09b8f151e9d516739dd86ad520 (diff)
Add interface fields
Diffstat (limited to 'types.c')
-rw-r--r--types.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/types.c b/types.c
index fd41bbcc..85060b4c 100644
--- a/types.c
+++ b/types.c
@@ -479,6 +479,8 @@ type_t *get_field_type(type_t *t, const char *field_name)
{
t = value_type(t);
switch (t->tag) {
+ case PointerType:
+ return get_field_type(Match(t, PointerType)->pointed, field_name);
case StructType: {
auto struct_t = Match(t, StructType);
for (arg_t *field = struct_t->fields; field; field = field->next) {
@@ -490,8 +492,11 @@ type_t *get_field_type(type_t *t, const char *field_name)
case InterfaceType: {
auto interface = Match(t, InterfaceType);
for (arg_t *field = interface->fields; field; field = field->next) {
- if (streq(field->name, field_name))
+ if (streq(field->name, field_name)) {
+ if (field->type->tag == PointerType)
+ return Match(field->type, PointerType)->pointed;
return field->type;
+ }
}
return NULL;
}