parser: make `p.opt()?` work for methods
parent
385c045e5a
commit
79a02a4c09
|
@ -329,17 +329,7 @@ fn (p mut Parser) name_expr() string {
|
||||||
is_or_else := p.tok == .key_orelse
|
is_or_else := p.tok == .key_orelse
|
||||||
if p.tok == .question {
|
if p.tok == .question {
|
||||||
// `files := os.ls('.')?`
|
// `files := os.ls('.')?`
|
||||||
if p.cur_fn.name != 'main__main' {
|
return p.gen_handle_question_suffix(f, fn_call_ph)
|
||||||
p.error('`func()?` syntax can only be used inside `fn main()` for now')
|
|
||||||
}
|
|
||||||
p.next()
|
|
||||||
tmp := p.get_tmp()
|
|
||||||
p.cgen.set_placeholder(fn_call_ph, '$f.typ $tmp = ')
|
|
||||||
p.genln(';')
|
|
||||||
p.genln('if (!${tmp}.ok) v_panic(${tmp}.error);')
|
|
||||||
typ := f.typ[7..] // option_xxx
|
|
||||||
p.gen('*($typ*) ${tmp}.data;')
|
|
||||||
return typ
|
|
||||||
}
|
}
|
||||||
else if !p.is_var_decl && is_or_else {
|
else if !p.is_var_decl && is_or_else {
|
||||||
f.typ = p.gen_handle_option_or_else(f.typ, '', fn_call_ph)
|
f.typ = p.gen_handle_option_or_else(f.typ, '', fn_call_ph)
|
||||||
|
|
|
@ -144,6 +144,21 @@ fn (p mut Parser) gen_handle_option_or_else(_typ, name string, fn_call_ph int) s
|
||||||
return typ
|
return typ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `files := os.ls('.')?`
|
||||||
|
fn (p mut Parser) gen_handle_question_suffix(f Fn, ph int) string {
|
||||||
|
if p.cur_fn.name != 'main__main' {
|
||||||
|
p.error('`func()?` syntax can only be used inside `fn main()` for now')
|
||||||
|
}
|
||||||
|
p.check(.question)
|
||||||
|
tmp := p.get_tmp()
|
||||||
|
p.cgen.set_placeholder(ph, '$f.typ $tmp = ')
|
||||||
|
p.genln(';')
|
||||||
|
p.genln('if (!${tmp}.ok) v_panic(${tmp}.error);')
|
||||||
|
typ := f.typ[7..] // option_xxx
|
||||||
|
p.gen('*($typ*) ${tmp}.data;')
|
||||||
|
return typ
|
||||||
|
}
|
||||||
|
|
||||||
fn types_to_c(types []Type, table &Table) string {
|
fn types_to_c(types []Type, table &Table) string {
|
||||||
mut sb := strings.new_builder(10)
|
mut sb := strings.new_builder(10)
|
||||||
for t in types {
|
for t in types {
|
||||||
|
|
|
@ -1868,7 +1868,11 @@ struct $typ.name {
|
||||||
p.fn_call(mut method, method_ph, '', str_typ)
|
p.fn_call(mut method, method_ph, '', str_typ)
|
||||||
// optional method call `a.method() or {}`, no return assignment
|
// optional method call `a.method() or {}`, no return assignment
|
||||||
is_or_else := p.tok == .key_orelse
|
is_or_else := p.tok == .key_orelse
|
||||||
if !p.is_var_decl && is_or_else {
|
if p.tok == .question {
|
||||||
|
// `files := os.ls('.')?`
|
||||||
|
return p.gen_handle_question_suffix(method, method_ph)
|
||||||
|
}
|
||||||
|
else if !p.is_var_decl && is_or_else {
|
||||||
method.typ = p.gen_handle_option_or_else(method.typ, '', method_ph)
|
method.typ = p.gen_handle_option_or_else(method.typ, '', method_ph)
|
||||||
}
|
}
|
||||||
else if !p.is_var_decl && !is_or_else && !p.inside_return_expr &&
|
else if !p.is_var_decl && !is_or_else && !p.inside_return_expr &&
|
||||||
|
|
Loading…
Reference in New Issue