mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
all: cleanup generics call_expr (#9856)
This commit is contained in:
@@ -26,27 +26,27 @@ pub fn (mut p Parser) call_expr(language ast.Language, mod string) ast.CallExpr
|
||||
p.expecting_type = true // Makes name_expr() parse the type `User` in `json.decode(User, txt)`
|
||||
or_kind = .block
|
||||
}
|
||||
//
|
||||
|
||||
old_expr_mod := p.expr_mod
|
||||
defer {
|
||||
p.expr_mod = old_expr_mod
|
||||
}
|
||||
p.expr_mod = ''
|
||||
//
|
||||
mut generic_types := []ast.Type{}
|
||||
mut generic_list_pos := p.tok.position()
|
||||
|
||||
mut concrete_types := []ast.Type{}
|
||||
mut concrete_list_pos := p.tok.position()
|
||||
if p.tok.kind == .lt {
|
||||
// `foo<int>(10)`
|
||||
p.expr_mod = ''
|
||||
generic_types = p.parse_generic_type_list()
|
||||
generic_list_pos = generic_list_pos.extend(p.prev_tok.position())
|
||||
concrete_types = p.parse_generic_type_list()
|
||||
concrete_list_pos = concrete_list_pos.extend(p.prev_tok.position())
|
||||
// In case of `foo<T>()`
|
||||
// T is unwrapped and registered in the checker.
|
||||
full_generic_fn_name := if fn_name.contains('.') { fn_name } else { p.prepend_mod(fn_name) }
|
||||
has_generic_generic := generic_types.filter(it.has_flag(.generic)).len > 0
|
||||
has_generic_generic := concrete_types.filter(it.has_flag(.generic)).len > 0
|
||||
if !has_generic_generic {
|
||||
// will be added in checker
|
||||
p.table.register_fn_generic_types(full_generic_fn_name, generic_types)
|
||||
p.table.register_fn_generic_types(full_generic_fn_name, concrete_types)
|
||||
}
|
||||
}
|
||||
p.check(.lpar)
|
||||
@@ -95,8 +95,8 @@ pub fn (mut p Parser) call_expr(language ast.Language, mod string) ast.CallExpr
|
||||
mod: p.mod
|
||||
pos: pos
|
||||
language: language
|
||||
generic_types: generic_types
|
||||
generic_list_pos: generic_list_pos
|
||||
concrete_types: concrete_types
|
||||
concrete_list_pos: concrete_list_pos
|
||||
or_block: ast.OrExpr{
|
||||
stmts: or_stmts
|
||||
kind: or_kind
|
||||
|
||||
@@ -2229,18 +2229,18 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr {
|
||||
}
|
||||
// Method call
|
||||
// TODO move to fn.v call_expr()
|
||||
mut generic_types := []ast.Type{}
|
||||
mut generic_list_pos := p.tok.position()
|
||||
mut concrete_types := []ast.Type{}
|
||||
mut concrete_list_pos := p.tok.position()
|
||||
if is_generic_call {
|
||||
// `g.foo<int>(10)`
|
||||
generic_types = p.parse_generic_type_list()
|
||||
generic_list_pos = generic_list_pos.extend(p.prev_tok.position())
|
||||
concrete_types = p.parse_generic_type_list()
|
||||
concrete_list_pos = concrete_list_pos.extend(p.prev_tok.position())
|
||||
// In case of `foo<T>()`
|
||||
// T is unwrapped and registered in the checker.
|
||||
has_generic_generic := generic_types.filter(it.has_flag(.generic)).len > 0
|
||||
has_generic_generic := concrete_types.filter(it.has_flag(.generic)).len > 0
|
||||
if !has_generic_generic {
|
||||
// will be added in checker
|
||||
p.table.register_fn_generic_types(field_name, generic_types)
|
||||
p.table.register_fn_generic_types(field_name, concrete_types)
|
||||
}
|
||||
}
|
||||
if p.tok.kind == .lpar {
|
||||
@@ -2280,8 +2280,8 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr {
|
||||
name_pos: name_pos
|
||||
pos: pos
|
||||
is_method: true
|
||||
generic_types: generic_types
|
||||
generic_list_pos: generic_list_pos
|
||||
concrete_types: concrete_types
|
||||
concrete_list_pos: concrete_list_pos
|
||||
or_block: ast.OrExpr{
|
||||
stmts: or_stmts
|
||||
kind: or_kind
|
||||
|
||||
Reference in New Issue
Block a user