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

Prefer matching brackets to the right of the position (part 1)

上级 c996984b
......@@ -566,9 +566,23 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
// limit search to not go after `maxBracketLength`
const searchEndOffset = Math.min(currentToken.endOffset, position.column - 1 + currentModeBrackets.maxBracketLength);
// first, check if there is a bracket to the right of `position`
let foundBracket = BracketsUtils.findNextBracketInToken(currentModeBrackets.forwardRegex, lineNumber, lineText, position.column - 1, searchEndOffset);
if (foundBracket && foundBracket.startColumn === position.column) {
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
if (r) {
return r;
}
}
// it might still be the case that [currentTokenStart -> currentTokenEnd] contains multiple brackets
while (true) {
let foundBracket = BracketsUtils.findNextBracketInText(currentModeBrackets.forwardRegex, lineNumber, lineText.substring(searchStartOffset, searchEndOffset), searchStartOffset);
let foundBracket = BracketsUtils.findNextBracketInToken(currentModeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);
if (!foundBracket) {
// there are no brackets in this text
break;
......
......@@ -153,12 +153,9 @@ suite('TextModelWithTokens - bracket matching', () => {
assert.equal(match, null, 'is not matching brackets at ' + lineNumber + ', ' + column);
}
function isBracket(model:Model, lineNumber1:number, column11:number, column12:number, lineNumber2:number, column21:number, column22:number) {
let match = model.matchBracket(new Position(lineNumber1, column11));
assert.deepEqual(match, [
new Range(lineNumber1, column11, lineNumber1, column12),
new Range(lineNumber2, column21, lineNumber2, column22)
], 'is matching brackets at ' + lineNumber1 + ', ' + column11);
function isBracket2(model:Model, testPosition:Position, expected:[Range,Range]): void {
let actual = model.matchBracket(testPosition);
assert.deepEqual(actual, expected, 'matches brackets at ' + testPosition);
}
const LANGUAGE_ID = 'bracketMode1';
......@@ -180,15 +177,15 @@ suite('TextModelWithTokens - bracket matching', () => {
isNotABracket(model, 1, 1);
isNotABracket(model, 1, 2);
isNotABracket(model, 1, 3);
isBracket(model, 1, 4, 5, 2, 3, 4);
isBracket(model, 1, 5, 4, 2, 3, 4);
isBracket(model, 1, 6, 5, 2, 2, 3);
isBracket(model, 1, 7, 6, 2, 1, 2);
isBracket(model, 2, 1, 2, 1, 6, 7);
isBracket(model, 2, 2, 1, 1, 6, 7);
isBracket(model, 2, 3, 2, 1, 5, 6);
isBracket(model, 2, 4, 3, 1, 4, 5);
isBracket2(model, new Position(1,4), [new Range(1,4,1,5), new Range(2,3,2,4)]);
isBracket2(model, new Position(1,5), [new Range(1,5,1,6), new Range(2,2,2,3)]);
isBracket2(model, new Position(1,6), [new Range(1,6,1,7), new Range(2,1,2,2)]);
isBracket2(model, new Position(1,7), [new Range(1,6,1,7), new Range(2,1,2,2)]);
isBracket2(model, new Position(2,1), [new Range(2,1,2,2), new Range(1,6,1,7)]);
isBracket2(model, new Position(2,2), [new Range(2,2,2,3), new Range(1,5,1,6)]);
isBracket2(model, new Position(2,3), [new Range(2,3,2,4), new Range(1,4,1,5)]);
isBracket2(model, new Position(2,4), [new Range(2,3,2,4), new Range(1,4,1,5)]);
isNotABracket(model, 2, 5);
isNotABracket(model, 2, 6);
isNotABracket(model, 2, 7);
......@@ -205,44 +202,43 @@ suite('TextModelWithTokens - bracket matching', () => {
'}]}}';
let model = Model.createFromString(text, undefined, LANGUAGE_ID);
let brackets = [
[1, 11, 12, 5, 4, 5],
[1, 12, 11, 5, 4, 5],
[5, 5, 4, 1, 11, 12],
[2, 6, 7, 3, 1, 2],
[2, 7, 6, 3, 1, 2],
[3, 1, 2, 2, 6, 7],
[3, 2, 1, 2, 6, 7],
[3, 9, 10, 5, 3, 4],
[3, 10, 9, 5, 3, 4],
[5, 4, 3, 3, 9, 10],
[3, 17, 18, 5, 2, 3],
[3, 18, 17, 5, 2, 3],
[5, 3, 2, 3, 17, 18],
[3, 19, 18, 4, 1, 2],
[4, 2, 1, 3, 18, 19],
[4, 1, 2, 3, 18, 19],
[4, 4, 5, 5, 1, 2],
[4, 5, 4, 5, 1, 2],
[5, 2, 1, 4, 4, 5],
[5, 1, 2, 4, 4, 5]
let brackets:[Position,Range,Range][] = [
[new Position(1,11), new Range(1,11,1,12), new Range(5,4,5,5)],
[new Position(1,12), new Range(1,11,1,12), new Range(5,4,5,5)],
[new Position(2,6), new Range(2,6,2,7), new Range(3,1,3,2)],
[new Position(2,7), new Range(2,6,2,7), new Range(3,1,3,2)],
[new Position(3,1), new Range(3,1,3,2), new Range(2,6,2,7)],
[new Position(3,2), new Range(3,1,3,2), new Range(2,6,2,7)],
[new Position(3,9), new Range(3,9,3,10), new Range(5,3,5,4)],
[new Position(3,10), new Range(3,9,3,10), new Range(5,3,5,4)],
[new Position(3,17), new Range(3,17,3,18), new Range(5,2,5,3)],
[new Position(3,18), new Range(3,18,3,19), new Range(4,1,4,2)],
[new Position(3,19), new Range(3,18,3,19), new Range(4,1,4,2)],
[new Position(4,1), new Range(4,1,4,2), new Range(3,18,3,19)],
[new Position(4,2), new Range(4,1,4,2), new Range(3,18,3,19)],
[new Position(4,4), new Range(4,4,4,5), new Range(5,1,5,2)],
[new Position(4,5), new Range(4,4,4,5), new Range(5,1,5,2)],
[new Position(5,1), new Range(5,1,5,2), new Range(4,4,4,5)],
[new Position(5,2), new Range(5,2,5,3), new Range(3,17,3,18)],
[new Position(5,3), new Range(5,3,5,4), new Range(3,9,3,10)],
[new Position(5,4), new Range(5,4,5,5), new Range(1,11,1,12)],
[new Position(5,5), new Range(5,4,5,5), new Range(1,11,1,12)],
];
let i, len, b, isABracket = {1:{}, 2:{}, 3:{}, 4:{}, 5:{}};
for (i = 0, len = brackets.length; i < len; i++) {
b = brackets[i];
isBracket(model, b[0], b[1], b[2], b[3], b[4], b[5]);
isABracket[b[0]][b[1]] = true;
let isABracket = {1:{}, 2:{}, 3:{}, 4:{}, 5:{}};
for (let i = 0, len = brackets.length; i < len; i++) {
let [testPos, b1, b2] = brackets[i];
isBracket2(model, testPos, [b1,b2]);
isABracket[testPos.lineNumber][testPos.column] = true;
}
for (i = 1, len = model.getLineCount(); i <= len; i++) {
let line = model.getLineContent(i), j, lenJ;
for (j = 1, lenJ = line.length + 1; j <= lenJ; j++) {
for (let i = 1, len = model.getLineCount(); i <= len; i++) {
let line = model.getLineContent(i);
for (let j = 1, lenJ = line.length + 1; j <= lenJ; j++) {
if (!isABracket[i].hasOwnProperty(j)) {
isNotABracket(model, i, j);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册