@@ -1059,6 +1059,7 @@ impl<T> TupleElement<T> {
1059
1059
}
1060
1060
1061
1061
pub ( crate ) struct Splatter < ' db > {
1062
+ db : & ' db dyn Db ,
1062
1063
targets : Tuple < UnionBuilder < ' db > > ,
1063
1064
}
1064
1065
@@ -1075,58 +1076,29 @@ impl<'db> Splatter<'db> {
1075
1076
new_builders ( suffix) ,
1076
1077
) ,
1077
1078
} ;
1078
- Self { targets }
1079
+ Self { db , targets }
1079
1080
}
1080
1081
1081
1082
pub ( crate ) fn add_values ( & mut self , values : & Tuple < Type < ' db > > ) -> Result < ( ) , SplatterError > {
1082
1083
match & mut self . targets {
1083
1084
Tuple :: Fixed ( targets) => targets. add_values ( values) ,
1084
- Tuple :: Variable ( targets) => targets. add_values ( values) ,
1085
+ Tuple :: Variable ( targets) => targets. add_values ( self . db , values) ,
1085
1086
}
1086
1087
}
1087
1088
1088
- pub ( crate ) fn add_list_element ( & mut self , element : Type < ' db > ) {
1089
- match & mut self . targets {
1090
- Tuple :: Fixed ( targets) => {
1091
- for target in & mut targets. 0 {
1092
- target. add_in_place ( element) ;
1093
- }
1094
- }
1095
-
1096
- Tuple :: Variable ( targets) => {
1097
- for target in & mut targets. prefix {
1098
- target. add_in_place ( element) ;
1099
- }
1100
- targets. variable . add_in_place ( element) ;
1101
- for target in & mut targets. suffix {
1102
- target. add_in_place ( element) ;
1103
- }
1104
- }
1105
- }
1106
- }
1107
-
1108
- pub ( crate ) fn add_unknown ( & mut self ) {
1109
- match & mut self . targets {
1110
- Tuple :: Fixed ( targets) => {
1111
- for target in & mut targets. 0 {
1112
- target. add_in_place ( Type :: unknown ( ) ) ;
1113
- }
1114
- }
1115
-
1116
- Tuple :: Variable ( targets) => {
1117
- for target in & mut targets. prefix {
1118
- target. add_in_place ( Type :: unknown ( ) ) ;
1119
- }
1120
- targets. variable . add_in_place ( Type :: unknown ( ) ) ;
1121
- for target in & mut targets. suffix {
1122
- target. add_in_place ( Type :: unknown ( ) ) ;
1089
+ pub ( crate ) fn into_types ( self ) -> impl Iterator < Item = Type < ' db > > {
1090
+ self . targets
1091
+ . into_all_elements ( )
1092
+ . map ( |builder| match builder {
1093
+ TupleElement :: Variable ( builder) => builder. try_build ( ) . unwrap_or_else ( || {
1094
+ KnownClass :: List . to_specialized_instance ( self . db , [ Type :: unknown ( ) ] )
1095
+ } ) ,
1096
+ TupleElement :: Fixed ( builder)
1097
+ | TupleElement :: Prefix ( builder)
1098
+ | TupleElement :: Suffix ( builder) => {
1099
+ builder. try_build ( ) . unwrap_or_else ( Type :: unknown)
1123
1100
}
1124
- }
1125
- }
1126
- }
1127
-
1128
- pub ( crate ) fn into_all_elements ( self ) -> impl Iterator < Item = TupleElement < UnionBuilder < ' db > > > {
1129
- self . targets . into_all_elements ( )
1101
+ } )
1130
1102
}
1131
1103
}
1132
1104
@@ -1162,7 +1134,11 @@ impl<'db> FixedLengthTuple<UnionBuilder<'db>> {
1162
1134
}
1163
1135
1164
1136
impl < ' db > VariableLengthTuple < UnionBuilder < ' db > > {
1165
- fn add_values ( & mut self , values : & Tuple < Type < ' db > > ) -> Result < ( ) , SplatterError > {
1137
+ fn add_values (
1138
+ & mut self ,
1139
+ db : & ' db dyn Db ,
1140
+ values : & Tuple < Type < ' db > > ,
1141
+ ) -> Result < ( ) , SplatterError > {
1166
1142
match values {
1167
1143
Tuple :: Fixed ( values) => {
1168
1144
let Some ( variable_count) = values. len ( ) . checked_sub ( self . len ( ) . minimum ( ) ) else {
@@ -1172,16 +1148,18 @@ impl<'db> VariableLengthTuple<UnionBuilder<'db>> {
1172
1148
for ( target, value) in self . prefix . iter_mut ( ) . zip ( values. by_ref ( ) ) {
1173
1149
target. add_in_place ( value) ;
1174
1150
}
1175
- for value in values. by_ref ( ) . take ( variable_count) {
1176
- self . variable . add_in_place ( value) ;
1177
- }
1151
+ let variable_element =
1152
+ UnionType :: from_elements ( db, values. by_ref ( ) . take ( variable_count) ) ;
1153
+ self . variable
1154
+ . add_in_place ( KnownClass :: List . to_specialized_instance ( db, [ variable_element] ) ) ;
1178
1155
for ( target, value) in self . suffix . iter_mut ( ) . zip ( values) {
1179
1156
target. add_in_place ( value) ;
1180
1157
}
1181
1158
Ok ( ( ) )
1182
1159
}
1183
1160
1184
1161
Tuple :: Variable ( values) => {
1162
+ let mut variable_element = UnionBuilder :: new ( db) ;
1185
1163
for pair in ( self . prefix . iter_mut ( ) ) . zip_longest ( values. prefix_elements ( ) . copied ( ) )
1186
1164
{
1187
1165
match pair {
@@ -1192,11 +1170,11 @@ impl<'db> VariableLengthTuple<UnionBuilder<'db>> {
1192
1170
target. add_in_place ( values. variable ) ;
1193
1171
}
1194
1172
EitherOrBoth :: Right ( value) => {
1195
- self . variable . add_in_place ( value) ;
1173
+ variable_element . add_in_place ( value) ;
1196
1174
}
1197
1175
}
1198
1176
}
1199
- self . variable . add_in_place ( values. variable ) ;
1177
+ variable_element . add_in_place ( values. variable ) ;
1200
1178
for pair in ( self . suffix . iter_mut ( ) . rev ( ) )
1201
1179
. zip_longest ( values. suffix_elements ( ) . copied ( ) . rev ( ) )
1202
1180
{
@@ -1208,10 +1186,13 @@ impl<'db> VariableLengthTuple<UnionBuilder<'db>> {
1208
1186
target. add_in_place ( values. variable ) ;
1209
1187
}
1210
1188
EitherOrBoth :: Right ( value) => {
1211
- self . variable . add_in_place ( value) ;
1189
+ variable_element . add_in_place ( value) ;
1212
1190
}
1213
1191
}
1214
1192
}
1193
+ self . variable . add_in_place (
1194
+ KnownClass :: List . to_specialized_instance ( db, [ variable_element. build ( ) ] ) ,
1195
+ ) ;
1215
1196
Ok ( ( ) )
1216
1197
}
1217
1198
}
0 commit comments