public static async Task <LSP.LocationWithText> DocumentSpanToLocationWithTextAsync(DocumentSpan documentSpan, ClassifiedTextElement text, CancellationToken cancellationToken) { var sourceText = await documentSpan.Document.GetTextAsync(cancellationToken).ConfigureAwait(false); var locationWithText = new LSP.LocationWithText { Uri = documentSpan.Document.GetURI(), Range = TextSpanToRange(documentSpan.SourceSpan, sourceText), Text = text }; return(locationWithText); }
private async Task <LSP.ReferenceGroup[]> GetReferenceGroupsAsync(LSP.ReferenceParams request, SimpleFindUsagesContext context, CancellationToken cancellationToken) { var definitionMap = new Dictionary <DefinitionItem, List <SourceReferenceItem> >(); foreach (var reference in context.GetReferences()) { if (!definitionMap.ContainsKey(reference.Definition)) { definitionMap.Add(reference.Definition, new List <SourceReferenceItem>()); } definitionMap[reference.Definition].Add(reference); } var referenceGroups = ArrayBuilder <LSP.ReferenceGroup> .GetInstance(); foreach (var keyValuePair in definitionMap) { var definition = keyValuePair.Key; var references = keyValuePair.Value; var referenceGroup = new LSP.ReferenceGroup(); var text = definition.GetClassifiedText(); referenceGroup.Definition = await ProtocolConversions.DocumentSpanToLocationWithTextAsync(definition.SourceSpans.First(), text, cancellationToken).ConfigureAwait(false); referenceGroup.DefinitionIcon = new ImageElement(definition.Tags.GetFirstGlyph().GetImageId()); var locationWithTexts = new ArrayBuilder <LSP.LocationWithText>(); foreach (var reference in references) { var classifiedSpansAndHighlightSpan = await ClassifiedSpansAndHighlightSpanFactory.ClassifyAsync(reference.SourceSpan, context.CancellationToken).ConfigureAwait(false); var classifiedSpans = classifiedSpansAndHighlightSpan.ClassifiedSpans; var referenceLocation = await ProtocolConversions.DocumentSpanToLocationAsync(reference.SourceSpan, cancellationToken).ConfigureAwait(false); var docText = await reference.SourceSpan.Document.GetTextAsync(context.CancellationToken).ConfigureAwait(false); var classifiedText = new ClassifiedTextElement(classifiedSpans.Select(cspan => new ClassifiedTextRun(cspan.ClassificationType, docText.ToString(cspan.TextSpan)))); var locationWithText = new LSP.LocationWithText { Range = referenceLocation.Range, Uri = referenceLocation.Uri, Text = classifiedText }; locationWithTexts.Add(locationWithText); } referenceGroup.References = locationWithTexts.ToArrayAndFree(); referenceGroups.Add(referenceGroup); } return(referenceGroups.ToArrayAndFree()); }