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