@@ -60,7 +60,7 @@ const (
6060 MainFn = Fn{ name: 'main' }
6161)
6262
63- fn (a []TypeInst) str () string {
63+ pub fn (a []TypeInst) str () string {
6464 mut r := []string
6565 for t in a {
6666 mut s := ' | '
@@ -254,7 +254,7 @@ fn (p mut Parser) fn_decl() {
254254 }
255255 // Don't allow modifying types from a different module
256256 if ! p.first_pass () && ! p.builtin_mod && t.mod != p.mod &&
257- ! p.is_vgen // allow .str()
257+ ! p.is_vgen // let vgen define methods like .str() on types defined in other modules
258258 {
259259 // println('T.mod=$T.mod')
260260 // println('p.mod=$p.mod')
@@ -297,6 +297,10 @@ fn (p mut Parser) fn_decl() {
297297 if f.name == 'init' && ! f.is_method && f.is_public && ! p.is_vh {
298298 p.error ('init function cannot be public' )
299299 }
300+ // .str() methods
301+ if f.is_method && f.name == 'str' && ! f.is_public {
302+ p.error ('.str() methods must be declared as public' )
303+ }
300304 // C function header def? (fn C.NSMakeRect(int,int,int,int))
301305 is_c := f.name == 'C' && p.tok == .dot
302306 // Just fn signature? only builtin.v + default build mode
@@ -726,7 +730,7 @@ fn (p mut Parser) fn_call(f mut Fn, method_ph int, receiver_var, receiver_type s
726730 if f.is_deprecated {
727731 p.warn ('$f.name is deprecated' )
728732 }
729- if ! f.is_public && ! f.is_c && ! p.pref.is_test && ! f.is_interface && f.mod != p.mod {
733+ if ! f.is_public && ! f.is_c && ! p.pref.is_test && ! f.is_interface && f.mod != p.mod {
730734 if f.name == 'contains' {
731735 println ('use `value in numbers` instead of `numbers.contains(value)`' )
732736 }
0 commit comments