сgen: print generic structs (#6967)
parent
6563535a3d
commit
d71d9ad7c0
|
@ -367,6 +367,12 @@ fn (mut g Gen) gen_str_for_struct(info table.Struct, styp string, str_fn_name st
|
||||||
g.type_definitions.writeln('string indent_${str_fn_name}($styp x, int indent_count); // auto')
|
g.type_definitions.writeln('string indent_${str_fn_name}($styp x, int indent_count); // auto')
|
||||||
g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp x, int indent_count) {')
|
g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp x, int indent_count) {')
|
||||||
mut clean_struct_v_type_name := styp.replace('__', '.')
|
mut clean_struct_v_type_name := styp.replace('__', '.')
|
||||||
|
if clean_struct_v_type_name.contains('_T_') {
|
||||||
|
// TODO: this is a bit hacky. styp shouldn't be even parsed with _T_
|
||||||
|
// use something different than g.typ for styp
|
||||||
|
clean_struct_v_type_name = clean_struct_v_type_name.replace('_T_', '<').replace('_', ', ') +
|
||||||
|
'>'
|
||||||
|
}
|
||||||
if styp.ends_with('*') {
|
if styp.ends_with('*') {
|
||||||
deref_typ := styp.replace('*', '')
|
deref_typ := styp.replace('*', '')
|
||||||
g.auto_str_funcs.writeln('\t$deref_typ *it = x;')
|
g.auto_str_funcs.writeln('\t$deref_typ *it = x;')
|
||||||
|
|
|
@ -500,11 +500,10 @@ static inline $opt_el_type __Option_${styp}_popval($styp ch) {
|
||||||
fn (g &Gen) cc_type2(t table.Type) string {
|
fn (g &Gen) cc_type2(t table.Type) string {
|
||||||
sym := g.table.get_type_symbol(g.unwrap_generic(t))
|
sym := g.table.get_type_symbol(g.unwrap_generic(t))
|
||||||
mut styp := util.no_dots(sym.name)
|
mut styp := util.no_dots(sym.name)
|
||||||
if sym.kind == .struct_ {
|
if mut sym.info is table.Struct {
|
||||||
info := sym.info as table.Struct
|
if sym.info.generic_types.len > 0 {
|
||||||
if info.generic_types.len > 0 {
|
|
||||||
mut sgtyps := '_T'
|
mut sgtyps := '_T'
|
||||||
for gt in info.generic_types {
|
for gt in sym.info.generic_types {
|
||||||
gts := g.table.get_type_symbol(if gt.has_flag(.generic) { g.unwrap_generic(gt) } else { gt })
|
gts := g.table.get_type_symbol(if gt.has_flag(.generic) { g.unwrap_generic(gt) } else { gt })
|
||||||
sgtyps += '_$gts.name'
|
sgtyps += '_$gts.name'
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,3 +269,24 @@ fn test_alias_struct() {
|
||||||
assert t.str() == 'TestAlias($ts)'
|
assert t.str() == 'TestAlias($ts)'
|
||||||
assert '$t' == 'TestAlias(TestStruct{\n x: 0\n})'
|
assert '$t' == 'TestAlias(TestStruct{\n x: 0\n})'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct GenericStruct<T> {
|
||||||
|
x T
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generic_struct() {
|
||||||
|
x := GenericStruct<TestStruct>{}
|
||||||
|
assert '$x' == 'GenericStruct<TestStruct>{\n x: TestStruct{\n x: 0\n }\n}'
|
||||||
|
assert x.str() == 'GenericStruct<TestStruct>{\n x: TestStruct{\n x: 0\n }\n}'
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MultiGenericStruct<T, X> {
|
||||||
|
t T
|
||||||
|
x X
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_multi_generic_struct() {
|
||||||
|
x := MultiGenericStruct<TestStruct, TestStruct>{}
|
||||||
|
assert '$x' == 'MultiGenericStruct<TestStruct, TestStruct>{\n t: TestStruct{\n x: 0\n }\n x: TestStruct{\n x: 0\n }\n}'
|
||||||
|
assert x.str() == 'MultiGenericStruct<TestStruct, TestStruct>{\n t: TestStruct{\n x: 0\n }\n x: TestStruct{\n x: 0\n }\n}'
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue