|
6 | 6 | 'use strict'; |
7 | 7 |
|
8 | 8 | import AbstractSupport from './abstractProvider'; |
9 | | -import {MetadataRequest, GoToDefinitionRequest} from '../omnisharp/protocol'; |
| 9 | +import {MetadataRequest, GoToDefinitionRequest, MetadataSource} from '../omnisharp/protocol'; |
10 | 10 | import * as serverUtils from '../omnisharp/utils'; |
11 | 11 | 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 | + |
13 | 15 |
|
14 | 16 | 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 | + } |
15 | 23 |
|
16 | 24 | public provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Promise<Location> { |
17 | 25 |
|
18 | 26 | let req = <GoToDefinitionRequest>createRequest(document, position); |
19 | 27 | req.WantMetadata = true; |
20 | 28 |
|
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 => { |
26 | 30 |
|
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; |
29 | 35 |
|
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 |
36 | 43 | }).then(metadataResponse => { |
37 | 44 | if (!metadataResponse || !metadataResponse.Source || !metadataResponse.SourceName) { |
38 | 45 | return; |
39 | 46 | } |
40 | 47 |
|
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)); |
58 | 50 | }); |
59 | 51 | } |
60 | 52 | }); |
|
0 commit comments