mirror of
https://github.com/vlang/v.git
synced 2025-09-13 14:32:26 +03:00
cgen: use alias next
method if defined in for x in iterator {
(#24905)
This commit is contained in:
parent
69a887f63b
commit
9b348b1b11
2 changed files with 25 additions and 5 deletions
|
@ -422,11 +422,22 @@ fn (mut g Gen) for_in_stmt(node_ ast.ForInStmt) {
|
|||
g.writeln('${field_accessor}str[${i}];')
|
||||
}
|
||||
} else if node.kind in [.struct, .interface] {
|
||||
cond_type_sym := g.table.final_sym(node.cond_type)
|
||||
next_fn := cond_type_sym.find_method_with_generic_parent('next') or {
|
||||
cond_type_sym := g.table.sym(node.cond_type)
|
||||
mut next_fn := ast.Fn{}
|
||||
// use alias `next` method if exists else use parent type `next` method
|
||||
if cond_type_sym.kind == .alias {
|
||||
next_fn = cond_type_sym.find_method_with_generic_parent('next') or {
|
||||
g.table.final_sym(node.cond_type).find_method_with_generic_parent('next') or {
|
||||
verror('`next` method not found')
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
next_fn = cond_type_sym.find_method_with_generic_parent('next') or {
|
||||
verror('`next` method not found')
|
||||
return
|
||||
}
|
||||
}
|
||||
ret_typ := next_fn.return_type
|
||||
t_expr := g.new_tmp_var()
|
||||
g.write('${g.styp(node.cond_type)} ${t_expr} = ')
|
||||
|
|
|
@ -35,10 +35,18 @@ fn iterator_as_concrete_type() LineIterator {
|
|||
|
||||
fn iterator_as_alias_concrete_type() AliasLineIterator {
|
||||
return AliasLineIterator(LineIterator{
|
||||
lines: ['alias']
|
||||
lines: ['alias', 'iterator', 'next']
|
||||
})
|
||||
}
|
||||
|
||||
pub fn (mut line_iterator AliasLineIterator) next() ?string {
|
||||
if line_iterator.idx >= line_iterator.lines.len {
|
||||
return none
|
||||
}
|
||||
defer { line_iterator.idx += 2 }
|
||||
return line_iterator.lines[line_iterator.idx]
|
||||
}
|
||||
|
||||
fn test_main() {
|
||||
mut out := []string{}
|
||||
for line in iterator_as_interface() {
|
||||
|
@ -78,4 +86,5 @@ fn test_main() {
|
|||
}
|
||||
|
||||
assert out[6] == 'LINE: alias'
|
||||
assert out[7] == 'LINE: next'
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue