Skip to content

Commit 97a2f31

Browse files
committed
Python: Fix invalid-method-override errors and remove global ignore
Rename visitor method parameters to match base class signatures and fix type annotations so the global `invalid-method-override = "ignore"` in pyproject.toml can be removed. Add targeted inline `ty: ignore` comments only for the 3 cases where overrides intentionally narrow types.
1 parent 8dc0f0b commit 97a2f31

11 files changed

Lines changed: 87 additions & 90 deletions

rewrite-python/rewrite/pyproject.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,8 @@ include = ["src"]
8282
# - invalid-argument-type: ~200 errors from Self type vs concrete type in accept_*() methods
8383
# (tracked as ty bug: https://github.com/astral-sh/ty/issues/2255)
8484
# - unresolved-reference: TYPE_CHECKING forward references
85-
# - invalid-method-override: ~30 errors from visitor pattern parameter name mismatches
86-
# (e.g. visit_compilation_unit(cu) vs visit_compilation_unit(compilation_unit))
8785
invalid-argument-type = "ignore"
8886
unresolved-reference = "ignore"
89-
invalid-method-override = "ignore"
9087

9188
[tool.pytest.ini_options]
9289
testpaths = ["tests"]

rewrite-python/rewrite/src/rewrite/python/format/blank_lines.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@ def __init__(self, style: BlankLinesStyle, stop_after: Optional[Tree] = None):
1616
self._stop_after = stop_after
1717
self._stop = False
1818

19-
def visit_compilation_unit(self, compilation_unit: CompilationUnit, p: P) -> J:
20-
if not compilation_unit.prefix.comments:
21-
compilation_unit = compilation_unit.replace(prefix=Space.EMPTY)
22-
return super().visit_compilation_unit(compilation_unit, p)
19+
def visit_compilation_unit(self, cu: CompilationUnit, p: P) -> J:
20+
if not cu.prefix.comments:
21+
cu = cu.replace(prefix=Space.EMPTY)
22+
return super().visit_compilation_unit(cu, p)
2323

24-
def visit_statement(self, statement: Statement, p: P) -> J:
25-
statement = super().visit_statement(statement, p)
24+
def visit_statement(self, stmt: Statement, p: P) -> J:
25+
stmt = super().visit_statement(stmt, p)
2626

2727
parent_cursor = self.cursor.parent_tree_cursor()
2828
top_level = isinstance(parent_cursor.value, CompilationUnit)
2929

30-
if isinstance(statement, (Import, MultiImport)):
30+
if isinstance(stmt, (Import, MultiImport)):
3131
parent_cursor.put_message('prev_import', True)
3232
prev_import = False
3333
else:
@@ -36,35 +36,35 @@ def visit_statement(self, statement: Statement, p: P) -> J:
3636
parent_cursor.put_message('prev_import', False)
3737

