@@ -7,7 +7,6 @@ use super::{
77 SpecialFormType , SubclassOfType , Truthiness , Type , TypeQualifiers , class_base:: ClassBase ,
88 function:: FunctionType , infer_expression_type, infer_unpack_types,
99} ;
10- use crate :: FxOrderMap ;
1110use crate :: module_resolver:: KnownModule ;
1211use crate :: place:: TypeOrigin ;
1312use crate :: semantic_index:: definition:: { Definition , DefinitionState } ;
@@ -128,7 +127,7 @@ fn try_metaclass_cycle_initial<'db>(
128127}
129128
130129/// A category of classes with code generation capabilities (with synthesized methods).
131- #[ derive( Clone , Copy , Debug , PartialEq , salsa:: Update , get_size2:: GetSize ) ]
130+ #[ derive( Clone , Copy , Debug , PartialEq , Eq , Hash , salsa:: Update , get_size2:: GetSize ) ]
132131pub ( crate ) enum CodeGeneratorKind < ' db > {
133132 /// Classes decorated with `@dataclass` or similar dataclass-like decorators
134133 DataclassLike ( Option < DataclassTransformerParams < ' db > > ) ,
@@ -1253,7 +1252,7 @@ impl MethodDecorator {
12531252}
12541253
12551254/// Kind-specific metadata for different types of fields
1256- #[ derive( Debug , Clone , PartialEq , Eq ) ]
1255+ #[ derive( Debug , Clone , PartialEq , Eq , salsa :: Update ) ]
12571256pub ( crate ) enum FieldKind < ' db > {
12581257 /// `NamedTuple` field metadata
12591258 NamedTuple { default_ty : Option < Type < ' db > > } ,
@@ -1281,7 +1280,7 @@ pub(crate) enum FieldKind<'db> {
12811280}
12821281
12831282/// Metadata regarding a dataclass field/attribute or a `TypedDict` "item" / key-value pair.
1284- #[ derive( Debug , Clone , PartialEq , Eq ) ]
1283+ #[ derive( Debug , Clone , PartialEq , Eq , salsa :: Update ) ]
12851284pub ( crate ) struct Field < ' db > {
12861285 /// The declared type of the field
12871286 pub ( crate ) declared_ty : Type < ' db > ,
@@ -2329,7 +2328,8 @@ impl<'db> ClassLiteral<'db> {
23292328 || kw_only. unwrap_or ( has_dataclass_param ( DataclassFlags :: KW_ONLY ) ) ;
23302329
23312330 // Use the alias name if provided, otherwise use the field name
2332- let parameter_name = alias. map ( Name :: new) . unwrap_or ( field_name) ;
2331+ let parameter_name =
2332+ Name :: new ( alias. map ( |alias| & * * alias) . unwrap_or ( & * * field_name) ) ;
23332333
23342334 let mut parameter = if is_kw_only {
23352335 Parameter :: keyword_only ( parameter_name)
@@ -2595,7 +2595,7 @@ impl<'db> ClassLiteral<'db> {
25952595 ( CodeGeneratorKind :: TypedDict , "get" ) => {
25962596 let overloads = self
25972597 . fields ( db, specialization, field_policy)
2598- . into_iter ( )
2598+ . iter ( )
25992599 . flat_map ( |( name, field) | {
26002600 let key_type =
26012601 Type :: StringLiteral ( StringLiteralType :: new ( db, name. as_str ( ) ) ) ;
@@ -2824,12 +2824,13 @@ impl<'db> ClassLiteral<'db> {
28242824 /// Returns a list of all annotated attributes defined in this class, or any of its superclasses.
28252825 ///
28262826 /// See [`ClassLiteral::own_fields`] for more details.
2827+ #[ salsa:: tracked( returns( ref) ) ]
28272828 pub ( crate ) fn fields (
28282829 self ,
28292830 db : & ' db dyn Db ,
28302831 specialization : Option < Specialization < ' db > > ,
2831- field_policy : CodeGeneratorKind ,
2832- ) -> FxOrderMap < Name , Field < ' db > > {
2832+ field_policy : CodeGeneratorKind < ' db > ,
2833+ ) -> FxIndexMap < Name , Field < ' db > > {
28332834 if field_policy == CodeGeneratorKind :: NamedTuple {
28342835 // NamedTuples do not allow multiple inheritance, so it is sufficient to enumerate the
28352836 // fields of this class only.
@@ -2877,8 +2878,8 @@ impl<'db> ClassLiteral<'db> {
28772878 db : & ' db dyn Db ,
28782879 specialization : Option < Specialization < ' db > > ,
28792880 field_policy : CodeGeneratorKind ,
2880- ) -> FxOrderMap < Name , Field < ' db > > {
2881- let mut attributes = FxOrderMap :: default ( ) ;
2881+ ) -> FxIndexMap < Name , Field < ' db > > {
2882+ let mut attributes = FxIndexMap :: default ( ) ;
28822883
28832884 let class_body_scope = self . body_scope ( db) ;
28842885 let table = place_table ( db, class_body_scope) ;
0 commit comments