Enable flake8-pyi's Y037 (#9686)

This commit is contained in:
Alex Waygood
2023-02-07 03:01:02 +00:00
committed by GitHub
parent c4c4bee8aa
commit 0ef9c3f8e8
38 changed files with 119 additions and 201 deletions

View File

@@ -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