builder: improve the function redefinition detector
							parent
							
								
									2c3f695469
								
							
						
					
					
						commit
						204fd8be03
					
				|  | @ -309,26 +309,50 @@ fn (b &Builder) print_warnings_and_errors() { | ||||||
| 		exit(1) | 		exit(1) | ||||||
| 	} | 	} | ||||||
| 	if b.table.redefined_fns.len > 0 { | 	if b.table.redefined_fns.len > 0 { | ||||||
|  | 		mut total_conflicts := 0 | ||||||
| 		for fn_name in b.table.redefined_fns { | 		for fn_name in b.table.redefined_fns { | ||||||
| 			eprintln('redefinition of function `$fn_name`') |  | ||||||
| 			// eprintln('previous declaration at')
 |  | ||||||
| 			// Find where this function was already declared
 | 			// Find where this function was already declared
 | ||||||
|  | 			mut redefines := []FunctionRedefinition{} | ||||||
|  | 			mut redefine_conflicts := map[string]int{} | ||||||
| 			for file in b.parsed_files { | 			for file in b.parsed_files { | ||||||
| 				for stmt in file.stmts { | 				for stmt in file.stmts { | ||||||
| 					if stmt is ast.FnDecl { | 					if stmt is ast.FnDecl { | ||||||
| 						if stmt.name == fn_name { | 						if stmt.name == fn_name { | ||||||
| 							fline := stmt.pos.line_nr | 							fheader := stmt.stringify(b.table, 'main') | ||||||
| 							println('$file.path:$fline:') | 							redefines << FunctionRedefinition{ | ||||||
|  | 								fpath: file.path | ||||||
|  | 								fline: stmt.pos.line_nr | ||||||
|  | 								f: stmt | ||||||
|  | 								fheader: fheader | ||||||
|  | 							} | ||||||
|  | 							redefine_conflicts[fheader]++ | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 			if redefine_conflicts.len > 1 { | ||||||
|  | 				eprintln('redefinition of function `$fn_name`') | ||||||
|  | 				for redefine in redefines { | ||||||
|  | 					eprintln(util.formatted_error('conflicting declaration:', redefine.fheader, | ||||||
|  | 						redefine.fpath, redefine.f.pos)) | ||||||
|  | 				} | ||||||
|  | 				total_conflicts++ | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if total_conflicts > 0 { | ||||||
| 			b.show_total_warns_and_errors_stats() | 			b.show_total_warns_and_errors_stats() | ||||||
| 			exit(1) | 			exit(1) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | struct FunctionRedefinition { | ||||||
|  | 	fpath   string | ||||||
|  | 	fline   int | ||||||
|  | 	fheader string | ||||||
|  | 	f       ast.FnDecl | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn verror(s string) { | fn verror(s string) { | ||||||
| 	util.verror('builder error', s) | 	util.verror('builder error', s) | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue