Commits

Anonymous committed a6dcf68

base.worder: fixing finding get_primary_at() for expressions like "if (1)." (keywords before parens)

Comments (0)

Files changed (3)

 import bisect
+import keyword
 
 import rope.base.simplify
 
             offset = self._find_last_non_space_char(last_atom - 1)
         if offset >= 0 and (self.code[offset] in '"\'})]' or
                             self._is_id_char(offset)):
-            return self._find_atom_start(offset)
+            atom_start = self._find_atom_start(offset)
+            if not keyword.iskeyword(self.code[atom_start:offset + 1]):
+                return atom_start
         return last_atom
 
     def _find_primary_start(self, offset):

ropetest/codeanalyzetest.py

         result = word_finder.get_primary_at(offset)
         return result
 
+    def test_keyword_before_parens(self):
+        code = 'if (a_var).an_attr:\n    pass\n'
+        self.assertEquals('(a_var).an_attr',
+                          self._find_primary(code, code.index(':')))
+
     def test_inside_parans(self):
         code = 'a_func(a_var)'
         self.assertEquals('a_var', self._find_primary(code, 10))

ropetest/contrib/codeassisttest.py

         doc = get_calltip(self.project, src, src.rindex('f'))
         self.assertEqual(doc, 'lambda(x, y)')
 
+    def test_keyword_before_parens(self):
+        code = 'if (1).:\n pass'
+        result = self._assist(code, offset=len('if (1).'))
+        self.assertTrue(result)
+
     # TESTING PROPOSAL'S KINDS AND TYPES.
     # SEE RELATION MATRIX IN `CompletionProposal`'s DOCSTRING