Skip to content

Commit bd2f69e

Browse files
committed
Handle typing_extensions in pycode.parser
1 parent ee2e922 commit bd2f69e

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

sphinx/pycode/parser.py

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,9 @@ def __init__(self, buffers: list[str], encoding: str) -> None:
247247
self.deforders: dict[str, int] = {}
248248
self.finals: list[str] = []
249249
self.overloads: dict[str, list[Signature]] = {}
250-
self.typing: str | None = None
251-
self.typing_final: str | None = None
252-
self.typing_overload: str | None = None
250+
self.typing: list[str] = []
251+
self.typing_final: list[str] = []
252+
self.typing_overload: list[str] = []
253253
super().__init__()
254254

255255
def get_qualname_for(self, name: str) -> list[str] | None:
@@ -295,12 +295,9 @@ def add_variable_annotation(self, name: str, annotation: ast.AST) -> None:
295295
self.annotations[basename, name] = ast_unparse(annotation)
296296

297297
def is_final(self, decorators: list[ast.expr]) -> bool:
298-
final = []
299-
if self.typing:
300-
final.append('%s.final' % self.typing)
301-
if self.typing_final:
302-
final.append(self.typing_final)
303-
298+
final = self.typing_final.copy()
299+
for modname in self.typing:
300+
final.append(f'{modname}.final')
304301
for decorator in decorators:
305302
try:
306303
if ast_unparse(decorator) in final:
@@ -311,11 +308,9 @@ def is_final(self, decorators: list[ast.expr]) -> bool:
311308
return False
312309

313310
def is_overload(self, decorators: list[ast.expr]) -> bool:
314-
overload = []
315-
if self.typing:
316-
overload.append('%s.overload' % self.typing)
317-
if self.typing_overload:
318-
overload.append(self.typing_overload)
311+
overload = self.typing_overload.copy()
312+
for modname in self.typing:
313+
overload.append(f'{modname}.overload')
319314

320315
for decorator in decorators:
321316
try:
@@ -348,22 +343,24 @@ def visit_Import(self, node: ast.Import) -> None:
348343
for name in node.names:
349344
self.add_entry(name.asname or name.name)
350345

351-
if name.name == 'typing':
352-
self.typing = name.asname or name.name
353-
elif name.name == 'typing.final':
354-
self.typing_final = name.asname or name.name
355-
elif name.name == 'typing.overload':
356-
self.typing_overload = name.asname or name.name
346+
if name.name in ('typing', 'typing_extensions'):
347+
self.typing.append(name.asname or name.name)
348+
elif name.name in ('typing.final', 'typing_extensions.final'):
349+
self.typing_final.append(name.asname or name.name)
350+
elif name.name in ('typing.overload', 'typing_extensions.overload'):
351+
self.typing_overload.append(name.asname or name.name)
357352

358353
def visit_ImportFrom(self, node: ast.ImportFrom) -> None:
359354
"""Handles Import node and record the order of definitions."""
360355
for name in node.names:
361356
self.add_entry(name.asname or name.name)
362357

363-
if node.module == 'typing' and name.name == 'final':
364-
self.typing_final = name.asname or name.name
365-
elif node.module == 'typing' and name.name == 'overload':
366-
self.typing_overload = name.asname or name.name
358+
if node.module not in ('typing', 'typing_extensions'):
359+
continue
360+
if name.name == 'final':
361+
self.typing_final.append(name.asname or name.name)
362+
elif name.name == 'overload':
363+
self.typing_overload.append(name.asname or name.name)
367364

368365
def visit_Assign(self, node: ast.Assign) -> None:
369366
"""Handles Assign node and pick up a variable comment."""

0 commit comments

Comments
 (0)