Skip to content

Commit 8dee2d2

Browse files
Preserve source offsets for parsed type comments
1 parent 0b97146 commit 8dee2d2

1 file changed

Lines changed: 17 additions & 5 deletions

File tree

mypy/fastparse.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ def parse_type_comment(
323323
ignored = None
324324
assert isinstance(typ, ast3.Expression)
325325
converted = TypeConverter(
326-
errors, line=line, override_column=column, is_evaluated=False
326+
errors, line=line, override_column=column, line_offset=line - 1, is_evaluated=False
327327
).visit(typ.body)
328328
return ignored, converted
329329

@@ -966,11 +966,16 @@ def do_func_def(
966966
blocker=False,
967967
)
968968
translated_args: list[Type] = TypeConverter(
969-
self.errors, line=lineno, override_column=n.col_offset
969+
self.errors,
970+
line=lineno,
971+
override_column=n.col_offset,
972+
line_offset=lineno - 1,
970973
).translate_expr_list(func_type_ast.argtypes)
971974
# Use a cast to work around `list` invariance
972975
arg_types = cast(list[Type | None], translated_args)
973-
return_type = TypeConverter(self.errors, line=lineno).visit(func_type_ast.returns)
976+
return_type = TypeConverter(
977+
self.errors, line=lineno, line_offset=lineno - 1
978+
).visit(func_type_ast.returns)
974979

975980
# add implicit self type
976981
in_method_scope = self.class_and_function_stack[-2:] == ["C", "D"]
@@ -1877,11 +1882,13 @@ def __init__(
18771882
errors: Errors | None,
18781883
line: int = -1,
18791884
override_column: int = -1,
1885+
line_offset: int = 0,
18801886
is_evaluated: bool = True,
18811887
) -> None:
18821888
self.errors = errors
18831889
self.line = line
18841890
self.override_column = override_column
1891+
self.line_offset = line_offset
18851892
self.node_stack: list[AST] = []
18861893
self.is_evaluated = is_evaluated
18871894

@@ -1896,6 +1903,10 @@ def convert_column(self, column: int) -> int:
18961903
else:
18971904
return self.override_column
18981905

1906+
def convert_lineno(self, line: int) -> int:
1907+
"""Map relative line numbers from synthetic parses back to source lines."""
1908+
return line + self.line_offset
1909+
18991910
def invalid_type(self, node: AST, note: str | None = None) -> RawExpressionType:
19001911
"""Constructs a type representing some expression that normally forms an invalid type.
19011912
For example, if we see a type hint that says "3 + 4", we would transform that
@@ -2112,12 +2123,13 @@ def visit_Subscript(self, n: ast3.Subscript) -> Type:
21122123
result = UnboundType(
21132124
value.name,
21142125
params,
2115-
line=n.lineno,
2126+
line=self.convert_lineno(n.lineno),
21162127
column=value.column,
21172128
empty_tuple_index=empty_tuple_index,
21182129
)
21192130
result.end_column = n.end_col_offset
2120-
result.end_line = n.end_lineno
2131+
if n.end_lineno is not None:
2132+
result.end_line = self.convert_lineno(n.end_lineno)
21212133
return result
21222134
else:
21232135
return self.invalid_type(n)

0 commit comments

Comments
 (0)