@@ -2,7 +2,7 @@ use ruff_python_ast::name::Name;
22use rustc_hash:: FxHashMap ;
33
44use crate :: {
5- Db , FxOrderSet ,
5+ Db , FxIndexMap ,
66 place:: { Place , PlaceAndQualifiers , place_from_bindings, place_from_declarations} ,
77 semantic_index:: { place_table, use_def_map} ,
88 types:: {
@@ -11,43 +11,46 @@ use crate::{
1111 } ,
1212} ;
1313
14- #[ derive( Debug , PartialEq , Eq ) ]
15- pub ( crate ) struct EnumMetadata {
16- pub ( crate ) members : FxOrderSet < Name > ,
14+ #[ derive( Debug , PartialEq , Eq , salsa :: Update ) ]
15+ pub ( crate ) struct EnumMetadata < ' db > {
16+ pub ( crate ) members : FxIndexMap < Name , Type < ' db > > ,
1717 pub ( crate ) aliases : FxHashMap < Name , Name > ,
1818}
1919
20- impl get_size2:: GetSize for EnumMetadata { }
20+ impl get_size2:: GetSize for EnumMetadata < ' _ > { }
2121
22- impl EnumMetadata {
22+ impl EnumMetadata < ' _ > {
2323 fn empty ( ) -> Self {
2424 EnumMetadata {
25- members : FxOrderSet :: default ( ) ,
25+ members : FxIndexMap :: default ( ) ,
2626 aliases : FxHashMap :: default ( ) ,
2727 }
2828 }
2929
3030 pub ( crate ) fn resolve_member < ' a > ( & ' a self , name : & ' a Name ) -> Option < & ' a Name > {
31- if self . members . contains ( name) {
31+ if self . members . contains_key ( name) {
3232 Some ( name)
3333 } else {
3434 self . aliases . get ( name)
3535 }
3636 }
3737}
3838
39- #[ allow( clippy:: ref_option) ]
40- fn enum_metadata_cycle_recover (
41- _db : & dyn Db ,
42- _value : & Option < EnumMetadata > ,
39+ #[ allow( clippy:: ref_option, clippy :: trivially_copy_pass_by_ref ) ]
40+ fn enum_metadata_cycle_recover < ' db > (
41+ _db : & ' db dyn Db ,
42+ _value : & Option < EnumMetadata < ' db > > ,
4343 _count : u32 ,
44- _class : ClassLiteral < ' _ > ,
45- ) -> salsa:: CycleRecoveryAction < Option < EnumMetadata > > {
44+ _class : ClassLiteral < ' db > ,
45+ ) -> salsa:: CycleRecoveryAction < Option < EnumMetadata < ' db > > > {
4646 salsa:: CycleRecoveryAction :: Iterate
4747}
4848
4949#[ allow( clippy:: unnecessary_wraps) ]
50- fn enum_metadata_cycle_initial ( _db : & dyn Db , _class : ClassLiteral < ' _ > ) -> Option < EnumMetadata > {
50+ fn enum_metadata_cycle_initial < ' db > (
51+ _db : & ' db dyn Db ,
52+ _class : ClassLiteral < ' db > ,
53+ ) -> Option < EnumMetadata < ' db > > {
5154 Some ( EnumMetadata :: empty ( ) )
5255}
5356
@@ -57,7 +60,7 @@ fn enum_metadata_cycle_initial(_db: &dyn Db, _class: ClassLiteral<'_>) -> Option
5760pub ( crate ) fn enum_metadata < ' db > (
5861 db : & ' db dyn Db ,
5962 class : ClassLiteral < ' db > ,
60- ) -> Option < EnumMetadata > {
63+ ) -> Option < EnumMetadata < ' db > > {
6164 // This is a fast path to avoid traversing the MRO of known classes
6265 if class
6366 . known ( db)
@@ -217,9 +220,9 @@ pub(crate) fn enum_metadata<'db>(
217220 }
218221 }
219222
220- Some ( name. clone ( ) )
223+ Some ( ( name. clone ( ) , value_ty ) )
221224 } )
222- . collect :: < FxOrderSet < _ > > ( ) ;
225+ . collect :: < FxIndexMap < _ , _ > > ( ) ;
223226
224227 if members. is_empty ( ) {
225228 // Enum subclasses without members are not considered enums.
@@ -237,7 +240,7 @@ pub(crate) fn enum_member_literals<'a, 'db: 'a>(
237240 enum_metadata ( db, class) . map ( |metadata| {
238241 metadata
239242 . members
240- . iter ( )
243+ . keys ( )
241244 . filter ( move |name| Some ( * name) != exclude_member)
242245 . map ( move |name| Type :: EnumLiteral ( EnumLiteralType :: new ( db, class, name. clone ( ) ) ) )
243246 } )
0 commit comments