Skip to content

Commit 083f208

Browse files
committed
Added support for Peek Definition by implementing the document provider properly
1 parent 44b4b15 commit 083f208

File tree

3 files changed

+81
-37
lines changed

3 files changed

+81
-37
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { workspace, Uri, TextDocument, Disposable, TextDocumentContentProvider} from 'vscode';
2+
import { MetadataResponse } from '../omnisharp/protocol';
3+
4+
export class DefinitionMetadataDocumentProvider implements TextDocumentContentProvider, Disposable {
5+
private _scheme = "omnisharp-metadata";
6+
private _registration : Disposable;
7+
private _documents: Map<string, MetadataResponse>;
8+
private _documentClosedSubscription: Disposable;
9+
10+
constructor() {
11+
this._documents = new Map<string, MetadataResponse>();
12+
this._documentClosedSubscription = workspace.onDidCloseTextDocument(this.onTextDocumentClosed);
13+
}
14+
15+
private onTextDocumentClosed(document: TextDocument) : void {
16+
this._documents.delete(document.uri.toString());
17+
}
18+
19+
public dispose() : void {
20+
this._registration.dispose();
21+
this._documentClosedSubscription.dispose();
22+
this._documents.clear();
23+
}
24+
25+
public addMetadataResponse(metadataResponse: MetadataResponse) : Uri {
26+
const uri = this.createUri(metadataResponse);
27+
28+
this._documents.set(uri.toString(), metadataResponse);
29+
30+
return uri;
31+
}
32+
33+
public register() : void {
34+
this._registration = workspace.registerTextDocumentContentProvider(this._scheme, this);
35+
}
36+
37+
public provideTextDocumentContent(uri : Uri) : string {
38+
return this._documents.get(uri.toString()).Source;
39+
}
40+
41+
private createUri(metadataResponse: MetadataResponse) : Uri {
42+
return Uri.parse(this._scheme + "://" +
43+
metadataResponse.SourceName.replace(/\\/g, "/")
44+
.replace(/(.*)\/(.*)/g, "$1/[metadata] $2"));
45+
}
46+
}

src/features/definitionProvider.ts

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,55 +6,47 @@
66
'use strict';
77

88
import AbstractSupport from './abstractProvider';
9-
import {MetadataRequest, GoToDefinitionRequest} from '../omnisharp/protocol';
9+
import {MetadataRequest, GoToDefinitionRequest, MetadataSource} from '../omnisharp/protocol';
1010
import * as serverUtils from '../omnisharp/utils';
1111
import {createRequest, toLocation} from '../omnisharp/typeConvertion';
12-
import {workspace, window, Uri, TextDocument, Position, Location, CancellationToken, DefinitionProvider, Selection, TextEditorRevealType} from 'vscode';
12+
import {Uri, TextDocument, Position, Location, CancellationToken, DefinitionProvider} from 'vscode';
13+
import {DefinitionMetadataDocumentProvider} from './definitionMetadataDocumentProvider';
14+
1315

