Skip to content

Commit a153aee

Browse files
authored
remove special handling of pypy offsets since modern pypy gets it right (#717)
1 parent d875b02 commit a153aee

File tree

5 files changed

+39
-73
lines changed

5 files changed

+39
-73
lines changed

.github/workflows/test.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@ jobs:
1212
strategy:
1313
fail-fast: false
1414
matrix:
15-
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11.0-beta - 3.11.999", "pypy-3.7"]
15+
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11.0-beta - 3.11.999", "pypy-3.9"]
1616
os: [ubuntu-latest]
1717
# Include minimum py3 + maximum py3 + pypy3 on Windows
1818
include:
1919
- { os: "windows-latest" , python-version: "3.6" }
2020
- { os: "windows-latest" , python-version: "3.10" }
21-
- { os: "windows-latest" , python-version: "pypy-3.7" }
21+
- { os: "windows-latest" , python-version: "pypy-3.9" }
2222

2323
steps:
24-
- uses: actions/checkout@v2
24+
- uses: actions/checkout@v3
2525

2626
- name: Set up Python ${{ matrix.python-version }}
27-
uses: actions/setup-python@v2
27+
uses: actions/setup-python@v4
2828
with:
2929
python-version: ${{ matrix.python-version }}
3030

pyflakes/api.py

+4-22
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,8 @@ def check(codeString, filename, reporter=None):
3737
# First, compile into an AST and handle syntax errors.
3838
try:
3939
tree = ast.parse(codeString, filename=filename)
40-
except SyntaxError:
41-
value = sys.exc_info()[1]
42-
msg = value.args[0]
43-
44-
(lineno, offset, text) = value.lineno, value.offset, value.text
45-
46-
if checker.PYPY:
47-
if text is None:
48-
lines = codeString.splitlines()
49-
if len(lines) >= lineno:
50-
text = lines[lineno - 1]
51-
if isinstance(text, bytes):
52-
try:
53-
text = text.decode('ascii')
54-
except UnicodeDecodeError:
55-
text = None
56-
offset -= 1
57-
58-
reporter.syntaxError(filename, msg, lineno, offset, text)
40+
except SyntaxError as e:
41+
reporter.syntaxError(filename, e.args[0], e.lineno, e.offset, e.text)
5942
return 1
6043
except Exception:
6144
reporter.unexpectedError(filename, 'problem decoding source')
@@ -83,9 +66,8 @@ def checkPath(filename, reporter=None):
8366
try:
8467
with open(filename, 'rb') as f:
8568
codestr = f.read()
86-
except OSError:
87-
msg = sys.exc_info()[1]
88-
reporter.unexpectedError(filename, msg.args[1])
69+
except OSError as e:
70+
reporter.unexpectedError(filename, e.args[1])
8971
return 1
9072
return check(codestr, filename, reporter)
9173

pyflakes/checker.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -1393,10 +1393,7 @@ def handleDoctests(self, node):
13931393
for example in examples:
13941394
try:
13951395
tree = ast.parse(example.source, "<doctest>")
1396-
except SyntaxError:
1397-
e = sys.exc_info()[1]
1398-
if PYPY:
1399-
e.offset += 1
1396+
except SyntaxError as e:
14001397
position = (node_lineno + example.lineno + e.lineno,
14011398
example.indent + 4 + (e.offset or 0))
14021399
self.report(messages.DoctestSyntaxError, node, position)

pyflakes/test/test_api.py

+25-29
Original file line numberDiff line numberDiff line change
@@ -401,8 +401,7 @@ def evaluate(source):
401401
exec(source)
402402
try:
403403
evaluate(source)
404-
except SyntaxError:
405-
e = sys.exc_info()[1]
404+
except SyntaxError as e:
406405
if not PYPY and sys.version_info < (3, 10):
407406
self.assertTrue(e.text.count('\n') > 1)
408407
else:
@@ -416,7 +415,7 @@ def evaluate(source):
416415
else:
417416
message = 'invalid syntax'
418417

419-
if sys.version_info >= (3, 10):
418+
if PYPY or sys.version_info >= (3, 10):
420419
column = 12
421420
elif sys.version_info >= (3, 8):
422421
column = 8
@@ -443,9 +442,7 @@ def test_eofSyntaxError(self):
443442
else:
444443
msg = 'unexpected EOF while parsing'
445444

446-
if PYPY:
447-
column = 7
448-
elif sys.version_info >= (3, 10):
445+
if PYPY or sys.version_info >= (3, 10):
449446
column = 8
450447
else:
451448
column = 9
@@ -463,16 +460,13 @@ def test_eofSyntaxErrorWithTab(self):
463460
syntax error reflects the cause for the syntax error.
464461
"""
465462
with self.makeTempFile("if True:\n\tfoo =") as sourcePath:
466-
column = 6 if PYPY else 7
467-
last_line = '\t ^' if PYPY else '\t ^'
468-
469463
self.assertHasErrors(
470464
sourcePath,
471-
["""\
472-
{}:2:{}: invalid syntax
465+
[f"""\
466+
{sourcePath}:2:7: invalid syntax
473467
\tfoo =
474-
{}
475-
""".format(sourcePath, column, last_line)])
468+
\t ^
469+
"""])
476470

477471
def test_nonDefaultFollowsDefaultSyntaxError(self):
478472
"""
@@ -485,8 +479,10 @@ def foo(bar=baz, bax):
485479
pass
486480
"""
487481
with self.makeTempFile(source) as sourcePath:
488-
if PYPY:
489-
column = 7
482+
if PYPY and sys.version_info >= (3, 9):
483+
column = 18
484+
elif PYPY:
485+
column = 8
490486
elif sys.version_info >= (3, 10):
491487
column = 18
492488
elif sys.version_info >= (3, 9):
@@ -514,11 +510,9 @@ def test_nonKeywordAfterKeywordSyntaxError(self):
514510
foo(bar=baz, bax)
515511
"""
516512
with self.makeTempFile(source) as sourcePath:
517-
if PYPY:
518-
column = 12
519-
elif sys.version_info >= (3, 9):
513+
if sys.version_info >= (3, 9):
520514
column = 17
521-
elif sys.version_info >= (3, 8):
515+
elif not PYPY and sys.version_info >= (3, 8):
522516
column = 14
523517
else:
524518
column = 13
@@ -541,8 +535,10 @@ def test_invalidEscape(self):
541535
# ValueError: invalid \x escape
542536
with self.makeTempFile(r"foo = '\xyz'") as sourcePath:
543537
position_end = 1
544-
if PYPY:
545-
column = 5
538+
if PYPY and sys.version_info >= (3, 9):
539+
column = 7
540+
elif PYPY:
541+
column = 6
546542
elif sys.version_info >= (3, 9):
547543
column = 13
548544
else:
@@ -671,17 +667,17 @@ def test_stdinReportsErrors(self):
671667
self.assertEqual(count, 1)
672668
errlines = err.getvalue().split("\n")[:-1]
673669

