Skip to content

Commit 1c1f349

Browse files
Exposes end_col_offset attr from python AST (#12972)
Co-authored-by: Jelle Zijlstra <[email protected]>
1 parent f663828 commit 1c1f349

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

mypy/fastparse.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ def set_line(self, node: N, n: AstNode) -> N:
373373
node.line = n.lineno
374374
node.column = n.col_offset
375375
node.end_line = getattr(n, "end_lineno", None) if isinstance(n, ast3.expr) else None
376+
node.end_column = getattr(n, "end_col_offset", None) if isinstance(n, ast3.expr) else None
377+
376378
return node
377379

378380
def translate_opt_expr_list(self, l: Sequence[Optional[AST]]) -> List[Optional[Expression]]:

mypy/fastparse2.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@ def visit_ClassDef(self, n: ast27.ClassDef) -> ClassDef:
599599
cdef.line = n.lineno + len(n.decorator_list)
600600
cdef.column = n.col_offset
601601
cdef.end_line = n.lineno
602+
cdef.end_column = None
602603
self.class_and_function_stack.pop()
603604
return cdef
604605

mypy/nodes.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@
2323

2424
class Context:
2525
"""Base type for objects that are valid as error message locations."""
26-
__slots__ = ('line', 'column', 'end_line')
26+
__slots__ = ('line', 'column', 'end_line', 'end_column')
2727

2828
def __init__(self, line: int = -1, column: int = -1) -> None:
2929
self.line = line
3030
self.column = column
3131
self.end_line: Optional[int] = None
32+
self.end_column: Optional[int] = None
3233

3334
def set_line(self,
3435
target: Union['Context', int],
3536
column: Optional[int] = None,
36-
end_line: Optional[int] = None) -> None:
37+
end_line: Optional[int] = None,
38+
end_column: Optional[int] = None) -> None:
3739
"""If target is a node, pull line (and column) information
3840
into this node. If column is specified, this will override any column
3941
information coming from a node.
@@ -44,13 +46,17 @@ def set_line(self,
4446
self.line = target.line
4547
self.column = target.column
4648
self.end_line = target.end_line
49+
self.end_column = target.end_column
4750

4851
if column is not None:
4952
self.column = column
5053

5154
if end_line is not None:
5255
self.end_line = end_line
5356

57+
if end_column is not None:
58+
self.end_column = end_column
59+
5460
def get_line(self) -> int:
5561
"""Don't use. Use x.line."""
5662
return self.line
@@ -631,13 +637,16 @@ def __init__(self,
631637
def set_line(self,
632638
target: Union[Context, int],
633639
column: Optional[int] = None,
634-
end_line: Optional[int] = None) -> None:
635-
super().set_line(target, column, end_line)
640+
end_line: Optional[int] = None,
641+
end_column: Optional[int] = None) -> None:
642+
super().set_line(target, column, end_line, end_column)
636643

637644
if self.initializer and self.initializer.line < 0:
638-
self.initializer.set_line(self.line, self.column, self.end_line)
645+
self.initializer.set_line(
646+
self.line, self.column, self.end_line, self.end_column)
639647

640-
self.variable.set_line(self.line, self.column, self.end_line)
648+
self.variable.set_line(
649+
self.line, self.column, self.end_line, self.end_column)
641650

642651

643652
FUNCITEM_FLAGS: Final = FUNCBASE_FLAGS + [
@@ -698,10 +707,11 @@ def max_fixed_argc(self) -> int:
698707
def set_line(self,
699708
target: Union[Context, int],
700709
column: Optional[int] = None,
701-
end_line: Optional[int] = None) -> None:
702-
super().set_line(target, column, end_line)
710+
end_line: Optional[int] = None,
711+
end_column: Optional[int] = None) -> None:
712+
super().set_line(target, column, end_line, end_column)
703713
for arg in self.arguments:
704-
arg.set_line(self.line, self.column, self.end_line)
714+
arg.set_line(self.line, self.column, self.end_line, end_column)
705715

706716
def is_dynamic(self) -> bool:
707717
return self.type is None

0 commit comments

Comments
 (0)