@@ -147,15 +147,6 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
147
147
let pydantic_metadata =
148
148
self . pydantic_metadata ( & bases_with_metadata, pydantic_metadata_binding) ;
149
149
150
- // If this class inherits from a dataclass_transform-ed class, record the defaults that we
151
- // should use for dataclass parameters.
152
- let dataclass_defaults_from_base_class = bases_with_metadata
153
- . iter ( )
154
- . find_map ( |( _, metadata) | metadata. dataclass_transform_metadata ( ) . cloned ( ) ) ;
155
- // This is set when a class is decorated with `@typing.dataclass_transform(...)`. Note that
156
- // this does not turn the class into a dataclass! Instead, it becomes a special base class
157
- // (or metaclass) that turns child classes into dataclasses.
158
- let mut dataclass_transform_metadata = dataclass_defaults_from_base_class. clone ( ) ;
159
150
let is_typed_dict = has_typed_dict_base_class
160
151
|| bases_with_metadata
161
152
. iter ( )
@@ -181,13 +172,6 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
181
172
& base_metaclasses,
182
173
errors,
183
174
) ;
184
- if let Some ( c) = & metaclass
185
- && let Some ( m) = self
186
- . get_metadata_for_class ( c. class_object ( ) )
187
- . dataclass_transform_metadata ( )
188
- {
189
- dataclass_transform_metadata = Some ( m. clone ( ) ) ;
190
- }
191
175
let enum_metadata =
192
176
self . enum_metadata ( cls, metaclass. as_ref ( ) , & bases_with_metadata, errors) ;
193
177
if let Some ( metaclass) = & metaclass {
@@ -229,16 +213,19 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
229
213
location : * decorator_range,
230
214
} ) ;
231
215
}
232
- // `@dataclass_transform(...)`
233
- _ if let Type :: KwCall ( call) = decorator_ty
234
- && call. has_function_kind ( FunctionKind :: DataclassTransform ) =>
235
- {
236
- dataclass_transform_metadata =
237
- Some ( DataclassTransformKeywords :: from_type_map ( & call. keywords ) ) ;
238
- }
239
216
_ => { }
240
217
}
241
218
}
219
+ // If this class inherits from a dataclass_transform-ed class, record the defaults that we
220
+ // should use for dataclass parameters.
221
+ let dataclass_defaults_from_base_class = bases_with_metadata
222
+ . iter ( )
223
+ . find_map ( |( _, metadata) | metadata. dataclass_transform_metadata ( ) . cloned ( ) ) ;
224
+ let dataclass_transform_metadata = self . dataclass_transform_metadata (
225
+ & decorators,
226
+ metaclass. as_ref ( ) ,
227
+ dataclass_defaults_from_base_class. clone ( ) ,
228
+ ) ;
242
229
let dataclass_from_dataclass_transform = self . dataclass_from_dataclass_transform (
243
230
& keywords,
244
231
& decorators,
@@ -473,6 +460,35 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
473
460
}
474
461
}
475
462
463
+ fn dataclass_transform_metadata (
464
+ & self ,
465
+ decorators : & [ ( Arc < TypeInfo > , TextRange ) ] ,
466
+ metaclass : Option < & ClassType > ,
467
+ dataclass_defaults_from_base_class : Option < DataclassTransformKeywords > ,
468
+ ) -> Option < DataclassTransformKeywords > {
469
+ // This is set when a class is decorated with `@typing.dataclass_transform(...)`. Note that
470
+ // this does not turn the class into a dataclass! Instead, it becomes a special base class
471
+ // (or metaclass) that turns child classes into dataclasses.
472
+ let mut dataclass_transform_metadata = dataclass_defaults_from_base_class;
473
+ if let Some ( c) = metaclass
474
+ && let Some ( m) = self
475
+ . get_metadata_for_class ( c. class_object ( ) )
476
+ . dataclass_transform_metadata ( )
477
+ {
478
+ dataclass_transform_metadata = Some ( m. clone ( ) ) ;
479
+ }
480
+ for ( decorator, _) in decorators {
481
+ // `@dataclass_transform(...)`
482
+ if let Type :: KwCall ( call) = decorator. ty ( )
483
+ && call. has_function_kind ( FunctionKind :: DataclassTransform )
484
+ {
485
+ dataclass_transform_metadata =
486
+ Some ( DataclassTransformKeywords :: from_type_map ( & call. keywords ) ) ;
487
+ }
488
+ }
489
+ dataclass_transform_metadata
490
+ }
491
+
476
492
fn dataclass_from_dataclass_transform (
477
493
& self ,
478
494
keywords : & [ ( Name , Type ) ] ,
0 commit comments