diff options
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/types.cpp b/src/types.cpp index 5f3bee127..a4381ed47 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -95,7 +95,9 @@ struct TypeRecord { bool is_packed; bool is_ordered; bool is_polymorphic; + bool is_poly_specialized; Type * polymorphic_params; // Type_Tuple + Type * polymorphic_parent; i64 custom_align; // NOTE(bill): Only used in structs at the moment Entity * names; @@ -103,7 +105,11 @@ struct TypeRecord { #define TYPE_KINDS \ TYPE_KIND(Basic, BasicType) \ - TYPE_KIND(Generic, struct{ i64 id; String name; }) \ + TYPE_KIND(Generic, struct { \ + i64 id; \ + String name; \ + Type * specific; \ + }) \ TYPE_KIND(Pointer, struct { Type *elem; }) \ TYPE_KIND(Atomic, struct { Type *elem; }) \ TYPE_KIND(Array, struct { Type *elem; i64 count; }) \ @@ -480,10 +486,11 @@ Type *make_type_basic(gbAllocator a, BasicType basic) { return t; } -Type *make_type_generic(gbAllocator a, i64 id, String name) { +Type *make_type_generic(gbAllocator a, i64 id, String name, Type *specific) { Type *t = alloc_type(a, Type_Generic); t->Generic.id = id; t->Generic.name = name; + t->Generic.specific = specific; return t; } @@ -948,11 +955,24 @@ bool is_type_polymorphic_struct(Type *t) { return false; } +bool is_type_polymorphic_struct_specialized(Type *t) { + t = base_type(t); + if (t->kind == Type_Record && + t->Record.kind == TypeRecord_Struct) { + return t->Record.is_polymorphic && t->Record.is_poly_specialized; + } + return false; +} + + bool is_type_polymorphic(Type *t) { switch (t->kind) { case Type_Generic: return true; + case Type_Named: + return is_type_polymorphic_struct(t->Named.base); + case Type_Pointer: return is_type_polymorphic(t->Pointer.elem); case Type_Atomic: @@ -2271,6 +2291,10 @@ gbString write_type_to_string(gbString str, Type *type) { String name = type->Generic.name; str = gb_string_appendc(str, "$"); str = gb_string_append_length(str, name.text, name.len); + if (type->Generic.specific != nullptr) { + str = gb_string_appendc(str, "/"); + str = write_type_to_string(str, type->Generic.specific); + } } break; |