Skip to content

Commit 3230270

Browse files
committed
Fixes microsoft#43371: Add selectBrackets argument to 'Select to Bracket' action
1 parent dc95a4e commit 3230270

2 files changed

Lines changed: 67 additions & 30 deletions

File tree

src/vs/editor/contrib/bracketMatching/bracketMatching.ts

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,36 @@ class SelectToBracketAction extends EditorAction {
5656
id: 'editor.action.selectToBracket',
5757
label: nls.localize('smartSelect.selectToBracket', "Select to Bracket"),
5858
alias: 'Select to Bracket',
59-
precondition: undefined
59+
precondition: undefined,
60+
description: {
61+
description: `Select to Bracket`,
62+
args: [{
63+
name: 'args',
64+
schema: {
65+
type: 'object',
66+
properties: {
67+
'selectBrackets': {
68+
type: 'boolean',
69+
default: true
70+
}
71+
},
72+
}
73+
}]
74+
}
6075
});
6176
}
6277

63-
public run(accessor: ServicesAccessor, editor: ICodeEditor): void {
64-
let controller = BracketMatchingController.get(editor);
78+
public run(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void {
79+
const controller = BracketMatchingController.get(editor);
6580
if (!controller) {
6681
return;
6782
}
68-
controller.selectToBracket();
83+
84+
let selectBrackets = true;
85+
if (args && args.selectBrackets === false) {
86+
selectBrackets = false;
87+
}
88+
controller.selectToBracket(selectBrackets);
6989
}
7090
}
7191

@@ -182,7 +202,7 @@ export class BracketMatchingController extends Disposable implements editorCommo
182202
this._editor.revealRange(newSelections[0]);
183203
}
184204

