1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

parser: improve precision of struct field type positions in errors

This commit is contained in:
Delyan Angelov 2022-12-18 13:34:39 +02:00
parent 5b4a16e864
commit de5ae63401
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
8 changed files with 21 additions and 20 deletions

View File

@ -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 |

View File

@ -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 |

View File

@ -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 | }

View File

@ -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 |

View File

@ -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 |

View File

@ -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 |

View File

@ -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`.

View File

@ -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()
}