Skip to content

Commit a877023

Browse files
committed
word based completions use insert and replace ranges, microsoft#10266
1 parent cab4cb5 commit a877023

3 files changed

Lines changed: 37 additions & 24 deletions

File tree

src/vs/editor/common/services/editorSimpleWorker.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon';
1717
import { EndOfLineSequence, IWordAtPosition } from 'vs/editor/common/model';
1818
import { IModelChangedEvent, MirrorTextModel as BaseMirrorModel } from 'vs/editor/common/model/mirrorTextModel';
1919
import { ensureValidWordDefinition, getWordAtText } from 'vs/editor/common/model/wordHelper';
20-
import { CompletionItem, CompletionItemKind, CompletionList, IInplaceReplaceSupportResult, ILink, TextEdit } from 'vs/editor/common/modes';
20+
import { IInplaceReplaceSupportResult, ILink, TextEdit } from 'vs/editor/common/modes';
2121
import { ILinkComputerTarget, computeLinks } from 'vs/editor/common/modes/linkComputer';
2222
import { BasicInplaceReplace } from 'vs/editor/common/modes/supports/inplaceReplaceSupport';
2323
import { IDiffComputationResult } from 'vs/editor/common/services/editorWorkerService';
@@ -529,44 +529,38 @@ export class EditorSimpleWorker implements IRequestHandler, IDisposable {
529529

530530
private static readonly _suggestionsLimit = 10000;
531531

532-
public async textualSuggest(modelUrl: string, position: IPosition, wordDef: string, wordDefFlags: string): Promise<CompletionList | null> {
532+
public async textualSuggest(modelUrl: string, position: IPosition, wordDef: string, wordDefFlags: string): Promise<string[] | null> {
533533
const model = this._getModel(modelUrl);
534534
if (!model) {
535535
return null;
536536
}
537537

538-
const seen: Record<string, boolean> = Object.create(null);
539-
const suggestions: CompletionItem[] = [];
538+
539+
const words: string[] = [];
540+
const seen = new Set<string>();
540541
const wordDefRegExp = new RegExp(wordDef, wordDefFlags);
541-
const wordUntil = model.getWordUntilPosition(position, wordDefRegExp);
542542

543543
const wordAt = model.getWordAtPosition(position, wordDefRegExp);
544544
if (wordAt) {
545-
seen[model.getValueInRange(wordAt)] = true;
545+
seen.add(model.getValueInRange(wordAt));
546546
}
547547

548548
for (
549549
let iter = model.createWordIterator(wordDefRegExp), e = iter.next();
550-
!e.done && suggestions.length <= EditorSimpleWorker._suggestionsLimit;
550+
!e.done && seen.size <= EditorSimpleWorker._suggestionsLimit;
551551
e = iter.next()
552552
) {
553553
const word = e.value;
554-
if (seen[word]) {
554+
if (seen.has(word)) {
555555
continue;
556556
}
557-
seen[word] = true;
557+
seen.add(word);
558558
if (!isNaN(Number(word))) {
559559
continue;
560560
}
561-
562-
suggestions.push({
563-
kind: CompletionItemKind.Text,
564-
label: word,
565-
insertText: word,
566-
range: { startLineNumber: position.lineNumber, startColumn: wordUntil.startColumn, endLineNumber: position.lineNumber, endColumn: wordUntil.endColumn }
567-
});
561+
words.push(word);
568562
}
569-
return { suggestions };
563+
return words;
570564
}
571565

572566

src/vs/editor/common/services/editorWorkerServiceImpl.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri';
99
import { SimpleWorkerClient, logOnceWebWorkerWarning, IWorkerClient } from 'vs/base/common/worker/simpleWorker';
1010
import { DefaultWorkerFactory } from 'vs/base/worker/defaultWorkerFactory';
1111
import { IPosition, Position } from 'vs/editor/common/core/position';
12-
import { IRange } from 'vs/editor/common/core/range';
12+
import { IRange, Range } from 'vs/editor/common/core/range';
1313
import * as editorCommon from 'vs/editor/common/editorCommon';
1414
import { ITextModel } from 'vs/editor/common/model';
1515
import * as modes from 'vs/editor/common/modes';
@@ -144,15 +144,35 @@ class WordBasedCompletionItemProvider implements modes.CompletionItemProvider {
144144
this._modelService = modelService;
145145
}
146146

147-
provideCompletionItems(model: ITextModel, position: Position): Promise<modes.CompletionList | null> | undefined {
147+
async provideCompletionItems(model: ITextModel, position: Position): Promise<modes.CompletionList | undefined> {
148148
const { wordBasedSuggestions } = this._configurationService.getValue<{ wordBasedSuggestions?: boolean }>(model.uri, position, 'editor');
149149
if (!wordBasedSuggestions) {
150150
return undefined;
151151
}
152152
if (!canSyncModel(this._modelService, model.uri)) {
153153
return undefined; // File too large
154154
}
155-
return this._workerManager.withWorker().then(client => client.textualSuggest(model.uri, position));
155+
156+
const client = await this._workerManager.withWorker();
157+
const words = await client.textualSuggest(model.uri, position);
158+
if (!words) {
159+
return undefined;
160+
}
161+
162+
const word = model.getWordAtPosition(position);
163+
const replace = !word ? Range.fromPositions(position) : new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);
164+
const insert = replace.setEndPosition(position.lineNumber, position.column);
165+
166+
return {
167+
suggestions: words.map((word): modes.CompletionItem => {
168+
return {
169+
kind: modes.CompletionItemKind.Text,
170+
label: word,
171+
insertText: word,
172+
range: { insert, replace }
173+
};
174+
})
175+
};
156176
}
157177
}
158178

@@ -433,7 +453,7 @@ export class EditorWorkerClient extends Disposable {
433453
});
434454
}
435455

436-
public textualSuggest(resource: URI, position: IPosition): Promise<modes.CompletionList | null> {
456+
public textualSuggest(resource: URI, position: IPosition): Promise<string[] | null> {
437457
return this._withSyncedResources([resource]).then(proxy => {
438458
let model = this._modelService.getModel(resource);
439459
if (!model) {

src/vs/editor/test/common/services/editorSimpleWorker.test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,8 @@ suite('EditorSimpleWorker', () => {
167167
assert.ok(false);
168168
return;
169169
}
170-
const { suggestions } = result;
171-
assert.equal(suggestions.length, 1);
172-
assert.equal(suggestions[0].label, 'foobar');
170+
assert.equal(result.length, 1);
171+
assert.equal(result, 'foobar');
173172
});
174173
});
175174

0 commit comments

Comments
 (0)