Skip to content

Commit 6cc321a

Browse files
Represent ParamSpec and TypeVar names with AssignName
Follow the example of MatchStar and the like
1 parent 964d63e commit 6cc321a

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

astroid/nodes/as_string.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,11 +525,11 @@ def visit_tuple(self, node) -> str:
525525

526526
def visit_typealias(self, node: nodes.TypeAlias) -> str:
527527
"""return an astroid.TypeAlias node as string"""
528-
return f"{node.value}{node.type_params or ''}"
528+
return node.name.accept(self) if node.name else "_"
529529

530530
def visit_typevar(self, node: nodes.TypeVar) -> str:
531531
"""return an astroid.TypeVar node as string"""
532-
return node.name
532+
return node.name.accept(self) if node.name else "_"
533533

534534
def visit_unaryop(self, node) -> str:
535535
"""return an astroid.UnaryOp node as string"""

astroid/nodes/node_classes.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2714,7 +2714,7 @@ def __init__(
27142714
end_lineno: int | None = None,
27152715
end_col_offset: int | None = None,
27162716
) -> None:
2717-
self.name: str
2717+
self.name: AssignName | None
27182718
super().__init__(
27192719
lineno=lineno,
27202720
col_offset=col_offset,
@@ -2723,7 +2723,7 @@ def __init__(
27232723
parent=parent,
27242724
)
27252725

2726-
def postinit(self, name: str) -> None:
2726+
def postinit(self, *, name: AssignName | None) -> None:
27272727
self.name = name
27282728

27292729
assigned_stmts: ClassVar[
@@ -3376,6 +3376,7 @@ def __init__(
33763376
end_lineno: int | None = None,
33773377
end_col_offset: int | None = None,
33783378
) -> None:
3379+
self.name: AssignName | None
33793380
self.type_params: list[TypeVar, ParamSpec]
33803381
self.value: NodeNG
33813382
super().__init__(
@@ -3389,9 +3390,11 @@ def __init__(
33893390
def postinit(
33903391
self,
33913392
*,
3393+
name: AssignName | None,
33923394
type_params: list[TypeVar, ParamSpec],
33933395
value: NodeNG,
33943396
) -> None:
3397+
self.name = name
33953398
self.type_params = type_params
33963399
self.value = value
33973400

@@ -3431,7 +3434,7 @@ def __init__(
34313434
end_lineno: int | None = None,
34323435
end_col_offset: int | None = None,
34333436
) -> None:
3434-
self.name: str
3437+
self.name: AssignName | None
34353438
self.bound: NodeNG | None
34363439
super().__init__(
34373440
lineno=lineno,
@@ -3441,7 +3444,7 @@ def __init__(
34413444
parent=parent,
34423445
)
34433446

3444-
def postinit(self, *, name: str, bound: NodeNG | None) -> None:
3447+
def postinit(self, *, name: AssignName | None, bound: NodeNG | None) -> None:
34453448
self.name = name
34463449
self.bound = bound
34473450

astroid/rebuilder.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,7 +1508,9 @@ def visit_paramspec(self, node: ast.ParamSpec, parent: NodeNG) -> nodes.ParamSpe
15081508
end_col_offset=node.end_col_offset,
15091509
parent=parent,
15101510
)
1511-
newnode.postinit(node.name)
1511+
# Add AssignName node for 'node.name'
1512+
# https://bugs.python.org/issue43994
1513+
newnode.postinit(name=self.visit_assignname(node, newnode, node.name))
15121514
return newnode
15131515

15141516
def visit_pass(self, node: ast.Pass, parent: NodeNG) -> nodes.Pass:
@@ -1713,6 +1715,7 @@ def visit_typealias(self, node: ast.TypeAlias, parent: NodeNG) -> nodes.TypeAlia
17131715
parent=parent,
17141716
)
17151717
newnode.postinit(
1718+
name=self.visit(node.name, newnode),
17161719
type_params=[self.visit(p, newnode) for p in node.type_params],
17171720
value=self.visit(node.value, newnode),
17181721
)
@@ -1727,7 +1730,12 @@ def visit_typevar(self, node: ast.TypeVar, parent: NodeNG) -> nodes.TypeVar:
17271730
end_col_offset=node.end_col_offset,
17281731
parent=parent,
17291732
)
1730-
newnode.postinit(name=node.name, bound=self.visit(node.bound, newnode))
1733+
# Add AssignName node for 'node.name'
1734+
# https://bugs.python.org/issue43994
1735+
newnode.postinit(
1736+
name=self.visit_assignname(node, newnode, node.name),
1737+
bound=self.visit(node.bound, newnode),
1738+
)
17311739
return newnode
17321740

17331741
def visit_unaryop(self, node: ast.UnaryOp, parent: NodeNG) -> nodes.UnaryOp:

tests/test_type_params.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66

77
from astroid import extract_node
88
from astroid.const import PY312_PLUS
9-
from astroid.nodes import ParamSpec, Subscript, TypeAlias, TypeVar
9+
from astroid.nodes import AssignName, ParamSpec, Subscript, TypeAlias, TypeVar
1010

1111

1212
@pytest.mark.skipif(not PY312_PLUS, reason="Requires Python 3.12 or higher")
1313
def test_type_alias() -> None:
1414
node = extract_node("type Point[T] = list[float, float]")
1515
assert isinstance(node, TypeAlias)
1616
assert isinstance(node.type_params[0], TypeVar)
17-
assert node.type_params[0].name == "T"
17+
assert isinstance(node.type_params[0].name, AssignName)
18+
assert node.type_params[0].name.name == "T"
1819
assert node.type_params[0].bound is None
1920

2021
assert isinstance(node.value, Subscript)
@@ -31,7 +32,8 @@ def test_type_param_spec() -> None:
3132
node = extract_node("type Alias[**P] = Callable[P, int]")
3233
params = node.type_params[0]
3334
assert isinstance(params, ParamSpec)
34-
assert params.name == "P"
35+
assert isinstance(params.name, AssignName)
36+
assert params.name.name == "P"
3537

3638
assert node.inferred()[0] is node
3739

@@ -40,10 +42,10 @@ def test_type_param_spec() -> None:
4042
def test_type_param() -> None:
4143
func_node = extract_node("def func[T]() -> T: ...")
4244
assert isinstance(func_node.type_params[0], TypeVar)
43-
assert func_node.type_params[0].name == "T"
45+
assert func_node.type_params[0].name.name == "T"
4446
assert func_node.type_params[0].bound is None
4547

4648
class_node = extract_node("class MyClass[T]: ...")
4749
assert isinstance(class_node.type_params[0], TypeVar)
48-
assert class_node.type_params[0].name == "T"
50+
assert class_node.type_params[0].name.name == "T"
4951
assert class_node.type_params[0].bound is None

0 commit comments

Comments
 (0)