bpo-41110: Fixed lib2to3 reporting some unchanged files as needing mo… · python/cpython@b87c9a5 · GitHub
Skip to content

Commit b87c9a5

Browse files
committed
bpo-41110: Fixed lib2to3 reporting some unchanged files as needing modification
1 parent c0b214b commit b87c9a5

9 files changed

Lines changed: 60 additions & 23 deletions

File tree

Lib/lib2to3/fixes/fix_dict.py

Lines changed: 2 additions & 0 deletions

Lib/lib2to3/fixes/fix_except.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,12 @@ def transform(self, node, results):
5050
tail = [n.clone() for n in results["tail"]]
5151

5252
try_cleanup = [ch.clone() for ch in results["cleanup"]]
53+
changed = False
5354
for except_clause, e_suite in find_excepts(try_cleanup):
5455
if len(except_clause.children) == 4:
5556
(E, comma, N) = except_clause.children[1:4]
5657
comma.replace(Name("as", prefix=" "))
58+
changed = True
5759

5860
if N.type != token.NAME:
5961
# Generate a new N for the except clause
@@ -88,6 +90,9 @@ def transform(self, node, results):
8890
# not so much.
8991
N.prefix = " "
9092

93+
if not changed:
94+
return None
95+
9196
#TODO(cwinter) fix this when children becomes a smart list
9297
children = [c.clone() for c in node.children[:3]] + try_cleanup + tail
9398
return pytree.Node(node.type, children)

Lib/lib2to3/fixes/fix_isinstance.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ def transform(self, node, results):
3232
args = testlist.children
3333
new_args = []
3434
iterator = enumerate(args)
35+
changed = False
3536
for idx, arg in iterator:
3637
if arg.type == token.NAME and arg.value in names_inserted:
38+
changed = True
3739
if idx < len(args) - 1 and args[idx + 1].type == token.COMMA:
3840
next(iterator)
3941
continue
@@ -42,11 +44,13 @@ def transform(self, node, results):
4244
if arg.type == token.NAME:
4345
names_inserted.add(arg.value)
4446
if new_args and new_args[-1].type == token.COMMA:
47+
changed = True
4548
del new_args[-1]
46-
if len(new_args) == 1:
47-
atom = testlist.parent
49+
atom = testlist.parent
50+
if len(new_args) == 1 and new_args[0].prefix != atom.prefix:
51+
changed = True
4852
new_args[0].prefix = atom.prefix
4953
atom.replace(new_args[0])
50-
else:
54+
if changed:
5155
args[:] = new_args
5256
node.changed()

Lib/lib2to3/fixes/fix_numliterals.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,24 @@ class FixNumliterals(fixer_base.BaseFix):
1414

1515
_accept_type = token.NUMBER
1616

17+
def is_long(self, node):
18+
return node.value[-1] in 'Ll'
19+
20+
def is_octal(self, node):
21+
return (
22+
node.value.startswith("0")
23+
and node.value.isdigit()
24+
and len(set(node.value)) > 1
25+
)
26+
1727
def match(self, node):
1828
# Override
19-
return (node.value.startswith("0") or node.value[-1] in "Ll")
29+
return self.is_long(node) or self.is_octal(node)
2030

2131
def transform(self, node, results):
22-
val = node.value
23-
if val[-1] in 'Ll':
24-
val = val[:-1]
25-
elif val.startswith('0') and val.isdigit() and len(set(val)) > 1:
26-
val = "0o" + val[1:]
32+
if self.is_long(node):
33+
return Number(node.value[:-1], prefix=node.prefix)
34+
elif self.is_octal(node):
35+
return Number("0o" + node.value[1:], prefix=node.prefix)
2736

28-
return Number(val, prefix=node.prefix)
37+
return None

Lib/lib2to3/fixes/fix_raise.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class FixRaise(fixer_base.BaseFix):
3737

3838
def transform(self, node, results):
3939
syms = self.syms
40+
changed = False
4041

4142
exc = results["exc"].clone()
4243
if exc.type == token.STRING:
@@ -56,8 +57,12 @@ def transform(self, node, results):
5657
# exc.children[1].children[0] is the first element of the tuple
5758
exc = exc.children[1].children[0].clone()
5859
exc.prefix = " "
60+
changed = True
5961

6062
if "val" not in results:
63+
if not changed:
64+
return None
65+
6166
# One-argument raise
6267
new = pytree.Node(syms.raise_stmt, [Name("raise"), exc])
6368
new.prefix = node.prefix

