public TextDocumentIdentifier?GetTextDocumentIdentifier( LSP.SemanticTokensEditsParams request ) { Contract.ThrowIfNull(request.TextDocument); return(request.TextDocument); }
public async Task <SumType <LSP.SemanticTokens, LSP.SemanticTokensEdits> > HandleRequestAsync( LSP.SemanticTokensEditsParams request, RequestContext context, CancellationToken cancellationToken) { // Temporary workaround for https://github.com/dotnet/roslyn/issues/54547: // We should eventually go back to throwing here if context.Document is null. if (context.Document is null) { return(new LSP.SemanticTokens()); } Contract.ThrowIfNull(request.TextDocument, "TextDocument is null."); Contract.ThrowIfNull(request.PreviousResultId, "previousResultId is null."); // Even though we want to ultimately pass edits back to LSP, we still need to compute all semantic tokens, // both for caching purposes and in order to have a baseline comparison when computing the edits. var newSemanticTokensData = await SemanticTokensHelpers.ComputeSemanticTokensDataAsync( context.Document, SemanticTokensCache.TokenTypeToIndex, range : null, cancellationToken).ConfigureAwait(false); Contract.ThrowIfNull(newSemanticTokensData, "newSemanticTokensData is null."); // Getting the cached tokens for the document. If we don't have an applicable cached token set, // we can't calculate edits, so we must return all semantic tokens instead. var oldSemanticTokensData = await _tokensCache.GetCachedTokensDataAsync( request.TextDocument.Uri, request.PreviousResultId, cancellationToken).ConfigureAwait(false); if (oldSemanticTokensData == null) { var newResultId = _tokensCache.GetNextResultId(); return(new LSP.SemanticTokens { ResultId = newResultId, Data = newSemanticTokensData }); } var resultId = request.PreviousResultId; var editArray = ComputeSemanticTokensEdits(oldSemanticTokensData, newSemanticTokensData); // If we have edits, generate a new ResultId. Otherwise, re-use the previous one. if (editArray.Length != 0) { resultId = _tokensCache.GetNextResultId(); var updatedTokens = new LSP.SemanticTokens { ResultId = resultId, Data = newSemanticTokensData }; await _tokensCache.UpdateCacheAsync( request.TextDocument.Uri, updatedTokens, cancellationToken).ConfigureAwait(false); } var edits = new SemanticTokensEdits { Edits = editArray, ResultId = resultId }; return(edits); }
public async Task <SumType <LSP.SemanticTokens, LSP.SemanticTokensEdits> > HandleRequestAsync( LSP.SemanticTokensEditsParams request, RequestContext context, CancellationToken cancellationToken ) { Contract.ThrowIfNull(request.TextDocument, "TextDocument is null."); Contract.ThrowIfNull(request.PreviousResultId, "previousResultId is null."); Contract.ThrowIfNull(context.Document, "Document is null."); // Even though we want to ultimately pass edits back to LSP, we still need to compute all semantic tokens, // both for caching purposes and in order to have a baseline comparison when computing the edits. var newSemanticTokensData = await SemanticTokensHelpers .ComputeSemanticTokensDataAsync( context.Document, SemanticTokensCache.TokenTypeToIndex, range : null, cancellationToken ) .ConfigureAwait(false); Contract.ThrowIfNull(newSemanticTokensData, "newSemanticTokensData is null."); var resultId = _tokensCache.GetNextResultId(); var newSemanticTokens = new LSP.SemanticTokens { ResultId = resultId, Data = newSemanticTokensData }; await _tokensCache .UpdateCacheAsync(request.TextDocument.Uri, newSemanticTokens, cancellationToken) .ConfigureAwait(false); // Getting the cached tokens for the document. If we don't have an applicable cached token set, // we can't calculate edits, so we must return all semantic tokens instead. var oldSemanticTokensData = await _tokensCache .GetCachedTokensDataAsync( request.TextDocument.Uri, request.PreviousResultId, cancellationToken ) .ConfigureAwait(false); if (oldSemanticTokensData == null) { return(newSemanticTokens); } var edits = new SemanticTokensEdits { Edits = ComputeSemanticTokensEdits(oldSemanticTokensData, newSemanticTokensData), ResultId = resultId }; return(edits); }
public TextDocumentIdentifier?GetTextDocumentIdentifier(LSP.SemanticTokensEditsParams request) => request.TextDocument;