Merge from vscode 6268feb42ba4f2e2fa15484e88c9af60d254998c (#6530)

This commit is contained in:
Anthony Dresser
2019-07-29 21:03:02 -07:00
committed by GitHub
parent 2c8a22bb0d
commit 6db84eefa3
104 changed files with 1797 additions and 3740 deletions

View File

@@ -485,7 +485,7 @@ export class FindModelBoundToEditorModel {
let resultText: string;
const preserveCase = this._state.preserveCase;
if (replacePattern.hasReplacementPatterns) {
if (replacePattern.hasReplacementPatterns || preserveCase) {
resultText = modelText.replace(searchRegex, function () {
return replacePattern.buildReplaceString(<string[]><any>arguments, preserveCase);
});
@@ -500,7 +500,7 @@ export class FindModelBoundToEditorModel {
private _regularReplaceAll(findScope: Range | null): void {
const replacePattern = this._getReplacePattern();
// Get all the ranges (even more than the highlighted ones)
let matches = this._findMatches(findScope, replacePattern.hasReplacementPatterns, Constants.MAX_SAFE_SMALL_INTEGER);
let matches = this._findMatches(findScope, replacePattern.hasReplacementPatterns || this._state.preserveCase, Constants.MAX_SAFE_SMALL_INTEGER);
let replaceStrings: string[] = [];
for (let i = 0, len = matches.length; i < len; i++) {

View File

@@ -929,7 +929,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas
}));
this._preserveCase = this._register(new Checkbox({
actionClassName: 'monaco-case-sensitive',
actionClassName: 'monaco-preserve-case',
title: NLS_PRESERVE_CASE_LABEL,
isChecked: false,
}));

View File

@@ -1947,6 +1947,42 @@ suite('FindModel', () => {
findState.dispose();
});
findTest('replaceAll preserving case', (editor, cursor) => {
let findState = new FindReplaceState();
findState.change({ searchString: 'hello', replaceString: 'goodbye', isRegex: false, matchCase: false, preserveCase: true }, false);
let findModel = new FindModelBoundToEditorModel(editor, findState);
assertFindState(
editor,
[1, 1, 1, 1],
null,
[
[6, 14, 6, 19],
[6, 27, 6, 32],
[7, 14, 7, 19],
[8, 14, 8, 19],
[9, 14, 9, 19],
]
);
findModel.replaceAll();
assert.equal(editor.getModel()!.getLineContent(6), ' cout << "goodbye world, Goodbye!" << endl;');
assert.equal(editor.getModel()!.getLineContent(7), ' cout << "goodbye world again" << endl;');
assert.equal(editor.getModel()!.getLineContent(8), ' cout << "Goodbye world again" << endl;');
assert.equal(editor.getModel()!.getLineContent(9), ' cout << "goodbyeworld again" << endl;');
assertFindState(
editor,
[1, 1, 1, 1],
null,
[]
);
findModel.dispose();
findState.dispose();
});
findTest('issue #18711 replaceAll with empty string', (editor, cursor) => {
let findState = new FindReplaceState();
findState.change({ searchString: 'hello', replaceString: '', wholeWord: true }, false);

View File

@@ -27,6 +27,7 @@ import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/c
import { URI } from 'vs/base/common/uri';
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
import { CancellationToken } from 'vs/base/common/cancellation';
import { coalesce, flatten } from 'vs/base/common/arrays';
export const defaultReferenceSearchOptions: RequestOptions = {
getMetaTitle(model) {
@@ -287,15 +288,7 @@ export function provideReferences(model: ITextModel, position: Position, token:
});
});
return Promise.all(promises).then(references => {
let result: Location[] = [];
for (let ref of references) {
if (ref) {
result.push(...ref);
}
}
return result;
});
return Promise.all(promises).then(references => flatten(coalesce(references)));
}
registerDefaultLanguageCommand('_executeReferenceProvider', (model, position) => provideReferences(model, position, CancellationToken.None));

View File

@@ -7,8 +7,6 @@ import * as nls from 'vs/nls';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { EditorAction, ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions';
import { StopWatch } from 'vs/base/common/stopwatch';
import { StandardTokenType } from 'vs/editor/common/modes';
import { ITextModel } from 'vs/editor/common/model';
class ForceRetokenizeAction extends EditorAction {
constructor() {
@@ -31,51 +29,6 @@ class ForceRetokenizeAction extends EditorAction {
sw.stop();
console.log(`tokenization took ${sw.elapsed()}`);
if (!true) {
extractTokenTypes(model);
}
}
}
function extractTokenTypes(model: ITextModel): void {
const eolLength = model.getEOL().length;
let result: number[] = [];
let resultLen: number = 0;
let lastTokenType: StandardTokenType = StandardTokenType.Other;
let lastEndOffset: number = 0;
let offset = 0;
for (let lineNumber = 1, lineCount = model.getLineCount(); lineNumber <= lineCount; lineNumber++) {
const lineTokens = model.getLineTokens(lineNumber);
for (let i = 0, len = lineTokens.getCount(); i < len; i++) {
const tokenType = lineTokens.getStandardTokenType(i);
if (tokenType === StandardTokenType.Other) {
continue;
}
const startOffset = offset + lineTokens.getStartOffset(i);
const endOffset = offset + lineTokens.getEndOffset(i);
const length = endOffset - startOffset;
if (length === 0) {
continue;
}
if (lastTokenType === tokenType && lastEndOffset === startOffset) {
result[resultLen - 2] += length;
lastEndOffset += length;
continue;
}
result[resultLen++] = startOffset; // - lastEndOffset
result[resultLen++] = length;
result[resultLen++] = tokenType;
lastTokenType = tokenType;
lastEndOffset = endOffset;
}
offset += lineTokens.getLineContent().length + eolLength;
}
}