v2: cleanup old & unused code, add new simple tmp vars in cgen
							parent
							
								
									2e1dbd9f5a
								
							
						
					
					
						commit
						ecb0af36b3
					
				| 
						 | 
					@ -13,6 +13,7 @@ struct Gen {
 | 
				
			||||||
	table       &table.Table
 | 
						table       &table.Table
 | 
				
			||||||
mut:
 | 
					mut:
 | 
				
			||||||
	fn_decl     &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
 | 
						fn_decl     &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
 | 
				
			||||||
 | 
						tmp_count   int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn cgen(files []ast.File, table &table.Table) string {
 | 
					pub fn cgen(files []ast.File, table &table.Table) string {
 | 
				
			||||||
| 
						 | 
					@ -39,6 +40,15 @@ pub fn (g mut Gen) writeln(s string) {
 | 
				
			||||||
	g.out.writeln(s)
 | 
						g.out.writeln(s)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn (g mut Gen) new_tmp_var() string {
 | 
				
			||||||
 | 
						g.tmp_count++
 | 
				
			||||||
 | 
						return 'tmp$g.tmp_count'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn (g mut Gen) reset_tmp_count() {
 | 
				
			||||||
 | 
						g.tmp_count = 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn (g mut Gen) stmts(stmts []ast.Stmt) {
 | 
					fn (g mut Gen) stmts(stmts []ast.Stmt) {
 | 
				
			||||||
	for stmt in stmts {
 | 
						for stmt in stmts {
 | 
				
			||||||
		g.stmt(stmt)
 | 
							g.stmt(stmt)
 | 
				
			||||||
| 
						 | 
					@ -60,6 +70,7 @@ fn (g mut Gen) stmt(node ast.Stmt) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ast.FnDecl {
 | 
							ast.FnDecl {
 | 
				
			||||||
 | 
								g.reset_tmp_count()
 | 
				
			||||||
			g.fn_decl = it // &it
 | 
								g.fn_decl = it // &it
 | 
				
			||||||
			is_main := it.name == 'main'
 | 
								is_main := it.name == 'main'
 | 
				
			||||||
			if is_main {
 | 
								if is_main {
 | 
				
			||||||
| 
						 | 
					@ -286,11 +297,10 @@ fn (g mut Gen) expr(node ast.Expr) {
 | 
				
			||||||
		ast.IfExpr {
 | 
							ast.IfExpr {
 | 
				
			||||||
			// If expression? Assign the value to a temp var.
 | 
								// If expression? Assign the value to a temp var.
 | 
				
			||||||
			// Previously ?: was used, but it's too unreliable.
 | 
								// Previously ?: was used, but it's too unreliable.
 | 
				
			||||||
			// ti := g.table.refresh_ti(it.ti)
 | 
					 | 
				
			||||||
			type_sym := g.table.get_type_symbol(it.typ)
 | 
								type_sym := g.table.get_type_symbol(it.typ)
 | 
				
			||||||
			mut tmp := ''
 | 
								mut tmp := ''
 | 
				
			||||||
			if type_sym.kind != .void {
 | 
								if type_sym.kind != .void {
 | 
				
			||||||
				tmp = g.table.new_tmp_var()
 | 
									tmp = g.new_tmp_var()
 | 
				
			||||||
				// g.writeln('$ti.name $tmp;')
 | 
									// g.writeln('$ti.name $tmp;')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			g.write('if (')
 | 
								g.write('if (')
 | 
				
			||||||
| 
						 | 
					@ -317,7 +327,7 @@ fn (g mut Gen) expr(node ast.Expr) {
 | 
				
			||||||
			type_sym := g.table.get_type_symbol(it.typ)
 | 
								type_sym := g.table.get_type_symbol(it.typ)
 | 
				
			||||||
			mut tmp := ''
 | 
								mut tmp := ''
 | 
				
			||||||
			if type_sym.kind != .void {
 | 
								if type_sym.kind != .void {
 | 
				
			||||||
				tmp = g.table.new_tmp_var()
 | 
									tmp = g.new_tmp_var()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			g.write('$type_sym.name $tmp = ')
 | 
								g.write('$type_sym.name $tmp = ')
 | 
				
			||||||
			g.expr(it.cond)
 | 
								g.expr(it.cond)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -112,12 +112,12 @@ void println(string s) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void matches() {
 | 
					void matches() {
 | 
				
			||||||
	int a = 100;
 | 
						int a = 100;
 | 
				
			||||||
	int tmp3 = a;
 | 
						int tmp1 = a;
 | 
				
			||||||
	if tmp3 == 10{
 | 
						if tmp1 == 10{
 | 
				
			||||||
		println(tos3("10"));
 | 
							println(tos3("10"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if tmp3 == 20{
 | 
						if tmp1 == 20{
 | 
				
			||||||
		int k = a + 1;
 | 
							int k = a + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -149,7 +149,6 @@ pub fn (p mut Parser) close_scope() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn (p mut Parser) parse_block() []ast.Stmt {
 | 
					pub fn (p mut Parser) parse_block() []ast.Stmt {
 | 
				
			||||||
	p.open_scope()
 | 
						p.open_scope()
 | 
				
			||||||
	p.table.open_scope()
 | 
					 | 
				
			||||||
	p.check(.lcbr)
 | 
						p.check(.lcbr)
 | 
				
			||||||
	mut stmts := []ast.Stmt
 | 
						mut stmts := []ast.Stmt
 | 
				
			||||||
	if p.tok.kind != .rcbr {
 | 
						if p.tok.kind != .rcbr {
 | 
				
			||||||
| 
						 | 
					@ -164,7 +163,6 @@ pub fn (p mut Parser) parse_block() []ast.Stmt {
 | 
				
			||||||
	p.check(.rcbr)
 | 
						p.check(.rcbr)
 | 
				
			||||||
	println('parse block')
 | 
						println('parse block')
 | 
				
			||||||
	p.close_scope()
 | 
						p.close_scope()
 | 
				
			||||||
	p.table.close_scope()
 | 
					 | 
				
			||||||
	// println('nr exprs in block = $exprs.len')
 | 
						// println('nr exprs in block = $exprs.len')
 | 
				
			||||||
	return stmts
 | 
						return stmts
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -789,7 +787,6 @@ fn (p mut Parser) dot_expr(left ast.Expr, left_type table.Type) ast.Expr {
 | 
				
			||||||
	field_name := p.check_name()
 | 
						field_name := p.check_name()
 | 
				
			||||||
	if field_name == 'filter' {
 | 
						if field_name == 'filter' {
 | 
				
			||||||
		p.open_scope()
 | 
							p.open_scope()
 | 
				
			||||||
		p.table.open_scope()
 | 
					 | 
				
			||||||
		p.filter(left_type)
 | 
							p.filter(left_type)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Method call
 | 
						// Method call
 | 
				
			||||||
| 
						 | 
					@ -823,7 +820,6 @@ fn (p mut Parser) dot_expr(left ast.Expr, left_type table.Type) ast.Expr {
 | 
				
			||||||
	node = sel_expr
 | 
						node = sel_expr
 | 
				
			||||||
	if field_name == 'filter' {
 | 
						if field_name == 'filter' {
 | 
				
			||||||
		p.close_scope()
 | 
							p.close_scope()
 | 
				
			||||||
		p.table.close_scope()
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return node
 | 
						return node
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -872,13 +868,11 @@ fn (p mut Parser) enum_val() (ast.Expr,table.Type) {
 | 
				
			||||||
fn (p mut Parser) for_statement() ast.Stmt {
 | 
					fn (p mut Parser) for_statement() ast.Stmt {
 | 
				
			||||||
	p.check(.key_for)
 | 
						p.check(.key_for)
 | 
				
			||||||
	p.open_scope()
 | 
						p.open_scope()
 | 
				
			||||||
	p.table.open_scope()
 | 
						// defer { p.close_scope() }
 | 
				
			||||||
	// defer { p.table.close_scope() }
 | 
					 | 
				
			||||||
	// Infinite loop
 | 
						// Infinite loop
 | 
				
			||||||
	if p.tok.kind == .lcbr {
 | 
						if p.tok.kind == .lcbr {
 | 
				
			||||||
		stmts := p.parse_block()
 | 
							stmts := p.parse_block()
 | 
				
			||||||
		p.close_scope()
 | 
							p.close_scope()
 | 
				
			||||||
		p.table.close_scope()
 | 
					 | 
				
			||||||
		return ast.ForStmt{
 | 
							return ast.ForStmt{
 | 
				
			||||||
			stmts: stmts
 | 
								stmts: stmts
 | 
				
			||||||
			pos: p.tok.position()
 | 
								pos: p.tok.position()
 | 
				
			||||||
| 
						 | 
					@ -917,7 +911,6 @@ fn (p mut Parser) for_statement() ast.Stmt {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		stmts := p.parse_block()
 | 
							stmts := p.parse_block()
 | 
				
			||||||
		p.close_scope()
 | 
							p.close_scope()
 | 
				
			||||||
		p.table.close_scope()
 | 
					 | 
				
			||||||
		return ast.ForCStmt{
 | 
							return ast.ForCStmt{
 | 
				
			||||||
			stmts: stmts
 | 
								stmts: stmts
 | 
				
			||||||
			init: init
 | 
								init: init
 | 
				
			||||||
| 
						 | 
					@ -981,7 +974,6 @@ fn (p mut Parser) for_statement() ast.Stmt {
 | 
				
			||||||
		stmts := p.parse_block()
 | 
							stmts := p.parse_block()
 | 
				
			||||||
		// println('nr stmts=$stmts.len')
 | 
							// println('nr stmts=$stmts.len')
 | 
				
			||||||
		p.close_scope()
 | 
							p.close_scope()
 | 
				
			||||||
		p.table.close_scope()
 | 
					 | 
				
			||||||
		return ast.ForStmt{
 | 
							return ast.ForStmt{
 | 
				
			||||||
			stmts: stmts
 | 
								stmts: stmts
 | 
				
			||||||
			pos: p.tok.position()
 | 
								pos: p.tok.position()
 | 
				
			||||||
| 
						 | 
					@ -991,7 +983,6 @@ fn (p mut Parser) for_statement() ast.Stmt {
 | 
				
			||||||
	cond,_ := p.expr(0)
 | 
						cond,_ := p.expr(0)
 | 
				
			||||||
	stmts := p.parse_block()
 | 
						stmts := p.parse_block()
 | 
				
			||||||
	p.close_scope()
 | 
						p.close_scope()
 | 
				
			||||||
	p.table.close_scope()
 | 
					 | 
				
			||||||
	return ast.ForStmt{
 | 
						return ast.ForStmt{
 | 
				
			||||||
		cond: cond
 | 
							cond: cond
 | 
				
			||||||
		stmts: stmts
 | 
							stmts: stmts
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,13 +11,9 @@ pub mut:
 | 
				
			||||||
	types       []TypeSymbol
 | 
						types       []TypeSymbol
 | 
				
			||||||
	// type_idxs Hashmap
 | 
						// type_idxs Hashmap
 | 
				
			||||||
	type_idxs   map[string]int
 | 
						type_idxs   map[string]int
 | 
				
			||||||
	local_vars  []Var
 | 
					 | 
				
			||||||
	scope_level int
 | 
					 | 
				
			||||||
	var_idx     int
 | 
					 | 
				
			||||||
	// fns Hashmap
 | 
						// fns Hashmap
 | 
				
			||||||
	fns         map[string]Fn
 | 
						fns         map[string]Fn
 | 
				
			||||||
	consts      map[string]Var
 | 
						consts      map[string]Var
 | 
				
			||||||
	tmp_cnt     int
 | 
					 | 
				
			||||||
	imports     []string // List of all imports
 | 
						imports     []string // List of all imports
 | 
				
			||||||
	modules     []string // List of all modules registered by the application
 | 
						modules     []string // List of all modules registered by the application
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -51,33 +47,6 @@ pub fn new_table() &Table {
 | 
				
			||||||
	return t
 | 
						return t
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn (t &Table) find_var_idx(name string) int {
 | 
					 | 
				
			||||||
	for i, var in t.local_vars {
 | 
					 | 
				
			||||||
		if var.name == name {
 | 
					 | 
				
			||||||
			return i
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return -1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (t &Table) find_var(name string) ?Var {
 | 
					 | 
				
			||||||
	for i in 0 .. t.var_idx {
 | 
					 | 
				
			||||||
		if t.local_vars[i].name == name {
 | 
					 | 
				
			||||||
			return t.local_vars[i]
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	// println(t.names)
 | 
					 | 
				
			||||||
	for var in t.local_vars {
 | 
					 | 
				
			||||||
		if var.name == name {
 | 
					 | 
				
			||||||
			return var
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return none
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (t mut Table) register_const(v Var) {
 | 
					pub fn (t mut Table) register_const(v Var) {
 | 
				
			||||||
	t.consts[v.name] = v
 | 
						t.consts[v.name] = v
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -91,86 +60,9 @@ pub fn (t mut Table) register_global(name string, typ Type) {
 | 
				
			||||||
		// mod: p.mod
 | 
							// mod: p.mod
 | 
				
			||||||
		// is_mut: true
 | 
							// is_mut: true
 | 
				
			||||||
		// idx: -1
 | 
							// idx: -1
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn (t mut Table) register_var(v Var) {
 | 
					 | 
				
			||||||
	typ_sym := t.get_type_symbol(v.typ)
 | 
					 | 
				
			||||||
	println('register_var: $v.name - $typ_sym.name')
 | 
					 | 
				
			||||||
	new_var := {
 | 
					 | 
				
			||||||
		v |
 | 
					 | 
				
			||||||
		idx:t.var_idx,
 | 
					 | 
				
			||||||
		scope_level:t.scope_level
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// t.local_vars << v
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	if v.line_nr == 0 {
 | 
					 | 
				
			||||||
		new_var.token_idx = p.cur_tok_index()
 | 
					 | 
				
			||||||
		new_var.line_nr = p.cur_tok().line_nr
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
	// Expand the array
 | 
					 | 
				
			||||||
	if t.var_idx >= t.local_vars.len {
 | 
					 | 
				
			||||||
		t.local_vars << new_var
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		t.local_vars[t.var_idx] = new_var
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	t.var_idx++
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (t mut Table) open_scope() {
 | 
					 | 
				
			||||||
	t.scope_level++
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (t mut Table) close_scope() {
 | 
					 | 
				
			||||||
	// println('close_scope level=$f.scope_level var_idx=$f.var_idx')
 | 
					 | 
				
			||||||
	// Move back `var_idx` (pointer to the end of the array) till we reach
 | 
					 | 
				
			||||||
	// the previous scope level.  This effectivly deletes (closes) current
 | 
					 | 
				
			||||||
	// scope.
 | 
					 | 
				
			||||||
	mut i := t.var_idx - 1
 | 
					 | 
				
			||||||
	for ; i >= 0; i-- {
 | 
					 | 
				
			||||||
		var := t.local_vars[i]
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		if p.pref.autofree && (v.is_alloc || (v.is_arg && v.typ == 'string')) {
 | 
					 | 
				
			||||||
			// && !p.pref.is_test {
 | 
					 | 
				
			||||||
			p.free_var(v)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// if p.fileis('mem.v') {
 | 
					 | 
				
			||||||
		// println(v.name + ' $v.is_arg scope=$v.scope_level cur=$p.cur_fn.scope_level')}
 | 
					 | 
				
			||||||
		if var.scope_level != t.scope_level {
 | 
					 | 
				
			||||||
			// && !v.is_arg {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	if p.cur_fn.defer_text.last() != '' {
 | 
					 | 
				
			||||||
		p.genln(p.cur_fn.defer_text.last())
 | 
					 | 
				
			||||||
		// p.cur_fn.defer_text[f] = ''
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	t.scope_level--
 | 
					 | 
				
			||||||
	// p.cur_fn.defer_text = p.cur_fn.defer_text[..p.cur_fn.scope_level + 1]
 | 
					 | 
				
			||||||
	t.var_idx = i + 1
 | 
					 | 
				
			||||||
	// println('close_scope new var_idx=$f.var_idx\n')
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (p mut Table) clear_vars() {
 | 
					 | 
				
			||||||
	// shared a := [1, 2, 3]
 | 
					 | 
				
			||||||
	p.var_idx = 0
 | 
					 | 
				
			||||||
	if p.local_vars.len > 0 {
 | 
					 | 
				
			||||||
		// ///if p.pref.autofree {
 | 
					 | 
				
			||||||
		// p.local_vars.free()
 | 
					 | 
				
			||||||
		// ///}
 | 
					 | 
				
			||||||
		p.local_vars = []
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	p.tmp_cnt = 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (t &Table) find_fn(name string) ?Fn {
 | 
					pub fn (t &Table) find_fn(name string) ?Fn {
 | 
				
			||||||
	f := t.fns[name]
 | 
						f := t.fns[name]
 | 
				
			||||||
	if f.name.str != 0 {
 | 
						if f.name.str != 0 {
 | 
				
			||||||
| 
						 | 
					@ -204,11 +96,6 @@ pub fn (t &Table) register_method(typ &TypeSymbol, new_fn Fn) bool {
 | 
				
			||||||
	return true
 | 
						return true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn (t mut Table) new_tmp_var() string {
 | 
					 | 
				
			||||||
	t.tmp_cnt++
 | 
					 | 
				
			||||||
	return 'tmp$t.tmp_cnt'
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (t &TypeSymbol) has_method(name string) bool {
 | 
					pub fn (t &TypeSymbol) has_method(name string) bool {
 | 
				
			||||||
	t.find_method(name) or {
 | 
						t.find_method(name) or {
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
| 
						 | 
					@ -500,86 +387,6 @@ pub fn (t &Table) check(got, expected Type) bool {
 | 
				
			||||||
	return true
 | 
						return true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
[inline]
 | 
					 | 
				
			||||||
pub fn (t &Table) get_expr_typ(expr ast.Expr) TypeSymbol {
 | 
					 | 
				
			||||||
	match expr {
 | 
					 | 
				
			||||||
		ast.ArrayInit {
 | 
					 | 
				
			||||||
			return it.typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.IndexExpr {
 | 
					 | 
				
			||||||
			return t.get_expr_typ(it.left)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.CallExpr {
 | 
					 | 
				
			||||||
			func := t.find_fn(it.name) or {
 | 
					 | 
				
			||||||
				return void_typ
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return func.return_typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.MethodCallExpr {
 | 
					 | 
				
			||||||
			ti := t.get_expr_typ(it.expr)
 | 
					 | 
				
			||||||
			func := t.find_method(typ.idx, it.name) or {
 | 
					 | 
				
			||||||
				return void_type
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return func.return_typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.Ident {
 | 
					 | 
				
			||||||
			if it.kind == .variable {
 | 
					 | 
				
			||||||
				info := it.info as ast.IdentVar
 | 
					 | 
				
			||||||
				if info.typ.kind != .unresolved {
 | 
					 | 
				
			||||||
					return info.ti
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return t.get_expr_typ(info.expr)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return types.void_typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.StructInit {
 | 
					 | 
				
			||||||
			return it.ti
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.StringLiteral {
 | 
					 | 
				
			||||||
			return types.string_typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.IntegerLiteral {
 | 
					 | 
				
			||||||
			return types.int_typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.SelectorExpr {
 | 
					 | 
				
			||||||
			ti := t.get_expr_typ(it.expr)
 | 
					 | 
				
			||||||
			kind := t.types[typ.idx].kind
 | 
					 | 
				
			||||||
			if typ.kind == .placeholder {
 | 
					 | 
				
			||||||
				println(' ##### PH $typ.name')
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !(kind in [.placeholder, .struct_]) {
 | 
					 | 
				
			||||||
				return types.void_typ
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			struct_ := t.types[typ.idx]
 | 
					 | 
				
			||||||
			struct_info := struct_.info as types.Struct
 | 
					 | 
				
			||||||
			for field in struct_info.fields {
 | 
					 | 
				
			||||||
				if field.name == it.field {
 | 
					 | 
				
			||||||
					return field.ti
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if struct_.parent_idx != 0 {
 | 
					 | 
				
			||||||
				parent := t.types[struct_.parent_idx]
 | 
					 | 
				
			||||||
				parent_info := parent.info as types.Struct
 | 
					 | 
				
			||||||
				for field in parent_info.fields {
 | 
					 | 
				
			||||||
					if field.name == it.field {
 | 
					 | 
				
			||||||
						return field.ti
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return types.void_typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.InfixExpr {
 | 
					 | 
				
			||||||
			return t.get_expr_typ(it.left)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else {
 | 
					 | 
				
			||||||
			return types.void_typ
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (t &Table) known_import(name string) bool {
 | 
					pub fn (t &Table) known_import(name string) bool {
 | 
				
			||||||
	for i in t.imports {
 | 
						for i in t.imports {
 | 
				
			||||||
		if i.all_after('.') == name {
 | 
							if i.all_after('.') == name {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue