From e07e2b015baf5ec927a2e5ffe31a874219b36014 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 31 Aug 2016 15:47:05 +0200 Subject: [PATCH] Fixes Microsoft/monaco-editor#133: Brackets are case-insensitive --- .../common/model/textModelWithTokens.ts | 10 +++++- .../modes/supports/electricCharacter.ts | 2 ++ .../common/modes/supports/richEditBrackets.ts | 8 ++--- .../contrib/smartSelect/common/tokenTree.ts | 2 ++ .../common/model/textModelWithTokens.test.ts | 31 +++++++++++++++++-- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/common/model/textModelWithTokens.ts b/src/vs/editor/common/model/textModelWithTokens.ts index f8ee238e93a..a04689cd9b1 100644 --- a/src/vs/editor/common/model/textModelWithTokens.ts +++ b/src/vs/editor/common/model/textModelWithTokens.ts @@ -716,8 +716,10 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke return result; } - public findMatchingBracketUp(bracket:string, _position:editorCommon.IPosition): Range { + public findMatchingBracketUp(_bracket:string, _position:editorCommon.IPosition): Range { + let bracket = _bracket.toLowerCase(); let position = this.validatePosition(_position); + let modeTransitions = this._lines[position.lineNumber - 1].getModeTransitions(this.getModeId()); let currentModeIndex = ModeTransition.findIndexInSegmentsArray(modeTransitions, position.column - 1); let currentMode = modeTransitions[currentModeIndex]; @@ -779,6 +781,8 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke // check that we didn't hit a bracket too far away from position if (foundBracket && foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) { let foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1); + foundBracketText = foundBracketText.toLowerCase(); + let r = this._matchFoundBracket(foundBracket, prevModeBrackets.textIsBracket[foundBracketText], prevModeBrackets.textIsOpenBracket[foundBracketText]); // check that we can actually match this bracket @@ -812,6 +816,8 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke // check that we didn't hit a bracket too far away from position if (foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) { let foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1); + foundBracketText = foundBracketText.toLowerCase(); + let r = this._matchFoundBracket(foundBracket, currentModeBrackets.textIsBracket[foundBracketText], currentModeBrackets.textIsOpenBracket[foundBracketText]); // check that we can actually match this bracket @@ -889,6 +895,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke } let hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1); + hitText = hitText.toLowerCase(); if (hitText === bracket.open) { count++; @@ -955,6 +962,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke } let hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1); + hitText = hitText.toLowerCase(); if (hitText === bracket.open) { count++; diff --git a/src/vs/editor/common/modes/supports/electricCharacter.ts b/src/vs/editor/common/modes/supports/electricCharacter.ts index 1f9dadfb2cb..fbb9ce8c14b 100644 --- a/src/vs/editor/common/modes/supports/electricCharacter.ts +++ b/src/vs/editor/common/modes/supports/electricCharacter.ts @@ -143,6 +143,8 @@ export class Brackets { let r = BracketsUtils.findPrevBracketInToken(reversedBracketRegex, 1, lineText, tokenStart, tokenEnd); if (r) { let text = lineText.substring(r.startColumn - 1, r.endColumn - 1); + text = text.toLowerCase(); + let isOpen = this._richEditBrackets.textIsOpenBracket[text]; if (!isOpen) { return { diff --git a/src/vs/editor/common/modes/supports/richEditBrackets.ts b/src/vs/editor/common/modes/supports/richEditBrackets.ts index cfe3e9c713a..22210f681a7 100644 --- a/src/vs/editor/common/modes/supports/richEditBrackets.ts +++ b/src/vs/editor/common/modes/supports/richEditBrackets.ts @@ -40,10 +40,10 @@ export class RichEditBrackets implements IRichEditBrackets { this.textIsOpenBracket = {}; this.maxBracketLength = 0; this.brackets.forEach((b) => { - this.textIsBracket[b.open] = b; - this.textIsBracket[b.close] = b; - this.textIsOpenBracket[b.open] = true; - this.textIsOpenBracket[b.close] = false; + this.textIsBracket[b.open.toLowerCase()] = b; + this.textIsBracket[b.close.toLowerCase()] = b; + this.textIsOpenBracket[b.open.toLowerCase()] = true; + this.textIsOpenBracket[b.close.toLowerCase()] = false; this.maxBracketLength = Math.max(this.maxBracketLength, b.open.length); this.maxBracketLength = Math.max(this.maxBracketLength, b.close.length); }); diff --git a/src/vs/editor/contrib/smartSelect/common/tokenTree.ts b/src/vs/editor/contrib/smartSelect/common/tokenTree.ts index ce33648dccf..8bd16bef5df 100644 --- a/src/vs/editor/contrib/smartSelect/common/tokenTree.ts +++ b/src/vs/editor/contrib/smartSelect/common/tokenTree.ts @@ -187,6 +187,8 @@ class TokenScanner { let bracketIsOpen: boolean = false; if (nextBracket) { let bracketText = this._currentLineText.substring(nextBracket.startColumn - 1, nextBracket.endColumn - 1); + bracketText = bracketText.toLowerCase(); + bracketData = this._currentModeBrackets.textIsBracket[bracketText]; bracketIsOpen = this._currentModeBrackets.textIsOpenBracket[bracketText]; } diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index 8d52ded0628..d518e4a1ce5 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -297,7 +297,34 @@ suite('TextModelWithTokens regression tests', () => { model.dispose(); }); - // test('Microsoft/monaco-editor#133: Error: Cannot read property \'modeId\' of undefined', () => { + test('Microsoft/monaco-editor#133: Error: Cannot read property \'modeId\' of undefined', () => { + class BracketMode extends MockMode { + constructor() { + super(); + LanguageConfigurationRegistry.register(this.getId(), { + brackets: [ + ['module','end module'], + ['sub','end sub'] + ] + }); + } + } - // }); + let model = Model.createFromString([ + 'Imports System', + 'Imports System.Collections.Generic', + '', + 'Module m1', + '', + '\tSub Main()', + '\tEnd Sub', + '', + 'End Module', + ].join('\n'), undefined, new BracketMode()); + + let actual = model.matchBracket(new Position(4,1)); + assert.deepEqual(actual, [new Range(4,1,4,7), new Range(9,1,9,11)]); + + model.dispose(); + }); }); \ No newline at end of file -- GitLab