Skip to content

Commit cb70ffe

Browse files
authored
table: minor simplification and cleanup of resolve_generic (#9772)
1 parent 515d8c0 commit cb70ffe

File tree

1 file changed

+21
-32
lines changed

1 file changed

+21
-32
lines changed

vlib/v/ast/table.v

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -948,16 +948,12 @@ pub fn (mut t Table) bitsize_to_type(bit_size int) Type {
948948
// resolve_generic_by_names resolves generics to real types T => int.
949949
// Even map[string]map[string]T can be resolved.
950950
// This is used for resolving the generic return type of CallExpr white `unwrap_generic` is used to resolve generic usage in FnDecl.
951-
pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names []string, generic_types []Type) ?Type {
951+
pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names []string, concrete_types []Type) ?Type {
952952
mut sym := t.get_type_symbol(generic_type)
953953
if sym.name in generic_names {
954954
index := generic_names.index(sym.name)
955-
mut typ := generic_types[index]
956-
typ = typ.set_nr_muls(generic_type.nr_muls())
957-
if generic_type.has_flag(.optional) {
958-
typ = typ.set_flag(.optional)
959-
}
960-
return typ
955+
typ := concrete_types[index]
956+
return typ.derive(generic_type).clear_flag(.generic)
961957
} else if sym.kind == .array {
962958
info := sym.info as Array
963959
mut elem_type := info.elem_type
@@ -968,23 +964,21 @@ pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names [
968964
elem_sym = t.get_type_symbol(elem_type)
969965
dims++
970966
}
971-
if typ := t.resolve_generic_by_names(elem_type, generic_names, generic_types) {
967+
if typ := t.resolve_generic_by_names(elem_type, generic_names, concrete_types) {
972968
idx := t.find_or_register_array_with_dims(typ, dims)
973-
array_typ := new_type(idx).derive(generic_type).clear_flag(.generic)
974-
return array_typ
969+
return new_type(idx).derive(generic_type).clear_flag(.generic)
975970
}
976971
} else if sym.kind == .chan {
977972
info := sym.info as Chan
978-
if typ := t.resolve_generic_by_names(info.elem_type, generic_names, generic_types) {
973+
if typ := t.resolve_generic_by_names(info.elem_type, generic_names, concrete_types) {
979974
idx := t.find_or_register_chan(typ, typ.nr_muls() > 0)
980-
chan_typ := new_type(idx).derive(generic_type).clear_flag(.generic)
981-
return chan_typ
975+
return new_type(idx).derive(generic_type).clear_flag(.generic)
982976
}
983977
} else if mut sym.info is MultiReturn {
984978
mut types := []Type{}
985979
mut type_changed := false
986980
for ret_type in sym.info.types {
987-
if typ := t.resolve_generic_by_names(ret_type, generic_names, generic_types) {
981+
if typ := t.resolve_generic_by_names(ret_type, generic_names, concrete_types) {
988982
types << typ
989983
type_changed = true
990984
} else {
@@ -993,18 +987,17 @@ pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names [
993987
}
994988
if type_changed {
995989
idx := t.find_or_register_multi_return(types)
996-
typ := new_type(idx).derive(generic_type).clear_flag(.generic)
997-
return typ
990+
return new_type(idx).derive(generic_type).clear_flag(.generic)
998991
}
999992
} else if mut sym.info is Map {
1000993
mut type_changed := false
1001994
mut unwrapped_key_type := sym.info.key_type
1002995
mut unwrapped_value_type := sym.info.value_type
1003-
if typ := t.resolve_generic_by_names(sym.info.key_type, generic_names, generic_types) {
996+
if typ := t.resolve_generic_by_names(sym.info.key_type, generic_names, concrete_types) {
1004997
unwrapped_key_type = typ
1005998
type_changed = true
1006999
}
1007-
if typ := t.resolve_generic_by_names(sym.info.value_type, generic_names, generic_types) {
1000+
if typ := t.resolve_generic_by_names(sym.info.value_type, generic_names, concrete_types) {
10081001
unwrapped_value_type = typ
10091002
type_changed = true
10101003
}
@@ -1019,16 +1012,12 @@ pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names [
10191012
// resolve_generic_by_types resolves generics to real types T => int.
10201013
// Even map[string]map[string]T can be resolved.
10211014
// This is used for resolving the generic return type of CallExpr white `unwrap_generic` is used to resolve generic usage in FnDecl.
1022-
pub fn (mut t Table) resolve_generic_by_types(generic_type Type, from_types []Type, to_types []Type) ?Type {
1015+
pub fn (mut t Table) resolve_generic_by_types(generic_type Type, generic_types []Type, concrete_types []Type) ?Type {
10231016
mut sym := t.get_type_symbol(generic_type)
1024-
if generic_type in from_types {
1025-
index := from_types.index(generic_type)
1026-
mut typ := to_types[index]
1027-
typ = typ.set_nr_muls(generic_type.nr_muls())
1028-
if generic_type.has_flag(.optional) {
1029-
typ = typ.set_flag(.optional)
1030-
}
1031-
return typ
1017+
if generic_type in generic_types {
1018+
index := generic_types.index(generic_type)
1019+
typ := concrete_types[index]
1020+
return typ.derive(generic_type).clear_flag(.generic)
10321021
} else if sym.kind == .array {
10331022
info := sym.info as Array
10341023
mut elem_type := info.elem_type
@@ -1039,21 +1028,21 @@ pub fn (mut t Table) resolve_generic_by_types(generic_type Type, from_types []Ty
10391028
elem_sym = t.get_type_symbol(elem_type)
10401029
dims++
10411030
}
1042-
if typ := t.resolve_generic_by_types(elem_type, from_types, to_types) {
1031+
if typ := t.resolve_generic_by_types(elem_type, generic_types, concrete_types) {
10431032
idx := t.find_or_register_array_with_dims(typ, dims)
10441033
return new_type(idx).derive(generic_type).clear_flag(.generic)
10451034
}
10461035
} else if sym.kind == .chan {
10471036
info := sym.info as Chan
1048-
if typ := t.resolve_generic_by_types(info.elem_type, from_types, to_types) {
1037+
if typ := t.resolve_generic_by_types(info.elem_type, generic_types, concrete_types) {
10491038
idx := t.find_or_register_chan(typ, typ.nr_muls() > 0)
10501039
return new_type(idx).derive(generic_type).clear_flag(.generic)
10511040
}
10521041
} else if mut sym.info is MultiReturn {
10531042
mut types := []Type{}
10541043
mut type_changed := false
10551044
for ret_type in sym.info.types {
1056-
if typ := t.resolve_generic_by_types(ret_type, from_types, to_types) {
1045+
if typ := t.resolve_generic_by_types(ret_type, generic_types, concrete_types) {
10571046
types << typ
10581047
type_changed = true
10591048
} else {
@@ -1068,11 +1057,11 @@ pub fn (mut t Table) resolve_generic_by_types(generic_type Type, from_types []Ty
10681057
mut type_changed := false
10691058
mut unwrapped_key_type := sym.info.key_type
10701059
mut unwrapped_value_type := sym.info.value_type
1071-
if typ := t.resolve_generic_by_types(sym.info.key_type, from_types, to_types) {
1060+
if typ := t.resolve_generic_by_types(sym.info.key_type, generic_types, concrete_types) {
10721061
unwrapped_key_type = typ
10731062
type_changed = true
10741063
}
1075-
if typ := t.resolve_generic_by_types(sym.info.value_type, from_types, to_types) {
1064+
if typ := t.resolve_generic_by_types(sym.info.value_type, generic_types, concrete_types) {
10761065
unwrapped_value_type = typ
10771066
type_changed = true
10781067
}

0 commit comments

Comments
 (0)