mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-22 03:14:41 +00:00
Select stable import name when multiple possible bindings are in scope (#12888)
This commit is contained in:
parent
499c0bd875
commit
d61d75d4fa
2 changed files with 27 additions and 12 deletions
|
@ -15,7 +15,7 @@ FURB177.py:5:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for curr
|
||||||
3 3 |
|
3 3 |
|
||||||
4 4 | # Errors
|
4 4 | # Errors
|
||||||
5 |-_ = Path().resolve()
|
5 |-_ = Path().resolve()
|
||||||
5 |+_ = pathlib.Path.cwd()
|
5 |+_ = Path.cwd()
|
||||||
6 6 | _ = pathlib.Path().resolve()
|
6 6 | _ = pathlib.Path().resolve()
|
||||||
7 7 |
|
7 7 |
|
||||||
8 8 | _ = Path("").resolve()
|
8 8 | _ = Path("").resolve()
|
||||||
|
@ -36,7 +36,7 @@ FURB177.py:6:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for curr
|
||||||
4 4 | # Errors
|
4 4 | # Errors
|
||||||
5 5 | _ = Path().resolve()
|
5 5 | _ = Path().resolve()
|
||||||
6 |-_ = pathlib.Path().resolve()
|
6 |-_ = pathlib.Path().resolve()
|
||||||
6 |+_ = pathlib.Path.cwd()
|
6 |+_ = Path.cwd()
|
||||||
7 7 |
|
7 7 |
|
||||||
8 8 | _ = Path("").resolve()
|
8 8 | _ = Path("").resolve()
|
||||||
9 9 | _ = pathlib.Path("").resolve()
|
9 9 | _ = pathlib.Path("").resolve()
|
||||||
|
@ -56,7 +56,7 @@ FURB177.py:8:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for curr
|
||||||
6 6 | _ = pathlib.Path().resolve()
|
6 6 | _ = pathlib.Path().resolve()
|
||||||
7 7 |
|
7 7 |
|
||||||
8 |-_ = Path("").resolve()
|
8 |-_ = Path("").resolve()
|
||||||
8 |+_ = pathlib.Path.cwd()
|
8 |+_ = Path.cwd()
|
||||||
9 9 | _ = pathlib.Path("").resolve()
|
9 9 | _ = pathlib.Path("").resolve()
|
||||||
10 10 |
|
10 10 |
|
||||||
11 11 | _ = Path(".").resolve()
|
11 11 | _ = Path(".").resolve()
|
||||||
|
@ -76,7 +76,7 @@ FURB177.py:9:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for curr
|
||||||
7 7 |
|
7 7 |
|
||||||
8 8 | _ = Path("").resolve()
|
8 8 | _ = Path("").resolve()
|
||||||
9 |-_ = pathlib.Path("").resolve()
|
9 |-_ = pathlib.Path("").resolve()
|
||||||
9 |+_ = pathlib.Path.cwd()
|
9 |+_ = Path.cwd()
|
||||||
10 10 |
|
10 10 |
|
||||||
11 11 | _ = Path(".").resolve()
|
11 11 | _ = Path(".").resolve()
|
||||||
12 12 | _ = pathlib.Path(".").resolve()
|
12 12 | _ = pathlib.Path(".").resolve()
|
||||||
|
@ -96,7 +96,7 @@ FURB177.py:11:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for cur
|
||||||
9 9 | _ = pathlib.Path("").resolve()
|
9 9 | _ = pathlib.Path("").resolve()
|
||||||
10 10 |
|
10 10 |
|
||||||
11 |-_ = Path(".").resolve()
|
11 |-_ = Path(".").resolve()
|
||||||
11 |+_ = pathlib.Path.cwd()
|
11 |+_ = Path.cwd()
|
||||||
12 12 | _ = pathlib.Path(".").resolve()
|
12 12 | _ = pathlib.Path(".").resolve()
|
||||||
13 13 |
|
13 13 |
|
||||||
14 14 | _ = Path("", **kwargs).resolve()
|
14 14 | _ = Path("", **kwargs).resolve()
|
||||||
|
@ -116,7 +116,7 @@ FURB177.py:12:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for cur
|
||||||
10 10 |
|
10 10 |
|
||||||
11 11 | _ = Path(".").resolve()
|
11 11 | _ = Path(".").resolve()
|
||||||
12 |-_ = pathlib.Path(".").resolve()
|
12 |-_ = pathlib.Path(".").resolve()
|
||||||
12 |+_ = pathlib.Path.cwd()
|
12 |+_ = Path.cwd()
|
||||||
13 13 |
|
13 13 |
|
||||||
14 14 | _ = Path("", **kwargs).resolve()
|
14 14 | _ = Path("", **kwargs).resolve()
|
||||||
15 15 | _ = pathlib.Path("", **kwargs).resolve()
|
15 15 | _ = pathlib.Path("", **kwargs).resolve()
|
||||||
|
@ -136,7 +136,7 @@ FURB177.py:14:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for cur
|
||||||
12 12 | _ = pathlib.Path(".").resolve()
|
12 12 | _ = pathlib.Path(".").resolve()
|
||||||
13 13 |
|
13 13 |
|
||||||
14 |-_ = Path("", **kwargs).resolve()
|
14 |-_ = Path("", **kwargs).resolve()
|
||||||
14 |+_ = pathlib.Path.cwd()
|
14 |+_ = Path.cwd()
|
||||||
15 15 | _ = pathlib.Path("", **kwargs).resolve()
|
15 15 | _ = pathlib.Path("", **kwargs).resolve()
|
||||||
16 16 |
|
16 16 |
|
||||||
17 17 | _ = Path(".", **kwargs).resolve()
|
17 17 | _ = Path(".", **kwargs).resolve()
|
||||||
|
@ -156,7 +156,7 @@ FURB177.py:15:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for cur
|
||||||
13 13 |
|
13 13 |
|
||||||
14 14 | _ = Path("", **kwargs).resolve()
|
14 14 | _ = Path("", **kwargs).resolve()
|
||||||
15 |-_ = pathlib.Path("", **kwargs).resolve()
|
15 |-_ = pathlib.Path("", **kwargs).resolve()
|
||||||
15 |+_ = pathlib.Path.cwd()
|
15 |+_ = Path.cwd()
|
||||||
16 16 |
|
16 16 |
|
||||||
17 17 | _ = Path(".", **kwargs).resolve()
|
17 17 | _ = Path(".", **kwargs).resolve()
|
||||||
18 18 | _ = pathlib.Path(".", **kwargs).resolve()
|
18 18 | _ = pathlib.Path(".", **kwargs).resolve()
|
||||||
|
@ -176,7 +176,7 @@ FURB177.py:17:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for cur
|
||||||
15 15 | _ = pathlib.Path("", **kwargs).resolve()
|
15 15 | _ = pathlib.Path("", **kwargs).resolve()
|
||||||
16 16 |
|
16 16 |
|
||||||
17 |-_ = Path(".", **kwargs).resolve()
|
17 |-_ = Path(".", **kwargs).resolve()
|
||||||
17 |+_ = pathlib.Path.cwd()
|
17 |+_ = Path.cwd()
|
||||||
18 18 | _ = pathlib.Path(".", **kwargs).resolve()
|
18 18 | _ = pathlib.Path(".", **kwargs).resolve()
|
||||||
19 19 |
|
19 19 |
|
||||||
20 20 | # OK
|
20 20 | # OK
|
||||||
|
@ -196,7 +196,7 @@ FURB177.py:18:5: FURB177 [*] Prefer `Path.cwd()` over `Path().resolve()` for cur
|
||||||
16 16 |
|
16 16 |
|
||||||
17 17 | _ = Path(".", **kwargs).resolve()
|
17 17 | _ = Path(".", **kwargs).resolve()
|
||||||
18 |-_ = pathlib.Path(".", **kwargs).resolve()
|
18 |-_ = pathlib.Path(".", **kwargs).resolve()
|
||||||
18 |+_ = pathlib.Path.cwd()
|
18 |+_ = Path.cwd()
|
||||||
19 19 |
|
19 19 |
|
||||||
20 20 | # OK
|
20 20 | # OK
|
||||||
21 21 | _ = Path.cwd()
|
21 21 | _ = Path.cwd()
|
||||||
|
|
|
@ -907,7 +907,7 @@ impl<'a> SemanticModel<'a> {
|
||||||
self.current_scopes()
|
self.current_scopes()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.find_map(|(scope_index, scope)| {
|
.find_map(|(scope_index, scope)| {
|
||||||
scope.bindings().find_map(|(name, binding_id)| {
|
let mut imported_names = scope.bindings().filter_map(|(name, binding_id)| {
|
||||||
let binding = &self.bindings[binding_id];
|
let binding = &self.bindings[binding_id];
|
||||||
match &binding.kind {
|
match &binding.kind {
|
||||||
// Ex) Given `module="sys"` and `object="exit"`:
|
// Ex) Given `module="sys"` and `object="exit"`:
|
||||||
|
@ -987,7 +987,22 @@ impl<'a> SemanticModel<'a> {
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
})
|
});
|
||||||
|
|
||||||
|
let first = imported_names.next()?;
|
||||||
|
if let Some(second) = imported_names.next() {
|
||||||
|
// Multiple candidates. We need to sort them because `scope.bindings()` is a HashMap
|
||||||
|
// which doesn't have a stable iteration order.
|
||||||
|
|
||||||
|
let mut imports: Vec<_> =
|
||||||
|
[first, second].into_iter().chain(imported_names).collect();
|
||||||
|
imports.sort_unstable_by_key(|import| import.range.start());
|
||||||
|
|
||||||
|
// Return the binding that was imported last.
|
||||||
|
imports.pop()
|
||||||
|
} else {
|
||||||
|
Some(first)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue