Exemplo n.º 1
0
        public async Task <IActionResult> GotoDefinition([FromBody] Request request)
        {
            _workspace.EnsureBufferUpdated(request);

            var quickFixes = new List <QuickFix>();

            var documentId = _workspace.GetDocumentId(request.FileName);
            var response   = new GotoDefinitionResponse();

            if (documentId != null)
            {
                var document      = _workspace.CurrentSolution.GetDocument(documentId);
                var semanticModel = await document.GetSemanticModelAsync();

                var syntaxTree = semanticModel.SyntaxTree;
                var sourceText = await document.GetTextAsync();

                var position = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column));
                var symbol   = SymbolFinder.FindSymbolAtPosition(semanticModel, position, _workspace);
                var lineSpan = symbol.Locations.First().GetMappedLineSpan();
                response = new GotoDefinitionResponse
                {
                    FileName = lineSpan.Path,
                    Line     = lineSpan.StartLinePosition.Line + 1,
                    Column   = lineSpan.StartLinePosition.Character + 1
                };
            }

            return(new ObjectResult(response));
        }
Exemplo n.º 2
0
        public async Task <GotoDefinitionResponse> GotoDefinition(GotoDefinitionRequest request)
        {
            var quickFixes = new List <QuickFix>();

            var document = _workspace.GetDocument(request.FileName);
            var response = new GotoDefinitionResponse();

            if (document != null)
            {
                var semanticModel = await document.GetSemanticModelAsync();

                var syntaxTree = semanticModel.SyntaxTree;
                var sourceText = await document.GetTextAsync();

                var position = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column - 1));
                var symbol   = SymbolFinder.FindSymbolAtPosition(semanticModel, position, _workspace);

                if (symbol != null)
                {
                    var location = symbol.Locations.First();

                    if (location.IsInSource)
                    {
                        var lineSpan = symbol.Locations.First().GetMappedLineSpan();
                        response = new GotoDefinitionResponse
                        {
                            FileName = lineSpan.Path,
                            Line     = lineSpan.StartLinePosition.Line + 1,
                            Column   = lineSpan.StartLinePosition.Character + 1
                        };
                    }
                    else if (location.IsInMetadata && request.WantMetadata)
                    {
                        var cancellationSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(request.Timeout));
                        var metadataDocument   = await MetadataHelper.GetDocumentFromMetadata(document.Project, symbol, cancellationSource.Token);

                        if (metadataDocument != null)
                        {
                            cancellationSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(request.Timeout));
                            var metadataLocation = await MetadataHelper.GetSymbolLocationFromMetadata(symbol, metadataDocument, cancellationSource.Token);

                            var lineSpan = metadataLocation.GetMappedLineSpan();

                            response = new GotoDefinitionResponse
                            {
                                Line           = lineSpan.StartLinePosition.Line + 1,
                                Column         = lineSpan.StartLinePosition.Character + 1,
                                MetadataSource = new MetadataSource()
                                {
                                    AssemblyName = symbol.ContainingAssembly.Name,
                                    ProjectName  = document.Project.Name,
                                    TypeName     = MetadataHelper.GetSymbolName(symbol)
                                },
                            };
                        }
                    }
                }
            }

            return(response);
        }