v2: imports
							parent
							
								
									0ec5680156
								
							
						
					
					
						commit
						d9cf98f772
					
				|  | @ -460,7 +460,6 @@ pub fn (a []int) reduce(iter fn(accum, curr int)int, accum_start int) int { | ||||||
| 	return _accum | 	return _accum | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* |  | ||||||
| // array_eq<T> checks if two arrays contain all the same elements in the same order.
 | // array_eq<T> checks if two arrays contain all the same elements in the same order.
 | ||||||
| // []int == []int (also for: i64, f32, f64, byte, string)
 | // []int == []int (also for: i64, f32, f64, byte, string)
 | ||||||
| fn array_eq<T>(a1, a2 []T) bool { | fn array_eq<T>(a1, a2 []T) bool { | ||||||
|  | @ -494,7 +493,6 @@ pub fn (a []byte) eq(a2 []byte) bool { | ||||||
| pub fn (a []f32) eq(a2 []f32) bool { | pub fn (a []f32) eq(a2 []f32) bool { | ||||||
| 	return array_eq(a, a2) | 	return array_eq(a, a2) | ||||||
| } | } | ||||||
| */ |  | ||||||
| 
 | 
 | ||||||
| // compare_i64 for []f64 sort_with_compare()
 | // compare_i64 for []f64 sort_with_compare()
 | ||||||
| // sort []i64 with quicksort
 | // sort []i64 with quicksort
 | ||||||
|  |  | ||||||
|  | @ -311,6 +311,8 @@ pub fn (v mut V) compile() { | ||||||
| 	} | 	} | ||||||
| 	cgen.save() | 	cgen.save() | ||||||
| 	v.cc() | 	v.cc() | ||||||
|  | 	//println(v.table.imports)
 | ||||||
|  | 	//println(v.table.modules)
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (v mut V) compile2() { | pub fn (v mut V) compile2() { | ||||||
|  |  | ||||||
|  | @ -90,6 +90,15 @@ pub fn (p mut Parser) parse_type() table.Type { | ||||||
| 	if p.tok.kind == .question { | 	if p.tok.kind == .question { | ||||||
| 		p.next() | 		p.next() | ||||||
| 	} | 	} | ||||||
|  | 	if p.peek_tok.kind == .dot { | ||||||
|  | 		///if !(p.tok.lit in p.table.imports) {
 | ||||||
|  | 		if !p.table.known_import(p.tok.lit) { | ||||||
|  | 			println(p.table.imports) | ||||||
|  | 			p.error('unknown module `$p.tok.lit`') | ||||||
|  | 		} | ||||||
|  | 		p.next() | ||||||
|  | 		p.check(.dot) | ||||||
|  | 	} | ||||||
| 	name := p.tok.lit | 	name := p.tok.lit | ||||||
| 	match p.tok.kind { | 	match p.tok.kind { | ||||||
| 		// func
 | 		// func
 | ||||||
|  |  | ||||||
|  | @ -211,6 +211,12 @@ pub fn (p mut Parser) top_stmt() ast.Stmt { | ||||||
| 		.hash { | 		.hash { | ||||||
| 			return p.hash() | 			return p.hash() | ||||||
| 		} | 		} | ||||||
|  | 		.key_type { | ||||||
|  | 			return p.type_decl() | ||||||
|  | 		} | ||||||
|  | 		.key_enum { | ||||||
|  | 			return p.enum_decl() | ||||||
|  | 		} | ||||||
| 		else { | 		else { | ||||||
| 			p.error('parser: bad top level statement') | 			p.error('parser: bad top level statement') | ||||||
| 			return ast.Stmt{} | 			return ast.Stmt{} | ||||||
|  | @ -470,7 +476,7 @@ pub fn (p mut Parser) name_expr() (ast.Expr,table.Type) { | ||||||
| 		p.next() | 		p.next() | ||||||
| 		p.check(.dot) | 		p.check(.dot) | ||||||
| 	} | 	} | ||||||
| 	else if p.tok.lit in ['strings', 'strconv'] { | 	if p.peek_tok.kind == .dot && p.tok.lit in p.table.imports { | ||||||
| 		p.next() | 		p.next() | ||||||
| 		p.check(.dot) | 		p.check(.dot) | ||||||
| 	} | 	} | ||||||
|  | @ -1020,6 +1026,18 @@ fn (p mut Parser) string_expr() (ast.Expr,table.Type) { | ||||||
| fn (p mut Parser) array_init() (ast.Expr,table.Type) { | fn (p mut Parser) array_init() (ast.Expr,table.Type) { | ||||||
| 	mut node := ast.Expr{} | 	mut node := ast.Expr{} | ||||||
| 	p.check(.lsbr) | 	p.check(.lsbr) | ||||||
|  | 	// `[]` - empty array with an automatically deduced type
 | ||||||
|  | 	/* | ||||||
|  | 	if p.peek_tok.kind == .rsbr && p.expected_type.kind == .array { | ||||||
|  | 		node = ast.ArrayInit{ | ||||||
|  | 			// typ: array_type
 | ||||||
|  | 			exprs: [] | ||||||
|  | 			pos: p.tok.position() | ||||||
|  | 		} | ||||||
|  | 		return node,p.expected_type | ||||||
|  | 	} | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
| 	mut val_type := table.void_type | 	mut val_type := table.void_type | ||||||
| 	mut exprs := []ast.Expr | 	mut exprs := []ast.Expr | ||||||
| 	mut is_fixed := false | 	mut is_fixed := false | ||||||
|  | @ -1103,16 +1121,17 @@ fn (p mut Parser) module_decl() ast.Module { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (p mut Parser) parse_import() ast.Import { | fn (p mut Parser) parse_import() ast.Import { | ||||||
| 	mod_name := p.check_name() | 	mut mod_name := p.check_name() | ||||||
| 	if p.tok.kind == .dot { | 	if p.tok.kind == .dot { | ||||||
| 		p.next() | 		p.next() | ||||||
| 		p.check_name() | 		mod_name += '.' + p.check_name() | ||||||
| 	} | 	} | ||||||
| 	mut mod_alias := mod_name | 	mut mod_alias := mod_name | ||||||
| 	if p.tok.kind == .key_as { | 	if p.tok.kind == .key_as { | ||||||
| 		p.check(.key_as) | 		p.check(.key_as) | ||||||
| 		mod_alias = p.check_name() | 		mod_alias = p.check_name() | ||||||
| 	} | 	} | ||||||
|  | 	p.table.imports << mod_name | ||||||
| 	return ast.Import{ | 	return ast.Import{ | ||||||
| 		mod: mod_name | 		mod: mod_name | ||||||
| 		alias: mod_alias | 		alias: mod_alias | ||||||
|  | @ -1372,6 +1391,10 @@ fn (p mut Parser) global_decl() ast.GlobalDecl { | ||||||
| 
 | 
 | ||||||
| fn (p mut Parser) match_expr() (ast.Expr,table.Type) { | fn (p mut Parser) match_expr() (ast.Expr,table.Type) { | ||||||
| 	p.check(.key_match) | 	p.check(.key_match) | ||||||
|  | 	is_mut := p.tok.kind == .key_mut | ||||||
|  | 	if is_mut { | ||||||
|  | 		p.next() | ||||||
|  | 	} | ||||||
| 	cond,typ := p.expr(0) | 	cond,typ := p.expr(0) | ||||||
| 	p.check(.lcbr) | 	p.check(.lcbr) | ||||||
| 	mut blocks := []ast.StmtBlock | 	mut blocks := []ast.StmtBlock | ||||||
|  | @ -1443,6 +1466,10 @@ fn (p mut Parser) enum_decl() ast.EnumDecl { | ||||||
| 		val := p.check_name() | 		val := p.check_name() | ||||||
| 		vals << val | 		vals << val | ||||||
| 		p.warn('enum val $val') | 		p.warn('enum val $val') | ||||||
|  | 		if p.tok.kind == .assign { | ||||||
|  | 			p.next() | ||||||
|  | 			p.expr(0) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	p.check(.rcbr) | 	p.check(.rcbr) | ||||||
| 	return ast.EnumDecl{ | 	return ast.EnumDecl{ | ||||||
|  |  | ||||||
|  | @ -19,7 +19,8 @@ pub mut: | ||||||
| 	fns             map[string]Fn | 	fns             map[string]Fn | ||||||
| 	consts          map[string]Var | 	consts          map[string]Var | ||||||
| 	tmp_cnt         int | 	tmp_cnt         int | ||||||
| 	imports         []string | 	imports         []string // List of all imports
 | ||||||
|  | 	modules         []string // List of all modules registered by the application
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct Fn { | pub struct Fn { | ||||||
|  | @ -577,3 +578,13 @@ pub fn (t &Table) get_expr_typ(expr ast.Expr) TypeSymbol { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| */ | */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | pub fn (t &Table) known_import(name string) bool { | ||||||
|  | 	for i in t.imports { | ||||||
|  | 		if i.all_after('.') == name { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue