ast: minor cleanup in ast.FnDecl (#9950)
parent
b3890e28f2
commit
fec947c7e1
|
@ -379,18 +379,18 @@ pub:
|
||||||
attrs []Attr
|
attrs []Attr
|
||||||
skip_gen bool // this function doesn't need to be generated (for example [if foo])
|
skip_gen bool // this function doesn't need to be generated (for example [if foo])
|
||||||
pub mut:
|
pub mut:
|
||||||
stmts []Stmt
|
stmts []Stmt
|
||||||
defer_stmts []DeferStmt
|
defer_stmts []DeferStmt
|
||||||
return_type Type
|
return_type Type
|
||||||
return_type_pos token.Position // `string` in `fn (u User) name() string` position
|
return_type_pos token.Position // `string` in `fn (u User) name() string` position
|
||||||
has_return bool
|
has_return bool
|
||||||
comments []Comment // comments *after* the header, but *before* `{`; used for InterfaceDecl
|
comments []Comment // comments *after* the header, but *before* `{`; used for InterfaceDecl
|
||||||
next_comments []Comment // coments that are one line after the decl; used for InterfaceDecl
|
next_comments []Comment // coments that are one line after the decl; used for InterfaceDecl
|
||||||
source_file &File = 0
|
source_file &File = 0
|
||||||
scope &Scope
|
scope &Scope
|
||||||
label_names []string
|
label_names []string
|
||||||
pos token.Position // function declaration position
|
pos token.Position // function declaration position
|
||||||
cur_generic_types []Type
|
cur_concrete_types []Type // current concrete types, e.g. <int, string>
|
||||||
}
|
}
|
||||||
|
|
||||||
// break, continue
|
// break, continue
|
||||||
|
|
|
@ -489,7 +489,7 @@ pub fn (mut c Checker) struct_init(mut struct_init ast.StructInit) ast.Type {
|
||||||
// Make sure the first letter is capital, do not allow e.g. `x := string{}`,
|
// Make sure the first letter is capital, do not allow e.g. `x := string{}`,
|
||||||
// but `x := T{}` is ok.
|
// but `x := T{}` is ok.
|
||||||
if !c.is_builtin_mod && !c.inside_unsafe && type_sym.language == .v
|
if !c.is_builtin_mod && !c.inside_unsafe && type_sym.language == .v
|
||||||
&& c.cur_fn.cur_generic_types.len == 0 {
|
&& c.cur_fn.cur_concrete_types.len == 0 {
|
||||||
pos := type_sym.name.last_index('.') or { -1 }
|
pos := type_sym.name.last_index('.') or { -1 }
|
||||||
first_letter := type_sym.name[pos + 1]
|
first_letter := type_sym.name[pos + 1]
|
||||||
if !first_letter.is_capital() {
|
if !first_letter.is_capital() {
|
||||||
|
@ -2732,7 +2732,7 @@ pub fn (mut c Checker) return_stmt(mut return_stmt ast.Return) {
|
||||||
mut expected_types := [expected_type]
|
mut expected_types := [expected_type]
|
||||||
if expected_type_sym.info is ast.MultiReturn {
|
if expected_type_sym.info is ast.MultiReturn {
|
||||||
expected_types = expected_type_sym.info.types
|
expected_types = expected_type_sym.info.types
|
||||||
if c.cur_fn.cur_generic_types.len > 0 {
|
if c.cur_fn.cur_concrete_types.len > 0 {
|
||||||
expected_types = expected_types.map(c.unwrap_generic(it))
|
expected_types = expected_types.map(c.unwrap_generic(it))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4185,7 +4185,7 @@ fn (mut c Checker) stmts(stmts []ast.Stmt) {
|
||||||
|
|
||||||
pub fn (mut c Checker) unwrap_generic(typ ast.Type) ast.Type {
|
pub fn (mut c Checker) unwrap_generic(typ ast.Type) ast.Type {
|
||||||
if typ.has_flag(.generic) {
|
if typ.has_flag(.generic) {
|
||||||
if t_typ := c.table.resolve_generic_to_concrete(typ, c.cur_fn.generic_names, c.cur_fn.cur_generic_types,
|
if t_typ := c.table.resolve_generic_to_concrete(typ, c.cur_fn.generic_names, c.cur_fn.cur_concrete_types,
|
||||||
false)
|
false)
|
||||||
{
|
{
|
||||||
return t_typ
|
return t_typ
|
||||||
|
@ -6599,26 +6599,22 @@ fn (mut c Checker) post_process_generic_fns() {
|
||||||
// Loop thru each generic function concrete type.
|
// Loop thru each generic function concrete type.
|
||||||
// Check each specific fn instantiation.
|
// Check each specific fn instantiation.
|
||||||
for i in 0 .. c.file.generic_fns.len {
|
for i in 0 .. c.file.generic_fns.len {
|
||||||
if c.table.fn_generic_types.len == 0 {
|
|
||||||
// no concrete types, so just skip:
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
mut node := c.file.generic_fns[i]
|
mut node := c.file.generic_fns[i]
|
||||||
c.mod = node.mod
|
c.mod = node.mod
|
||||||
for generic_types in c.table.fn_generic_types[node.name] {
|
for concrete_types in c.table.fn_generic_types[node.name] {
|
||||||
node.cur_generic_types = generic_types
|
node.cur_concrete_types = concrete_types
|
||||||
c.fn_decl(mut node)
|
c.fn_decl(mut node)
|
||||||
if node.name in ['vweb.run_app', 'vweb.run'] {
|
if node.name in ['vweb.run_app', 'vweb.run'] {
|
||||||
c.vweb_gen_types << generic_types
|
c.vweb_gen_types << concrete_types
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
node.cur_generic_types = []
|
node.cur_concrete_types = []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
||||||
c.returns = false
|
c.returns = false
|
||||||
if node.generic_names.len > 0 && node.cur_generic_types.len == 0 {
|
if node.generic_names.len > 0 && node.cur_concrete_types.len == 0 {
|
||||||
// Just remember the generic function for now.
|
// Just remember the generic function for now.
|
||||||
// It will be processed later in c.post_process_generic_fns,
|
// It will be processed later in c.post_process_generic_fns,
|
||||||
// after all other normal functions are processed.
|
// after all other normal functions are processed.
|
||||||
|
|
Loading…
Reference in New Issue