From de5ae63401daa6e609c3fc060b6ccc42f8bc0475 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sun, 18 Dec 2022 13:34:39 +0200 Subject: [PATCH] parser: improve precision of struct field type positions in errors --- .../tests/generics_interface_field_type_err.out | 4 ++-- .../checker/tests/generics_struct_field_type_err.out | 4 ++-- vlib/v/checker/tests/map_unknown_value.out | 4 ++-- .../struct_field_generic_struct_unknown_type_err.out | 4 ++-- .../checker/tests/struct_multi_return_field_err.out | 12 ++++++------ .../v/checker/tests/unknown_array_element_type_b.out | 4 ++-- vlib/v/checker/tests/unknown_method_suggest_name.out | 4 ++-- vlib/v/parser/struct.v | 5 +++-- 8 files changed, 21 insertions(+), 20 deletions(-) diff --git a/vlib/v/checker/tests/generics_interface_field_type_err.out b/vlib/v/checker/tests/generics_interface_field_type_err.out index 8edd2e625..0b24eb197 100644 --- a/vlib/v/checker/tests/generics_interface_field_type_err.out +++ b/vlib/v/checker/tests/generics_interface_field_type_err.out @@ -1,7 +1,7 @@ -vlib/v/checker/tests/generics_interface_field_type_err.vv:34:18: error: `IComponentStore` type is generic interface, must specify the generic type names, e.g. IComponentStore[T], IComponentStore[int] +vlib/v/checker/tests/generics_interface_field_type_err.vv:34:7: error: `IComponentStore` type is generic interface, must specify the generic type names, e.g. IComponentStore[T], IComponentStore[int] 32 | struct Registry { 33 | pub mut: 34 | data map[string]IComponentStore - | ~~~~~~~~~~~~~~~ + | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 35 | } 36 | diff --git a/vlib/v/checker/tests/generics_struct_field_type_err.out b/vlib/v/checker/tests/generics_struct_field_type_err.out index 97c807a9c..8dc6509a5 100644 --- a/vlib/v/checker/tests/generics_struct_field_type_err.out +++ b/vlib/v/checker/tests/generics_struct_field_type_err.out @@ -1,7 +1,7 @@ -vlib/v/checker/tests/generics_struct_field_type_err.vv:4:9: error: `LL` type is generic struct, must specify the generic type names, e.g. LL[T], LL[int] +vlib/v/checker/tests/generics_struct_field_type_err.vv:4:8: error: `LL` type is generic struct, must specify the generic type names, e.g. LL[T], LL[int] 2 | mut: 3 | value T 4 | next &LL = unsafe { 0 } - | ~~ + | ~~~ 5 | } 6 | diff --git a/vlib/v/checker/tests/map_unknown_value.out b/vlib/v/checker/tests/map_unknown_value.out index d5f268b5c..e42d65620 100644 --- a/vlib/v/checker/tests/map_unknown_value.out +++ b/vlib/v/checker/tests/map_unknown_value.out @@ -1,5 +1,5 @@ -vlib/v/checker/tests/map_unknown_value.vv:2:23: error: unknown type `DoesNotExist` +vlib/v/checker/tests/map_unknown_value.vv:2:12: error: unknown type `DoesNotExist` 1 | struct App { 2 | my_map map[string]DoesNotExist - | ~~~~~~~~~~~~ + | ~~~~~~~~~~~~~~~~~~~~~~~ 3 | } diff --git a/vlib/v/checker/tests/struct_field_generic_struct_unknown_type_err.out b/vlib/v/checker/tests/struct_field_generic_struct_unknown_type_err.out index f9aed8373..4de8f8ecb 100644 --- a/vlib/v/checker/tests/struct_field_generic_struct_unknown_type_err.out +++ b/vlib/v/checker/tests/struct_field_generic_struct_unknown_type_err.out @@ -1,7 +1,7 @@ -vlib/v/checker/tests/struct_field_generic_struct_unknown_type_err.vv:9:24: error: unknown type `UnknownType` +vlib/v/checker/tests/struct_field_generic_struct_unknown_type_err.vv:9:7: error: unknown type `UnknownType` 7 | } 8 | struct MyType { 9 | a Maybe[UnknownType] - | ^ + | ~~~~~~~~~~~~~~~~~~ 10 | } 11 | diff --git a/vlib/v/checker/tests/struct_multi_return_field_err.out b/vlib/v/checker/tests/struct_multi_return_field_err.out index ce1e26b24..a16ff52bd 100644 --- a/vlib/v/checker/tests/struct_multi_return_field_err.out +++ b/vlib/v/checker/tests/struct_multi_return_field_err.out @@ -1,6 +1,6 @@ -vlib/v/checker/tests/struct_multi_return_field_err.vv:2:16: error: cannot use multi return as field type - 1 | struct Tuple{ - 2 | data (int, int) - | ^ - 3 | } - 4 | +vlib/v/checker/tests/struct_multi_return_field_err.vv:2:7: error: cannot use multi return as field type + 1 | struct Tuple{ + 2 | data (int, int) + | ~~~~~~~~~~ + 3 | } + 4 | diff --git a/vlib/v/checker/tests/unknown_array_element_type_b.out b/vlib/v/checker/tests/unknown_array_element_type_b.out index 2efc456c9..b46648706 100644 --- a/vlib/v/checker/tests/unknown_array_element_type_b.out +++ b/vlib/v/checker/tests/unknown_array_element_type_b.out @@ -1,7 +1,7 @@ -vlib/v/checker/tests/unknown_array_element_type_b.vv:2:6: error: unknown type `abc`. +vlib/v/checker/tests/unknown_array_element_type_b.vv:2:4: error: unknown type `abc`. Did you mean `Aaa`? 1 | struct Aaa { 2 | a []abc - | ~~~ + | ~~~~~ 3 | } 4 | diff --git a/vlib/v/checker/tests/unknown_method_suggest_name.out b/vlib/v/checker/tests/unknown_method_suggest_name.out index f80de0946..acf5d1427 100644 --- a/vlib/v/checker/tests/unknown_method_suggest_name.out +++ b/vlib/v/checker/tests/unknown_method_suggest_name.out @@ -1,9 +1,9 @@ -vlib/v/checker/tests/unknown_method_suggest_name.vv:13:12: error: unknown type `hash.crc32.Crc33`. +vlib/v/checker/tests/unknown_method_suggest_name.vv:13:6: error: unknown type `hash.crc32.Crc33`. Did you mean `crc32.Crc32`? 11 | y int 12 | z int 13 | ccc crc32.Crc33 - | ~~~~~ + | ~~~~~~~~~~~ 14 | } 15 | vlib/v/checker/tests/unknown_method_suggest_name.vv:27:9: error: unknown method or field: `Point.tranzlate`. diff --git a/vlib/v/parser/struct.v b/vlib/v/parser/struct.v index 3e9d4e367..823cc9455 100644 --- a/vlib/v/parser/struct.v +++ b/vlib/v/parser/struct.v @@ -252,15 +252,16 @@ fn (mut p Parser) struct_decl(is_anon bool) ast.StructDecl { typ = p.table.find_type_idx(anon_struct_decl.name) } } else { + start_type_pos := p.tok.pos() typ = p.parse_type() + type_pos = start_type_pos.extend(p.prev_tok.pos()) } p.inside_struct_field_decl = false if typ.idx() == 0 { // error is set in parse_type return ast.StructDecl{} } - type_pos = p.prev_tok.pos() - field_pos = field_start_pos.extend(type_pos) + field_pos = field_start_pos.extend(p.prev_tok.pos()) if typ.has_flag(.optional) || typ.has_flag(.result) { optional_pos = p.peek_token(-2).pos() } -- 2.39.5