mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-21 05:45:19 +00:00
Improve error reporting on "Failed to parse fail" and show the line error if possible
This commit is contained in:
@@ -35,18 +35,38 @@ gb_internal gbString get_file_line_as_string(TokenPos const &pos, i32 *offset_)
|
||||
if (file == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
isize offset = pos.offset;
|
||||
|
||||
u8 *start = file->tokenizer.start;
|
||||
u8 *end = file->tokenizer.end;
|
||||
if (start == end) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
isize offset = pos.offset;
|
||||
if (pos.line != 0 && offset == 0) {
|
||||
for (i32 i = 1; i < pos.line; i++) {
|
||||
while (start+offset < end) {
|
||||
u8 c = start[offset++];
|
||||
if (c == '\n') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i32 i = 1; i < pos.column; i++) {
|
||||
u8 *ptr = start+offset;
|
||||
u8 c = *ptr;
|
||||
if (c & 0x80) {
|
||||
offset += utf8_decode(ptr, end-ptr, nullptr);
|
||||
} else {
|
||||
offset++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
isize len = end-start;
|
||||
if (len < offset) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
u8 *pos_offset = start+offset;
|
||||
|
||||
u8 *line_start = pos_offset;
|
||||
@@ -70,6 +90,7 @@ gb_internal gbString get_file_line_as_string(TokenPos const &pos, i32 *offset_)
|
||||
|
||||
if (offset_) *offset_ = cast(i32)(pos_offset - the_line.text);
|
||||
|
||||
|
||||
return gb_string_make_length(heap_allocator(), the_line.text, the_line.len);
|
||||
}
|
||||
|
||||
@@ -5417,6 +5438,7 @@ gb_internal WORKER_TASK_PROC(parser_worker_proc) {
|
||||
|
||||
gb_internal void parser_add_file_to_process(Parser *p, AstPackage *pkg, FileInfo fi, TokenPos pos) {
|
||||
ImportedFile f = {pkg, fi, pos, p->file_to_process_count++};
|
||||
f.pos.file_id = cast(i32)(f.index+1);
|
||||
auto wd = gb_alloc_item(permanent_allocator(), ParserWorkerData);
|
||||
wd->parser = p;
|
||||
wd->imported_file = f;
|
||||
@@ -5453,6 +5475,7 @@ gb_internal WORKER_TASK_PROC(foreign_file_worker_proc) {
|
||||
gb_internal void parser_add_foreign_file_to_process(Parser *p, AstPackage *pkg, AstForeignFileKind kind, FileInfo fi, TokenPos pos) {
|
||||
// TODO(bill): Use a better allocator
|
||||
ImportedFile f = {pkg, fi, pos, p->file_to_process_count++};
|
||||
f.pos.file_id = cast(i32)(f.index+1);
|
||||
auto wd = gb_alloc_item(permanent_allocator(), ForeignFileWorkerData);
|
||||
wd->parser = p;
|
||||
wd->imported_file = f;
|
||||
|
||||
Reference in New Issue
Block a user