185-
public selectToBracket(): void {
205+
public selectToBracket(selectBrackets: boolean): void {
186206
if (!this._editor.hasModel()) {
187207
return;
188208
}
@@ -194,9 +214,6 @@ export class BracketMatchingController extends Disposable implements editorCommo
194214
const position = selection.getStartPosition();
195215
let brackets = model.matchBracket(position);
196216

197-
let openBracket: Position | null = null;
198-
let closeBracket: Position | null = null;
199-
200217
if (!brackets) {
201218
brackets = model.findEnclosingBrackets(position);
202219
if (!brackets) {
@@ -207,26 +224,21 @@ export class BracketMatchingController extends Disposable implements editorCommo
207224
}
208225
}
209226

227+
let selectFrom: Position | null = null;
228+
let selectTo: Position | null = null;
229+
210230
if (brackets) {
211-
if (brackets[0].startLineNumber === brackets[1].startLineNumber) {
212-
openBracket = brackets[1].startColumn < brackets[0].startColumn ?
213-
brackets[1].getStartPosition() : brackets[0].getStartPosition();
214-
closeBracket = brackets[1].startColumn < brackets[0].startColumn ?
215-
brackets[0].getEndPosition() : brackets[1].getEndPosition();
216-
} else {
217-
openBracket = brackets[1].startLineNumber < brackets[0].startLineNumber ?
218-
brackets[1].getStartPosition() : brackets[0].getStartPosition();
219-
closeBracket = brackets[1].startLineNumber < brackets[0].startLineNumber ?
220-
brackets[0].getEndPosition() : brackets[1].getEndPosition();
221-
}
231+
brackets.sort(Range.compareRangesUsingStarts);
232+
const [open, close] = brackets;
233+
selectFrom = selectBrackets ? open.getStartPosition() : open.getEndPosition();
234+
selectTo = selectBrackets ? close.getEndPosition() : close.getStartPosition();
222235
}
223236

224-
if (openBracket && closeBracket) {
225-
newSelections.push(new Selection(openBracket.lineNumber, openBracket.column, closeBracket.lineNumber, closeBracket.column));
237+
if (selectFrom && selectTo) {
238+
newSelections.push(new Selection(selectFrom.lineNumber, selectFrom.column, selectTo.lineNumber, selectTo.column));
226239
}
227240
});
228241

229-
230242
if (newSelections.length > 0) {
231243
this._editor.setSelections(newSelections);
232244
this._editor.revealRange(newSelections[0]);

src/vs/editor/contrib/bracketMatching/test/bracketMatching.test.ts

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,31 +108,31 @@ suite('bracket matching', () => {
108108

109109
// start position in open brackets
110110
editor.setPosition(new Position(1, 9));
111-
bracketMatchingController.selectToBracket();
111+
bracketMatchingController.selectToBracket(true);
112112
assert.deepEqual(editor.getPosition(), new Position(1, 20));
113113
assert.deepEqual(editor.getSelection(), new Selection(1, 9, 1, 20));
114114

115115
// start position in close brackets
116116
editor.setPosition(new Position(1, 20));
117-
bracketMatchingController.selectToBracket();
117+
bracketMatchingController.selectToBracket(true);
118118
assert.deepEqual(editor.getPosition(), new Position(1, 20));
119119
assert.deepEqual(editor.getSelection(), new Selection(1, 9, 1, 20));
120120

121121
// start position between brackets
122122
editor.setPosition(new Position(1, 16));
123-
bracketMatchingController.selectToBracket();
123+
bracketMatchingController.selectToBracket(true);
124124
assert.deepEqual(editor.getPosition(), new Position(1, 19));
125125
assert.deepEqual(editor.getSelection(), new Selection(1, 14, 1, 19));
126126

127127
// start position outside brackets
128128
editor.setPosition(new Position(1, 21));
129-
bracketMatchingController.selectToBracket();
129+
bracketMatchingController.selectToBracket(true);
130130
assert.deepEqual(editor.getPosition(), new Position(1, 25));
131131
assert.deepEqual(editor.getSelection(), new Selection(1, 23, 1, 25));
132132

133133
// do not break if no brackets are available
134134
editor.setPosition(new Position(1, 26));
135-
bracketMatchingController.selectToBracket();
135+
bracketMatchingController.selectToBracket(true);
136136
assert.deepEqual(editor.getPosition(), new Position(1, 26));
137137
assert.deepEqual(editor.getSelection(), new Selection(1, 26, 1, 26));
138138

@@ -168,6 +168,31 @@ suite('bracket matching', () => {
168168
mode.dispose();
169169
});
170170

171+
test('issue #43371: argument to not select brackets', () => {
172+
const text = [
173+
'const x = {',
174+
' something: [0, 1, 2],',
175+
' another: true,',
176+
' somethingmore: [0, 2, 4]',
177+
'};',
178+
].join('\n');
179+
const mode = new BracketMode();
180+
const model = TextModel.createFromString(text, undefined, mode.getLanguageIdentifier());
181+
182+
withTestCodeEditor(null, { model: model }, (editor, cursor) => {
183+
const bracketMatchingController = editor.registerAndInstantiateContribution<BracketMatchingController>(BracketMatchingController.ID, BracketMatchingController);
184+
185+
editor.setPosition(new Position(3, 5));
186+
bracketMatchingController.selectToBracket(false);
187+
assert.deepEqual(editor.getSelection(), new Selection(1, 12, 5, 1));
188+
189+
bracketMatchingController.dispose();
190+
});
191+
192+
model.dispose();
193+
mode.dispose();
194+
});
195+
171196
test('issue #45369: Select to Bracket with multicursor', () => {
172197
let mode = new BracketMode();
173198
let model = TextModel.createFromString('{ } { } { }', undefined, mode.getLanguageIdentifier());
@@ -181,7 +206,7 @@ suite('bracket matching', () => {
181206
new Selection(1, 10, 1, 10),
182207
new Selection(1, 17, 1, 17)
183208
]);
184-
bracketMatchingController.selectToBracket();
209+
bracketMatchingController.selectToBracket(true);
185210
assert.deepEqual(editor.getSelections(), [
186211
new Selection(1, 1, 1, 5),
187212
new Selection(1, 8, 1, 13),
@@ -194,7 +219,7 @@ suite('bracket matching', () => {
194219
new Selection(1, 6, 1, 6),
195220
new Selection(1, 14, 1, 14)
196221
]);
197-
bracketMatchingController.selectToBracket();
222+
bracketMatchingController.selectToBracket(true);
198223
assert.deepEqual(editor.getSelections(), [
199224
new Selection(1, 1, 1, 5),
200225
new Selection(1, 8, 1, 13),
@@ -207,7 +232,7 @@ suite('bracket matching', () => {
207232
new Selection(1, 13, 1, 13),
208233
new Selection(1, 19, 1, 19)
209234
]);
210-
bracketMatchingController.selectToBracket();
235+
bracketMatchingController.selectToBracket(true);
211236
assert.deepEqual(editor.getSelections(), [
212237
new Selection(1, 1, 1, 5),
213238
new Selection(1, 8, 1, 13),

0 commit comments

Comments
 (0)