public Task <DocumentHighlightContainer> Handle( DocumentHighlightParams request, CancellationToken cancellationToken) { ScriptFile scriptFile = _workspaceService.GetFile(request.TextDocument.Uri); IReadOnlyList <SymbolReference> symbolOccurrences = _symbolsService.FindOccurrencesInFile( scriptFile, (int)request.Position.Line + 1, (int)request.Position.Character + 1); if (symbolOccurrences == null) { return(Task.FromResult(s_emptyHighlightContainer)); } var highlights = new DocumentHighlight[symbolOccurrences.Count]; for (int i = 0; i < symbolOccurrences.Count; i++) { highlights[i] = new DocumentHighlight { Kind = DocumentHighlightKind.Write, // TODO: Which symbol types are writable? Range = symbolOccurrences[i].ScriptRegion.ToRange() }; } return(Task.FromResult(new DocumentHighlightContainer(highlights))); }
public void SimpleTest(string expected) { var model = new DocumentHighlight { Kind = DocumentHighlightKind.Text, Range = new Range(new Position(1, 1), new Position(2, 2)) }; var result = Fixture.SerializeObject(model); result.Should().Be(expected); var deresult = new LspSerializer(ClientVersion.Lsp3).DeserializeObject <DocumentHighlight>(expected); deresult.Should().BeEquivalentTo(model); }
protected async Task HandleDocumentHighlightRequest( TextDocumentPosition textDocumentPosition, EditorSession editorSession, RequestContext <DocumentHighlight[], object> requestContext) { ScriptFile scriptFile = editorSession.Workspace.GetFile( textDocumentPosition.Uri); FindOccurrencesResult occurrencesResult = editorSession.LanguageService.FindOccurrencesInFile( scriptFile, textDocumentPosition.Position.Line + 1, textDocumentPosition.Position.Character + 1); DocumentHighlight[] documentHighlights = null; if (occurrencesResult != null) { documentHighlights = occurrencesResult .FoundOccurrences .Select(o => { return(new DocumentHighlight { Kind = DocumentHighlightKind.Write, // TODO: Which symbol types are writable? Range = GetRangeFromScriptRegion(o.ScriptRegion) }); }) .ToArray(); } else { documentHighlights = new DocumentHighlight[0]; } await requestContext.SendResult(documentHighlights); }
public async Task <DocumentHighlight[]> HandleRequestAsync(DocumentHighlightParams request, ClientCapabilities clientCapabilities, CancellationToken cancellationToken) { if (request is null) { throw new ArgumentNullException(nameof(request)); } if (clientCapabilities is null) { throw new ArgumentNullException(nameof(clientCapabilities)); } _logger.LogInformation($"Starting request for {request.TextDocument.Uri}."); if (!_documentManager.TryGetDocument(request.TextDocument.Uri, out var documentSnapshot)) { _logger.LogWarning($"Failed to find document {request.TextDocument.Uri}."); return(null); } var projectionResult = await _projectionProvider.GetProjectionAsync( documentSnapshot, request.Position, cancellationToken).ConfigureAwait(false); if (projectionResult == null) { return(null); } var serverKind = projectionResult.LanguageKind == RazorLanguageKind.CSharp ? LanguageServerKind.CSharp : LanguageServerKind.Html; cancellationToken.ThrowIfCancellationRequested(); var documentHighlightParams = new DocumentHighlightParams() { Position = projectionResult.Position, TextDocument = new TextDocumentIdentifier() { Uri = projectionResult.Uri } }; _logger.LogInformation($"Requesting highlights for {projectionResult.Uri} at ({projectionResult.Position?.Line}, {projectionResult.Position?.Character})."); var highlights = await _requestInvoker.ReinvokeRequestOnServerAsync <DocumentHighlightParams, DocumentHighlight[]>( Methods.TextDocumentDocumentHighlightName, serverKind.ToContentType(), documentHighlightParams, cancellationToken).ConfigureAwait(false); if (highlights == null || highlights.Length == 0) { _logger.LogInformation("Received no results."); return(highlights); } _logger.LogInformation($"Received {highlights.Length} results, remapping."); var remappedHighlights = new List <DocumentHighlight>(); var rangesToMap = highlights.Select(r => r.Range).ToArray(); var mappingResult = await _documentMappingProvider.MapToDocumentRangesAsync( projectionResult.LanguageKind, request.TextDocument.Uri, rangesToMap, cancellationToken).ConfigureAwait(false); if (mappingResult == null || mappingResult.HostDocumentVersion != documentSnapshot.Version) { // Couldn't remap the range or the document changed in the meantime. Discard this highlight. _logger.LogInformation($"Mapping failed. Versions: {documentSnapshot.Version} -> {mappingResult?.HostDocumentVersion}."); return(Array.Empty <DocumentHighlight>()); } for (var i = 0; i < highlights.Length; i++) { var highlight = highlights[i]; var range = mappingResult.Ranges[i]; if (range.IsUndefined()) { // Couldn't remap the range correctly. Discard this range. continue; } var remappedHighlight = new DocumentHighlight() { Range = range, Kind = highlight.Kind }; remappedHighlights.Add(remappedHighlight); } _logger.LogInformation($"Returning {remappedHighlights.Count} highlights."); return(remappedHighlights.ToArray()); }
public async Task <DocumentHighlight[]> HandleRequestAsync(DocumentHighlightParams request, ClientCapabilities clientCapabilities, CancellationToken cancellationToken) { if (request is null) { throw new ArgumentNullException(nameof(request)); } if (clientCapabilities is null) { throw new ArgumentNullException(nameof(clientCapabilities)); } if (!_documentManager.TryGetDocument(request.TextDocument.Uri, out var documentSnapshot)) { return(null); } var projectionResult = await _projectionProvider.GetProjectionAsync(documentSnapshot, request.Position, cancellationToken).ConfigureAwait(false); if (projectionResult == null || projectionResult.LanguageKind != RazorLanguageKind.CSharp) { return(null); } cancellationToken.ThrowIfCancellationRequested(); var serverKind = LanguageServerKind.CSharp; var documentHighlightParams = new DocumentHighlightParams() { Position = projectionResult.Position, TextDocument = new TextDocumentIdentifier() { Uri = projectionResult.Uri } }; var highlights = await _requestInvoker.ReinvokeRequestOnServerAsync <DocumentHighlightParams, DocumentHighlight[]>( Methods.TextDocumentDocumentHighlightName, serverKind, documentHighlightParams, cancellationToken).ConfigureAwait(false); if (highlights == null || highlights.Length == 0) { return(highlights); } var remappedHighlights = new List <DocumentHighlight>(); var rangesToMap = highlights.Select(r => r.Range).ToArray(); var mappingResult = await _documentMappingProvider.MapToDocumentRangesAsync( projectionResult.LanguageKind, request.TextDocument.Uri, rangesToMap, cancellationToken).ConfigureAwait(false); if (mappingResult == null || mappingResult.HostDocumentVersion != documentSnapshot.Version) { // Couldn't remap the range or the document changed in the meantime. Discard this highlight. return(Array.Empty <DocumentHighlight>()); } for (var i = 0; i < highlights.Length; i++) { var highlight = highlights[i]; var range = mappingResult.Ranges[i]; if (range.IsUndefined()) { // Couldn't remap the range correctly. Discard this range. continue; } var remappedHighlight = new DocumentHighlight() { Range = range, Kind = highlight.Kind }; remappedHighlights.Add(remappedHighlight); } return(remappedHighlights.ToArray()); }