diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index b2f6f817610..94bd7c5c61b 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -375,6 +375,10 @@ export interface ISuggestSupport { triggerCharacters: string[]; + shouldAutotriggerSuggest: boolean; + + filter?: IFilter; + /** * Compute all completions for the given resource at the given position. */ @@ -384,10 +388,6 @@ export interface ISuggestSupport { * Compute more details for the given suggestion. */ getSuggestionDetails?: (resource: URI, position: editorCommon.IPosition, suggestion: ISuggestion) => TPromise; - - filter?: IFilter; - - shouldAutotriggerSuggest(context: ILineContext, offset: number, triggeredByCharacter: string): boolean; } /** diff --git a/src/vs/editor/common/modes/supports/suggestSupport.ts b/src/vs/editor/common/modes/supports/suggestSupport.ts index f2d28e780fa..70d1fd9cffa 100644 --- a/src/vs/editor/common/modes/supports/suggestSupport.ts +++ b/src/vs/editor/common/modes/supports/suggestSupport.ts @@ -7,7 +7,7 @@ import URI from 'vs/base/common/uri'; import {TPromise} from 'vs/base/common/winjs.base'; import {IPosition} from 'vs/editor/common/editorCommon'; -import {ILineContext, ISuggestResult, ISuggestSupport, ISuggestion} from 'vs/editor/common/modes'; +import {ISuggestResult, ISuggestSupport} from 'vs/editor/common/modes'; import {IFilter, matchesStrictPrefix, fuzzyContiguousFilter} from 'vs/base/common/filters'; import {IEditorWorkerService} from 'vs/editor/common/services/editorWorkerService'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; @@ -15,44 +15,6 @@ import {IConfigurationRegistry, Extensions} from 'vs/platform/configuration/comm import {Registry} from 'vs/platform/platform'; import {localize} from 'vs/nls'; -export interface ISuggestContribution { - triggerCharacters: string[]; - disableAutoTrigger?: boolean; - suggest: (resource: URI, position: IPosition) => TPromise; - getSuggestionDetails? : (resource:URI, position:IPosition, suggestion:ISuggestion) => TPromise; -} - -export class SuggestSupport implements ISuggestSupport { - - public triggerCharacters: string[]; - public getSuggestionDetails : (resource:URI, position:IPosition, suggestion:ISuggestion) => TPromise; - - private _modeId: string; - private _contribution: ISuggestContribution; - - constructor(modeId: string, contribution : ISuggestContribution){ - this._modeId = modeId; - this._contribution = contribution; - - this.triggerCharacters = this._contribution.triggerCharacters; - - if (typeof contribution.getSuggestionDetails === 'function') { - this.getSuggestionDetails = (resource, position, suggestion) => contribution.getSuggestionDetails(resource, position, suggestion); - } - } - - public suggest(resource:URI, position:IPosition): TPromise { - return this._contribution.suggest(resource, position); - } - - shouldAutotriggerSuggest(context: ILineContext, offset: number, triggeredByCharacter: string): boolean { - if (this._contribution.disableAutoTrigger) { - return false; - } - return true; - } -} - export class TextualSuggestSupport implements ISuggestSupport { /* tslint:disable */ @@ -68,7 +30,17 @@ export class TextualSuggestSupport implements ISuggestSupport { }); /* tslint:enable */ - public triggerCharacters: string[] = []; + public get triggerCharacters(): string[] { + return []; + } + + public get shouldAutotriggerSuggest(): boolean { + return true; + } + + public get filter(): IFilter { + return matchesStrictPrefix; + } private _modeId: string; private _editorWorkerService: IEditorWorkerService; @@ -86,15 +58,6 @@ export class TextualSuggestSupport implements ISuggestSupport { ? this._editorWorkerService.textualSuggest(resource, position) : TPromise.as([]); } - - public get filter(): IFilter { - return matchesStrictPrefix; - } - - public shouldAutotriggerSuggest(context: ILineContext, offset: number, triggeredByCharacter: string): boolean { - return true; - } - } export function filterSuggestions(value: ISuggestResult): ISuggestResult[] { diff --git a/src/vs/editor/contrib/suggest/browser/suggest.ts b/src/vs/editor/contrib/suggest/browser/suggest.ts index e8c62816ebd..23127b8e44a 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.ts +++ b/src/vs/editor/contrib/suggest/browser/suggest.ts @@ -129,11 +129,8 @@ export class SuggestController implements IEditorContribution { } private triggerCharacterHandler(character: string, groups: ISuggestSupport[][]): void { - const position = this.editor.getPosition(); - const lineContext = this.editor.getModel().getLineContext(position.lineNumber); - groups = groups.map(supports => { - return supports.filter(support => support.shouldAutotriggerSuggest(lineContext, position.column - 1, character)); + return supports.filter(support => support.shouldAutotriggerSuggest); }); if (groups.length > 0) { diff --git a/src/vs/editor/contrib/suggest/browser/suggestModel.ts b/src/vs/editor/contrib/suggest/browser/suggestModel.ts index c99c810fa4c..ed2c28a2e20 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestModel.ts @@ -80,10 +80,8 @@ class Context { } } - const lineContext = model.getLineContext(position.lineNumber); - const character = model.getLineContent(position.lineNumber).charAt(position.column - 1); const supports = SuggestRegistry.all(model); - this.isAutoTriggerEnabled = supports.some(s => s.shouldAutotriggerSuggest(lineContext, position.column - 1, character)); + this.isAutoTriggerEnabled = supports.some(s => s.shouldAutotriggerSuggest); } public shouldAutoTrigger(): boolean { diff --git a/src/vs/languages/css/common/css.ts b/src/vs/languages/css/common/css.ts index 39db1240f7e..dc2d5083b93 100644 --- a/src/vs/languages/css/common/css.ts +++ b/src/vs/languages/css/common/css.ts @@ -19,7 +19,6 @@ import {IInstantiationService} from 'vs/platform/instantiation/common/instantiat import {IThreadService, ThreadAffinity} from 'vs/platform/thread/common/thread'; import {RichEditSupport} from 'vs/editor/common/modes/supports/richEditSupport'; import {TokenizationSupport} from 'vs/editor/common/modes/supports/tokenizationSupport'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; import {CancellationToken} from 'vs/base/common/cancellation'; import {wireCancellationToken} from 'vs/base/common/async'; @@ -340,10 +339,11 @@ export class CSSMode extends AbstractMode { // tokens: [cssTokenTypes.TOKEN_VALUE + '.css'], // findDeclaration: (resource, position) => this.findDeclaration(resource, position)}); - Modes.SuggestRegistry.register(this.getId(), new SuggestSupport(this.getId(), { + Modes.SuggestRegistry.register(this.getId(), { triggerCharacters: [' ', ':'], + shouldAutotriggerSuggest: true, suggest: (resource, position) => this.suggest(resource, position) - })); + }); this.quickFixSupport = this; diff --git a/src/vs/languages/handlebars/common/handlebars.ts b/src/vs/languages/handlebars/common/handlebars.ts index f451c7a24e0..2c9a2351fb0 100644 --- a/src/vs/languages/handlebars/common/handlebars.ts +++ b/src/vs/languages/handlebars/common/handlebars.ts @@ -14,7 +14,6 @@ import {RichEditSupport} from 'vs/editor/common/modes/supports/richEditSupport'; import {createWordRegExp} from 'vs/editor/common/modes/abstractMode'; import {ILeavingNestedModeData} from 'vs/editor/common/modes/supports/tokenizationSupport'; import {IThreadService} from 'vs/platform/thread/common/thread'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; export enum States { HTML, @@ -121,10 +120,11 @@ export class HandlebarsMode extends htmlMode.HTMLMode { protected _registerSupports(): void { Modes.HoverProviderRegistry.register(this.getId(), this); Modes.ReferenceSearchRegistry.register(this.getId(), this); - Modes.SuggestRegistry.register(this.getId(), new SuggestSupport(this.getId(), { + Modes.SuggestRegistry.register(this.getId(), { triggerCharacters: ['.', ':', '<', '"', '=', '/'], + shouldAutotriggerSuggest: true, suggest: (resource, position) => this.suggest(resource, position) - })); + }); } protected _createRichEditSupport(): Modes.IRichEditSupport { diff --git a/src/vs/languages/html/common/html.ts b/src/vs/languages/html/common/html.ts index 8aa9f50bd4a..162d38f5c17 100644 --- a/src/vs/languages/html/common/html.ts +++ b/src/vs/languages/html/common/html.ts @@ -18,7 +18,6 @@ import * as htmlTokenTypes from 'vs/languages/html/common/htmlTokenTypes'; import {EMPTY_ELEMENTS} from 'vs/languages/html/common/htmlEmptyTagsShared'; import {RichEditSupport} from 'vs/editor/common/modes/supports/richEditSupport'; import {TokenizationSupport, IEnteringNestedModeData, ILeavingNestedModeData, ITokenizationCustomization} from 'vs/editor/common/modes/supports/tokenizationSupport'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; import {IThreadService} from 'vs/platform/thread/common/thread'; import {CancellationToken} from 'vs/base/common/cancellation'; import {wireCancellationToken} from 'vs/base/common/async'; @@ -335,10 +334,11 @@ export class HTMLMode extends AbstractMode impl Modes.HoverProviderRegistry.register(this.getId(), this); Modes.ReferenceSearchRegistry.register(this.getId(), this); - Modes.SuggestRegistry.register(this.getId(), new SuggestSupport(this.getId(), { + Modes.SuggestRegistry.register(this.getId(), { triggerCharacters: ['.', ':', '<', '"', '=', '/'], + shouldAutotriggerSuggest: true, suggest: (resource, position) => this.suggest(resource, position) - })); + }); } protected _createModeWorkerManager(descriptor:Modes.IModeDescriptor, instantiationService: IInstantiationService): ModeWorkerManager { diff --git a/src/vs/languages/json/common/json.ts b/src/vs/languages/json/common/json.ts index be830b1c156..705f4187c19 100644 --- a/src/vs/languages/json/common/json.ts +++ b/src/vs/languages/json/common/json.ts @@ -18,7 +18,6 @@ import {IThreadService, ThreadAffinity} from 'vs/platform/thread/common/thread'; import {IJSONContributionRegistry, Extensions, ISchemaContributions} from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {RichEditSupport} from 'vs/editor/common/modes/supports/richEditSupport'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; import {CancellationToken} from 'vs/base/common/cancellation'; import {wireCancellationToken} from 'vs/base/common/async'; @@ -86,10 +85,11 @@ export class JSONMode extends AbstractMode implements Modes.HoverProvider, Modes this.formattingSupport = this; - Modes.SuggestRegistry.register(this.getId(), new SuggestSupport(this.getId(), { + Modes.SuggestRegistry.register(this.getId(), { triggerCharacters: [], + shouldAutotriggerSuggest: true, suggest: (resource, position) => this.suggest(resource, position) - })); + }); } public creationDone(): void { diff --git a/src/vs/languages/less/common/less.ts b/src/vs/languages/less/common/less.ts index 526f0ecf85b..9acfa371321 100644 --- a/src/vs/languages/less/common/less.ts +++ b/src/vs/languages/less/common/less.ts @@ -19,7 +19,6 @@ import {IInstantiationService} from 'vs/platform/instantiation/common/instantiat import {IThreadService, ThreadAffinity} from 'vs/platform/thread/common/thread'; import {IModelService} from 'vs/editor/common/services/modelService'; import {DeclarationSupport} from 'vs/editor/common/modes/supports/declarationSupport'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; import {IEditorWorkerService} from 'vs/editor/common/services/editorWorkerService'; import {CancellationToken} from 'vs/base/common/cancellation'; import {wireCancellationToken} from 'vs/base/common/async'; @@ -217,10 +216,11 @@ export class LESSMode extends AbstractMode implements Modes.HoverProvider, Modes findDeclaration: (resource, position) => this.findDeclaration(resource, position)}); this.outlineSupport = this; - Modes.SuggestRegistry.register(this.getId(), new SuggestSupport(this.getId(), { + Modes.SuggestRegistry.register(this.getId(), { triggerCharacters: [], + shouldAutotriggerSuggest: true, suggest: (resource, position) => this.suggest(resource, position) - })); + }); this.tokenizationSupport = createTokenizationSupport(modeService, this, lexer); diff --git a/src/vs/languages/markdown/common/markdown.ts b/src/vs/languages/markdown/common/markdown.ts index 536cc005279..92b3fcdbfb8 100644 --- a/src/vs/languages/markdown/common/markdown.ts +++ b/src/vs/languages/markdown/common/markdown.ts @@ -23,7 +23,6 @@ import {AbstractMode, ModeWorkerManager} from 'vs/editor/common/modes/abstractMo import {createRichEditSupport} from 'vs/editor/common/modes/monarch/monarchDefinition'; import {createTokenizationSupport} from 'vs/editor/common/modes/monarch/monarchLexer'; import {RichEditSupport} from 'vs/editor/common/modes/supports/richEditSupport'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; export const language = { @@ -205,20 +204,6 @@ export const language = } }; -class MarkdownSuggestSupport extends SuggestSupport { - - constructor(modeId:string, modelService: IModelService, editorWorkerService: IEditorWorkerService) { - super(modeId, { - triggerCharacters: [], - disableAutoTrigger: true, - suggest: (resource, position) => { - return editorWorkerService.textualSuggest(resource, position); - } - }); - } - -} - export class MarkdownMode extends AbstractMode implements Modes.IEmitOutputSupport { public emitOutputSupport: Modes.IEmitOutputSupport; @@ -251,11 +236,13 @@ export class MarkdownMode extends AbstractMode implements Modes.IEmitOutputSuppo this.richEditSupport = new RichEditSupport(this.getId(), null, createRichEditSupport(lexer)); - Modes.SuggestRegistry.register(this.getId(), new MarkdownSuggestSupport( - this.getId(), - modelService, - editorWorkerService - )); + Modes.SuggestRegistry.register(this.getId(), { + triggerCharacters: [], + shouldAutotriggerSuggest: false, + suggest: (resource, position) => { + return editorWorkerService.textualSuggest(resource, position); + } + }); } private _worker(runner:(worker:MarkdownWorker.MarkdownWorker)=>WinJS.TPromise): WinJS.TPromise { diff --git a/src/vs/languages/razor/common/razor.ts b/src/vs/languages/razor/common/razor.ts index 595ebc19af8..bc50dc1420c 100644 --- a/src/vs/languages/razor/common/razor.ts +++ b/src/vs/languages/razor/common/razor.ts @@ -15,7 +15,6 @@ import {IModeService} from 'vs/editor/common/services/modeService'; import {RichEditSupport} from 'vs/editor/common/modes/supports/richEditSupport'; import {ILeavingNestedModeData} from 'vs/editor/common/modes/supports/tokenizationSupport'; import {IThreadService} from 'vs/platform/thread/common/thread'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; // for a brief description of the razor syntax see http://www.mikesdotnetting.com/Article/153/Inline-Razor-Syntax-Overview @@ -70,10 +69,11 @@ export class RAZORMode extends htmlMode.HTMLMode { protected _registerSupports(): void { Modes.HoverProviderRegistry.register(this.getId(), this); Modes.ReferenceSearchRegistry.register(this.getId(), this); - Modes.SuggestRegistry.register(this.getId(), new SuggestSupport(this.getId(), { + Modes.SuggestRegistry.register(this.getId(), { triggerCharacters: ['.', ':', '<', '"', '=', '/'], + shouldAutotriggerSuggest: true, suggest: (resource, position) => this.suggest(resource, position) - })); + }); } protected _createModeWorkerManager(descriptor:Modes.IModeDescriptor, instantiationService: IInstantiationService): ModeWorkerManager { diff --git a/src/vs/languages/sass/common/sass.ts b/src/vs/languages/sass/common/sass.ts index ae60202fad8..3f865a914fd 100644 --- a/src/vs/languages/sass/common/sass.ts +++ b/src/vs/languages/sass/common/sass.ts @@ -19,7 +19,6 @@ import {IInstantiationService} from 'vs/platform/instantiation/common/instantiat import {IThreadService, ThreadAffinity} from 'vs/platform/thread/common/thread'; import {IModelService} from 'vs/editor/common/services/modelService'; import {DeclarationSupport} from 'vs/editor/common/modes/supports/declarationSupport'; -import {SuggestSupport} from 'vs/editor/common/modes/supports/suggestSupport'; import {IEditorWorkerService} from 'vs/editor/common/services/editorWorkerService'; import {CancellationToken} from 'vs/base/common/cancellation'; import {wireCancellationToken} from 'vs/base/common/async'; @@ -318,10 +317,11 @@ export class SASSMode extends AbstractMode implements Modes.HoverProvider, Modes findDeclaration: (resource, position) => this.findDeclaration(resource, position)}); this.outlineSupport = this; - Modes.SuggestRegistry.register(this.getId(), new SuggestSupport(this.getId(), { + Modes.SuggestRegistry.register(this.getId(), { triggerCharacters: [], + shouldAutotriggerSuggest: true, suggest: (resource, position) => this.suggest(resource, position) - })); + }); this.tokenizationSupport = createTokenizationSupport(modeService, this, lexer); diff --git a/src/vs/languages/typescript/common/languageFeatures.ts b/src/vs/languages/typescript/common/languageFeatures.ts index 68d40bda4f2..fd69855828a 100644 --- a/src/vs/languages/typescript/common/languageFeatures.ts +++ b/src/vs/languages/typescript/common/languageFeatures.ts @@ -165,7 +165,13 @@ class DiagnostcsAdapter extends Adapter { class SuggestAdapter extends Adapter implements modes.ISuggestSupport { - public triggerCharacters: string[] = ['.']; + public get triggerCharacters(): string[] { + return ['.']; + } + + public get shouldAutotriggerSuggest(): boolean { + return true; + } suggest(resource: URI, position: editor.IPosition, triggerCharacter?: string) { @@ -234,10 +240,6 @@ class SuggestAdapter extends Adapter implements modes.ISuggestSupport { return 'variable'; } - - shouldAutotriggerSuggest(context: modes.ILineContext, offset: number, triggeredByCharacter: string): boolean { - return true; - } } class SignatureHelpAdapter extends Adapter implements modes.SignatureHelpProvider { diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 8630c5fded5..3735a633b34 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -475,7 +475,13 @@ interface ISuggestion2 extends modes.ISuggestion { class SuggestAdapter implements modes.ISuggestSupport { - public triggerCharacters: string[] = []; + public get triggerCharacters(): string[] { + throw new Error('illegal state'); + } + + public get shouldAutotriggerSuggest(): boolean { + throw new Error('illegal state'); + } private _documents: ExtHostModelService; private _provider: vscode.CompletionItemProvider; @@ -575,10 +581,6 @@ class SuggestAdapter implements modes.ISuggestSupport { return TypeConverters.Suggest.from(resolvedItem || item); }); } - - shouldAutotriggerSuggest(context: modes.ILineContext, offset: number, triggeredByCharacter: string): boolean { - throw new Error('illegal state'); - } } class SignatureHelpAdapter { @@ -1001,14 +1003,12 @@ export class MainThreadLanguageFeatures { $registerSuggestSupport(handle: number, selector: vscode.DocumentSelector, triggerCharacters: string[]): TPromise { this._registrations[handle] = modes.SuggestRegistry.register(selector, { triggerCharacters: triggerCharacters, + shouldAutotriggerSuggest: true, suggest: (resource: URI, position: IPosition, triggerCharacter?: string): TPromise => { return this._proxy.$suggest(handle, resource, position); }, getSuggestionDetails: (resource: URI, position: IPosition, suggestion: modes.ISuggestion): TPromise => { return this._proxy.$getSuggestionDetails(handle, resource, position, suggestion); - }, - shouldAutotriggerSuggest(): boolean { - return true; } }); return undefined;