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