mirror of https://github.com/astral-sh/ruff
[ty] Add more tests for renamings (#21810)
This commit is contained in:
parent
48f7f42784
commit
71a7a03ad4
|
|
@ -1432,7 +1432,7 @@ result = func(10, y=20)
|
||||||
fn rename_overloaded_function() {
|
fn rename_overloaded_function() {
|
||||||
let test = CursorTest::builder()
|
let test = CursorTest::builder()
|
||||||
.source(
|
.source(
|
||||||
"mypackage/__init__.py",
|
"lib1.py",
|
||||||
r#"
|
r#"
|
||||||
from typing import overload, Any
|
from typing import overload, Any
|
||||||
|
|
||||||
|
|
@ -1448,9 +1448,9 @@ result = func(10, y=20)
|
||||||
"#,
|
"#,
|
||||||
)
|
)
|
||||||
.source(
|
.source(
|
||||||
"mypackage/subpkg/__init__.py",
|
"main.py",
|
||||||
r#"
|
r#"
|
||||||
from lib import test
|
from lib2 import test
|
||||||
|
|
||||||
test("test")
|
test("test")
|
||||||
"#,
|
"#,
|
||||||
|
|
@ -1459,7 +1459,7 @@ result = func(10, y=20)
|
||||||
|
|
||||||
assert_snapshot!(test.rename("better_name"), @r"
|
assert_snapshot!(test.rename("better_name"), @r"
|
||||||
info[rename]: Rename symbol (found 1 locations)
|
info[rename]: Rename symbol (found 1 locations)
|
||||||
--> mypackage/__init__.py:5:5
|
--> lib1.py:5:5
|
||||||
|
|
|
|
||||||
4 | @overload
|
4 | @overload
|
||||||
5 | def test() -> None: ...
|
5 | def test() -> None: ...
|
||||||
|
|
@ -1470,11 +1470,479 @@ result = func(10, y=20)
|
||||||
");
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rename_property() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"lib.py",
|
||||||
|
r#"
|
||||||
|
class Foo:
|
||||||
|
@property
|
||||||
|
def my_property<CURSOR>(self) -> int:
|
||||||
|
return 42
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.source(
|
||||||
|
"main.py",
|
||||||
|
r#"
|
||||||
|
from lib import Foo
|
||||||
|
|
||||||
|
print(Foo().my_property)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r"
|
||||||
|
info[rename]: Rename symbol (found 2 locations)
|
||||||
|
--> lib.py:4:9
|
||||||
|
|
|
||||||
|
2 | class Foo:
|
||||||
|
3 | @property
|
||||||
|
4 | def my_property(self) -> int:
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
5 | return 42
|
||||||
|
|
|
||||||
|
::: main.py:4:13
|
||||||
|
|
|
||||||
|
2 | from lib import Foo
|
||||||
|
3 |
|
||||||
|
4 | print(Foo().my_property)
|
||||||
|
| -----------
|
||||||
|
|
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this should rename the name of the function decorated with
|
||||||
|
// `@my_property.setter` as well as the getter function name
|
||||||
|
#[test]
|
||||||
|
fn rename_property_with_setter() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"lib.py",
|
||||||
|
r#"
|
||||||
|
class Foo:
|
||||||
|
@property
|
||||||
|
def my_property<CURSOR>(self) -> int:
|
||||||
|
return 42
|
||||||
|
|
||||||
|
@my_property.setter
|
||||||
|
def my_property(self, value: int) -> None:
|
||||||
|
pass
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.source(
|
||||||
|
"main.py",
|
||||||
|
r#"
|
||||||
|
from lib import Foo
|
||||||
|
|
||||||
|
print(Foo().my_property)
|
||||||
|
Foo().my_property = 56
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r"
|
||||||
|
info[rename]: Rename symbol (found 4 locations)
|
||||||
|
--> lib.py:4:9
|
||||||
|
|
|
||||||
|
2 | class Foo:
|
||||||
|
3 | @property
|
||||||
|
4 | def my_property(self) -> int:
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
5 | return 42
|
||||||
|
6 |
|
||||||
|
7 | @my_property.setter
|
||||||
|
| -----------
|
||||||
|
8 | def my_property(self, value: int) -> None:
|
||||||
|
9 | pass
|
||||||
|
|
|
||||||
|
::: main.py:4:13
|
||||||
|
|
|
||||||
|
2 | from lib import Foo
|
||||||
|
3 |
|
||||||
|
4 | print(Foo().my_property)
|
||||||
|
| -----------
|
||||||
|
5 | Foo().my_property = 56
|
||||||
|
| -----------
|
||||||
|
|
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this should rename the name of the function decorated with
|
||||||
|
// `@my_property.deleter` as well as the getter function name
|
||||||
|
#[test]
|
||||||
|
fn rename_property_with_deleter() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"lib.py",
|
||||||
|
r#"
|
||||||
|
class Foo:
|
||||||
|
@property
|
||||||
|
def my_property<CURSOR>(self) -> int:
|
||||||
|
return 42
|
||||||
|
|
||||||
|
@my_property.deleter
|
||||||
|
def my_property(self) -> None:
|
||||||
|
pass
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.source(
|
||||||
|
"main.py",
|
||||||
|
r#"
|
||||||
|
from lib import Foo
|
||||||
|
|
||||||
|
print(Foo().my_property)
|
||||||
|
del Foo().my_property
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r"
|
||||||
|
info[rename]: Rename symbol (found 4 locations)
|
||||||
|
--> lib.py:4:9
|
||||||
|
|
|
||||||
|
2 | class Foo:
|
||||||
|
3 | @property
|
||||||
|
4 | def my_property(self) -> int:
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
5 | return 42
|
||||||
|
6 |
|
||||||
|
7 | @my_property.deleter
|
||||||
|
| -----------
|
||||||
|
8 | def my_property(self) -> None:
|
||||||
|
9 | pass
|
||||||
|
|
|
||||||
|
::: main.py:4:13
|
||||||
|
|
|
||||||
|
2 | from lib import Foo
|
||||||
|
3 |
|
||||||
|
4 | print(Foo().my_property)
|
||||||
|
| -----------
|
||||||
|
5 | del Foo().my_property
|
||||||
|
| -----------
|
||||||
|
|
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this should rename the name of the functions decorated with
|
||||||
|
// `@my_property.deleter` and `@my_property.deleter` as well as the
|
||||||
|
// getter function name
|
||||||
|
#[test]
|
||||||
|
fn rename_property_with_setter_and_deleter() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"lib.py",
|
||||||
|
r#"
|
||||||
|
class Foo:
|
||||||
|
@property
|
||||||
|
def my_property<CURSOR>(self) -> int:
|
||||||
|
return 42
|
||||||
|
|
||||||
|
@my_property.setter
|
||||||
|
def my_property(self, value: int) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@my_property.deleter
|
||||||
|
def my_property(self) -> None:
|
||||||
|
pass
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.source(
|
||||||
|
"main.py",
|
||||||
|
r#"
|
||||||
|
from lib import Foo
|
||||||
|
|
||||||
|
print(Foo().my_property)
|
||||||
|
Foo().my_property = 56
|
||||||
|
del Foo().my_property
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r"
|
||||||
|
info[rename]: Rename symbol (found 6 locations)
|
||||||
|
--> lib.py:4:9
|
||||||
|
|
|
||||||
|
2 | class Foo:
|
||||||
|
3 | @property
|
||||||
|
4 | def my_property(self) -> int:
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
5 | return 42
|
||||||
|
6 |
|
||||||
|
7 | @my_property.setter
|
||||||
|
| -----------
|
||||||
|
8 | def my_property(self, value: int) -> None:
|
||||||
|
9 | pass
|
||||||
|
10 |
|
||||||
|
11 | @my_property.deleter
|
||||||
|
| -----------
|
||||||
|
12 | def my_property(self) -> None:
|
||||||
|
13 | pass
|
||||||
|
|
|
||||||
|
::: main.py:4:13
|
||||||
|
|
|
||||||
|
2 | from lib import Foo
|
||||||
|
3 |
|
||||||
|
4 | print(Foo().my_property)
|
||||||
|
| -----------
|
||||||
|
5 | Foo().my_property = 56
|
||||||
|
| -----------
|
||||||
|
6 | del Foo().my_property
|
||||||
|
| -----------
|
||||||
|
|
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rename_single_dispatch_function() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"foo.py",
|
||||||
|
r#"
|
||||||
|
from functools import singledispatch
|
||||||
|
|
||||||
|
@singledispatch
|
||||||
|
def f<CURSOR>(x: object):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@f.register
|
||||||
|
def _(x: int) -> str:
|
||||||
|
return "int"
|
||||||
|
|
||||||
|
@f.register
|
||||||
|
def _(x: str) -> int:
|
||||||
|
return int(x)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r#"
|
||||||
|
info[rename]: Rename symbol (found 3 locations)
|
||||||
|
--> foo.py:5:5
|
||||||
|
|
|
||||||
|
4 | @singledispatch
|
||||||
|
5 | def f(x: object):
|
||||||
|
| ^
|
||||||
|
6 | raise NotImplementedError
|
||||||
|
7 |
|
||||||
|
8 | @f.register
|
||||||
|
| -
|
||||||
|
9 | def _(x: int) -> str:
|
||||||
|
10 | return "int"
|
||||||
|
11 |
|
||||||
|
12 | @f.register
|
||||||
|
| -
|
||||||
|
13 | def _(x: str) -> int:
|
||||||
|
14 | return int(x)
|
||||||
|
|
|
||||||
|
"#);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rename_single_dispatch_function_stacked_register() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"foo.py",
|
||||||
|
r#"
|
||||||
|
from functools import singledispatch
|
||||||
|
|
||||||
|
@singledispatch
|
||||||
|
def f<CURSOR>(x):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@f.register(int)
|
||||||
|
@f.register(float)
|
||||||
|
def _(x) -> float:
|
||||||
|
return "int"
|
||||||
|
|
||||||
|
@f.register(str)
|
||||||
|
def _(x) -> int:
|
||||||
|
return int(x)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r#"
|
||||||
|
info[rename]: Rename symbol (found 4 locations)
|
||||||
|
--> foo.py:5:5
|
||||||
|
|
|
||||||
|
4 | @singledispatch
|
||||||
|
5 | def f(x):
|
||||||
|
| ^
|
||||||
|
6 | raise NotImplementedError
|
||||||
|
7 |
|
||||||
|
8 | @f.register(int)
|
||||||
|
| -
|
||||||
|
9 | @f.register(float)
|
||||||
|
| -
|
||||||
|
10 | def _(x) -> float:
|
||||||
|
11 | return "int"
|
||||||
|
12 |
|
||||||
|
13 | @f.register(str)
|
||||||
|
| -
|
||||||
|
14 | def _(x) -> int:
|
||||||
|
15 | return int(x)
|
||||||
|
|
|
||||||
|
"#);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rename_single_dispatchmethod() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"foo.py",
|
||||||
|
r#"
|
||||||
|
from functools import singledispatchmethod
|
||||||
|
|
||||||
|
class Foo:
|
||||||
|
@singledispatchmethod
|
||||||
|
def f<CURSOR>(self, x: object):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@f.register
|
||||||
|
def _(self, x: str) -> float:
|
||||||
|
return "int"
|
||||||
|
|
||||||
|
@f.register
|
||||||
|
def _(self, x: str) -> int:
|
||||||
|
return int(x)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r#"
|
||||||
|
info[rename]: Rename symbol (found 3 locations)
|
||||||
|
--> foo.py:6:9
|
||||||
|
|
|
||||||
|
4 | class Foo:
|
||||||
|
5 | @singledispatchmethod
|
||||||
|
6 | def f(self, x: object):
|
||||||
|
| ^
|
||||||
|
7 | raise NotImplementedError
|
||||||
|
8 |
|
||||||
|
9 | @f.register
|
||||||
|
| -
|
||||||
|
10 | def _(self, x: str) -> float:
|
||||||
|
11 | return "int"
|
||||||
|
12 |
|
||||||
|
13 | @f.register
|
||||||
|
| -
|
||||||
|
14 | def _(self, x: str) -> int:
|
||||||
|
15 | return int(x)
|
||||||
|
|
|
||||||
|
"#);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rename_single_dispatchmethod_staticmethod() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"foo.py",
|
||||||
|
r#"
|
||||||
|
from functools import singledispatchmethod
|
||||||
|
|
||||||
|
class Foo:
|
||||||
|
@singledispatchmethod
|
||||||
|
@staticmethod
|
||||||
|
def f<CURSOR>(self, x):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@f.register(str)
|
||||||
|
@staticmethod
|
||||||
|
def _(x: int) -> str:
|
||||||
|
return "int"
|
||||||
|
|
||||||
|
@f.register
|
||||||
|
@staticmethod
|
||||||
|
def _(x: str) -> int:
|
||||||
|
return int(x)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r#"
|
||||||
|
info[rename]: Rename symbol (found 3 locations)
|
||||||
|
--> foo.py:7:9
|
||||||
|
|
|
||||||
|
5 | @singledispatchmethod
|
||||||
|
6 | @staticmethod
|
||||||
|
7 | def f(self, x):
|
||||||
|
| ^
|
||||||
|
8 | raise NotImplementedError
|
||||||
|
9 |
|
||||||
|
10 | @f.register(str)
|
||||||
|
| -
|
||||||
|
11 | @staticmethod
|
||||||
|
12 | def _(x: int) -> str:
|
||||||
|
13 | return "int"
|
||||||
|
14 |
|
||||||
|
15 | @f.register
|
||||||
|
| -
|
||||||
|
16 | @staticmethod
|
||||||
|
17 | def _(x: str) -> int:
|
||||||
|
|
|
||||||
|
"#);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rename_single_dispatchmethod_classmethod() {
|
||||||
|
let test = CursorTest::builder()
|
||||||
|
.source(
|
||||||
|
"foo.py",
|
||||||
|
r#"
|
||||||
|
from functools import singledispatchmethod
|
||||||
|
|
||||||
|
class Foo:
|
||||||
|
@singledispatchmethod
|
||||||
|
@classmethod
|
||||||
|
def f<CURSOR>(cls, x):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@f.register(str)
|
||||||
|
@classmethod
|
||||||
|
def _(cls, x) -> str:
|
||||||
|
return "int"
|
||||||
|
|
||||||
|
@f.register(int)
|
||||||
|
@f.register(float)
|
||||||
|
@staticmethod
|
||||||
|
def _(cls, x) -> int:
|
||||||
|
return int(x)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assert_snapshot!(test.rename("better_name"), @r#"
|
||||||
|
info[rename]: Rename symbol (found 4 locations)
|
||||||
|
--> foo.py:7:9
|
||||||
|
|
|
||||||
|
5 | @singledispatchmethod
|
||||||
|
6 | @classmethod
|
||||||
|
7 | def f(cls, x):
|
||||||
|
| ^
|
||||||
|
8 | raise NotImplementedError
|
||||||
|
9 |
|
||||||
|
10 | @f.register(str)
|
||||||
|
| -
|
||||||
|
11 | @classmethod
|
||||||
|
12 | def _(cls, x) -> str:
|
||||||
|
13 | return "int"
|
||||||
|
14 |
|
||||||
|
15 | @f.register(int)
|
||||||
|
| -
|
||||||
|
16 | @f.register(float)
|
||||||
|
| -
|
||||||
|
17 | @staticmethod
|
||||||
|
18 | def _(cls, x) -> int:
|
||||||
|
|
|
||||||
|
"#);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn rename_attribute() {
|
fn rename_attribute() {
|
||||||
let test = CursorTest::builder()
|
let test = CursorTest::builder()
|
||||||
.source(
|
.source(
|
||||||
"mypackage/__init__.py",
|
"foo.py",
|
||||||
r#"
|
r#"
|
||||||
class Test:
|
class Test:
|
||||||
attribute<CURSOR>: str
|
attribute<CURSOR>: str
|
||||||
|
|
@ -1497,7 +1965,7 @@ result = func(10, y=20)
|
||||||
|
|
||||||
assert_snapshot!(test.rename("better_name"), @r#"
|
assert_snapshot!(test.rename("better_name"), @r#"
|
||||||
info[rename]: Rename symbol (found 5 locations)
|
info[rename]: Rename symbol (found 5 locations)
|
||||||
--> mypackage/__init__.py:3:5
|
--> foo.py:3:5
|
||||||
|
|
|
|
||||||
2 | class Test:
|
2 | class Test:
|
||||||
3 | attribute: str
|
3 | attribute: str
|
||||||
|
|
@ -1512,7 +1980,7 @@ result = func(10, y=20)
|
||||||
10 | return self.attribute
|
10 | return self.attribute
|
||||||
| ---------
|
| ---------
|
||||||
|
|
|
|
||||||
::: mypackage/__init__.py:15:9
|
::: foo.py:15:9
|
||||||
|
|
|
|
||||||
13 | c = Child("test")
|
13 | c = Child("test")
|
||||||
14 |
|
14 |
|
||||||
|
|
@ -1530,7 +1998,7 @@ result = func(10, y=20)
|
||||||
fn rename_implicit_attribute() {
|
fn rename_implicit_attribute() {
|
||||||
let test = CursorTest::builder()
|
let test = CursorTest::builder()
|
||||||
.source(
|
.source(
|
||||||
"mypackage/__init__.py",
|
"main.py",
|
||||||
r#"
|
r#"
|
||||||
class Test:
|
class Test:
|
||||||
def __init__(self, value: str):
|
def __init__(self, value: str):
|
||||||
|
|
@ -1555,7 +2023,7 @@ result = func(10, y=20)
|
||||||
|
|
||||||
assert_snapshot!(test.rename("better_name"), @r"
|
assert_snapshot!(test.rename("better_name"), @r"
|
||||||
info[rename]: Rename symbol (found 1 locations)
|
info[rename]: Rename symbol (found 1 locations)
|
||||||
--> mypackage/__init__.py:4:14
|
--> main.py:4:14
|
||||||
|
|
|
|
||||||
2 | class Test:
|
2 | class Test:
|
||||||
3 | def __init__(self, value: str):
|
3 | def __init__(self, value: str):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue