Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Lib/lib2to3/fixes/fix_dict.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ def transform(self, node, results):
head = [n.clone() for n in head]
tail = [n.clone() for n in tail]
special = not tail and self.in_special_context(node, isiter)
if special and not (isiter or isview):
return None
args = head + [pytree.Node(syms.trailer,
[Dot(),
Name(method_name,
Expand Down
5 changes: 5 additions & 0 deletions Lib/lib2to3/fixes/fix_except.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,12 @@ def transform(self, node, results):
tail = [n.clone() for n in results["tail"]]

try_cleanup = [ch.clone() for ch in results["cleanup"]]
changed = False
for except_clause, e_suite in find_excepts(try_cleanup):
if len(except_clause.children) == 4:
(E, comma, N) = except_clause.children[1:4]
comma.replace(Name("as", prefix=" "))
changed = True

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

if not changed:
return None

#TODO(cwinter) fix this when children becomes a smart list
children = [c.clone() for c in node.children[:3]] + try_cleanup + tail
return pytree.Node(node.type, children)
10 changes: 7 additions & 3 deletions Lib/lib2to3/fixes/fix_isinstance.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,10 @@ def transform(self, node, results):
args = testlist.children
new_args = []
iterator = enumerate(args)
changed = False
for idx, arg in iterator:
if arg.type == token.NAME and arg.value in names_inserted:
changed = True
if idx < len(args) - 1 and args[idx + 1].type == token.COMMA:
next(iterator)
continue
Expand All @@ -42,11 +44,13 @@ def transform(self, node, results):
if arg.type == token.NAME:
names_inserted.add(arg.value)
if new_args and new_args[-1].type == token.COMMA:
changed = True
del new_args[-1]
if len(new_args) == 1:
atom = testlist.parent
atom = testlist.parent
if len(new_args) == 1 and new_args[0].prefix != atom.prefix:
changed = True
new_args[0].prefix = atom.prefix
atom.replace(new_args[0])
else:
if changed:
args[:] = new_args
node.changed()
23 changes: 16 additions & 7 deletions Lib/lib2to3/fixes/fix_numliterals.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,24 @@ class FixNumliterals(fixer_base.BaseFix):

_accept_type = token.NUMBER

def is_long(self, node):
return node.value[-1] in 'Ll'

def is_octal(self, node):
return (
node.value.startswith("0")
and node.value.isdigit()
and len(set(node.value)) > 1
)

def match(self, node):
# Override
return (node.value.startswith("0") or node.value[-1] in "Ll")
return self.is_long(node) or self.is_octal(node)

def transform(self, node, results):
val = node.value
if val[-1] in 'Ll':
val = val[:-1]
elif val.startswith('0') and val.isdigit() and len(set(val)) > 1:
val = "0o" + val[1:]
if self.is_long(node):
return Number(node.value[:-1], prefix=node.prefix)
elif self.is_octal(node):
return Number("0o" + node.value[1:], prefix=node.prefix)

return Number(val, prefix=node.prefix)
return None
5 changes: 5 additions & 0 deletions Lib/lib2to3/fixes/fix_raise.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class FixRaise(fixer_base.BaseFix):

def transform(self, node, results):
syms = self.syms
changed = False

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

if "val" not in results:
if not changed:
return None

# One-argument raise
new = pytree.Node(syms.raise_stmt, [Name("raise"), exc])
new.prefix = node.prefix
Expand Down
2 changes: 1 addition & 1 deletion Lib/lib2to3/fixes/fix_unicode.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def transform(self, node, results):
if val[0] in 'uU':
val = val[1:]
if val == node.value:
return node
return
new = node.clone()
new.value = val
return new
5 changes: 4 additions & 1 deletion Lib/lib2to3/fixes/fix_ws_comma.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,19 @@ class FixWsComma(fixer_base.BaseFix):
def transform(self, node, results):
new = node.clone()
comma = False
changed = False
for child in new.children:
if child in self.SEPS:
prefix = child.prefix
if prefix.isspace() and "\n" not in prefix:
child.prefix = ""
changed = True
comma = True
else:
if comma:
prefix = child.prefix
if not prefix:
child.prefix = " "
changed = True
comma = False
return new
return new if changed else None
30 changes: 19 additions & 11 deletions Lib/lib2to3/tests/test_fixers.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ def warns_unchanged(self, before, message):
self.warns(before, before, message, unchanged=True)

def unchanged(self, before, ignore_warnings=False):
self._check(before, before)
tree = self._check(before, before)
self.assertFalse(tree.was_changed)
if not ignore_warnings:
self.assertEqual(self.fixer_log, [])

Expand Down Expand Up @@ -955,6 +956,10 @@ def test_tuple_exc_2(self):
a = """raise E1(V)"""
self.check(b, a)

def test_unchanged(self):
a = """raise E1(V)"""
self.unchanged(a)

# These should produce a warning

def test_string_exc(self):
Expand Down Expand Up @@ -2776,6 +2781,10 @@ def test_unchanged_int(self):
def test_unchanged_float(self):
s = """5.0"""
self.unchanged(s)
s = """0.1"""
self.unchanged(s)
s = """000"""
self.unchanged(s)

def test_unchanged_octal(self):
s = """0o755"""
Expand Down Expand Up @@ -2895,18 +2904,15 @@ def test_native_literal_escape_u(self):
a = r"""'\\\\u20ac\\U0001d121\\u20ac'"""
self.check(b, a)

b = r"""r'\\\u20ac\U0001d121\\u20ac'"""
a = r"""r'\\\u20ac\U0001d121\\u20ac'"""
self.check(b, a)
self.unchanged(a)

def test_bytes_literal_escape_u(self):
b = r"""b'\\\u20ac\U0001d121\\u20ac'"""
a = r"""b'\\\u20ac\U0001d121\\u20ac'"""
self.check(b, a)
self.unchanged(a)

b = r"""br'\\\u20ac\U0001d121\\u20ac'"""
a = r"""br'\\\u20ac\U0001d121\\u20ac'"""
self.check(b, a)
self.unchanged(a)

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

def test_native_unicode_literal_escape_u(self):
f = 'from __future__ import unicode_literals\n'
b = f + r"""'\\\u20ac\U0001d121\\u20ac'"""
a = f + r"""'\\\u20ac\U0001d121\\u20ac'"""
self.check(b, a)
self.unchanged(a)

b = f + r"""r'\\\u20ac\U0001d121\\u20ac'"""
a = f + r"""r'\\\u20ac\U0001d121\\u20ac'"""
self.check(b, a)
self.unchanged(a)

def test_unchanged(self):
a = """'h'"""
self.unchanged(a)


class Test_filter(FixerTestCase):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed lib2to3 reporting some unchanged files as needing modification.