Skip to content

Commit 3696128

Browse files
committed
add leading/trailing line part to bracket selection microsoft#64004
1 parent 47661d4 commit 3696128

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

src/vs/editor/contrib/smartSelect/bracketSelections.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,43 @@ export class BracketSelectionRangeProvider implements SelectionRangeProvider {
105105
if (arr.length === 0) {
106106
ranges.delete(key);
107107
}
108-
bucket.push(Range.fromPositions(bracket.range.getEndPosition(), closing!.getStartPosition()));
109-
bucket.push(Range.fromPositions(bracket.range.getStartPosition(), closing!.getEndPosition()));
108+
const innerBracket = Range.fromPositions(bracket.range.getEndPosition(), closing!.getStartPosition());
109+
const outerBracket = Range.fromPositions(bracket.range.getStartPosition(), closing!.getEndPosition());
110+
bucket.push(innerBracket);
111+
bucket.push(outerBracket);
112+
BracketSelectionRangeProvider._addBracketLeading(model, outerBracket, bucket);
110113
}
111114
}
112115
}
113116
pos = bracket.range.getStartPosition();
114117
}
115118
}
119+
120+
private static _addBracketLeading(model: ITextModel, bracket: Range, bucket: Range[]): void {
121+
if (bracket.startLineNumber === bracket.endLineNumber) {
122+
return;
123+
}
124+
// xxxxxxxx {
125+
//
126+
// }
127+
const startLine = bracket.startLineNumber;
128+
const column = model.getLineFirstNonWhitespaceColumn(startLine);
129+
if (column !== 0 && column !== bracket.startColumn) {
130+
bucket.push(Range.fromPositions(new Position(startLine, column), bracket.getEndPosition()));
131+
bucket.push(Range.fromPositions(new Position(startLine, 1), bracket.getEndPosition()));
132+
}
133+
134+
// xxxxxxxx
135+
// {
136+
//
137+
// }
138+
const aboveLine = startLine - 1;
139+
if (aboveLine > 0) {
140+
const column = model.getLineFirstNonWhitespaceColumn(aboveLine);
141+
if (column === bracket.startColumn && column !== model.getLineLastNonWhitespaceColumn(aboveLine)) {
142+
bucket.push(Range.fromPositions(new Position(aboveLine, column), bracket.getEndPosition()));
143+
bucket.push(Range.fromPositions(new Position(aboveLine, 1), bracket.getEndPosition()));
144+
}
145+
}
146+
}
116147
}

src/vs/editor/contrib/smartSelect/test/tokenSelectionSupport.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,18 @@ suite('SmartSelect', () => {
234234
await assertRanges('(aaa(aaa)bbb(bIb)ccc(ccc))', new Range(1, 14, 1, 17), new Range(1, 13, 1, 18), new Range(1, 2, 1, 26), new Range(1, 1, 1, 27));
235235
});
236236

237+
test('bracket with leading/trailing', async () => {
238+
239+
await assertRanges('for(a of b){\n foo(I);\n}',
240+
new Range(2, 7, 2, 8), new Range(2, 6, 2, 9),
241+
new Range(1, 13, 3, 1), new Range(1, 12, 3, 2),
242+
new Range(1, 1, 3, 2), new Range(1, 1, 3, 2),
243+
);
244+
245+
await assertRanges('for(a of b)\n{\n foo(I);\n}',
246+
new Range(3, 7, 3, 8), new Range(3, 6, 3, 9),
247+
new Range(2, 2, 4, 1), new Range(2, 1, 4, 2),
248+
new Range(1, 1, 4, 2), new Range(1, 1, 4, 2),
249+
);
250+
});
237251
});

0 commit comments

Comments
 (0)