Răsfoiți Sursa

Add extra error checking in parser.cpp

gingerBill 4 ani în urmă
părinte
comite
c653e400db
2 a modificat fișierele cu 19 adăugiri și 4 ștergeri
  1. 13 0
      src/parser.cpp
  2. 6 4
      src/parser.hpp

+ 13 - 0
src/parser.cpp

@@ -5320,6 +5320,7 @@ ParseFileError process_imported_file(Parser *p, ImportedFile const &imported_fil
 	TokenPos err_pos = {0};
 	ParseFileError err = init_ast_file(file, fi->fullpath, &err_pos);
 	err_pos.file = fi->fullpath;
+	file->last_error = err;
 
 	if (err != ParseFile_None) {
 		if (err == ParseFile_EmptyFile) {
@@ -5426,6 +5427,18 @@ ParseFileError parse_packages(Parser *p, String init_filename) {
 		}
 	}
 
+	for (isize i = p->packages.count-1; i >= 0; i--) {
+		AstPackage *pkg = p->packages[i];
+		for (isize j = pkg->files.count-1; j >= 0; j--) {
+			AstFile *file = pkg->files[j];
+			if (file->error_count != 0) {
+				if (file->last_error != ParseFile_None) {
+					return file->last_error;
+				}
+				return ParseFile_GeneralError;
+			}
+		}
+	}
 	return ParseFile_None;
 }
 

+ 6 - 4
src/parser.hpp

@@ -41,6 +41,7 @@ enum ParseFileError {
 	ParseFile_Permission,
 	ParseFile_NotFound,
 	ParseFile_InvalidToken,
+	ParseFile_GeneralError,
 
 	ParseFile_Count,
 };
@@ -102,10 +103,11 @@ struct AstFile {
 	Array<Ast *> imports; // 'import'
 	isize        directive_count;
 
-	Ast *        curr_proc;
-	isize        error_count;
-	f64          time_to_tokenize; // seconds
-	f64          time_to_parse;    // seconds
+	Ast *          curr_proc;
+	isize          error_count;
+	ParseFileError last_error;
+	f64            time_to_tokenize; // seconds
+	f64            time_to_parse;    // seconds
 
 	bool is_test;