public async Task <GotoDefinitionResponse> Handle(GotoDefinitionRequest request) { var cancellationToken = _externalSourceServiceFactory.CreateCancellationToken(_omnisharpOptions, request.Timeout); var externalSourceService = _externalSourceServiceFactory.Create(_omnisharpOptions); var document = externalSourceService.FindDocumentInCache(request.FileName) ?? _workspace.GetDocument(request.FileName); if (document == null) { return(new GotoDefinitionResponse()); } var symbol = await GoToDefinitionHelpers.GetDefinitionSymbol(document, request.Line, request.Column, cancellationToken); if (symbol?.Locations.IsDefaultOrEmpty != false) { return(new GotoDefinitionResponse()); } if (symbol.Locations[0].IsInSource) { return(new GotoDefinitionResponse() { Definitions = symbol.Locations .Select(location => new Definition { Location = location.GetMappedLineSpan().GetLocationFromFileLinePositionSpan(), SourceGeneratedFileInfo = GoToDefinitionHelpers.GetSourceGeneratedFileInfo(_workspace, location) }) .ToList() }); } else { var maybeSpan = await GoToDefinitionHelpers.GetMetadataMappedSpan(document, symbol, externalSourceService, cancellationToken); if (maybeSpan is FileLinePositionSpan lineSpan) { return(new GotoDefinitionResponse { Definitions = new() { new Definition { Location = lineSpan.GetLocationFromFileLinePositionSpan(), MetadataSource = new OmniSharp.Models.Metadata.MetadataSource() { AssemblyName = symbol.ContainingAssembly.Name, ProjectName = document.Project.Name, TypeName = symbol.GetSymbolName() } } } });
public async Task <GotoDefinitionResponse> Handle(GotoDefinitionRequest request) { var externalSourceService = _externalSourceServiceFactory.Create(_omnisharpOptions); var cancellationToken = _externalSourceServiceFactory.CreateCancellationToken(_omnisharpOptions, request.Timeout); var document = externalSourceService.FindDocumentInCache(request.FileName) ?? _workspace.GetDocument(request.FileName); var symbol = await GoToDefinitionHelpers.GetDefinitionSymbol(document, request.Line, request.Column, cancellationToken); if (symbol == null) { return(new GotoDefinitionResponse()); } var location = symbol.Locations.First(); GotoDefinitionResponse?response = null; if (location.IsInSource) { var lineSpan = symbol.Locations.First().GetMappedLineSpan(); response = new GotoDefinitionResponse { FileName = lineSpan.Path, Line = lineSpan.StartLinePosition.Line, Column = lineSpan.StartLinePosition.Character, SourceGeneratedInfo = GoToDefinitionHelpers.GetSourceGeneratedFileInfo(_workspace, location) }; } else if (location.IsInMetadata && request.WantMetadata) { var maybeSpan = await GoToDefinitionHelpers.GetMetadataMappedSpan(document, symbol, externalSourceService, cancellationToken); if (maybeSpan is FileLinePositionSpan lineSpan) { response = new GotoDefinitionResponse { Line = lineSpan.StartLinePosition.Line, Column = lineSpan.StartLinePosition.Character, MetadataSource = new MetadataSource() { AssemblyName = symbol.ContainingAssembly.Name, ProjectName = document.Project.Name, TypeName = symbol.GetSymbolName() }, }; } } return(response ?? new GotoDefinitionResponse()); }