提交 e07e2b01 编写于 作者: A Alex Dima

Fixes Microsoft/monaco-editor#133: Brackets are case-insensitive

上级 daf411d8
...@@ -716,8 +716,10 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke ...@@ -716,8 +716,10 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
return result; 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 position = this.validatePosition(_position);
let modeTransitions = this._lines[position.lineNumber - 1].getModeTransitions(this.getModeId()); let modeTransitions = this._lines[position.lineNumber - 1].getModeTransitions(this.getModeId());
let currentModeIndex = ModeTransition.findIndexInSegmentsArray(modeTransitions, position.column - 1); let currentModeIndex = ModeTransition.findIndexInSegmentsArray(modeTransitions, position.column - 1);
let currentMode = modeTransitions[currentModeIndex]; let currentMode = modeTransitions[currentModeIndex];
...@@ -779,6 +781,8 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke ...@@ -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 // check that we didn't hit a bracket too far away from position
if (foundBracket && foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) { if (foundBracket && foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) {
let foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1); let foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1);
foundBracketText = foundBracketText.toLowerCase();
let r = this._matchFoundBracket(foundBracket, prevModeBrackets.textIsBracket[foundBracketText], prevModeBrackets.textIsOpenBracket[foundBracketText]); let r = this._matchFoundBracket(foundBracket, prevModeBrackets.textIsBracket[foundBracketText], prevModeBrackets.textIsOpenBracket[foundBracketText]);
// check that we can actually match this bracket // check that we can actually match this bracket
...@@ -812,6 +816,8 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke ...@@ -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 // check that we didn't hit a bracket too far away from position
if (foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) { if (foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) {
let foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1); let foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1);
foundBracketText = foundBracketText.toLowerCase();
let r = this._matchFoundBracket(foundBracket, currentModeBrackets.textIsBracket[foundBracketText], currentModeBrackets.textIsOpenBracket[foundBracketText]); let r = this._matchFoundBracket(foundBracket, currentModeBrackets.textIsBracket[foundBracketText], currentModeBrackets.textIsOpenBracket[foundBracketText]);
// check that we can actually match this bracket // check that we can actually match this bracket
...@@ -889,6 +895,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke ...@@ -889,6 +895,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
} }
let hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1); let hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1);
hitText = hitText.toLowerCase();
if (hitText === bracket.open) { if (hitText === bracket.open) {
count++; count++;
...@@ -955,6 +962,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke ...@@ -955,6 +962,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
} }
let hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1); let hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1);
hitText = hitText.toLowerCase();
if (hitText === bracket.open) { if (hitText === bracket.open) {
count++; count++;
......
...@@ -143,6 +143,8 @@ export class Brackets { ...@@ -143,6 +143,8 @@ export class Brackets {
let r = BracketsUtils.findPrevBracketInToken(reversedBracketRegex, 1, lineText, tokenStart, tokenEnd); let r = BracketsUtils.findPrevBracketInToken(reversedBracketRegex, 1, lineText, tokenStart, tokenEnd);
if (r) { if (r) {
let text = lineText.substring(r.startColumn - 1, r.endColumn - 1); let text = lineText.substring(r.startColumn - 1, r.endColumn - 1);
text = text.toLowerCase();
let isOpen = this._richEditBrackets.textIsOpenBracket[text]; let isOpen = this._richEditBrackets.textIsOpenBracket[text];
if (!isOpen) { if (!isOpen) {
return { return {
......
...@@ -40,10 +40,10 @@ export class RichEditBrackets implements IRichEditBrackets { ...@@ -40,10 +40,10 @@ export class RichEditBrackets implements IRichEditBrackets {
this.textIsOpenBracket = {}; this.textIsOpenBracket = {};
this.maxBracketLength = 0; this.maxBracketLength = 0;
this.brackets.forEach((b) => { this.brackets.forEach((b) => {
this.textIsBracket[b.open] = b; this.textIsBracket[b.open.toLowerCase()] = b;
this.textIsBracket[b.close] = b; this.textIsBracket[b.close.toLowerCase()] = b;
this.textIsOpenBracket[b.open] = true; this.textIsOpenBracket[b.open.toLowerCase()] = true;
this.textIsOpenBracket[b.close] = false; this.textIsOpenBracket[b.close.toLowerCase()] = false;
this.maxBracketLength = Math.max(this.maxBracketLength, b.open.length); this.maxBracketLength = Math.max(this.maxBracketLength, b.open.length);
this.maxBracketLength = Math.max(this.maxBracketLength, b.close.length); this.maxBracketLength = Math.max(this.maxBracketLength, b.close.length);
}); });
......
...@@ -187,6 +187,8 @@ class TokenScanner { ...@@ -187,6 +187,8 @@ class TokenScanner {
let bracketIsOpen: boolean = false; let bracketIsOpen: boolean = false;
if (nextBracket) { if (nextBracket) {
let bracketText = this._currentLineText.substring(nextBracket.startColumn - 1, nextBracket.endColumn - 1); let bracketText = this._currentLineText.substring(nextBracket.startColumn - 1, nextBracket.endColumn - 1);
bracketText = bracketText.toLowerCase();
bracketData = this._currentModeBrackets.textIsBracket[bracketText]; bracketData = this._currentModeBrackets.textIsBracket[bracketText];
bracketIsOpen = this._currentModeBrackets.textIsOpenBracket[bracketText]; bracketIsOpen = this._currentModeBrackets.textIsOpenBracket[bracketText];
} }
......
...@@ -297,7 +297,34 @@ suite('TextModelWithTokens regression tests', () => { ...@@ -297,7 +297,34 @@ suite('TextModelWithTokens regression tests', () => {
model.dispose(); 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册