Skip to content

Commit 453c7ef

Browse files
rchen152facebook-github-bot
authored andcommitted
Move DataclassTransformKeywords calculation into its own function
Reviewed By: grievejia Differential Revision: D80371756 fbshipit-source-id: 3947661f8667e3d89ef743b08cb65239a89019b0
1 parent aae19be commit 453c7ef

File tree

1 file changed

+39
-23
lines changed

1 file changed

+39
-23
lines changed

pyrefly/lib/alt/class/class_metadata.rs

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,6 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
147147
let pydantic_metadata =
148148
self.pydantic_metadata(&bases_with_metadata, pydantic_metadata_binding);
149149

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();
159150
let is_typed_dict = has_typed_dict_base_class
160151
|| bases_with_metadata
161152
.iter()
@@ -181,13 +172,6 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
181172
&base_metaclasses,
182173
errors,
183174
);
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-
}
191175
let enum_metadata =
192176
self.enum_metadata(cls, metaclass.as_ref(), &bases_with_metadata, errors);
193177
if let Some(metaclass) = &metaclass {
@@ -229,16 +213,19 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
229213
location: *decorator_range,
230214
});
231215
}
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-
}
239216
_ => {}
240217
}
241218
}
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+
);
242229
let dataclass_from_dataclass_transform = self.dataclass_from_dataclass_transform(
243230
&keywords,
244231
&decorators,
@@ -473,6 +460,35 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
473460
}
474461
}
475462

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+
476492
fn dataclass_from_dataclass_transform(
477493
&self,
478494
keywords: &[(Name, Type)],

0 commit comments

Comments
 (0)