88import AbstractSupport from './abstractProvider' ;
99import { MetadataRequest , GoToDefinitionRequest , MetadataSource } from '../omnisharp/protocol' ;
1010import * as serverUtils from '../omnisharp/utils' ;
11- import { createRequest , toLocation } from '../omnisharp/typeConvertion' ;
11+ import { createRequest , toLocation , toLocationFromUri } from '../omnisharp/typeConvertion' ;
1212import { Uri , TextDocument , Position , Location , CancellationToken , DefinitionProvider } from 'vscode' ;
1313import DefinitionMetadataDocumentProvider from './definitionMetadataDocumentProvider' ;
1414import TelemetryReporter from 'vscode-extension-telemetry' ;
@@ -29,11 +29,23 @@ export default class CSharpDefinitionProvider extends AbstractSupport implements
2929
3030 return serverUtils . goToDefinition ( this . _server , req , token ) . then ( gotoDefinitionResponse => {
3131
32+ // the defintion is in source
3233 if ( gotoDefinitionResponse && gotoDefinitionResponse . FileName ) {
34+
35+ // if it is part of an already used metadata file, retrieve its uri instead of going to the physical file
36+ if ( gotoDefinitionResponse . FileName . startsWith ( "$metadata$" ) ) {
37+ const uri = this . _definitionMetadataDocumentProvider . getExistingMetadataResponseUri ( gotoDefinitionResponse . FileName ) ;
38+ return toLocationFromUri ( uri , gotoDefinitionResponse ) ;
39+ }
40+
41+ // if it is a normal source definition, convert the response to a location
3342 return toLocation ( gotoDefinitionResponse ) ;
43+
44+ // the definition is in metadata
3445 } else if ( gotoDefinitionResponse . MetadataSource ) {
3546 const metadataSource : MetadataSource = gotoDefinitionResponse . MetadataSource ;
3647
48+ // go to metadata endpoint for more information
3749 return serverUtils . getMetadata ( this . _server , < MetadataRequest > {
3850 Timeout : 5000 ,
3951 AssemblyName : metadataSource . AssemblyName ,
0 commit comments