@@ -62,6 +62,14 @@ fn (mut b Builder) gen_auto_str_fn() {
6262 already_gen_str_map[type_name] = true
6363 }
6464 }
65+ .alias {
66+ info := t.info as ast.Alias
67+ hint := 'type=${t.idx} \n t.name=${t.name} '
68+ if type_name ! in already_gen_str_map {
69+ b.gen_str_for_alias (mut sb, type_name, type_name2 , info, hint)
70+ already_gen_str_map[type_name] = true
71+ }
72+ }
6573 else {}
6674 }
6775 }
@@ -131,21 +139,25 @@ fn (mut b Builder) gen_str_for_struct(mut sb strings.Builder, struct_name string
131139 sb.writeln ('\t rlock it.${f.name} {' )
132140 }
133141 if f.typ == ast.string_type {
134- sb.writeln ('\t res.write_string(\' ${f.name} : \\\'\$ {it.${f.name} }\\\'\\ n\' )' )
142+ sb.writeln ('\t res.write_string(\' ${f.name} : \\\'\$ {it.${f.name} }\\\'\\ n\' )' )
135143 } else {
136144 sym := b.table.sym (f.typ)
137145 if sym.kind == .struct {
138146 if f.typ.has_flag (.option) {
139147 sb.writeln ('\t if option_f := it.${f.name} {' )
140- sb.writeln ("\t\t res.writeln(' ${f.name} : Option(\$ {option_f})')" )
148+ sb.writeln ("\t\t res.writeln('${f.name} : Option(\$ {option_f})')" )
141149 sb.writeln ('\t }\n\t else {' )
142- sb.writeln ("\t\t res.writeln(' ${f.name} : Option(none)')" )
150+ sb.writeln ("\t\t res.writeln('${f.name} : Option(none)')" )
143151 sb.writeln ('\t }' )
144152 } else {
145- sb.writeln ("\t res.writeln(' ${f.name} : \$ {it.${f.name} }')" )
153+ sb.writeln ("\t res.writeln('${f.name} : \$ {it.${f.name} }')" )
146154 }
155+ } else if sym.kind == .chan {
156+ elem_info := sym.info as ast.Chan
157+ elem_type_str := b.table.type_to_str (elem_info.elem_type)
158+ sb.writeln ("\t res.writeln('${f.name} : chan ${elem_type_str} {cap: \$ {it.${f.name} .cap}, closed: \$ {it.${f.name} .closed}}')" )
147159 } else {
148- sb.writeln ("\t res.writeln(' ${f.name} : \$ {it.${f.name} }')" )
160+ sb.writeln ("\t res.writeln('${f.name} : \$ {it.${f.name} }')" )
149161 }
150162 }
151163 if f.typ.has_flag (.shared_f) {
@@ -159,6 +171,25 @@ fn (mut b Builder) gen_str_for_struct(mut sb strings.Builder, struct_name string
159171 sb.writeln ('\t return sb.str()\n }' )
160172}
161173
174+ fn (mut b Builder) gen_str_for_alias (mut sb strings.Builder, alias_name string , alias_name2 string , info ast.Alias, hint string ) {
175+ sb.writeln ('/*${hint} */' )
176+ // -hide-auto-str hides potential sensitive struct data from resulting binary files
177+ if b.pref.hide_auto_str {
178+ sb.writeln ("@[markused]\n pub fn (it ${alias_name} ) str() string { return 'str() used with -hide-auto-str' }" )
179+ return
180+ }
181+ parent_type_name := b.table.type_to_str (info.parent_type)
182+ sb.writeln ('@[markused]\n pub fn (it ${alias_name} ) str() string {' )
183+ sb.writeln ('\t parent_it := *(&${parent_type_name} (&it))' )
184+ sb.writeln ('\t mut res := strings.new_builder(222)' )
185+ sb.writeln ("\t res.write_string(' ${alias_name2} (\$ {parent_it})')" )
186+ // sb.writeln('\t// note: this can be removed after move dump beyond cgen')
187+ // sb.writeln('\tmut sb := strings.new_builder(222)')
188+ // sb.writeln('\tsb.indent(res.str())')
189+ // sb.writeln('\treturn sb.str()\n}')
190+ sb.writeln ('\t return res.str()\n }' )
191+ }
192+
162193fn (b Builder) get_mod_full_path (full_mod_name string ) string {
163194 for f in b.parsed_files {
164195 if f.mod.name == full_mod_name {
@@ -169,7 +200,7 @@ fn (b Builder) get_mod_full_path(full_mod_name string) string {
169200}
170201
171202fn (mut b Builder) auto_fn_get_type_name (t & ast.TypeSymbol, is_get_type_name bool ) string {
172- mut type_name := t.name
203+ mut type_name := t.name. all_after_last ( '.' )
173204 if t.kind == .struct {
174205 // main.MyS[int] => MyS[T]
175206 info := t.info as ast.Struct
0 commit comments