mirror of
https://github.com/davidhalter/typeshed.git
synced 2026-01-28 05:42:10 +08:00
Enable flake8-pyi's Y037 (#9686)
This commit is contained in:
@@ -10,68 +10,6 @@ from pathlib import Path
|
||||
|
||||
def check_new_syntax(tree: ast.AST, path: Path, stub: str) -> list[str]:
|
||||
errors = []
|
||||
sourcelines = stub.splitlines()
|
||||
|
||||
class AnnotationUnionFinder(ast.NodeVisitor):
|
||||
def visit_Subscript(self, node: ast.Subscript) -> None:
|
||||
if isinstance(node.value, ast.Name):
|
||||
if node.value.id == "Union" and isinstance(node.slice, ast.Tuple):
|
||||
new_syntax = " | ".join(ast.unparse(x) for x in node.slice.elts)
|
||||
errors.append(f"{path}:{node.lineno}: Use PEP 604 syntax for Union, e.g. `{new_syntax}`")
|
||||
if node.value.id == "Optional":
|
||||
new_syntax = f"{ast.unparse(node.slice)} | None"
|
||||
errors.append(f"{path}:{node.lineno}: Use PEP 604 syntax for Optional, e.g. `{new_syntax}`")
|
||||
|
||||
self.generic_visit(node)
|
||||
|
||||
class NonAnnotationUnionFinder(ast.NodeVisitor):
|
||||
def visit_Subscript(self, node: ast.Subscript) -> None:
|
||||
if isinstance(node.value, ast.Name):
|
||||
nodelines = sourcelines[(node.lineno - 1) : node.end_lineno]
|
||||
for line in nodelines:
|
||||
# A hack to workaround various PEP 604 bugs in mypy
|
||||
if any(x in line for x in {"tuple[", "Callable[", "type["}):
|
||||
return None
|
||||
if node.value.id == "Union" and isinstance(node.slice, ast.Tuple):
|
||||
new_syntax = " | ".join(ast.unparse(x) for x in node.slice.elts)
|
||||
errors.append(f"{path}:{node.lineno}: Use PEP 604 syntax for Union, e.g. `{new_syntax}`")
|
||||
elif node.value.id == "Optional":
|
||||
new_syntax = f"{ast.unparse(node.slice)} | None"
|
||||
errors.append(f"{path}:{node.lineno}: Use PEP 604 syntax for Optional, e.g. `{new_syntax}`")
|
||||
|
||||
self.generic_visit(node)
|
||||
|
||||
class OldSyntaxFinder(ast.NodeVisitor):
|
||||
def visit_AnnAssign(self, node: ast.AnnAssign) -> None:
|
||||
AnnotationUnionFinder().visit(node.annotation)
|
||||
if node.value is not None:
|
||||
NonAnnotationUnionFinder().visit(node.value)
|
||||
self.generic_visit(node)
|
||||
|
||||
def visit_arg(self, node: ast.arg) -> None:
|
||||
if node.annotation is not None:
|
||||
AnnotationUnionFinder().visit(node.annotation)
|
||||
self.generic_visit(node)
|
||||
|
||||
def _visit_function(self, node: ast.FunctionDef | ast.AsyncFunctionDef) -> None:
|
||||
if node.returns is not None:
|
||||
AnnotationUnionFinder().visit(node.returns)
|
||||
self.generic_visit(node)
|
||||
|
||||
def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
|
||||
self._visit_function(node)
|
||||
|
||||
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
|
||||
self._visit_function(node)
|
||||
|
||||
def visit_Assign(self, node: ast.Assign) -> None:
|
||||
NonAnnotationUnionFinder().visit(node.value)
|
||||
self.generic_visit(node)
|
||||
|
||||
def visit_ClassDef(self, node: ast.ClassDef) -> None:
|
||||
for base in node.bases:
|
||||
NonAnnotationUnionFinder().visit(base)
|
||||
self.generic_visit(node)
|
||||
|
||||
class IfFinder(ast.NodeVisitor):
|
||||
def visit_If(self, node: ast.If) -> None:
|
||||
@@ -88,7 +26,6 @@ def check_new_syntax(tree: ast.AST, path: Path, stub: str) -> list[str]:
|
||||
)
|
||||
self.generic_visit(node)
|
||||
|
||||
OldSyntaxFinder().visit(tree)
|
||||
IfFinder().visit(tree)
|
||||
return errors
|
||||
|
||||
|
||||
Reference in New Issue
Block a user