|
6 | 6 | 'use strict'; |
7 | 7 |
|
8 | 8 | import AbstractSupport from './abstractProvider'; |
| 9 | +import {MetadataRequest, GoToDefinitionRequest, MetadataSource} from '../omnisharp/protocol'; |
9 | 10 | import * as serverUtils from '../omnisharp/utils'; |
10 | 11 | import {createRequest, toLocation} from '../omnisharp/typeConvertion'; |
11 | | -import {TextDocument, Position, Location, CancellationToken, DefinitionProvider} from 'vscode'; |
| 12 | +import {Uri, TextDocument, Position, Location, CancellationToken, DefinitionProvider} from 'vscode'; |
| 13 | +import {DefinitionMetadataDocumentProvider} from './definitionMetadataDocumentProvider'; |
| 14 | + |
12 | 15 |
|
13 | 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 | + } |
14 | 23 |
|
15 | 24 | public provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Promise<Location> { |
16 | 25 |
|
17 | | - let req = createRequest(document, position); |
| 26 | + let req = <GoToDefinitionRequest>createRequest(document, position); |
| 27 | + req.WantMetadata = true; |
| 28 | + |
| 29 | + return serverUtils.goToDefinition(this._server, req, token).then(gotoDefinitionResponse => { |
| 30 | + |
| 31 | + if (gotoDefinitionResponse && gotoDefinitionResponse.FileName) { |
| 32 | + return toLocation(gotoDefinitionResponse); |
| 33 | + } else if (gotoDefinitionResponse.MetadataSource) { |
| 34 | + const metadataSource: MetadataSource = gotoDefinitionResponse.MetadataSource; |
| 35 | + |
| 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 |
| 43 | + }).then(metadataResponse => { |
| 44 | + if (!metadataResponse || !metadataResponse.Source || !metadataResponse.SourceName) { |
| 45 | + return; |
| 46 | + } |
18 | 47 |
|
19 | | - return serverUtils.goToDefinition(this._server, req, token).then(value => { |
20 | | - if (value && value.FileName) { |
21 | | - return toLocation(value); |
22 | | - } |
| 48 | + const uri: Uri = this._definitionMetadataDocumentProvider.addMetadataResponse(metadataResponse); |
| 49 | + return new Location(uri, new Position(gotoDefinitionResponse.Line - 1, gotoDefinitionResponse.Column - 1)); |
| 50 | + }); |
| 51 | + } |
23 | 52 | }); |
24 | 53 | } |
25 | 54 | } |
0 commit comments