提交 277f25d0 编写于 作者: M Matt Bierner

Fix a few undefined ref accesses while ts is loading

上级 bfffabef
...@@ -12,18 +12,14 @@ import { ITypescriptServiceClient } from '../typescriptService'; ...@@ -12,18 +12,14 @@ import { ITypescriptServiceClient } from '../typescriptService';
export default class TypeScriptHoverProvider implements HoverProvider { export default class TypeScriptHoverProvider implements HoverProvider {
private client: ITypescriptServiceClient; public constructor(private client: ITypescriptServiceClient) { }
public constructor(client: ITypescriptServiceClient) {
this.client = client;
}
public provideHover(document: TextDocument, position: Position, token: CancellationToken): Promise<Hover | undefined | null> { public provideHover(document: TextDocument, position: Position, token: CancellationToken): Promise<Hover | undefined | null> {
const filepath = this.client.normalizePath(document.uri); const filepath = this.client.normalizePath(document.uri);
if (!filepath) { if (!filepath) {
return Promise.resolve(null); return Promise.resolve(null);
} }
let args: Proto.FileLocationRequestArgs = { const args: Proto.FileLocationRequestArgs = {
file: filepath, file: filepath,
line: position.line + 1, line: position.line + 1,
offset: position.character + 1 offset: position.character + 1
...@@ -32,8 +28,8 @@ export default class TypeScriptHoverProvider implements HoverProvider { ...@@ -32,8 +28,8 @@ export default class TypeScriptHoverProvider implements HoverProvider {
return Promise.resolve(null); return Promise.resolve(null);
} }
return this.client.execute('quickinfo', args, token).then((response): Hover | undefined => { return this.client.execute('quickinfo', args, token).then((response): Hover | undefined => {
let data = response.body; if (response && response.body) {
if (data) { const data = response.body;
return new Hover( return new Hover(
[{ language: 'typescript', value: data.displayString }, data.documentation], [{ language: 'typescript', value: data.displayString }, data.documentation],
new Range(data.start.line - 1, data.start.offset - 1, data.end.line - 1, data.end.offset - 1)); new Range(data.start.line - 1, data.start.offset - 1, data.end.line - 1, data.end.offset - 1));
......
...@@ -12,17 +12,16 @@ import * as PConst from '../protocol.const'; ...@@ -12,17 +12,16 @@ import * as PConst from '../protocol.const';
import { ITypescriptServiceClient } from '../typescriptService'; import { ITypescriptServiceClient } from '../typescriptService';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
let localize = nls.loadMessageBundle(); const localize = nls.loadMessageBundle();
class ReferencesCodeLens extends CodeLens { class ReferencesCodeLens extends CodeLens {
public document: Uri; constructor(
public file: string; public tsDocument: Uri,
public tsFile: string,
constructor(document: Uri, file: string, range: Range) { range: Range
) {
super(range); super(range);
this.document = document;
this.file = file;
} }
} }
...@@ -31,14 +30,14 @@ export default class TypeScriptReferencesCodeLensProvider implements CodeLensPro ...@@ -31,14 +30,14 @@ export default class TypeScriptReferencesCodeLensProvider implements CodeLensPro
private onDidChangeCodeLensesEmitter = new EventEmitter<CodeLensProvider>(); private onDidChangeCodeLensesEmitter = new EventEmitter<CodeLensProvider>();
public constructor(private client: ITypescriptServiceClient) { }
public get onDidChangeCodeLenses(): Event<CodeLensProvider> { public get onDidChangeCodeLenses(): Event<CodeLensProvider> {
return this.onDidChangeCodeLensesEmitter.event; return this.onDidChangeCodeLensesEmitter.event;
} }
constructor(private client: ITypescriptServiceClient) { }
public updateConfiguration(config: WorkspaceConfiguration): void { public updateConfiguration(config: WorkspaceConfiguration): void {
let typeScriptConfig = workspace.getConfiguration('typescript'); const typeScriptConfig = workspace.getConfiguration('typescript');
const wasEnabled = this.enabled; const wasEnabled = this.enabled;
this.enabled = typeScriptConfig.get('referencesCodeLens.enabled', false); this.enabled = typeScriptConfig.get('referencesCodeLens.enabled', false);
if (wasEnabled !== this.enabled) { if (wasEnabled !== this.enabled) {
...@@ -56,22 +55,25 @@ export default class TypeScriptReferencesCodeLensProvider implements CodeLensPro ...@@ -56,22 +55,25 @@ export default class TypeScriptReferencesCodeLensProvider implements CodeLensPro
return Promise.resolve([]); return Promise.resolve([]);
} }
return this.client.execute('navtree', { file: filepath }, token).then(response => { return this.client.execute('navtree', { file: filepath }, token).then(response => {
if (!response) {
return [];
}
const tree = response.body; const tree = response.body;
const referenceableSpans: Range[] = []; const referenceableSpans: Range[] = [];
if (tree && tree.childItems) { if (tree && tree.childItems) {
tree.childItems.forEach(item => this.extractReferenceableSymbols(document, item, referenceableSpans)); tree.childItems.forEach(item => this.extractReferenceableSymbols(document, item, referenceableSpans));
} }
return Promise.resolve(referenceableSpans.map(span => new ReferencesCodeLens(document.uri, filepath, span))); return referenceableSpans.map(span => new ReferencesCodeLens(document.uri, filepath, span));
}); });
} }
resolveCodeLens(inputCodeLens: CodeLens, token: CancellationToken): Promise<CodeLens> { resolveCodeLens(inputCodeLens: CodeLens, token: CancellationToken): Promise<CodeLens> {
const codeLens = inputCodeLens as ReferencesCodeLens; const codeLens = inputCodeLens as ReferencesCodeLens;
if (!codeLens.document) { if (!codeLens.tsDocument) {
return Promise.reject<CodeLens>(codeLens); return Promise.reject<CodeLens>(codeLens);
} }
const args: Proto.FileLocationRequestArgs = { const args: Proto.FileLocationRequestArgs = {
file: codeLens.file, file: codeLens.tsFile,
line: codeLens.range.start.line + 1, line: codeLens.range.start.line + 1,
offset: codeLens.range.start.character + 1 offset: codeLens.range.start.character + 1
}; };
...@@ -90,7 +92,7 @@ export default class TypeScriptReferencesCodeLensProvider implements CodeLensPro ...@@ -90,7 +92,7 @@ export default class TypeScriptReferencesCodeLensProvider implements CodeLensPro
codeLens.command = { codeLens.command = {
title: locations.length + ' ' + (locations.length === 1 ? localize('oneReferenceLabel', 'reference') : localize('manyReferenceLabel', 'references')), title: locations.length + ' ' + (locations.length === 1 ? localize('oneReferenceLabel', 'reference') : localize('manyReferenceLabel', 'references')),
command: 'editor.action.showReferences', command: 'editor.action.showReferences',
arguments: [codeLens.document, codeLens.range.start, locations] arguments: [codeLens.tsDocument, codeLens.range.start, locations]
}; };
return Promise.resolve(codeLens); return Promise.resolve(codeLens);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册