Moving features to use registration method

This commit is contained in:
Matt Bierner
2018-06-04 13:37:37 -07:00
parent 15f61c90ac
commit 75a64cf2b3
7 changed files with 110 additions and 60 deletions

View File

@@ -3,12 +3,20 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { DefinitionProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode';
import * as vscode from 'vscode';
import { ITypeScriptServiceClient } from '../typescriptService';
import DefinitionProviderBase from './definitionProviderBase';
export default class TypeScriptDefinitionProvider extends DefinitionProviderBase implements DefinitionProvider {
public provideDefinition(document: TextDocument, position: Position, token: CancellationToken | boolean): Promise<Definition | undefined> {
class TypeScriptDefinitionProvider extends DefinitionProviderBase implements vscode.DefinitionProvider {
public provideDefinition(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken | boolean): Promise<vscode.Definition | undefined> {
return this.getSymbolLocations('definition', document, position, token);
}
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,
) {
return vscode.languages.registerDefinitionProvider(selector,
new TypeScriptDefinitionProvider(client));
}

View File

@@ -3,23 +3,23 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { DocumentHighlightProvider, DocumentHighlight, DocumentHighlightKind, TextDocument, Position, CancellationToken } from 'vscode';
import * as vscode from 'vscode';
import * as Proto from '../protocol';
import { ITypeScriptServiceClient } from '../typescriptService';
import * as typeConverters from '../utils/typeConverters';
export default class TypeScriptDocumentHighlightProvider implements DocumentHighlightProvider {
class TypeScriptDocumentHighlightProvider implements vscode.DocumentHighlightProvider {
public constructor(
private readonly client: ITypeScriptServiceClient
) { }
public async provideDocumentHighlights(
resource: TextDocument,
position: Position,
token: CancellationToken
): Promise<DocumentHighlight[]> {
resource: vscode.TextDocument,
position: vscode.Position,
token: vscode.CancellationToken
): Promise<vscode.DocumentHighlight[]> {
const file = this.client.normalizePath(resource.uri);
if (!file) {
return [];
@@ -41,8 +41,16 @@ export default class TypeScriptDocumentHighlightProvider implements DocumentHigh
}
}
function documentHighlightFromOccurance(occurrence: Proto.OccurrencesResponseItem): DocumentHighlight {
return new DocumentHighlight(
function documentHighlightFromOccurance(occurrence: Proto.OccurrencesResponseItem): vscode.DocumentHighlight {
return new vscode.DocumentHighlight(
typeConverters.Range.fromTextSpan(occurrence),
occurrence.isWriteAccess ? DocumentHighlightKind.Write : DocumentHighlightKind.Read);
occurrence.isWriteAccess ? vscode.DocumentHighlightKind.Write : vscode.DocumentHighlightKind.Read);
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,
) {
return vscode.languages.registerDocumentHighlightProvider(selector,
new TypeScriptDocumentHighlightProvider(client));
}

View File

@@ -3,38 +3,38 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { DocumentSymbolProvider, SymbolInformation, SymbolKind, TextDocument, CancellationToken, Uri, Hierarchy, SymbolInformation2 } from 'vscode';
import * as vscode from 'vscode';
import * as Proto from '../protocol';
import * as PConst from '../protocol.const';
import { ITypeScriptServiceClient } from '../typescriptService';
import * as typeConverters from '../utils/typeConverters';
const getSymbolKind = (kind: string): SymbolKind => {
const getSymbolKind = (kind: string): vscode.SymbolKind => {
switch (kind) {
case PConst.Kind.module: return SymbolKind.Module;
case PConst.Kind.class: return SymbolKind.Class;
case PConst.Kind.enum: return SymbolKind.Enum;
case PConst.Kind.interface: return SymbolKind.Interface;
case PConst.Kind.memberFunction: return SymbolKind.Method;
case PConst.Kind.memberVariable: return SymbolKind.Property;
case PConst.Kind.memberGetAccessor: return SymbolKind.Property;
case PConst.Kind.memberSetAccessor: return SymbolKind.Property;
case PConst.Kind.variable: return SymbolKind.Variable;
case PConst.Kind.const: return SymbolKind.Variable;
case PConst.Kind.localVariable: return SymbolKind.Variable;
case PConst.Kind.variable: return SymbolKind.Variable;
case PConst.Kind.function: return SymbolKind.Function;
case PConst.Kind.localFunction: return SymbolKind.Function;
case PConst.Kind.module: return vscode.SymbolKind.Module;
case PConst.Kind.class: return vscode.SymbolKind.Class;
case PConst.Kind.enum: return vscode.SymbolKind.Enum;
case PConst.Kind.interface: return vscode.SymbolKind.Interface;
case PConst.Kind.memberFunction: return vscode.SymbolKind.Method;
case PConst.Kind.memberVariable: return vscode.SymbolKind.Property;
case PConst.Kind.memberGetAccessor: return vscode.SymbolKind.Property;
case PConst.Kind.memberSetAccessor: return vscode.SymbolKind.Property;
case PConst.Kind.variable: return vscode.SymbolKind.Variable;
case PConst.Kind.const: return vscode.SymbolKind.Variable;
case PConst.Kind.localVariable: return vscode.SymbolKind.Variable;
case PConst.Kind.variable: return vscode.SymbolKind.Variable;
case PConst.Kind.function: return vscode.SymbolKind.Function;
case PConst.Kind.localFunction: return vscode.SymbolKind.Function;
}
return SymbolKind.Variable;
return vscode.SymbolKind.Variable;
};
export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolProvider {
class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
public constructor(
private readonly client: ITypeScriptServiceClient) { }
public async provideDocumentSymbols(resource: TextDocument, token: CancellationToken): Promise<any> { // todo@joh `any[]` temporary hack to make typescript happy...
public async provideDocumentSymbols(resource: vscode.TextDocument, token: vscode.CancellationToken): Promise<any> { // todo@joh `any[]` temporary hack to make typescript happy...
const filepath = this.client.normalizePath(resource.uri);
if (!filepath) {
return [];
@@ -50,7 +50,7 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
// The root represents the file. Ignore this when showing in the UI
const tree = response.body;
if (tree.childItems) {
const result = new Array<Hierarchy<SymbolInformation2>>();
const result = new Array<vscode.Hierarchy<vscode.SymbolInformation2>>();
tree.childItems.forEach(item => TypeScriptDocumentSymbolProvider.convertNavTree(resource.uri, result, item));
return result;
}
@@ -58,9 +58,9 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
} else {
const response = await this.client.execute('navbar', args, token);
if (response.body) {
const result = new Array<SymbolInformation>();
const foldingMap: ObjectMap<SymbolInformation> = Object.create(null);
response.body.forEach(item => TypeScriptDocumentSymbolProvider.convertNavBar(resource.uri, 0, foldingMap, result as SymbolInformation[], item));
const result = new Array<vscode.SymbolInformation>();
const foldingMap: ObjectMap<vscode.SymbolInformation> = Object.create(null);
response.body.forEach(item => TypeScriptDocumentSymbolProvider.convertNavBar(resource.uri, 0, foldingMap, result as vscode.SymbolInformation[], item));
return result;
}
}
@@ -70,11 +70,11 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
}
}
private static convertNavBar(resource: Uri, indent: number, foldingMap: ObjectMap<SymbolInformation>, bucket: SymbolInformation[], item: Proto.NavigationBarItem, containerLabel?: string): void {
private static convertNavBar(resource: vscode.Uri, indent: number, foldingMap: ObjectMap<vscode.SymbolInformation>, bucket: vscode.SymbolInformation[], item: Proto.NavigationBarItem, containerLabel?: string): void {
const realIndent = indent + item.indent;
const key = `${realIndent}|${item.text}`;
if (realIndent !== 0 && !foldingMap[key] && TypeScriptDocumentSymbolProvider.shouldInclueEntry(item)) {
const result = new SymbolInformation(item.text,
const result = new vscode.SymbolInformation(item.text,
getSymbolKind(item.kind),
containerLabel ? containerLabel : '',
typeConverters.Location.fromTextSpan(resource, item.spans[0]));
@@ -88,8 +88,8 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
}
}
private static convertNavTree(resource: Uri, bucket: Hierarchy<SymbolInformation>[], item: Proto.NavigationTree): boolean {
const symbolInfo = new SymbolInformation2(
private static convertNavTree(resource: vscode.Uri, bucket: vscode.Hierarchy<vscode.SymbolInformation>[], item: Proto.NavigationTree): boolean {
const symbolInfo = new vscode.SymbolInformation2(
item.text,
'', // todo@joh detail
getSymbolKind(item.kind),
@@ -97,7 +97,7 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
typeConverters.Location.fromTextSpan(resource, item.spans[0]),
);
const hierarchy = new Hierarchy(symbolInfo);
const hierarchy = new vscode.Hierarchy(symbolInfo);
let shouldInclude = TypeScriptDocumentSymbolProvider.shouldInclueEntry(item);
if (item.childItems) {
@@ -120,3 +120,12 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
return !!(item.text && item.text !== '<function>' && item.text !== '<class>');
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,
) {
return vscode.languages.registerDocumentSymbolProvider(selector,
new TypeScriptDocumentSymbolProvider(client));
}

View File

@@ -3,24 +3,24 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { HoverProvider, Hover, TextDocument, Position, CancellationToken } from 'vscode';
import * as vscode from 'vscode';
import * as Proto from '../protocol';
import { ITypeScriptServiceClient } from '../typescriptService';
import { tagsMarkdownPreview } from '../utils/previewer';
import * as typeConverters from '../utils/typeConverters';
export default class TypeScriptHoverProvider implements HoverProvider {
class TypeScriptHoverProvider implements vscode.HoverProvider {
public constructor(
private readonly client: ITypeScriptServiceClient
) { }
public async provideHover(
document: TextDocument,
position: Position,
token: CancellationToken
): Promise<Hover | undefined> {
document: vscode.TextDocument,
position: vscode.Position,
token: vscode.CancellationToken
): Promise<vscode.Hover | undefined> {
const filepath = this.client.normalizePath(document.uri);
if (!filepath) {
return undefined;
@@ -30,7 +30,7 @@ export default class TypeScriptHoverProvider implements HoverProvider {
const response = await this.client.execute('quickinfo', args, token);
if (response && response.body) {
const data = response.body;
return new Hover(
return new vscode.Hover(
TypeScriptHoverProvider.getContents(data),
typeConverters.Range.fromTextSpan(data));
}
@@ -53,4 +53,12 @@ export default class TypeScriptHoverProvider implements HoverProvider {
parts.push(data.documentation + (tags ? '\n\n' + tags : ''));
return parts;
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient
): vscode.Disposable {
return vscode.languages.registerHoverProvider(selector,
new TypeScriptHoverProvider(client));
}

View File

@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Position, Range, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, window, Uri, TextEditor, SnippetString, workspace } from 'vscode';
import { Position, Range, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, window, Uri, TextEditor, SnippetString, workspace, DocumentSelector, languages, Disposable } from 'vscode';
import { ITypeScriptServiceClient } from '../typescriptService';
import * as Proto from '../protocol';
@@ -46,7 +46,7 @@ class JsDocCompletionItem extends CompletionItem {
}
}
export default class JsDocCompletionProvider implements CompletionItemProvider {
class JsDocCompletionProvider implements CompletionItemProvider {
constructor(
private readonly client: ITypeScriptServiceClient,
@@ -220,4 +220,14 @@ export function templateToSnippet(template: string): SnippetString {
return out;
});
return new SnippetString(template);
}
}
export function register(
selector: DocumentSelector,
client: ITypeScriptServiceClient,
commandManager: CommandManager
): Disposable {
return languages.registerCompletionItemProvider(selector,
new JsDocCompletionProvider(client, commandManager),
'*');
}

View File

@@ -8,7 +8,7 @@ import * as vscode from 'vscode';
import { ITypeScriptServiceClient } from '../typescriptService';
import * as typeConverters from '../utils/typeConverters';
export default class TypeScriptReferenceSupport implements vscode.ReferenceProvider {
class TypeScriptReferenceSupport implements vscode.ReferenceProvider {
public constructor(
private readonly client: ITypeScriptServiceClient) { }
@@ -44,4 +44,12 @@ export default class TypeScriptReferenceSupport implements vscode.ReferenceProvi
return [];
}
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient
) {
return vscode.languages.registerReferenceProvider(selector,
new TypeScriptReferenceSupport(client));
}

View File

@@ -123,13 +123,12 @@ export default class LanguageProvider {
const cachedResponse = new CachedNavTreeResponse();
this.disposables.push(vscode.languages.registerCompletionItemProvider(selector, new (await import('./features/jsDocCompletionProvider')).default(client, commandManager), '*'));
this.disposables.push(vscode.languages.registerHoverProvider(selector, new (await import('./features/hoverProvider')).default(client)));
this.disposables.push(vscode.languages.registerDefinitionProvider(selector, new (await import('./features/definitionProvider')).default(client)));
this.disposables.push(vscode.languages.registerDocumentHighlightProvider(selector, new (await import('./features/documentHighlightProvider')).default(client)));
this.disposables.push(vscode.languages.registerReferenceProvider(selector, new (await import('./features/referenceProvider')).default(client)));
this.disposables.push(vscode.languages.registerDocumentSymbolProvider(selector, new (await import('./features/documentSymbolProvider')).default(client)));
this.disposables.push((await import('./features/jsDocCompletionProvider')).register(selector, client, commandManager));
this.disposables.push((await import('./features/hoverProvider')).register(selector, client));
this.disposables.push((await import('./features/definitionProvider')).register(selector, client));
this.disposables.push((await import('./features/documentHighlightProvider')).register(selector, client));
this.disposables.push((await import('./features/referenceProvider')).register(selector, client));
this.disposables.push((await import('./features/documentSymbolProvider')).register(selector, client));
this.disposables.push(vscode.languages.registerRenameProvider(selector, new (await import('./features/renameProvider')).default(client)));
this.disposables.push(vscode.languages.registerCodeActionsProvider(selector, new (await import('./features/quickFixProvider')).default(client, this.fileConfigurationManager, commandManager, this.diagnosticsManager, this.bufferSyncSupport, this.telemetryReporter)));