diff --git a/CHANGELOG.md b/CHANGELOG.md index ba328bd9a..5c06472a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # **Upcoming release** +- #745 Preserve None when inlining a bare return into an expression. (@Narek-Khachikyan) + - #895 patchedast Starred and keyword now consumes their syntactically expected and ** (@lieryan) - #896 patchedast cleanup and refactoring (@lieryan) - #905 Ignore `node_modules` directories by default when scanning project files and source folders. (@marcoeangeli) diff --git a/rope/refactor/inline.py b/rope/refactor/inline.py index 768d30b7d..c8dfef2dc 100644 --- a/rope/refactor/inline.py +++ b/rope/refactor/inline.py @@ -587,7 +587,7 @@ def occurred_outside_skip(self, change_collector, occurrence): ) if returns: name = returned - if name is None: + if not name: name = "None" change_collector.add_change( line_end, diff --git a/ropetest/refactor/inlinetest.py b/ropetest/refactor/inlinetest.py index 585214b41..638171ddb 100644 --- a/ropetest/refactor/inlinetest.py +++ b/ropetest/refactor/inlinetest.py @@ -29,6 +29,30 @@ def _inline2(self, resource, offset, **kwds): self.project.do(changes) return self.mod.read() + def test_inlining_bare_return_in_generator_expression(self): + code = dedent("""\ + class MyTokenizer: + def tokenize(self, text): + return + + def itokenize(self, text): + return (t for t in self.tokenize(text)) + """) + namespace = {} + exec(self._inline(code, code.index("tokenize(")), namespace) + with self.assertRaises(TypeError): + namespace["MyTokenizer"]().itokenize("") + + def test_inlining_bare_return_as_expression(self): + code = dedent("""\ + def f(): + return + result = f() + """) + namespace = {} + exec(self._inline(code, code.index("f(")), namespace) + self.assertIsNone(namespace["result"]) + def test_simple_case(self): code = dedent("""\ a_var = 10