Lib/lib2to3/fixes/fix_unicode.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def transform(self, node, results):
3636
if val[0] in 'uU':
3737
val = val[1:]
3838
if val == node.value:
39-
return node
39+
return
4040
new = node.clone()
4141
new.value = val
4242
return new

Lib/lib2to3/fixes/fix_ws_comma.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,19 @@ class FixWsComma(fixer_base.BaseFix):
2424
def transform(self, node, results):
2525
new = node.clone()
2626
comma = False
27+
changed = False
2728
for child in new.children:
2829
if child in self.SEPS:
2930
prefix = child.prefix
3031
if prefix.isspace() and "\n" not in prefix:
3132
child.prefix = ""
33+
changed = True
3234
comma = True
3335
else:
3436
if comma:
3537
prefix = child.prefix
3638
if not prefix:
3739
child.prefix = " "
40+
changed = True
3841
comma = False
39-
return new
42+
return new if changed else None

Lib/lib2to3/tests/test_fixers.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ def warns_unchanged(self, before, message):
4848
self.warns(before, before, message, unchanged=True)
4949

5050
def unchanged(self, before, ignore_warnings=False):
51-
self._check(before, before)
51+
tree = self._check(before, before)
52+
self.assertFalse(tree.was_changed)
5253
if not ignore_warnings:
5354
self.assertEqual(self.fixer_log, [])
5455

@@ -955,6 +956,10 @@ def test_tuple_exc_2(self):
955956
a = """raise E1(V)"""
956957
self.check(b, a)
957958

959+
def test_unchanged(self):
960+
a = """raise E1(V)"""
961+
self.unchanged(a)
962+
958963
# These should produce a warning
959964

960965
def test_string_exc(self):
@@ -2776,6 +2781,10 @@ def test_unchanged_int(self):
27762781
def test_unchanged_float(self):
27772782
s = """5.0"""
27782783
self.unchanged(s)
2784+
s = """0.1"""
2785+
self.unchanged(s)
2786+
s = """000"""
2787+
self.unchanged(s)
27792788

27802789
def test_unchanged_octal(self):
27812790
s = """0o755"""
@@ -2895,18 +2904,15 @@ def test_native_literal_escape_u(self):
28952904
a = r"""'\\\\u20ac\\U0001d121\\u20ac'"""
28962905
self.check(b, a)
28972906

2898-
b = r"""r'\\\u20ac\U0001d121\\u20ac'"""
28992907
a = r"""r'\\\u20ac\U0001d121\\u20ac'"""
2900-
self.check(b, a)
2908+
self.unchanged(a)
29012909

29022910
def test_bytes_literal_escape_u(self):
2903-
b = r"""b'\\\u20ac\U0001d121\\u20ac'"""
29042911
a = r"""b'\\\u20ac\U0001d121\\u20ac'"""
2905-
self.check(b, a)
2912+
self.unchanged(a)
29062913

2907-
b = r"""br'\\\u20ac\U0001d121\\u20ac'"""
29082914
a = r"""br'\\\u20ac\U0001d121\\u20ac'"""
2909-
self.check(b, a)
2915+
self.unchanged(a)
29102916

29112917
def test_unicode_literal_escape_u(self):
29122918
b = r"""u'\\\u20ac\U0001d121\\u20ac'"""
@@ -2919,13 +2925,15 @@ def test_unicode_literal_escape_u(self):
29192925

29202926
def test_native_unicode_literal_escape_u(self):
29212927
f = 'from __future__ import unicode_literals\n'
2922-
b = f + r"""'\\\u20ac\U0001d121\\u20ac'"""
29232928
a = f + r"""'\\\u20ac\U0001d121\\u20ac'"""
2924-
self.check(b, a)
2929+
self.unchanged(a)
29252930

2926-
b = f + r"""r'\\\u20ac\U0001d121\\u20ac'"""
29272931
a = f + r"""r'\\\u20ac\U0001d121\\u20ac'"""
2928-
self.check(b, a)
2932+
self.unchanged(a)
2933+
2934+
def test_unchanged(self):
2935+
a = """'h'"""
2936+
self.unchanged(a)
29292937

29302938

29312939
class Test_filter(FixerTestCase):
Lines changed: 1 addition & 0 deletions

0 commit comments

Comments
 (0)