@@ -948,16 +948,12 @@ pub fn (mut t Table) bitsize_to_type(bit_size int) Type {
948
948
// resolve_generic_by_names resolves generics to real types T => int.
949
949
// Even map[string]map[string]T can be resolved.
950
950
// 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 {
952
952
mut sym := t.get_type_symbol (generic_type)
953
953
if sym.name in generic_names {
954
954
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)
961
957
} else if sym.kind == .array {
962
958
info := sym.info as Array
963
959
mut elem_type := info.elem_type
@@ -968,23 +964,21 @@ pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names [
968
964
elem_sym = t.get_type_symbol (elem_type)
969
965
dims++
970
966
}
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 ) {
972
968
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)
975
970
}
976
971
} else if sym.kind == .chan {
977
972
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 ) {
979
974
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)
982
976
}
983
977
} else if mut sym.info is MultiReturn {
984
978
mut types := []Type{}
985
979
mut type_changed := false
986
980
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 ) {
988
982
types << typ
989
983
type_changed = true
990
984
} else {
@@ -993,18 +987,17 @@ pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names [
993
987
}
994
988
if type_changed {
995
989
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)
998
991
}
999
992
} else if mut sym.info is Map {
1000
993
mut type_changed := false
1001
994
mut unwrapped_key_type := sym.info.key_type
1002
995
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 ) {
1004
997
unwrapped_key_type = typ
1005
998
type_changed = true
1006
999
}
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 ) {
1008
1001
unwrapped_value_type = typ
1009
1002
type_changed = true
1010
1003
}
@@ -1019,16 +1012,12 @@ pub fn (mut t Table) resolve_generic_by_names(generic_type Type, generic_names [
1019
1012
// resolve_generic_by_types resolves generics to real types T => int.
1020
1013
// Even map[string]map[string]T can be resolved.
1021
1014
// 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 {
1023
1016
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)
1032
1021
} else if sym.kind == .array {
1033
1022
info := sym.info as Array
1034
1023
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
1039
1028
elem_sym = t.get_type_symbol (elem_type)
1040
1029
dims++
1041
1030
}
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 ) {
1043
1032
idx := t.find_or_register_array_with_dims (typ, dims)
1044
1033
return new_type (idx).derive (generic_type).clear_flag (.generic)
1045
1034
}
1046
1035
} else if sym.kind == .chan {
1047
1036
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 ) {
1049
1038
idx := t.find_or_register_chan (typ, typ.nr_muls () > 0 )
1050
1039
return new_type (idx).derive (generic_type).clear_flag (.generic)
1051
1040
}
1052
1041
} else if mut sym.info is MultiReturn {
1053
1042
mut types := []Type{}
1054
1043
mut type_changed := false
1055
1044
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 ) {
1057
1046
types << typ
1058
1047
type_changed = true
1059
1048
} else {
@@ -1068,11 +1057,11 @@ pub fn (mut t Table) resolve_generic_by_types(generic_type Type, from_types []Ty
1068
1057
mut type_changed := false
1069
1058
mut unwrapped_key_type := sym.info.key_type
1070
1059
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 ) {
1072
1061
unwrapped_key_type = typ
1073
1062
type_changed = true
1074
1063
}
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 ) {
1076
1065
unwrapped_value_type = typ
1077
1066
type_changed = true
1078
1067
}
0 commit comments