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()
                                }
                            }
                        }
                    });
示例#2
0
        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());
        }