提交 74b25109 编写于 作者: J Johannes Rieken

word based completion includes words from other files of same language

上级 76abce66
...@@ -530,36 +530,30 @@ export class EditorSimpleWorker implements IRequestHandler, IDisposable { ...@@ -530,36 +530,30 @@ export class EditorSimpleWorker implements IRequestHandler, IDisposable {
private static readonly _suggestionsLimit = 10000; private static readonly _suggestionsLimit = 10000;
public async textualSuggest(modelUrl: string, position: IPosition, wordDef: string, wordDefFlags: string): Promise<{ words: string[], duration: number } | null> { public async textualSuggest(modelUrls: string[], leadingWord: string | undefined, wordDef: string, wordDefFlags: string): Promise<{ words: string[], duration: number } | null> {
const model = this._getModel(modelUrl);
if (!model) {
return null;
}
const sw = new StopWatch(true); const sw = new StopWatch(true);
const words: string[] = [];
const seen = new Set<string>();
const wordDefRegExp = new RegExp(wordDef, wordDefFlags); const wordDefRegExp = new RegExp(wordDef, wordDefFlags);
const seen = new Set<string>();
const wordAt = model.getWordAtPosition(position, wordDefRegExp); outer: for (let url of modelUrls) {
if (wordAt) { const model = this._getModel(url);
seen.add(model.getValueInRange(wordAt)); if (!model) {
}
for (let word of model.words(wordDefRegExp)) {
if (seen.has(word)) {
continue; continue;
} }
seen.add(word);
if (!isNaN(Number(word))) { for (let word of model.words(wordDefRegExp)) {
continue; if (word === leadingWord || !isNaN(Number(word))) {
} continue;
words.push(word); }
if (seen.size > EditorSimpleWorker._suggestionsLimit) { seen.add(word);
break; if (seen.size > EditorSimpleWorker._suggestionsLimit) {
break outer;
}
} }
} }
return { words, duration: sw.elapsed() };
return { words: Array.from(seen), duration: sw.elapsed() };
} }
......
...@@ -8,7 +8,7 @@ import { Disposable, IDisposable, dispose, toDisposable, DisposableStore } from ...@@ -8,7 +8,7 @@ import { Disposable, IDisposable, dispose, toDisposable, DisposableStore } from
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { SimpleWorkerClient, logOnceWebWorkerWarning, IWorkerClient } from 'vs/base/common/worker/simpleWorker'; import { SimpleWorkerClient, logOnceWebWorkerWarning, IWorkerClient } from 'vs/base/common/worker/simpleWorker';
import { DefaultWorkerFactory } from 'vs/base/worker/defaultWorkerFactory'; import { DefaultWorkerFactory } from 'vs/base/worker/defaultWorkerFactory';
import { IPosition, Position } from 'vs/editor/common/core/position'; import { Position } from 'vs/editor/common/core/position';
import { IRange, Range } from 'vs/editor/common/core/range'; import { IRange, Range } from 'vs/editor/common/core/range';
import { IChange } from 'vs/editor/common/editorCommon'; import { IChange } from 'vs/editor/common/editorCommon';
import { ITextModel } from 'vs/editor/common/model'; import { ITextModel } from 'vs/editor/common/model';
...@@ -152,16 +152,30 @@ class WordBasedCompletionItemProvider implements modes.CompletionItemProvider { ...@@ -152,16 +152,30 @@ class WordBasedCompletionItemProvider implements modes.CompletionItemProvider {
if (!wordBasedSuggestions) { if (!wordBasedSuggestions) {
return undefined; return undefined;
} }
if (!canSyncModel(this._modelService, model.uri)) {
return undefined; // File too large const models: URI[] = [];
for (let candidate of this._modelService.getModels()) {
if (!canSyncModel(this._modelService, candidate.uri)) {
continue;
}
if (candidate === model) {
models.unshift(candidate.uri);
} else if (candidate.getLanguageIdentifier().id === model.getLanguageIdentifier().id) {
models.push(candidate.uri);
}
}
if (models.length === 0) {
return undefined; // File too large, no other files
} }
const wordDefRegExp = LanguageConfigurationRegistry.getWordDefinition(model.getLanguageIdentifier().id);
const word = model.getWordAtPosition(position); const word = model.getWordAtPosition(position);
const replace = !word ? Range.fromPositions(position) : new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn); const replace = !word ? Range.fromPositions(position) : new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);
const insert = replace.setEndPosition(position.lineNumber, position.column); const insert = replace.setEndPosition(position.lineNumber, position.column);
const client = await this._workerManager.withWorker(); const client = await this._workerManager.withWorker();
const data = await client.textualSuggest(model.uri, position); const data = await client.textualSuggest(models, word?.word, wordDefRegExp);
if (!data) { if (!data) {
return undefined; return undefined;
} }
...@@ -463,17 +477,11 @@ export class EditorWorkerClient extends Disposable { ...@@ -463,17 +477,11 @@ export class EditorWorkerClient extends Disposable {
}); });
} }
public textualSuggest(resource: URI, position: IPosition): Promise<{ words: string[], duration: number } | null> { public async textualSuggest(resources: URI[], leadingWord: string | undefined, wordDefRegExp: RegExp): Promise<{ words: string[], duration: number } | null> {
return this._withSyncedResources([resource]).then(proxy => { const proxy = await this._withSyncedResources(resources);
let model = this._modelService.getModel(resource); const wordDef = wordDefRegExp.source;
if (!model) { const wordDefFlags = regExpFlags(wordDefRegExp);
return null; return proxy.textualSuggest(resources.map(r => r.toString()), leadingWord, wordDef, wordDefFlags);
}
let wordDefRegExp = LanguageConfigurationRegistry.getWordDefinition(model.getLanguageIdentifier().id);
let wordDef = wordDefRegExp.source;
let wordDefFlags = regExpFlags(wordDefRegExp);
return proxy.textualSuggest(resource.toString(), position, wordDef, wordDefFlags);
});
} }
computeWordRanges(resource: URI, range: IRange): Promise<{ [word: string]: IRange[] } | null> { computeWordRanges(resource: URI, range: IRange): Promise<{ [word: string]: IRange[] } | null> {
......
...@@ -162,7 +162,7 @@ suite('EditorSimpleWorker', () => { ...@@ -162,7 +162,7 @@ suite('EditorSimpleWorker', () => {
'f f' // 2 'f f' // 2
]); ]);
return worker.textualSuggest(model.uri.toString(), { lineNumber: 2, column: 2 }, '[a-z]+', 'img').then((result) => { return worker.textualSuggest([model.uri.toString()], 'f', '[a-z]+', 'img').then((result) => {
if (!result) { if (!result) {
assert.ok(false); assert.ok(false);
return; return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册