3838
if top_level:
39-
if statement == cast(CompilationUnit, parent_cursor.value).statements[0]:
40-
statement = statement.replace(prefix=statement.prefix.replace(whitespace=''))
39+
if stmt == cast(CompilationUnit, parent_cursor.value).statements[0]:
40+
stmt = stmt.replace(prefix=stmt.prefix.replace(whitespace=''))
4141
else:
42-
min_lines = max(self._style.minimum.around_top_level_classes_functions if isinstance(statement, (ClassDeclaration, MethodDeclaration)) else 0,
42+
min_lines = max(self._style.minimum.around_top_level_classes_functions if isinstance(stmt, (ClassDeclaration, MethodDeclaration)) else 0,
4343
self._style.minimum.after_top_level_imports if prev_import else 0)
44-
statement = _adjusted_lines_for_tree(statement, min_lines, self._style.keep_maximum.in_declarations)
44+
stmt = _adjusted_lines_for_tree(stmt, min_lines, self._style.keep_maximum.in_declarations)
4545
else:
4646
in_block = isinstance(parent_cursor.value, Block)
4747
in_class = in_block and isinstance(parent_cursor.parent_tree_cursor().value, ClassDeclaration)
4848
min_lines = 0
4949
if in_class:
50-
is_first = cast(Block, parent_cursor.value).statements[0] is statement
51-
if not is_first and isinstance(statement, MethodDeclaration):
50+
is_first = cast(Block, parent_cursor.value).statements[0] is stmt
51+
if not is_first and isinstance(stmt, MethodDeclaration):
5252
min_lines = max(min_lines, self._style.minimum.around_method)
53-
elif not is_first and isinstance(statement, ClassDeclaration):
53+
elif not is_first and isinstance(stmt, ClassDeclaration):
5454
min_lines = max(min_lines, self._style.minimum.around_class)
55-
elif is_first and isinstance(statement, MethodDeclaration):
55+
elif is_first and isinstance(stmt, MethodDeclaration):
5656
min_lines = max(min_lines, self._style.minimum.before_first_method)
5757

5858
# This seems to correspond to how IntelliJ interprets this configuration
5959
max_lines = self._style.keep_maximum.in_declarations if \
60-
isinstance(statement, (ClassDeclaration, MethodDeclaration)) else \
60+
isinstance(stmt, (ClassDeclaration, MethodDeclaration)) else \
6161
self._style.keep_maximum.in_code
6262

6363
if prev_import:
6464
min_lines = max(min_lines, self._style.minimum.after_local_imports)
6565

66-
statement = _adjusted_lines_for_tree(statement, min_lines, max_lines)
67-
return statement
66+
stmt = _adjusted_lines_for_tree(stmt, min_lines, max_lines)
67+
return stmt
6868

6969
def post_visit(self, tree: T, p: P) -> Optional[T]:
7070
if self._stop_after and tree == self._stop_after:

rewrite-python/rewrite/src/rewrite/python/format/normalize_format.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ def __init__(self, stop_after: Optional[Tree] = None):
1515
self._stop_after = stop_after
1616
self._stop = False
1717

18-
def visit_class_declaration(self, cd: ClassDeclaration, p: P) -> J:
19-
cd = cast(ClassDeclaration, super().visit_class_declaration(cd, p))
18+
def visit_class_declaration(self, class_decl: ClassDeclaration, p: P) -> J:
19+
cd = cast(ClassDeclaration, super().visit_class_declaration(class_decl, p))
2020
if cd.leading_annotations:
2121
cd = _concatenate_prefix(cd, Space.first_prefix(cd.leading_annotations))
2222
cd = cd.replace(leading_annotations=Space.format_first_prefix(cd.leading_annotations, Space.EMPTY))
@@ -26,8 +26,8 @@ def visit_class_declaration(self, cd: ClassDeclaration, p: P) -> J:
2626
cd = cd.padding.replace(kind=cd.padding.kind.with_prefix(Space.EMPTY))
2727
return cd
2828

29-
def visit_method_declaration(self, md: MethodDeclaration, p: P) -> J:
30-
md = cast(MethodDeclaration, super().visit_method_declaration(md, p))
29+
def visit_method_declaration(self, method: MethodDeclaration, p: P) -> J:
30+
md = cast(MethodDeclaration, super().visit_method_declaration(method, p))
3131
if md.leading_annotations:
3232
md = _concatenate_prefix(md, Space.first_prefix(md.leading_annotations))
3333
md = md.replace(leading_annotations=Space.format_first_prefix(md.leading_annotations, Space.EMPTY))

rewrite-python/rewrite/src/rewrite/python/format/normalize_line_breaks_visitor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def process_comment(comment: Comment) -> Comment:
3434

3535
return s.replace(comments=list_map(process_comment, s.comments))
3636

37-
def post_visit(self, tree: T, _: object) -> Optional[T]:
37+
def post_visit(self, tree: T, p: P) -> Optional[T]:
3838
if self._stop_after and tree == self._stop_after:
3939
self._stop = True
4040
return tree

rewrite-python/rewrite/src/rewrite/python/format/normalize_tabs_or_spaces.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, style: TabsAndIndentsStyle, stop_after: Optional[Tree] = None
1818
self._style = style
1919
self._stop = False
2020

21-
def visit_space(self, space: Space, p):
21+
def visit_space(self, space: Optional[Space], p):
2222
if not space or space is Space.EMPTY:
2323
return space
2424

rewrite-python/rewrite/src/rewrite/python/format/remove_trailing_whitespace_visitor.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ def __init__(self, stop_after: Optional[Tree] = None):
1212
self._stop_after = stop_after
1313
self._stop = False
1414

15-
def visit_compilation_unit(self, compilation_unit: CompilationUnit, p: P) -> J:
16-
if not compilation_unit.prefix.comments:
17-
compilation_unit = compilation_unit.replace(prefix=Space.EMPTY)
18-
cu: j.CompilationUnit = cast(j.CompilationUnit, super().visit_compilation_unit(compilation_unit, p))
15+
def visit_compilation_unit(self, cu: CompilationUnit, p: P) -> J:
16+
if not cu.prefix.comments:
17+
cu = cu.replace(prefix=Space.EMPTY)
18+
cu: j.CompilationUnit = cast(j.CompilationUnit, super().visit_compilation_unit(cu, p))
1919

2020
if cu.eof.whitespace:
2121
clean = "".join([_ for _ in cu.eof.whitespace if _ in ['\n', '\r']])

0 commit comments

Comments
 (0)