674-
if PYPY:
670+
if sys.version_info >= (3, 9):
675671
expected_error = [
676-
"<stdin>:1:3: Generator expression must be parenthesized if not sole argument", # noqa: E501
672+
"<stdin>:1:5: Generator expression must be parenthesized",
677673
"max(1 for i in range(10), key=lambda x: x+1)",
678-
" ^",
674+
" ^",
679675
]
680-
elif sys.version_info >= (3, 9):
676+
elif PYPY:
681677
expected_error = [
682-
"<stdin>:1:5: Generator expression must be parenthesized",
678+
"<stdin>:1:4: Generator expression must be parenthesized if not sole argument", # noqa: E501
683679
"max(1 for i in range(10), key=lambda x: x+1)",
684-
" ^",
680+
" ^",
685681
]
686682
elif sys.version_info >= (3, 8):
687683
expected_error = [
@@ -784,8 +780,8 @@ def test_errors_syntax(self):
784780
with open(self.tempfilepath, 'wb') as fd:
785781
fd.write(b"import")
786782
d = self.runPyflakes([self.tempfilepath])
787-
error_msg = '{0}:1:{2}: invalid syntax{1}import{1} {3}^{1}'.format(
788-
self.tempfilepath, os.linesep, 6 if PYPY else 7, '' if PYPY else ' ')
783+
error_msg = '{0}:1:7: invalid syntax{1}import{1} ^{1}'.format(
784+
self.tempfilepath, os.linesep)
789785
self.assertEqual(d, ('', error_msg, 1))
790786

791787
def test_readFromStdin(self):

pyflakes/test/test_doctests.py

+5-14
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,7 @@ def doctest_stuff():
323323
m.DoctestSyntaxError).messages
324324
exc = exceptions[0]
325325
self.assertEqual(exc.lineno, 4)
326-
if PYPY:
327-
self.assertEqual(exc.col, 27)
328-
elif sys.version_info >= (3, 8):
326+
if not PYPY and sys.version_info >= (3, 8):
329327
self.assertEqual(exc.col, 18)
330328
else:
331329
self.assertEqual(exc.col, 26)
@@ -336,14 +334,12 @@ def doctest_stuff():
336334
exc = exceptions[1]
337335
self.assertEqual(exc.lineno, 5)
338336
if PYPY:
339-
self.assertEqual(exc.col, 14)
337+
self.assertEqual(exc.col, 13)
340338
else:
341339
self.assertEqual(exc.col, 16)
342340
exc = exceptions[2]
343341
self.assertEqual(exc.lineno, 6)
344-
if PYPY:
345-
self.assertEqual(exc.col, 14)
346-
elif sys.version_info >= (3, 8):
342+
if PYPY or sys.version_info >= (3, 8):
347343
self.assertEqual(exc.col, 13)
348344
else:
349345
self.assertEqual(exc.col, 18)
@@ -357,9 +353,7 @@ def doctest_stuff():
357353
"""
358354
''', m.DoctestSyntaxError).messages[0]
359355
self.assertEqual(exc.lineno, 5)
360-
if PYPY:
361-
self.assertEqual(exc.col, 14)
362-
elif sys.version_info >= (3, 8):
356+
if PYPY or sys.version_info >= (3, 8):
363357
self.assertEqual(exc.col, 13)
364358
else:
365359
self.assertEqual(exc.col, 16)
@@ -378,10 +372,7 @@ def doctest_stuff(arg1,
378372
m.DoctestSyntaxError,
379373
m.UndefinedName).messages
380374
self.assertEqual(exc1.lineno, 6)
381-
if PYPY:
382-
self.assertEqual(exc1.col, 20)
383-
else:
384-
self.assertEqual(exc1.col, 19)
375+
self.assertEqual(exc1.col, 19)
385376
self.assertEqual(exc2.lineno, 7)
386377
self.assertEqual(exc2.col, 12)
387378

0 commit comments

Comments
 (0)