mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-30 20:25:40 +01:00
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user