| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import { isLowerAsciiLetter, isUpperAsciiLetter } from '../../../../base/common/strings.js';
- import { Range } from '../../../common/core/range.js';
- export class WordSelectionRangeProvider {
- provideSelectionRanges(model, positions) {
- const result = [];
- for (const position of positions) {
- const bucket = [];
- result.push(bucket);
- this._addInWordRanges(bucket, model, position);
- this._addWordRanges(bucket, model, position);
- this._addWhitespaceLine(bucket, model, position);
- bucket.push({ range: model.getFullModelRange() });
- }
- return result;
- }
- _addInWordRanges(bucket, model, pos) {
- const obj = model.getWordAtPosition(pos);
- if (!obj) {
- return;
- }
- const { word, startColumn } = obj;
- const offset = pos.column - startColumn;
- let start = offset;
- let end = offset;
- let lastCh = 0;
- // LEFT anchor (start)
- for (; start >= 0; start--) {
- const ch = word.charCodeAt(start);
- if ((start !== offset) && (ch === 95 /* CharCode.Underline */ || ch === 45 /* 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++) {
- const ch = word.charCodeAt(end);
- if (isUpperAsciiLetter(ch) && isLowerAsciiLetter(lastCh)) {
- // fooBar
- break;
- }
- else if (ch === 95 /* CharCode.Underline */ || ch === 45 /* 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) });
- }
- }
- _addWordRanges(bucket, model, pos) {
- const word = model.getWordAtPosition(pos);
- if (word) {
- bucket.push({ range: new Range(pos.lineNumber, word.startColumn, pos.lineNumber, word.endColumn) });
- }
- }
- _addWhitespaceLine(bucket, model, pos) {
- 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)) });
- }
- }
- }
|