1
0
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:
yuyi
2021-04-24 14:44:15 +08:00
committed by GitHub
parent a832bb609a
commit 8ccdae6188
8 changed files with 99 additions and 98 deletions

View File

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

View File

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