From 5b9d8b2d6cd201ab4267c026531856dc85d75fc4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 10 Aug 2017 09:48:29 +0200 Subject: [PATCH] Fixes #27937: Do not over-type equal auto closing pairs when the character count is even --- .../common/controller/cursorTypeOperations.ts | 19 +++++++++++++++++++ .../test/common/controller/cursor.test.ts | 17 +++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index 4a2393ae607..e8322fd95aa 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -410,6 +410,8 @@ export class TypeOperations { return false; } + const isEqualPair = (ch === config.autoClosingPairsClose[ch]); + for (let i = 0, len = selections.length; i < len; i++) { const selection = selections[i]; @@ -424,11 +426,28 @@ export class TypeOperations { if (afterCharacter !== ch) { return false; } + + if (isEqualPair) { + const lineTextBeforeCursor = lineText.substr(0, position.column - 1); + const chCntBefore = this._countNeedlesInHaystack(lineTextBeforeCursor, ch); + if (chCntBefore % 2 === 0) { + return false; + } + } } return true; } + private static _countNeedlesInHaystack(haystack: string, needle: string): number { + let cnt = 0; + let lastIndex = -1; + while ((lastIndex = haystack.indexOf(needle, lastIndex + 1)) !== -1) { + cnt++; + } + return cnt; + } + private static _runAutoClosingCloseCharType(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): EditOperationResult { let commands: ICommand[] = []; for (let i = 0, len = selections.length; i < len; i++) { diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index b086156e566..72ecc641c29 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -3493,12 +3493,12 @@ suite('autoClosingPairs', () => { let autoClosePositions = [ 'var a =| [|];|', 'var b =| |`asd`;|', - 'var c =| !\'asd!\';|', + 'var c =| |\'asd!\';|', 'var d =| |"asd";|', 'var e =| /*3*/| 3;|', 'var f =| /**| 3 */3;|', 'var g =| (3+5);|', - 'var h =| {| a:| !\'value!\'| |};|', + 'var h =| {| a:| |\'value!\'| |};|', ]; for (let i = 0, len = autoClosePositions.length; i < len; i++) { const lineNumber = i + 1; @@ -3518,6 +3518,19 @@ suite('autoClosingPairs', () => { mode.dispose(); }); + test('issue #27937: Trying to add an item to the front of a list is cumbersome', () => { + let mode = new AutoClosingMode(); + usingCursor({ + text: [ + 'var arr = ["b", "c"];' + ], + languageIdentifier: mode.getLanguageIdentifier() + }, (model, cursor) => { + assertType(model, cursor, 1, 12, '"', '""', `does not over type and will auto close`); + }); + mode.dispose(); + }); + test('issue #25658 - Do not auto-close single/double quotes after word characters', () => { let mode = new AutoClosingMode(); usingCursor({ -- GitLab