Skip to content

Commit d8ada59

Browse files
committed
FxOrderSet
1 parent c11770e commit d8ada59

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

crates/ty_python_semantic/src/types/builder.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -378,27 +378,29 @@ impl<'db> UnionBuilder<'db> {
378378
}
379379
Type::EnumLiteral(enum_literal) => {
380380
let enum_class = enum_literal.enum_class(self.db);
381-
382381
let metadata =
383382
enum_metadata(self.db, enum_class).expect("Class of enum literal is an enum");
384383

385-
// TODO: This is a horribly slow implementation just to check if this works.
386-
let all_members = metadata.members.iter().collect::<FxHashSet<_>>();
387-
388-
let mut existing_enum_members = self
384+
let members_in_union = self
389385
.elements
390386
.iter()
391387
.filter_map(|element| {
392388
if let UnionElement::Type(Type::EnumLiteral(lit)) = element {
393-
Some(lit.name(self.db))
389+
Some(lit.name(self.db).clone())
394390
} else {
395391
None
396392
}
397393
})
398-
.collect::<FxHashSet<_>>();
399-
existing_enum_members.insert(enum_literal.name(self.db));
394+
.chain(std::iter::once(enum_literal.name(self.db).clone()))
395+
.collect::<FxOrderSet<_>>();
396+
397+
let all_members_are_in_union = metadata
398+
.members
399+
.difference(&members_in_union)
400+
.next()
401+
.is_none();
400402

401-
if all_members == existing_enum_members {
403+
if all_members_are_in_union {
402404
self.add_in_place(enum_literal.enum_class_instance(self.db));
403405
} else {
404406
if !self.elements.iter().any(|element| match element {

crates/ty_python_semantic/src/types/enums.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use ruff_python_ast::name::Name;
33
use rustc_hash::FxHashMap;
44

55
use crate::{
6-
Db,
6+
Db, FxOrderSet,
77
place::{Place, PlaceAndQualifiers, place_from_bindings, place_from_declarations},
88
semantic_index::{place_table, use_def_map},
99
types::{
@@ -12,16 +12,18 @@ use crate::{
1212
},
1313
};
1414

15-
#[derive(Debug, PartialEq, Eq, get_size2::GetSize)]
15+
#[derive(Debug, PartialEq, Eq)]
1616
pub(crate) struct EnumMetadata {
17-
pub(crate) members: Box<[Name]>,
17+
pub(crate) members: FxOrderSet<Name>,
1818
pub(crate) aliases: FxHashMap<Name, Name>,
1919
}
2020

21+
impl get_size2::GetSize for EnumMetadata {}
22+
2123
impl EnumMetadata {
2224
fn empty() -> Self {
2325
EnumMetadata {
24-
members: Box::new([]),
26+
members: FxOrderSet::default(),
2527
aliases: FxHashMap::default(),
2628
}
2729
}
@@ -212,7 +214,7 @@ pub(crate) fn enum_metadata<'db>(
212214
Some(name)
213215
})
214216
.cloned()
215-
.collect::<Box<_>>();
217+
.collect::<FxOrderSet<_>>();
216218

217219
if members.is_empty() {
218220
// Enum subclasses without members are not considered enums.

0 commit comments

Comments
 (0)