Johannes
2022-04-05 14:57:25 +02:00
parent 4cbb57235f
commit c8feffd368
@@ -11,16 +11,16 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { registerEditorContribution } from 'vs/editor/browser/editorExtensions';
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
import { EditorOption, FindComputedEditorOptionValueById } from 'vs/editor/common/config/editorOptions';
import { Position } from 'vs/editor/common/core/position';
import { IPosition, Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';
import { IWordAtPosition } from 'vs/editor/common/core/wordHelper';
import { IEditorContribution } from 'vs/editor/common/editorCommon';
import { InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider } from 'vs/editor/common/languages';
import { CompletionItemProvider, CompletionTriggerKind, InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider } from 'vs/editor/common/languages';
import { ITextModel } from 'vs/editor/common/model';
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
import { CompletionItemInsertTextRule } from 'vs/editor/common/standalone/standaloneEnums';
import { CompletionModel, LineContext } from 'vs/editor/contrib/suggest/browser/completionModel';
import { CompletionItemModel, provideSuggestionItems, QuickSuggestionsOptions } from 'vs/editor/contrib/suggest/browser/suggest';
import { CompletionItemModel, CompletionOptions, provideSuggestionItems, QuickSuggestionsOptions } from 'vs/editor/contrib/suggest/browser/suggest';
import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/browser/suggestMemory';
import { WordDistance } from 'vs/editor/contrib/suggest/browser/wordDistance';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
@@ -114,15 +114,24 @@ class SuggestInlineCompletions implements InlineCompletionsProvider<InlineComple
return undefined;
}
const wordInfo = model.getWordAtPosition(position);
if (!wordInfo || wordInfo.word.length === 0 || wordInfo.endColumn !== position.column) {
// not without true prefix, not inside word
// We consider non-empty leading words and trigger characters. The latter only
// when no word is being typed (word characters superseed trigger characters)
let wordInfo = model.getWordUntilPosition(position);
let triggerCharacterInfo: { ch: string; providers: Set<CompletionItemProvider> } | undefined;
if (!wordInfo.word) {
triggerCharacterInfo = this._getTriggerCharacterInfo(model, position);
}
if (!wordInfo.word && !triggerCharacterInfo) {
// not at word, not a trigger character
return;
}
let result: InlineCompletionResults;
const leadingLineContents = model.getValueInRange(new Range(position.lineNumber, 1, position.lineNumber, position.column));
if (this._lastResult?.canBeReused(model, position.lineNumber, wordInfo)) {
if (!triggerCharacterInfo && this._lastResult?.canBeReused(model, position.lineNumber, wordInfo)) {
// reuse a previous result iff possible, only a refilter is needed
// TODO@jrieken this can be improved further and only incomplete results can be updated
// console.log(`REUSE with ${wordInfo.word}`);
@@ -136,8 +145,8 @@ class SuggestInlineCompletions implements InlineCompletionsProvider<InlineComple
const completions = await provideSuggestionItems(
this._languageFeatureService.completionProvider,
model, position,
undefined,
undefined,
new CompletionOptions(undefined, undefined, triggerCharacterInfo?.providers),
triggerCharacterInfo && { triggerKind: CompletionTriggerKind.TriggerCharacter, triggerCharacter: triggerCharacterInfo.ch },
token
);
@@ -165,6 +174,20 @@ class SuggestInlineCompletions implements InlineCompletionsProvider<InlineComple
freeInlineCompletions(result: InlineCompletionResults): void {
result.release();
}
private _getTriggerCharacterInfo(model: ITextModel, position: IPosition) {
const ch = model.getValueInRange(Range.fromPositions({ lineNumber: position.lineNumber, column: position.column - 1 }, position));
const providers = new Set<CompletionItemProvider>();
for (const provider of this._languageFeatureService.completionProvider.all(model)) {
if (provider.triggerCharacters?.includes(ch)) {
providers.add(provider);
}
}
if (providers.size === 0) {
return undefined;
}
return { providers, ch };
}
}
class EditorContribution implements IEditorContribution {