mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-21 20:30:29 -04:00
Merge VS Code 1.31.1 (#4283)
This commit is contained in:
@@ -3,29 +3,81 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { SelectionRangeProvider } from 'vs/editor/common/modes';
|
||||
import { SelectionRangeProvider, SelectionRange } from 'vs/editor/common/modes';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { CharCode } from 'vs/base/common/charCode';
|
||||
import { isUpperAsciiLetter, isLowerAsciiLetter } from 'vs/base/common/strings';
|
||||
|
||||
export class WordSelectionRangeProvider implements SelectionRangeProvider {
|
||||
|
||||
provideSelectionRanges(model: ITextModel, position: Position): Range[] {
|
||||
let result: Range[] = [];
|
||||
provideSelectionRanges(model: ITextModel, position: Position): SelectionRange[] {
|
||||
let result: SelectionRange[] = [];
|
||||
this._addInWordRanges(result, model, position);
|
||||
this._addWordRanges(result, model, position);
|
||||
this._addLineRanges(result, model, position);
|
||||
this._addWhitespaceLine(result, model, position);
|
||||
result.push({ range: model.getFullModelRange(), kind: 'statement.all' });
|
||||
return result;
|
||||
}
|
||||
|
||||
private _addWordRanges(bucket: Range[], model: ITextModel, pos: Position): void {
|
||||
const word = model.getWordAtPosition(pos);
|
||||
if (word) {
|
||||
bucket.push(new Range(pos.lineNumber, word.startColumn, pos.lineNumber, word.endColumn));
|
||||
private _addInWordRanges(bucket: SelectionRange[], model: ITextModel, pos: Position): void {
|
||||
const obj = model.getWordAtPosition(pos);
|
||||
if (!obj) {
|
||||
return;
|
||||
}
|
||||
|
||||
let { word, startColumn } = obj;
|
||||
let offset = pos.column - startColumn;
|
||||
let start = offset;
|
||||
let end = offset;
|
||||
let lastCh: number = 0;
|
||||
|
||||
// LEFT anchor (start)
|
||||
for (; start >= 0; start--) {
|
||||
let ch = word.charCodeAt(start);
|
||||
if (ch === CharCode.Underline || ch === CharCode.Dash) {
|
||||
// foo-bar OR foo_bar
|
||||
break;
|
||||
} else if (isLowerAsciiLetter(ch) && isUpperAsciiLetter(lastCh)) {
|
||||
// fooBar
|
||||
break;
|
||||
}
|
||||
lastCh = ch;
|
||||
}
|
||||
start += 1;
|
||||
|
||||
// RIGHT anchor (end)
|
||||
for (; end < word.length; end++) {
|
||||
let ch = word.charCodeAt(end);
|
||||
if (isUpperAsciiLetter(ch) && isLowerAsciiLetter(lastCh)) {
|
||||
// fooBar
|
||||
break;
|
||||
} else if (ch === CharCode.Underline || ch === CharCode.Dash) {
|
||||
// foo-bar OR foo_bar
|
||||
break;
|
||||
}
|
||||
lastCh = ch;
|
||||
}
|
||||
|
||||
if (start < end) {
|
||||
bucket.push({ range: new Range(pos.lineNumber, startColumn + start, pos.lineNumber, startColumn + end), kind: 'statement.word.part' });
|
||||
}
|
||||
}
|
||||
|
||||
private _addLineRanges(bucket: Range[], model: ITextModel, pos: Position): void {
|
||||
bucket.push(new Range(pos.lineNumber, model.getLineFirstNonWhitespaceColumn(pos.lineNumber), pos.lineNumber, model.getLineLastNonWhitespaceColumn(pos.lineNumber)));
|
||||
bucket.push(new Range(pos.lineNumber, model.getLineMinColumn(pos.lineNumber), pos.lineNumber, model.getLineMaxColumn(pos.lineNumber)));
|
||||
private _addWordRanges(bucket: SelectionRange[], model: ITextModel, pos: Position): void {
|
||||
const word = model.getWordAtPosition(pos);
|
||||
if (word) {
|
||||
bucket.push({ range: new Range(pos.lineNumber, word.startColumn, pos.lineNumber, word.endColumn), kind: 'statement.word' });
|
||||
}
|
||||
}
|
||||
|
||||
private _addWhitespaceLine(bucket: SelectionRange[], model: ITextModel, pos: Position): void {
|
||||
if (model.getLineLength(pos.lineNumber) > 0
|
||||
&& model.getLineFirstNonWhitespaceColumn(pos.lineNumber) === 0
|
||||
&& model.getLineLastNonWhitespaceColumn(pos.lineNumber) === 0
|
||||
) {
|
||||
bucket.push({ range: new Range(pos.lineNumber, 1, pos.lineNumber, model.getLineMaxColumn(pos.lineNumber)), kind: 'statement.line' });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user