1416
export default class CSharpDefinitionProvider extends AbstractSupport implements DefinitionProvider {
17+
private _definitionMetadataDocumentProvider: DefinitionMetadataDocumentProvider;
18+
19+
constructor(server, definitionMetadataDocumentProvider: DefinitionMetadataDocumentProvider) {
20+
super(server);
21+
this._definitionMetadataDocumentProvider = definitionMetadataDocumentProvider;
22+
}
1523

1624
public provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Promise<Location> {
1725

1826
let req = <GoToDefinitionRequest>createRequest(document, position);
1927
req.WantMetadata = true;
2028

21-
return serverUtils.goToDefinition(this._server, req, token).then(value => {
22-
23-
if (value && value.FileName) {
24-
return toLocation(value);
25-
} else if (value.MetadataSource) {
29+
return serverUtils.goToDefinition(this._server, req, token).then(gotoDefinitionResponse => {
2630

27-
let lineNumber = value.Line;
28-
let column = value.Column;
31+
if (gotoDefinitionResponse && gotoDefinitionResponse.FileName) {
32+
return toLocation(gotoDefinitionResponse);
33+
} else if (gotoDefinitionResponse.MetadataSource) {
34+
const metadataSource: MetadataSource = gotoDefinitionResponse.MetadataSource;
2935

30-
serverUtils.getMetadata(this._server, <MetadataRequest> {
31-
AssemblyName: value.MetadataSource.AssemblyName,
32-
VersionNumber: value.MetadataSource.VersionNumber,
33-
ProjectName: value.MetadataSource.ProjectName,
34-
Language: value.MetadataSource.Language,
35-
TypeName: value.MetadataSource.TypeName
36+
return serverUtils.getMetadata(this._server, <MetadataRequest> {
37+
Timeout: 5000,
38+
AssemblyName: metadataSource.AssemblyName,
39+
VersionNumber: metadataSource.VersionNumber,
40+
ProjectName: metadataSource.ProjectName,
41+
Language: metadataSource.Language,
42+
TypeName: metadataSource.TypeName
3643
}).then(metadataResponse => {
3744
if (!metadataResponse || !metadataResponse.Source || !metadataResponse.SourceName) {
3845
return;
3946
}
4047

41-
const scheme = "omnisharp-metadata";
42-
let temporaryDocumentContentProviderRegistration = workspace.registerTextDocumentContentProvider(scheme, {
43-
provideTextDocumentContent: function(uri) {
44-
return metadataResponse.Source;
45-
}
46-
});
47-
48-
let uri = Uri.parse(scheme + "://" + metadataResponse.SourceName.replace(/\\/g, "/").replace(/(.*)\/(.*)/g, "$1/[metadata] $2"));
49-
workspace.openTextDocument(uri).then(document => {
50-
temporaryDocumentContentProviderRegistration.dispose();
51-
52-
window.showTextDocument(document, null, false).then(editor => {
53-
let position = new Position(lineNumber - 1, column - 1);
54-
editor.selection = new Selection(position, position);
55-
editor.revealRange(editor.document.lineAt(position.line).range, TextEditorRevealType.InCenter);
56-
});
57-
});
48+
const uri: Uri = this._definitionMetadataDocumentProvider.addMetadataResponse(metadataResponse);
49+
return new Location(uri, new Position(gotoDefinitionResponse.Line - 1, gotoDefinitionResponse.Column - 1));
5850
});
5951
}
6052
});

src/main.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ import * as coreclrdebug from './coreclr-debug/activate';
2626
import {addAssetsIfNecessary} from './assets';
2727
import * as vscode from 'vscode';
2828
import TelemetryReporter from 'vscode-extension-telemetry';
29+
import {DefinitionMetadataDocumentProvider} from './features/definitionMetadataDocumentProvider';
30+
2931

3032
export function activate(context: vscode.ExtensionContext): any {
31-
33+
3234
const extensionId = 'ms-vscode.csharp';
3335
const extension = vscode.extensions.getExtension(extensionId);
3436
const extensionVersion = extension.packageJSON.version;
@@ -48,7 +50,11 @@ export function activate(context: vscode.ExtensionContext): any {
4850

4951
disposables.push(server.onServerStart(() => {
5052
// register language feature provider on start
51-
localDisposables.push(vscode.languages.registerDefinitionProvider(_selector, new DefinitionProvider(server)));
53+
const definitionMetadataDocumentProvider = new DefinitionMetadataDocumentProvider();
54+
definitionMetadataDocumentProvider.register();
55+
localDisposables.push(definitionMetadataDocumentProvider);
56+
57+
localDisposables.push(vscode.languages.registerDefinitionProvider(_selector, new DefinitionProvider(server, definitionMetadataDocumentProvider)));
5258
localDisposables.push(vscode.languages.registerCodeLensProvider(_selector, new CodeLensProvider(server)));
5359
localDisposables.push(vscode.languages.registerDocumentHighlightProvider(_selector, new DocumentHighlightProvider(server)));
5460
localDisposables.push(vscode.languages.registerDocumentSymbolProvider(_selector, new DocumentSymbolProvider(server)));
@@ -74,7 +80,7 @@ export function activate(context: vscode.ExtensionContext): any {
7480

7581
disposables.push(registerCommands(server, context.extensionPath));
7682
disposables.push(reportStatus(server));
77-
83+
7884
disposables.push(server.onServerStart(() => {
7985
// Update or add tasks.json and launch.json
8086
addAssetsIfNecessary(server);
@@ -89,10 +95,10 @@ export function activate(context: vscode.ExtensionContext): any {
8995
advisor.dispose();
9096
server.stop();
9197
}));
92-
98+
9399
// activate coreclr-debug
94100
coreclrdebug.activate(context, reporter);
95-
101+
96102
context.subscriptions.push(...disposables);
97103
}
98104

0 commit comments

Comments
 (0)