parser/checker: do not allow using private types from other modules
							parent
							
								
									9aa1a65489
								
							
						
					
					
						commit
						32a7bd3a48
					
				|  | @ -29,9 +29,9 @@ const ( | ||||||
| 	OpenDataConnection = 150 | 	OpenDataConnection = 150 | ||||||
| 	CloseDataConnection = 226 | 	CloseDataConnection = 226 | ||||||
| 	CommandOk = 200 | 	CommandOk = 200 | ||||||
| 	Denied = 550 | 	denied = 550 | ||||||
| 	PassiveMode = 227 | 	PassiveMode = 227 | ||||||
| 	Complete = 226 | 	complete = 226 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| struct DTP { | struct DTP { | ||||||
|  | @ -173,13 +173,13 @@ pub fn (ftp FTP) pwd() string { | ||||||
| pub fn (ftp FTP) cd(dir string) { | pub fn (ftp FTP) cd(dir string) { | ||||||
| 	ftp.write('CWD $dir') or { return } | 	ftp.write('CWD $dir') or { return } | ||||||
| 	mut code, mut data := ftp.read() | 	mut code, mut data := ftp.read() | ||||||
| 	match code { | 	match int(code) { | ||||||
| 		Denied { | 		denied { | ||||||
| 			$if debug { | 			$if debug { | ||||||
| 				println('CD $dir denied!') | 				println('CD $dir denied!') | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		Complete { | 		complete { | ||||||
| 			code, data = ftp.read() | 			code, data = ftp.read() | ||||||
| 		} | 		} | ||||||
| 		else {} | 		else {} | ||||||
|  | @ -233,7 +233,7 @@ pub fn (ftp FTP) dir() ?[]string { | ||||||
| 
 | 
 | ||||||
| 	ftp.write('LIST') or {} | 	ftp.write('LIST') or {} | ||||||
| 	code, _ := ftp.read() | 	code, _ := ftp.read() | ||||||
| 	if code == Denied { | 	if code == denied { | ||||||
| 		return error('LIST denied') | 		return error('LIST denied') | ||||||
| 	} | 	} | ||||||
| 	if code != OpenDataConnection { | 	if code != OpenDataConnection { | ||||||
|  | @ -267,7 +267,7 @@ pub fn (ftp FTP) get(file string) ?[]byte { | ||||||
| 	ftp.write('RETR $file') or {} | 	ftp.write('RETR $file') or {} | ||||||
| 	code, _ := ftp.read() | 	code, _ := ftp.read() | ||||||
| 
 | 
 | ||||||
| 	if code == Denied { | 	if code == denied { | ||||||
| 		return error('Permission denied') | 		return error('Permission denied') | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -393,6 +393,11 @@ fn vpclose(f voidptr) int { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | struct Foo2 { | ||||||
|  | 	x int | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub struct Result { | pub struct Result { | ||||||
| pub: | pub: | ||||||
| 	exit_code int | 	exit_code int | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ module cflag | ||||||
| import os | import os | ||||||
| 
 | 
 | ||||||
| // parsed cflag
 | // parsed cflag
 | ||||||
| struct CFlag { | pub struct CFlag { | ||||||
| 	mod   string // the module in which the flag was given
 | 	mod   string // the module in which the flag was given
 | ||||||
| 	os    string // eg. windows | darwin | linux
 | 	os    string // eg. windows | darwin | linux
 | ||||||
| 	name  string // eg. -I
 | 	name  string // eg. -I
 | ||||||
|  |  | ||||||
|  | @ -260,6 +260,9 @@ pub fn (mut c Checker) struct_init(struct_init mut ast.StructInit) table.Type { | ||||||
| 		struct_init.typ = c.expected_type | 		struct_init.typ = c.expected_type | ||||||
| 	} | 	} | ||||||
| 	type_sym := c.table.get_type_symbol(struct_init.typ) | 	type_sym := c.table.get_type_symbol(struct_init.typ) | ||||||
|  | 	if !type_sym.is_public && type_sym.mod != c.mod { | ||||||
|  | 		c.warn('type `$type_sym.name` is private', struct_init.pos) | ||||||
|  | 	} | ||||||
| 	// println('check struct $typ_sym.name')
 | 	// println('check struct $typ_sym.name')
 | ||||||
| 	match type_sym.kind { | 	match type_sym.kind { | ||||||
| 		.placeholder { | 		.placeholder { | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ import v.util | ||||||
| import term | import term | ||||||
| import os | import os | ||||||
| 
 | 
 | ||||||
| struct Parser { | pub struct Parser { | ||||||
| 	scanner           &scanner.Scanner | 	scanner           &scanner.Scanner | ||||||
| 	file_name         string // "/home/user/hello.v"
 | 	file_name         string // "/home/user/hello.v"
 | ||||||
| 	file_name_dir     string // "/home/user"
 | 	file_name_dir     string // "/home/user"
 | ||||||
|  | @ -1202,6 +1202,7 @@ fn (mut p Parser) type_decl() ast.TypeDecl { | ||||||
| 			info: table.SumType{ | 			info: table.SumType{ | ||||||
| 				variants: sum_variants | 				variants: sum_variants | ||||||
| 			} | 			} | ||||||
|  | 			is_public: is_pub | ||||||
| 		}) | 		}) | ||||||
| 		return ast.SumTypeDecl{ | 		return ast.SumTypeDecl{ | ||||||
| 			name: name | 			name: name | ||||||
|  | @ -1220,6 +1221,7 @@ fn (mut p Parser) type_decl() ast.TypeDecl { | ||||||
| 		info: table.Alias{ | 		info: table.Alias{ | ||||||
| 			foo: '' | 			foo: '' | ||||||
| 		} | 		} | ||||||
|  | 		is_public: is_pub | ||||||
| 	}) | 	}) | ||||||
| 	return ast.AliasTypeDecl{ | 	return ast.AliasTypeDecl{ | ||||||
| 		name: name | 		name: name | ||||||
|  |  | ||||||
|  | @ -161,6 +161,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl { | ||||||
| 			is_union: is_union | 			is_union: is_union | ||||||
| 		} | 		} | ||||||
| 		mod: p.mod | 		mod: p.mod | ||||||
|  | 		is_public: is_pub | ||||||
| 	} | 	} | ||||||
| 	mut ret := 0 | 	mut ret := 0 | ||||||
| 	if p.builtin_mod && t.name in table.builtin_type_names { | 	if p.builtin_mod && t.name in table.builtin_type_names { | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ mut: | ||||||
| 	name       string | 	name       string | ||||||
| 	methods    []Fn | 	methods    []Fn | ||||||
| 	mod        string | 	mod        string | ||||||
|  | 	is_public  bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub enum TypeFlag { | pub enum TypeFlag { | ||||||
|  | @ -546,7 +547,7 @@ pub: | ||||||
| // NB: FExpr here is a actually an ast.Expr .
 | // NB: FExpr here is a actually an ast.Expr .
 | ||||||
| // It should always be used by casting to ast.Expr, using ast.fe2ex()/ast.ex2fe()
 | // It should always be used by casting to ast.Expr, using ast.fe2ex()/ast.ex2fe()
 | ||||||
| // That hack is needed to break an import cycle between v.ast and v.table .
 | // That hack is needed to break an import cycle between v.ast and v.table .
 | ||||||
| type FExpr = byteptr | voidptr | pub type FExpr = byteptr | voidptr | ||||||
| 
 | 
 | ||||||
| pub struct Field { | pub struct Field { | ||||||
| pub: | pub: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue