diff --git a/spyder/widgets/sourcecode/codeeditor.py b/spyder/widgets/sourcecode/codeeditor.py index a2fb9182f9a..266ceadfd9c 100644 --- a/spyder/widgets/sourcecode/codeeditor.py +++ b/spyder/widgets/sourcecode/codeeditor.py @@ -2892,8 +2892,13 @@ def keyPressEvent(self, event): cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor) text = to_text_string(cursor.selectedText()) - if text == {Qt.Key_ParenRight: ')', Qt.Key_BraceRight: '}', - Qt.Key_BracketRight: ']'}[key]: + key_matches_next_char = ( + text == {Qt.Key_ParenRight: ')', Qt.Key_BraceRight: '}', + Qt.Key_BracketRight: ']'}[key] + ) + if (key_matches_next_char + and not self.__unmatched_braces_in_line(cursor.block().text())): + # overwrite an existing brace if all braces in line are matched cursor.clearSelection() self.setTextCursor(cursor) else: diff --git a/spyder/widgets/tests/test_codeeditor.py b/spyder/widgets/tests/test_codeeditor.py index 7a7d0fc15ec..7d37ec79b21 100644 --- a/spyder/widgets/tests/test_codeeditor.py +++ b/spyder/widgets/tests/test_codeeditor.py @@ -54,4 +54,38 @@ def test_editor_lower_to_upper(editorbot): widget.setTextCursor(cursor) widget.transform_to_uppercase() new_text = widget.get_text('sof', 'eof') - assert text != new_text \ No newline at end of file + assert text != new_text + +def test_editor_complete_backet(editorbot): + qtbot, editor = editorbot + editor.textCursor().insertText('foo') + qtbot.keyClicks(editor, '(') + assert editor.toPlainText() == 'foo()' + assert editor.textCursor().columnNumber() == 4 + +def test_editor_complete_bracket_nested(editorbot): + qtbot, editor = editorbot + editor.textCursor().insertText('foo(bar)') + editor.move_cursor(-1) + qtbot.keyClicks(editor, '(') + assert editor.toPlainText() == 'foo(bar())' + assert editor.textCursor().columnNumber() == 8 + +def test_editor_bracket_closing(editorbot): + qtbot, editor = editorbot + editor.textCursor().insertText('foo(bar(x') + qtbot.keyClicks(editor, ')') + assert editor.toPlainText() == 'foo(bar(x)' + assert editor.textCursor().columnNumber() == 10 + qtbot.keyClicks(editor, ')') + assert editor.toPlainText() == 'foo(bar(x))' + assert editor.textCursor().columnNumber() == 11 + # same ')' closing with existing brackets starting at 'foo(bar(x|))' + editor.move_cursor(-2) + qtbot.keyClicks(editor, ')') + assert editor.toPlainText() == 'foo(bar(x))' + assert editor.textCursor().columnNumber() == 10 + qtbot.keyClicks(editor, ')') + assert editor.toPlainText() == 'foo(bar(x))' + assert editor.textCursor().columnNumber() == 11 +