Update select to matching bracket direction

This commit is contained in:
Stephen Sigwart 2021-07-17 23:56:38 -04:00
parent 27858a0faf
commit e2dbe9747f
3 changed files with 35 additions and 12 deletions

View file

@ -67,8 +67,17 @@ function getRangeToBalanceOut(document: vscode.TextDocument, rootNode: HtmlFlatN
return offsetRangeToSelection(document, nodeToBalance.start, nodeToBalance.end);
}
const innerSelection = offsetRangeToSelection(document, nodeToBalance.open.end, nodeToBalance.close.start);
const outerSelection = offsetRangeToSelection(document, nodeToBalance.open.start, nodeToBalance.close.end);
// Set reverse direction if we were in the end tag
let innerSelection: vscode.Selection;
let outerSelection: vscode.Selection;
if (nodeToBalance.close.start <= offset && nodeToBalance.close.end > offset) {
innerSelection = offsetRangeToSelection(document, nodeToBalance.close.start, nodeToBalance.open.end);
outerSelection = offsetRangeToSelection(document, nodeToBalance.close.end, nodeToBalance.open.start);
}
else {
innerSelection = offsetRangeToSelection(document, nodeToBalance.open.end, nodeToBalance.close.start);
outerSelection = offsetRangeToSelection(document, nodeToBalance.open.start, nodeToBalance.close.end);
}
if (innerSelection.contains(selection) && !innerSelection.isEqual(selection)) {
return innerSelection;

View file

@ -216,8 +216,10 @@ export class BracketMatchingController extends Disposable implements IEditorCont
this._editor.getSelections().forEach(selection => {
const position = selection.getStartPosition();
let brackets = model.matchBracket(position);
let forceOpenBracketFirst = false;
if (!brackets) {
forceOpenBracketFirst = true;
brackets = model.findEnclosingBrackets(position);
if (!brackets) {
const nextBracket = model.findNextBracket(position);
@ -231,10 +233,22 @@ export class BracketMatchingController extends Disposable implements IEditorCont
let selectTo: Position | null = null;
if (brackets) {
brackets.sort(Range.compareRangesUsingStarts);
const [open, close] = brackets;
selectFrom = selectBrackets ? open.getStartPosition() : open.getEndPosition();
selectTo = selectBrackets ? close.getEndPosition() : close.getStartPosition();
let [firstBracket, secondBracket] = brackets;
let startsFromClosingBracket = Range.compareRangesUsingStarts(firstBracket, secondBracket) > 0;
if (startsFromClosingBracket && forceOpenBracketFirst) {
let tmp = firstBracket;
firstBracket = secondBracket;
secondBracket = tmp;
startsFromClosingBracket = false;
}
if (startsFromClosingBracket) {
selectFrom = selectBrackets ? firstBracket.getEndPosition() : firstBracket.getStartPosition();
selectTo = selectBrackets ? secondBracket.getStartPosition() : secondBracket.getEndPosition();
}
else {
selectFrom = selectBrackets ? firstBracket.getStartPosition() : firstBracket.getEndPosition();
selectTo = selectBrackets ? secondBracket.getEndPosition() : secondBracket.getStartPosition();
}
}
if (selectFrom && selectTo) {

View file

@ -112,11 +112,11 @@ suite('bracket matching', () => {
assert.deepStrictEqual(editor.getPosition(), new Position(1, 20));
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 9, 1, 20));
// start position in close brackets
// start position in close brackets (should select backwards)
editor.setPosition(new Position(1, 20));
bracketMatchingController.selectToBracket(true);
assert.deepStrictEqual(editor.getPosition(), new Position(1, 20));
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 9, 1, 20));
assert.deepStrictEqual(editor.getPosition(), new Position(1, 9));
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 20, 1, 9));
// start position between brackets
editor.setPosition(new Position(1, 16));
@ -234,9 +234,9 @@ suite('bracket matching', () => {
]);
bracketMatchingController.selectToBracket(true);
assert.deepStrictEqual(editor.getSelections(), [
new Selection(1, 1, 1, 5),
new Selection(1, 8, 1, 13),
new Selection(1, 16, 1, 19)
new Selection(1, 5, 1, 1),
new Selection(1, 13, 1, 8),
new Selection(1, 19, 1, 16)
]);
bracketMatchingController.dispose();