mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: improve error messages of missing generic type names (#16610)
This commit is contained in:
@@ -497,11 +497,11 @@ fn (mut c Checker) sum_type_decl(node ast.SumTypeDecl) {
|
|||||||
} else if mut sym.info is ast.Struct {
|
} else if mut sym.info is ast.Struct {
|
||||||
if sym.info.is_generic {
|
if sym.info.is_generic {
|
||||||
if !variant.typ.has_flag(.generic) {
|
if !variant.typ.has_flag(.generic) {
|
||||||
c.error('generic struct `${sym.name}` must specify generic type names, e.g. Foo[T]',
|
c.error('generic struct `${sym.name}` must specify generic type names, e.g. ${sym.name}[T]',
|
||||||
variant.pos)
|
variant.pos)
|
||||||
}
|
}
|
||||||
if node.generic_types.len == 0 {
|
if node.generic_types.len == 0 {
|
||||||
c.error('generic sumtype `${node.name}` must specify generic type names, e.g. Foo[T]',
|
c.error('generic sumtype `${node.name}` must specify generic type names, e.g. ${node.name}[T]',
|
||||||
node.name_pos)
|
node.name_pos)
|
||||||
} else {
|
} else {
|
||||||
for typ in sym.info.generic_types {
|
for typ in sym.info.generic_types {
|
||||||
|
@@ -17,10 +17,10 @@ fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
|
|||||||
if elem_info.generic_types.len > 0 && elem_info.concrete_types.len == 0
|
if elem_info.generic_types.len > 0 && elem_info.concrete_types.len == 0
|
||||||
&& !node.elem_type.has_flag(.generic) {
|
&& !node.elem_type.has_flag(.generic) {
|
||||||
if c.table.cur_concrete_types.len == 0 {
|
if c.table.cur_concrete_types.len == 0 {
|
||||||
c.error('generic struct must specify type parameter, e.g. Foo[int]',
|
c.error('generic struct `${elem_sym.name}` must specify type parameter, e.g. ${elem_sym.name}[int]',
|
||||||
node.elem_type_pos)
|
node.elem_type_pos)
|
||||||
} else {
|
} else {
|
||||||
c.error('generic struct must specify type parameter, e.g. Foo[T]',
|
c.error('generic struct `${elem_sym.name}` must specify type parameter, e.g. ${elem_sym.name}[T]',
|
||||||
node.elem_type_pos)
|
node.elem_type_pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -29,10 +29,10 @@ fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
|
|||||||
if elem_info.generic_types.len > 0 && elem_info.concrete_types.len == 0
|
if elem_info.generic_types.len > 0 && elem_info.concrete_types.len == 0
|
||||||
&& !node.elem_type.has_flag(.generic) {
|
&& !node.elem_type.has_flag(.generic) {
|
||||||
if c.table.cur_concrete_types.len == 0 {
|
if c.table.cur_concrete_types.len == 0 {
|
||||||
c.error('generic interface must specify type parameter, e.g. Foo[int]',
|
c.error('generic interface `${elem_sym.name}` must specify type parameter, e.g. ${elem_sym.name}[int]',
|
||||||
node.elem_type_pos)
|
node.elem_type_pos)
|
||||||
} else {
|
} else {
|
||||||
c.error('generic interface must specify type parameter, e.g. Foo[T]',
|
c.error('generic interface `${elem_sym.name}` must specify type parameter, e.g. ${elem_sym.name}[T]',
|
||||||
node.elem_type_pos)
|
node.elem_type_pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -41,10 +41,10 @@ fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
|
|||||||
if elem_info.generic_types.len > 0 && elem_info.concrete_types.len == 0
|
if elem_info.generic_types.len > 0 && elem_info.concrete_types.len == 0
|
||||||
&& !node.elem_type.has_flag(.generic) {
|
&& !node.elem_type.has_flag(.generic) {
|
||||||
if c.table.cur_concrete_types.len == 0 {
|
if c.table.cur_concrete_types.len == 0 {
|
||||||
c.error('generic sumtype must specify type parameter, e.g. Foo[int]',
|
c.error('generic sumtype `${elem_sym.name}` must specify type parameter, e.g. ${elem_sym.name}[int]',
|
||||||
node.elem_type_pos)
|
node.elem_type_pos)
|
||||||
} else {
|
} else {
|
||||||
c.error('generic sumtype must specify type parameter, e.g. Foo[T]',
|
c.error('generic sumtype `${elem_sym.name}` must specify type parameter, e.g. ${elem_sym.name}[T]',
|
||||||
node.elem_type_pos)
|
node.elem_type_pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -307,10 +307,10 @@ fn (mut c Checker) map_init(mut node ast.MapInit) ast.Type {
|
|||||||
if val_info.generic_types.len > 0 && val_info.concrete_types.len == 0
|
if val_info.generic_types.len > 0 && val_info.concrete_types.len == 0
|
||||||
&& !info.value_type.has_flag(.generic) {
|
&& !info.value_type.has_flag(.generic) {
|
||||||
if c.table.cur_concrete_types.len == 0 {
|
if c.table.cur_concrete_types.len == 0 {
|
||||||
c.error('generic struct `${val_sym.name}` must specify type parameter, e.g. Foo[int]',
|
c.error('generic struct `${val_sym.name}` must specify type parameter, e.g. ${val_sym.name}[int]',
|
||||||
node.pos)
|
node.pos)
|
||||||
} else {
|
} else {
|
||||||
c.error('generic struct `${val_sym.name}` must specify type parameter, e.g. Foo[T]',
|
c.error('generic struct `${val_sym.name}` must specify type parameter, e.g. ${val_sym.name}[T]',
|
||||||
node.pos)
|
node.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -105,7 +105,7 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
|||||||
gs := c.table.sym(node.return_type)
|
gs := c.table.sym(node.return_type)
|
||||||
if gs.info is ast.Struct {
|
if gs.info is ast.Struct {
|
||||||
if gs.info.is_generic && !node.return_type.has_flag(.generic) {
|
if gs.info.is_generic && !node.return_type.has_flag(.generic) {
|
||||||
c.error('return generic struct in fn declaration must specify the generic type names, e.g. Foo[T]',
|
c.error('return generic struct `${gs.name}` in fn declaration must specify the generic type names, e.g. ${gs.name}[T]',
|
||||||
node.return_type_pos)
|
node.return_type_pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,19 +224,19 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
|||||||
}
|
}
|
||||||
if arg_typ_sym.info.generic_types.len > 0 && !param.typ.has_flag(.generic)
|
if arg_typ_sym.info.generic_types.len > 0 && !param.typ.has_flag(.generic)
|
||||||
&& arg_typ_sym.info.concrete_types.len == 0 {
|
&& arg_typ_sym.info.concrete_types.len == 0 {
|
||||||
c.error('generic struct in fn declaration must specify the generic type names, e.g. Foo[T]',
|
c.error('generic struct `${arg_typ_sym.name}` in fn declaration must specify the generic type names, e.g. ${arg_typ_sym.name}[T]',
|
||||||
param.type_pos)
|
param.type_pos)
|
||||||
}
|
}
|
||||||
} else if arg_typ_sym.info is ast.Interface {
|
} else if arg_typ_sym.info is ast.Interface {
|
||||||
if arg_typ_sym.info.generic_types.len > 0 && !param.typ.has_flag(.generic)
|
if arg_typ_sym.info.generic_types.len > 0 && !param.typ.has_flag(.generic)
|
||||||
&& arg_typ_sym.info.concrete_types.len == 0 {
|
&& arg_typ_sym.info.concrete_types.len == 0 {
|
||||||
c.error('generic interface in fn declaration must specify the generic type names, e.g. Foo[T]',
|
c.error('generic interface `${arg_typ_sym.name}` in fn declaration must specify the generic type names, e.g. ${arg_typ_sym.name}[T]',
|
||||||
param.type_pos)
|
param.type_pos)
|
||||||
}
|
}
|
||||||
} else if arg_typ_sym.info is ast.SumType {
|
} else if arg_typ_sym.info is ast.SumType {
|
||||||
if arg_typ_sym.info.generic_types.len > 0 && !param.typ.has_flag(.generic)
|
if arg_typ_sym.info.generic_types.len > 0 && !param.typ.has_flag(.generic)
|
||||||
&& arg_typ_sym.info.concrete_types.len == 0 {
|
&& arg_typ_sym.info.concrete_types.len == 0 {
|
||||||
c.error('generic sumtype in fn declaration must specify the generic type names, e.g. Foo[T]',
|
c.error('generic sumtype `${arg_typ_sym.name}` in fn declaration must specify the generic type names, e.g. ${arg_typ_sym.name}[T]',
|
||||||
param.type_pos)
|
param.type_pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -211,7 +211,7 @@ fn (mut c Checker) interface_decl(mut node ast.InterfaceDecl) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if node.generic_types.len == 0 && has_generic_types {
|
if node.generic_types.len == 0 && has_generic_types {
|
||||||
c.error('generic interface declaration must specify the generic type names, e.g. Foo[T]',
|
c.error('generic interface `${node.name}` declaration must specify the generic type names, e.g. ${node.name}[T]',
|
||||||
node.pos)
|
node.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -165,7 +165,7 @@ fn (mut c Checker) struct_decl(mut node ast.StructDecl) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if node.generic_types.len == 0 && has_generic_types {
|
if node.generic_types.len == 0 && has_generic_types {
|
||||||
c.error('generic struct declaration must specify the generic type names, e.g. Foo[T]',
|
c.error('generic struct `${node.name}` declaration must specify the generic type names, e.g. ${node.name}[T]',
|
||||||
node.pos)
|
node.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,7 @@ vlib/v/checker/tests/array_of_generic_struct_init_err.vv:6:6: warning: unused va
|
|||||||
6 | mut arr := []Item{}
|
6 | mut arr := []Item{}
|
||||||
| ~~~
|
| ~~~
|
||||||
7 | }
|
7 | }
|
||||||
vlib/v/checker/tests/array_of_generic_struct_init_err.vv:6:15: error: generic struct must specify type parameter, e.g. Foo[int]
|
vlib/v/checker/tests/array_of_generic_struct_init_err.vv:6:15: error: generic struct `Item` must specify type parameter, e.g. Item[int]
|
||||||
4 |
|
4 |
|
||||||
5 | fn main() {
|
5 | fn main() {
|
||||||
6 | mut arr := []Item{}
|
6 | mut arr := []Item{}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generic_interface_missing_type_names_err.vv:16:17: error: generic interface must specify type parameter, e.g. Foo[int]
|
vlib/v/checker/tests/generic_interface_missing_type_names_err.vv:16:17: error: generic interface `Output` must specify type parameter, e.g. Output[int]
|
||||||
14 |
|
14 |
|
||||||
15 | fn main() {
|
15 | fn main() {
|
||||||
16 | mut outs := []Output{}
|
16 | mut outs := []Output{}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generic_sumtype_decl_err_a.vv:7:24: error: generic struct `Just` must specify generic type names, e.g. Foo[T]
|
vlib/v/checker/tests/generic_sumtype_decl_err_a.vv:7:24: error: generic struct `Just` must specify generic type names, e.g. Just[T]
|
||||||
5 | struct Nothing {}
|
5 | struct Nothing {}
|
||||||
6 |
|
6 |
|
||||||
7 | type Maybe = Nothing | Just
|
7 | type Maybe = Nothing | Just
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generic_sumtype_decl_err_b.vv:7:6: error: generic sumtype `Maybe` must specify generic type names, e.g. Foo[T]
|
vlib/v/checker/tests/generic_sumtype_decl_err_b.vv:7:6: error: generic sumtype `Maybe` must specify generic type names, e.g. Maybe[T]
|
||||||
5 | struct Nothing {}
|
5 | struct Nothing {}
|
||||||
6 |
|
6 |
|
||||||
7 | type Maybe = Nothing | Just[T]
|
7 | type Maybe = Nothing | Just[T]
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generics_fn_arg_type_err.vv:14:23: error: generic interface in fn declaration must specify the generic type names, e.g. Foo[T]
|
vlib/v/checker/tests/generics_fn_arg_type_err.vv:14:23: error: generic interface `List` in fn declaration must specify the generic type names, e.g. List[T]
|
||||||
12 | }
|
12 | }
|
||||||
13 |
|
13 |
|
||||||
14 | fn do_list_thing(list List) { // <--- Error here
|
14 | fn do_list_thing(list List) { // <--- Error here
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generics_fn_return_generic_struct_err.vv:13:32: error: return generic struct in fn declaration must specify the generic type names, e.g. Foo[T]
|
vlib/v/checker/tests/generics_fn_return_generic_struct_err.vv:13:32: error: return generic struct `GenericChannelStruct` in fn declaration must specify the generic type names, e.g. GenericChannelStruct[T]
|
||||||
11 | }
|
11 | }
|
||||||
12 |
|
12 |
|
||||||
13 | pub fn new_channel_struct[T]() GenericChannelStruct {
|
13 | pub fn new_channel_struct[T]() GenericChannelStruct {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generics_interface_declaration_err.vv:1:1: error: generic interface declaration must specify the generic type names, e.g. Foo[T]
|
vlib/v/checker/tests/generics_interface_declaration_err.vv:1:1: error: generic interface `Expr` declaration must specify the generic type names, e.g. Expr[T]
|
||||||
1 | interface Expr {
|
1 | interface Expr {
|
||||||
| ~~~~~~~~~~~~~~~~
|
| ~~~~~~~~~~~~~~~~
|
||||||
2 | accept(v Visitor<R>) R
|
2 | accept(v Visitor<R>) R
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generics_method_receiver_type_err.vv:6:11: error: generic struct in fn declaration must specify the generic type names, e.g. Foo[T]
|
vlib/v/checker/tests/generics_method_receiver_type_err.vv:6:11: error: generic struct `Node` in fn declaration must specify the generic type names, e.g. Node[T]
|
||||||
4 | }
|
4 | }
|
||||||
5 |
|
5 |
|
||||||
6 | pub fn (x Node) str() string {
|
6 | pub fn (x Node) str() string {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
vlib/v/checker/tests/generics_struct_declaration_err.vv:5:1: error: generic struct declaration must specify the generic type names, e.g. Foo[T]
|
vlib/v/checker/tests/generics_struct_declaration_err.vv:5:1: error: generic struct `MyGenericChannelStruct` declaration must specify the generic type names, e.g. MyGenericChannelStruct[T]
|
||||||
3 | }
|
3 | }
|
||||||
4 |
|
4 |
|
||||||
5 | struct MyGenericChannelStruct {
|
5 | struct MyGenericChannelStruct {
|
||||||
|
@@ -4,7 +4,7 @@ vlib/v/checker/tests/map_of_generic_struct_init_err.vv:6:6: warning: unused vari
|
|||||||
6 | mut m := map[string]Item{}
|
6 | mut m := map[string]Item{}
|
||||||
| ^
|
| ^
|
||||||
7 | }
|
7 | }
|
||||||
vlib/v/checker/tests/map_of_generic_struct_init_err.vv:6:11: error: generic struct `Item` must specify type parameter, e.g. Foo[int]
|
vlib/v/checker/tests/map_of_generic_struct_init_err.vv:6:11: error: generic struct `Item` must specify type parameter, e.g. Item[int]
|
||||||
4 |
|
4 |
|
||||||
5 | fn main() {
|
5 | fn main() {
|
||||||
6 | mut m := map[string]Item{}
|
6 | mut m := map[string]Item{}
|
||||||
|
Reference in New Issue
Block a user