Skip to content

Commit 70742b3

Browse files
committed
Initial hacky version of overload filtering
1 parent 31f9dce commit 70742b3

File tree

2 files changed

+35
-5
lines changed

2 files changed

+35
-5
lines changed

crates/ty_python_semantic/resources/mdtest/public_types.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ reveal_type(f(1)) # revealed: int
229229
reveal_type(f("a")) # revealed: str
230230

231231
def _():
232-
reveal_type(f)
233232
reveal_type(f(1)) # revealed: int
234233
reveal_type(f("a")) # revealed: str
235234
```

crates/ty_python_semantic/src/place.rs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ fn place_from_declarations_impl<'db>(
10211021
_ => Truthiness::AlwaysFalse,
10221022
};
10231023

1024-
let mut types = declarations.filter_map(
1024+
let types = declarations.filter_map(
10251025
|DeclarationWithConstraint {
10261026
declaration,
10271027
reachability_constraint,
@@ -1045,14 +1045,45 @@ fn place_from_declarations_impl<'db>(
10451045
},
10461046
);
10471047

1048-
if let Some(first) = types.next() {
1048+
let mut types = types.peekable();
1049+
1050+
if types.peek().is_some() {
1051+
let mut union_elements = vec![];
1052+
let mut queue = vec![];
1053+
1054+
for ty in types {
1055+
match ty.inner_type() {
1056+
Type::FunctionLiteral(function) => {
1057+
if function.literal(db).last_definition(db).is_overload(db) {
1058+
queue.push(ty);
1059+
} else {
1060+
queue.clear();
1061+
union_elements.push(ty);
1062+
}
1063+
}
1064+
_ => {
1065+
union_elements.append(&mut queue);
1066+
1067+
union_elements.push(ty);
1068+
}
1069+
}
1070+
}
1071+
union_elements.append(&mut queue);
1072+
// dbg!(&union_elements);
1073+
1074+
let mut union_elements = union_elements.into_iter();
1075+
1076+
let first = union_elements
1077+
.next()
1078+
.expect("At least one type must be present");
1079+
10491080
let mut conflicting: Vec<Type<'db>> = vec![];
1050-
let declared = if let Some(second) = types.next() {
1081+
let declared = if let Some(second) = union_elements.next() {
10511082
let ty_first = first.inner_type();
10521083
let mut qualifiers = first.qualifiers();
10531084

10541085
let mut builder = UnionBuilder::new(db).add(ty_first);
1055-
for other in std::iter::once(second).chain(types) {
1086+
for other in std::iter::once(second).chain(union_elements) {
10561087
let other_ty = other.inner_type();
10571088
if !ty_first.is_equivalent_to(db, other_ty) {
10581089
conflicting.push(other_ty);

0 commit comments

Comments
 (0)