Commit 9db63fc
authored
[red-knot] Handle generic constructors of generic classes (#17552)
We now handle generic constructor methods on generic classes correctly:
```py
class C[T]:
def __init__[S](self, t: T, s: S): ...
x = C(1, "str")
```
Here, constructing `C` requires us to infer a specialization for the
generic contexts of `C` and `__init__` at the same time.
At first I thought I would need to track the full stack of nested
generic contexts here (since the `[S]` context is nested within the
`[T]` context). But I think this is the only way that we might need to
specialize more than one generic context at once — in all other cases, a
containing generic context must be specialized before we get to a nested
one, and so we can just special-case this.
While we're here, we also construct the generic context for a generic
function lazily, when its signature is accessed, instead of eagerly when
inferring the function body.1 parent 61e7348 commit 9db63fc
File tree
7 files changed
+102
-60
lines changed- crates/red_knot_python_semantic
- resources/mdtest/generics
- src
- types
- call
7 files changed
+102
-60
lines changedLines changed: 5 additions & 15 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
232 | 232 | | |
233 | 233 | | |
234 | 234 | | |
235 | | - | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | | - | |
241 | | - | |
242 | | - | |
243 | | - | |
244 | | - | |
245 | | - | |
246 | | - | |
247 | | - | |
248 | | - | |
249 | | - | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
250 | 240 | | |
251 | 241 | | |
252 | 242 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4268 | 4268 | | |
4269 | 4269 | | |
4270 | 4270 | | |
4271 | | - | |
| 4271 | + | |
4272 | 4272 | | |
4273 | 4273 | | |
4274 | 4274 | | |
4275 | 4275 | | |
4276 | 4276 | | |
4277 | | - | |
| 4277 | + | |
4278 | 4278 | | |
4279 | 4279 | | |
4280 | 4280 | | |
| |||
5940 | 5940 | | |
5941 | 5941 | | |
5942 | 5942 | | |
5943 | | - | |
5944 | | - | |
| 5943 | + | |
| 5944 | + | |
| 5945 | + | |
| 5946 | + | |
5945 | 5947 | | |
5946 | 5948 | | |
5947 | 5949 | | |
| |||
6007 | 6009 | | |
6008 | 6010 | | |
6009 | 6011 | | |
6010 | | - | |
6011 | | - | |
6012 | | - | |
6013 | | - | |
6014 | | - | |
| 6012 | + | |
6015 | 6013 | | |
6016 | 6014 | | |
6017 | 6015 | | |
| |||
6071 | 6069 | | |
6072 | 6070 | | |
6073 | 6071 | | |
6074 | | - | |
| 6072 | + | |
| 6073 | + | |
| 6074 | + | |
| 6075 | + | |
| 6076 | + | |
| 6077 | + | |
| 6078 | + | |
| 6079 | + | |
| 6080 | + | |
| 6081 | + | |
| 6082 | + | |
| 6083 | + | |
| 6084 | + | |
| 6085 | + | |
| 6086 | + | |
6075 | 6087 | | |
6076 | 6088 | | |
6077 | 6089 | | |
6078 | 6090 | | |
6079 | 6091 | | |
6080 | 6092 | | |
6081 | | - | |
| 6093 | + | |
| 6094 | + | |
| 6095 | + | |
| 6096 | + | |
| 6097 | + | |
| 6098 | + | |
| 6099 | + | |
| 6100 | + | |
| 6101 | + | |
| 6102 | + | |
| 6103 | + | |
| 6104 | + | |
| 6105 | + | |
| 6106 | + | |
| 6107 | + | |
| 6108 | + | |
| 6109 | + | |
| 6110 | + | |
| 6111 | + | |
| 6112 | + | |
| 6113 | + | |
| 6114 | + | |
| 6115 | + | |
| 6116 | + | |
6082 | 6117 | | |
6083 | 6118 | | |
6084 | 6119 | | |
6085 | 6120 | | |
6086 | 6121 | | |
6087 | 6122 | | |
6088 | 6123 | | |
6089 | | - | |
| 6124 | + | |
6090 | 6125 | | |
6091 | 6126 | | |
6092 | 6127 | | |
| |||
6103 | 6138 | | |
6104 | 6139 | | |
6105 | 6140 | | |
6106 | | - | |
| 6141 | + | |
6107 | 6142 | | |
6108 | 6143 | | |
6109 | 6144 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
23 | | - | |
24 | | - | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
424 | 424 | | |
425 | 425 | | |
426 | 426 | | |
427 | | - | |
428 | | - | |
429 | | - | |
430 | | - | |
431 | | - | |
432 | | - | |
433 | | - | |
434 | | - | |
435 | | - | |
436 | | - | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
437 | 430 | | |
438 | 431 | | |
439 | 432 | | |
| |||
961 | 954 | | |
962 | 955 | | |
963 | 956 | | |
| 957 | + | |
| 958 | + | |
| 959 | + | |
| 960 | + | |
964 | 961 | | |
965 | 962 | | |
966 | 963 | | |
| |||
1097 | 1094 | | |
1098 | 1095 | | |
1099 | 1096 | | |
| 1097 | + | |
1100 | 1098 | | |
1101 | 1099 | | |
1102 | 1100 | | |
| |||
1112 | 1110 | | |
1113 | 1111 | | |
1114 | 1112 | | |
1115 | | - | |
1116 | | - | |
| 1113 | + | |
| 1114 | + | |
1117 | 1115 | | |
1118 | 1116 | | |
1119 | 1117 | | |
| |||
1126 | 1124 | | |
1127 | 1125 | | |
1128 | 1126 | | |
1129 | | - | |
1130 | | - | |
| 1127 | + | |
| 1128 | + | |
| 1129 | + | |
| 1130 | + | |
| 1131 | + | |
1131 | 1132 | | |
1132 | 1133 | | |
1133 | 1134 | | |
| |||
1155 | 1156 | | |
1156 | 1157 | | |
1157 | 1158 | | |
| 1159 | + | |
| 1160 | + | |
| 1161 | + | |
1158 | 1162 | | |
1159 | 1163 | | |
1160 | 1164 | | |
| |||
1180 | 1184 | | |
1181 | 1185 | | |
1182 | 1186 | | |
| 1187 | + | |
| 1188 | + | |
| 1189 | + | |
| 1190 | + | |
| 1191 | + | |
1183 | 1192 | | |
1184 | 1193 | | |
1185 | 1194 | | |
| |||
1190 | 1199 | | |
1191 | 1200 | | |
1192 | 1201 | | |
1193 | | - | |
1194 | | - | |
| 1202 | + | |
| 1203 | + | |
1195 | 1204 | | |
1196 | 1205 | | |
1197 | 1206 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1017 | 1017 | | |
1018 | 1018 | | |
1019 | 1019 | | |
1020 | | - | |
| 1020 | + | |
1021 | 1021 | | |
1022 | 1022 | | |
1023 | 1023 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
299 | 299 | | |
300 | 300 | | |
301 | 301 | | |
302 | | - | |
303 | 302 | | |
304 | 303 | | |
305 | 304 | | |
306 | 305 | | |
307 | | - | |
| 306 | + | |
308 | 307 | | |
309 | 308 | | |
310 | | - | |
311 | 309 | | |
312 | 310 | | |
313 | 311 | | |
314 | 312 | | |
315 | | - | |
316 | | - | |
317 | | - | |
| 313 | + | |
| 314 | + | |
318 | 315 | | |
319 | 316 | | |
320 | 317 | | |
| |||
324 | 321 | | |
325 | 322 | | |
326 | 323 | | |
327 | | - | |
| 324 | + | |
328 | 325 | | |
329 | 326 | | |
330 | 327 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1525 | 1525 | | |
1526 | 1526 | | |
1527 | 1527 | | |
1528 | | - | |
1529 | | - | |
1530 | | - | |
1531 | | - | |
1532 | 1528 | | |
1533 | 1529 | | |
1534 | 1530 | | |
| |||
1537 | 1533 | | |
1538 | 1534 | | |
1539 | 1535 | | |
| 1536 | + | |
1540 | 1537 | | |
1541 | 1538 | | |
1542 | 1539 | | |
| |||
1546 | 1543 | | |
1547 | 1544 | | |
1548 | 1545 | | |
1549 | | - | |
| 1546 | + | |
1550 | 1547 | | |
1551 | 1548 | | |
1552 | 1549 | | |
| |||
0 commit comments