cgen, fmt, scanner: fix and use nested lambda in scanner (#11967)
parent
400ab7876b
commit
834cf40ab2
|
@ -43,7 +43,7 @@ pub mut:
|
|||
use_short_fn_args bool
|
||||
single_line_fields bool // should struct fields be on a single line
|
||||
it_name string // the name to replace `it` with
|
||||
inside_lambda bool
|
||||
in_lambda_depth int
|
||||
inside_const bool
|
||||
is_mbranch_expr bool // match a { x...y { } }
|
||||
fn_scope &ast.Scope = voidptr(0)
|
||||
|
@ -1539,9 +1539,9 @@ pub fn (mut f Fmt) call_expr(node ast.CallExpr) {
|
|||
}
|
||||
if node.is_method {
|
||||
if node.name in ['map', 'filter', 'all', 'any'] {
|
||||
f.inside_lambda = true
|
||||
f.in_lambda_depth++
|
||||
defer {
|
||||
f.inside_lambda = false
|
||||
f.in_lambda_depth--
|
||||
}
|
||||
}
|
||||
if node.left is ast.Ident {
|
||||
|
@ -1724,7 +1724,7 @@ pub fn (mut f Fmt) ident(node ast.Ident) {
|
|||
}
|
||||
}
|
||||
f.write_language_prefix(node.language)
|
||||
if node.name == 'it' && f.it_name != '' && !f.inside_lambda { // allow `it` in lambdas
|
||||
if node.name == 'it' && f.it_name != '' && f.in_lambda_depth == 0 { // allow `it` in lambdas
|
||||
f.write(f.it_name)
|
||||
} else if node.kind == .blank_ident {
|
||||
f.write('_')
|
||||
|
|
|
@ -196,7 +196,7 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
|
|||
}
|
||||
}
|
||||
ast.CallExpr {
|
||||
if expr.name in ['map', 'filter'] {
|
||||
if expr.name in ['map', 'filter', 'all', 'any'] {
|
||||
is_embed_map_filter = true
|
||||
g.stmt_path_pos << g.out.len
|
||||
}
|
||||
|
@ -387,7 +387,7 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) {
|
|||
}
|
||||
}
|
||||
ast.CallExpr {
|
||||
if expr.name in ['map', 'filter'] {
|
||||
if expr.name in ['map', 'filter', 'all', 'any'] {
|
||||
is_embed_map_filter = true
|
||||
g.stmt_path_pos << g.out.len
|
||||
}
|
||||
|
@ -678,7 +678,7 @@ fn (mut g Gen) gen_array_any(node ast.CallExpr) {
|
|||
}
|
||||
}
|
||||
ast.CallExpr {
|
||||
if expr.name in ['map', 'filter'] {
|
||||
if expr.name in ['map', 'filter', 'all', 'any'] {
|
||||
is_embed_map_filter = true
|
||||
g.stmt_path_pos << g.out.len
|
||||
}
|
||||
|
@ -761,7 +761,7 @@ fn (mut g Gen) gen_array_all(node ast.CallExpr) {
|
|||
}
|
||||
}
|
||||
ast.CallExpr {
|
||||
if expr.name in ['map', 'filter'] {
|
||||
if expr.name in ['map', 'filter', 'all', 'any'] {
|
||||
is_embed_map_filter = true
|
||||
g.stmt_path_pos << g.out.len
|
||||
}
|
||||
|
|
|
@ -926,20 +926,14 @@ fn (mut s Scanner) text_scan() token.Token {
|
|||
// here we set the limit 100 which should be nice for real cases
|
||||
// e.g. ...Bar<int, []Foo<int>, Baz_, [20]f64, map[string][]bool>> =>
|
||||
// <int, Baz_, [20]f64, map[string][]bool => int, Baz_, f64, bool
|
||||
mut is_generic := true
|
||||
if s.last_lt >= 0 && s.pos - s.last_lt < 100 {
|
||||
is_generic := if s.last_lt >= 0 && s.pos - s.last_lt < 100 {
|
||||
typs := s.text[s.last_lt + 1..s.pos].split(',').map(it.trim_space().trim_right('>').after(']'))
|
||||
// if any typ is neither Type nor builtin, then the case is non-generic
|
||||
for typ in typs {
|
||||
if typ.len == 0
|
||||
|| (!(typ[0].is_capital() && typ[1..].bytes().all(it.is_alnum()
|
||||
|| it == `_`)) && typ !in ast.builtin_type_names) {
|
||||
is_generic = false
|
||||
break
|
||||
}
|
||||
}
|
||||
typs.all(it.len > 0
|
||||
&& ((it[0].is_capital() && it[1..].bytes().all(it.is_alnum()
|
||||
|| it == `_`)) || it in ast.builtin_type_names))
|
||||
} else {
|
||||
is_generic = false
|
||||
false
|
||||
}
|
||||
if is_generic {
|
||||
return s.new_token(.gt, '', 1)
|
||||
|
|
Loading…
Reference in New Issue