mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-20 12:00:24 -04:00
Merge from vscode 9bc92b48d945144abb405b9e8df05e18accb9148
This commit is contained in:
@@ -419,8 +419,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas
|
||||
}
|
||||
if (currentMatch) {
|
||||
const ariaLabel = nls.localize('ariaSearchNoResultWithLineNum', "{0} found for '{1}', at {2}", label, searchString, currentMatch.startLineNumber + ':' + currentMatch.startColumn);
|
||||
const lineContent = this._codeEditor.getModel()?.getLineContent(currentMatch.startLineNumber);
|
||||
if (lineContent) {
|
||||
const model = this._codeEditor.getModel();
|
||||
if (model && (currentMatch.startLineNumber <= model.getLineCount()) && (currentMatch.startLineNumber >= 1)) {
|
||||
const lineContent = model.getLineContent(currentMatch.startLineNumber);
|
||||
return `${lineContent}, ${ariaLabel}`;
|
||||
}
|
||||
|
||||
|
||||
@@ -180,9 +180,11 @@ suite('SmartSelect', () => {
|
||||
// -- bracket selections
|
||||
|
||||
async function assertRanges(provider: SelectionRangeProvider, value: string, ...expected: IRange[]): Promise<void> {
|
||||
let index = value.indexOf('|');
|
||||
value = value.replace('|', '');
|
||||
|
||||
let model = modelService.createModel(value, new StaticLanguageSelector(mode.getLanguageIdentifier()), URI.parse('fake:lang'));
|
||||
let pos = model.getPositionAt(value.indexOf('|'));
|
||||
let pos = model.getPositionAt(index);
|
||||
let all = await provider.provideSelectionRanges(model, [pos], CancellationToken.None);
|
||||
let ranges = all![0];
|
||||
|
||||
@@ -197,18 +199,18 @@ suite('SmartSelect', () => {
|
||||
|
||||
test('bracket selection', async () => {
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '(|)',
|
||||
new Range(1, 2, 1, 3), new Range(1, 1, 1, 4)
|
||||
new Range(1, 2, 1, 2), new Range(1, 1, 1, 3)
|
||||
);
|
||||
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '[[[](|)]]',
|
||||
new Range(1, 6, 1, 7), new Range(1, 5, 1, 8), // ()
|
||||
new Range(1, 3, 1, 8), new Range(1, 2, 1, 9), // [[]()]
|
||||
new Range(1, 2, 1, 9), new Range(1, 1, 1, 10), // [[[]()]]
|
||||
new Range(1, 6, 1, 6), new Range(1, 5, 1, 7), // ()
|
||||
new Range(1, 3, 1, 7), new Range(1, 2, 1, 8), // [[]()]
|
||||
new Range(1, 2, 1, 8), new Range(1, 1, 1, 9), // [[[]()]]
|
||||
);
|
||||
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '[a[](|)a]',
|
||||
new Range(1, 6, 1, 7), new Range(1, 5, 1, 8),
|
||||
new Range(1, 2, 1, 9), new Range(1, 1, 1, 10),
|
||||
new Range(1, 6, 1, 6), new Range(1, 5, 1, 7),
|
||||
new Range(1, 2, 1, 8), new Range(1, 1, 1, 9),
|
||||
);
|
||||
|
||||
// no bracket
|
||||
@@ -219,23 +221,23 @@ suite('SmartSelect', () => {
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '|[[[]()]]');
|
||||
|
||||
// edge
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '[|[[]()]]', new Range(1, 2, 1, 9), new Range(1, 1, 1, 10));
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '[[[]()]|]', new Range(1, 2, 1, 9), new Range(1, 1, 1, 10));
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '[|[[]()]]', new Range(1, 2, 1, 8), new Range(1, 1, 1, 9));
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '[[[]()]|]', new Range(1, 2, 1, 8), new Range(1, 1, 1, 9));
|
||||
|
||||
await assertRanges(new BracketSelectionRangeProvider(), 'aaa(aaa)bbb(b|b)ccc(ccc)', new Range(1, 13, 1, 16), new Range(1, 12, 1, 17));
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '(aaa(aaa)bbb(b|b)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));
|
||||
await assertRanges(new BracketSelectionRangeProvider(), 'aaa(aaa)bbb(b|b)ccc(ccc)', new Range(1, 13, 1, 15), new Range(1, 12, 1, 16));
|
||||
await assertRanges(new BracketSelectionRangeProvider(), '(aaa(aaa)bbb(b|b)ccc(ccc))', new Range(1, 14, 1, 16), new Range(1, 13, 1, 17), new Range(1, 2, 1, 25), new Range(1, 1, 1, 26));
|
||||
});
|
||||
|
||||
test('bracket with leading/trailing', async () => {
|
||||
|
||||
await assertRanges(new BracketSelectionRangeProvider(), 'for(a of b){\n foo(|);\n}',
|
||||
new Range(2, 7, 2, 8), new Range(2, 6, 2, 9),
|
||||
new Range(2, 7, 2, 7), new Range(2, 6, 2, 8),
|
||||
new Range(1, 13, 3, 1), new Range(1, 12, 3, 2),
|
||||
new Range(1, 1, 3, 2), new Range(1, 1, 3, 2),
|
||||
);
|
||||
|
||||
await assertRanges(new BracketSelectionRangeProvider(), 'for(a of b)\n{\n foo(|);\n}',
|
||||
new Range(3, 7, 3, 8), new Range(3, 6, 3, 9),
|
||||
new Range(3, 7, 3, 7), new Range(3, 6, 3, 8),
|
||||
new Range(2, 2, 4, 1), new Range(2, 1, 4, 2),
|
||||
new Range(1, 1, 4, 2), new Range(1, 1, 4, 2),
|
||||
);
|
||||
@@ -244,60 +246,60 @@ suite('SmartSelect', () => {
|
||||
test('in-word ranges', async () => {
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'f|ooBar',
|
||||
new Range(1, 1, 1, 5), // foo
|
||||
new Range(1, 1, 1, 8), // fooBar
|
||||
new Range(1, 1, 1, 8), // doc
|
||||
new Range(1, 1, 1, 4), // foo
|
||||
new Range(1, 1, 1, 7), // fooBar
|
||||
new Range(1, 1, 1, 7), // doc
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'f|oo_Ba',
|
||||
new Range(1, 1, 1, 5),
|
||||
new Range(1, 1, 1, 8),
|
||||
new Range(1, 1, 1, 8),
|
||||
new Range(1, 1, 1, 4),
|
||||
new Range(1, 1, 1, 7),
|
||||
new Range(1, 1, 1, 7),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'f|oo-Ba',
|
||||
new Range(1, 1, 1, 5),
|
||||
new Range(1, 1, 1, 8),
|
||||
new Range(1, 1, 1, 8),
|
||||
new Range(1, 1, 1, 4),
|
||||
new Range(1, 1, 1, 7),
|
||||
new Range(1, 1, 1, 7),
|
||||
);
|
||||
});
|
||||
|
||||
test('Default selection should select current word/hump first in camelCase #67493', async function () {
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Abs|tractSmartSelect',
|
||||
new Range(1, 1, 1, 10),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 1, 1, 9),
|
||||
new Range(1, 1, 1, 20),
|
||||
new Range(1, 1, 1, 20),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'AbstractSma|rtSelect',
|
||||
new Range(1, 9, 1, 15),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 9, 1, 14),
|
||||
new Range(1, 1, 1, 20),
|
||||
new Range(1, 1, 1, 20),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Abstrac-Sma|rt-elect',
|
||||
new Range(1, 9, 1, 15),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 9, 1, 14),
|
||||
new Range(1, 1, 1, 20),
|
||||
new Range(1, 1, 1, 20),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Abstrac_Sma|rt_elect',
|
||||
new Range(1, 9, 1, 15),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 9, 1, 14),
|
||||
new Range(1, 1, 1, 20),
|
||||
new Range(1, 1, 1, 20),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Abstrac_Sma|rt-elect',
|
||||
new Range(1, 9, 1, 15),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 9, 1, 14),
|
||||
new Range(1, 1, 1, 20),
|
||||
new Range(1, 1, 1, 20),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Abstrac_Sma|rtSelect',
|
||||
new Range(1, 9, 1, 15),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 1, 1, 21),
|
||||
new Range(1, 9, 1, 14),
|
||||
new Range(1, 1, 1, 20),
|
||||
new Range(1, 1, 1, 20),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -321,4 +323,49 @@ suite('SmartSelect', () => {
|
||||
|
||||
reg.dispose();
|
||||
});
|
||||
|
||||
test('Expand selection in words with underscores is inconsistent #90589', async function () {
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Hel|lo_World',
|
||||
new Range(1, 1, 1, 6),
|
||||
new Range(1, 1, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Hello_Wo|rld',
|
||||
new Range(1, 7, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Hello|_World',
|
||||
new Range(1, 1, 1, 6),
|
||||
new Range(1, 1, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Hello_|World',
|
||||
new Range(1, 7, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Hello|-World',
|
||||
new Range(1, 1, 1, 6),
|
||||
new Range(1, 1, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Hello-|World',
|
||||
new Range(1, 7, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
new Range(1, 1, 1, 12),
|
||||
);
|
||||
|
||||
await assertRanges(new WordSelectionRangeProvider(), 'Hello|World',
|
||||
new Range(1, 6, 1, 11),
|
||||
new Range(1, 1, 1, 11),
|
||||
new Range(1, 1, 1, 11),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -40,7 +40,7 @@ export class WordSelectionRangeProvider implements SelectionRangeProvider {
|
||||
// LEFT anchor (start)
|
||||
for (; start >= 0; start--) {
|
||||
let ch = word.charCodeAt(start);
|
||||
if (ch === CharCode.Underline || ch === CharCode.Dash) {
|
||||
if ((start !== offset) && (ch === CharCode.Underline || ch === CharCode.Dash)) {
|
||||
// foo-bar OR foo_bar
|
||||
break;
|
||||
} else if (isLowerAsciiLetter(ch) && isUpperAsciiLetter(lastCh)) {
|
||||
|
||||
@@ -11,6 +11,8 @@ import { Selection } from 'vs/editor/common/core/selection';
|
||||
import { deserializePipePositions, serializePipePositions, testRepeatedActionAndExtractPositions } from 'vs/editor/contrib/wordOperations/test/wordTestUtils';
|
||||
import { CursorWordEndLeft, CursorWordEndLeftSelect, CursorWordEndRight, CursorWordEndRightSelect, CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect, CursorWordStartLeft, CursorWordStartLeftSelect, CursorWordStartRight, CursorWordStartRightSelect, DeleteWordEndLeft, DeleteWordEndRight, DeleteWordLeft, DeleteWordRight, DeleteWordStartLeft, DeleteWordStartRight, CursorWordAccessibilityLeft, CursorWordAccessibilityLeftSelect, CursorWordAccessibilityRight, CursorWordAccessibilityRightSelect } from 'vs/editor/contrib/wordOperations/wordOperations';
|
||||
import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor';
|
||||
import { Handler } from 'vs/editor/common/editorCommon';
|
||||
import { Cursor } from 'vs/editor/common/controller/cursor';
|
||||
|
||||
suite('WordOperations', () => {
|
||||
|
||||
@@ -193,6 +195,32 @@ suite('WordOperations', () => {
|
||||
assert.deepEqual(actual, EXPECTED);
|
||||
});
|
||||
|
||||
test('issue #51275 - cursorWordStartLeft does not push undo/redo stack element', () => {
|
||||
function cursorCommand(cursor: Cursor, command: string, extraData?: any, overwriteSource?: string) {
|
||||
cursor.trigger(overwriteSource || 'tests', command, extraData);
|
||||
}
|
||||
|
||||
function type(cursor: Cursor, text: string) {
|
||||
for (let i = 0; i < text.length; i++) {
|
||||
cursorCommand(cursor, Handler.Type, { text: text.charAt(i) }, 'keyboard');
|
||||
}
|
||||
}
|
||||
|
||||
withTestCodeEditor('', {}, (editor, cursor) => {
|
||||
type(cursor, 'foo bar baz');
|
||||
assert.equal(editor.getValue(), 'foo bar baz');
|
||||
|
||||
cursorWordStartLeft(editor);
|
||||
cursorWordStartLeft(editor);
|
||||
type(cursor, 'q');
|
||||
|
||||
assert.equal(editor.getValue(), 'foo qbar baz');
|
||||
|
||||
cursorCommand(cursor, Handler.Undo, {});
|
||||
assert.equal(editor.getValue(), 'foo bar baz');
|
||||
});
|
||||
});
|
||||
|
||||
test('cursorWordEndLeft', () => {
|
||||
const EXPECTED = ['| /*| Just| some| more| text| a|+=| 3| +|5|-|3| +| 7| */| '].join('\n');
|
||||
const [text,] = deserializePipePositions(EXPECTED);
|
||||
|
||||
@@ -52,6 +52,7 @@ export abstract class MoveWordCommand extends EditorCommand {
|
||||
return this._moveTo(sel, outPosition, this._inSelectionMode);
|
||||
});
|
||||
|
||||
model.pushStackElement();
|
||||
editor._getCursors().setStates('moveWordCommand', CursorChangeReason.NotSet, result.map(r => CursorState.fromModelSelection(r)));
|
||||
if (result.length === 1) {
|
||||
const pos = new Position(result[0].positionLineNumber, result[0].positionColumn);
|
||||
|
||||
Reference in New Issue
Block a user