checker: improve the method searching in the generic types

Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
pull/13824/head
Vincenzo Palazzo 2022-03-31 21:40:02 +02:00
parent ae4bb3aa88
commit b4af04259d
No known key found for this signature in database
GPG Key ID: 8B6DC2B870B80D5F
3 changed files with 6 additions and 3 deletions

View File

@ -327,7 +327,8 @@ pub fn (mut rng PRNG) choose<T>(array []T, k int) ?[]T {
} }
mut results := []T{len: k} mut results := []T{len: k}
mut indices := []int{len: n, init: it} mut indices := []int{len: n, init: it}
rng.shuffle(mut indices) ? // enfoce the type to int to avoid ambiguity
rng.shuffle<int>(mut indices) ?
for i in 0 .. k { for i in 0 .. k {
results[i] = array[indices[i]] results[i] = array[indices[i]]
} }

View File

@ -823,10 +823,12 @@ pub fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type {
left_gen_type := c.unwrap_generic(left_type) left_gen_type := c.unwrap_generic(left_type)
gen_sym := c.table.sym(left_gen_type) gen_sym := c.table.sym(left_gen_type)
need_overload := gen_sym.kind in [.struct_, .interface_] need_overload := gen_sym.kind in [.struct_, .interface_]
if need_overload && !gen_sym.has_method('<') && node.op in [.ge, .le] { if need_overload && !gen_sym.has_method_with_generic_parent('<')
&& node.op in [.ge, .le] {
c.error('cannot use `$node.op` as `<` operator method is not defined', c.error('cannot use `$node.op` as `<` operator method is not defined',
left_right_pos) left_right_pos)
} else if need_overload && !gen_sym.has_method('<') && node.op == .gt { } else if need_overload && !gen_sym.has_method_with_generic_parent('<')
&& node.op == .gt {
c.error('cannot use `>` as `<=` operator method is not defined', left_right_pos) c.error('cannot use `>` as `<=` operator method is not defined', left_right_pos)
} }
} else if left_type in ast.integer_type_idxs && right_type in ast.integer_type_idxs { } else if left_type in ast.integer_type_idxs && right_type in ast.integer_type_idxs {