protected override async Task <CompletionDescription> GetDescriptionWorkerAsync(Document document, CompletionItem item, CancellationToken cancellationToken) { var lspClient = _roslynLspClientServiceFactory.ActiveLanguageServerClient; if (lspClient == null) { return(await base.GetDescriptionWorkerAsync(document, item, cancellationToken).ConfigureAwait(false)); } if (!item.Properties.TryGetValue("ResolveData", out var serializedItem)) { return(await base.GetDescriptionWorkerAsync(document, item, cancellationToken).ConfigureAwait(false)); } var completionItem = JToken.Parse(serializedItem).ToObject <RoslynCompletionItem>(); var request = new LspRequest <RoslynCompletionItem, RoslynCompletionItem>(LSP.Methods.TextDocumentCompletionResolveName); var resolvedCompletionItem = await lspClient.RequestAsync(request, completionItem, cancellationToken).ConfigureAwait(false); if (resolvedCompletionItem?.Description == null) { return(await base.GetDescriptionWorkerAsync(document, item, cancellationToken).ConfigureAwait(false)); } var parts = resolvedCompletionItem.Description.Select(tt => tt.ToTaggedText()).AsImmutable(); return(CompletionDescription.Create(parts)); }
KeyValuePair <int, int>?GetMatchIndexes(RoslynCompletion completion, CompletionDescription description) { if (completion == null || description == null) { return(null); } if (stringBuilder == null) { stringBuilder = new StringBuilder(); } else { stringBuilder.Clear(); } var displayText = completion.DisplayText; int matchIndex = -1; int index = -1; foreach (var part in description.TaggedParts) { index++; if (part.Tag == TextTags.LineBreak) { break; } if (matchIndex < 0) { if (!displayText.StartsWith(part.Text)) { continue; } matchIndex = index; } else { if (!StartsWith(displayText, stringBuilder.Length, part.Text)) { // Partial match, could happen if the type is System.Collections.Generic.List<int> but // the documentation is using System.Collections.Generic.List<T>. return(new KeyValuePair <int, int>(matchIndex, index - 1)); } } stringBuilder.Append(part.Text); if (stringBuilder.Length == displayText.Length) { if (stringBuilder.ToString() == completion.DisplayText) { return(new KeyValuePair <int, int>(matchIndex, index)); } break; } else if (stringBuilder.Length > displayText.Length) { break; } } return(null); }
public override Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken) { if (!item.Tags.Contains(nameof(CustomDelegateCompletion))) { return(base.GetDescriptionAsync(document, item, cancellationToken)); } return(Task.FromResult(CompletionDescription.FromText(ThisAssembly.Strings.CustomDelegateCompletion.Description))); }
public override async Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken) { return(CompletionDescription.Create(ImmutableArray.Create(new TaggedText[] { new TaggedText(TextTags.Text, "Just a shortcut for the "), new TaggedText(TextTags.Class, "Task"), new TaggedText(TextTags.Method, ".ConfigureAwait"), new TaggedText(TextTags.Text, " method.") }))); }
public override Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken) { if (!item.Properties.TryGetValue(DescriptionKey, out var description)) { return(SpecializedTasks.Default <CompletionDescription>()); } return(Task.FromResult(CompletionDescription.Create( ImmutableArray.Create(new TaggedText(TextTags.Text, description))))); }
public override Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken) { List <TaggedText> taggedTexts = new List <TaggedText>(); for (int i = 1; i < item.Tags.Length; i = 2 + i) { taggedTexts.Add(new TaggedText(item.Tags[i], item.Tags[i + 1])); } return(Task.FromResult(CompletionDescription.Create(ImmutableArray.Create(taggedTexts.ToArray())))); }
/// <inheritdoc /> public override Task <CompletionDescription> GetDescriptionAsync( Document document, CompletionItem item, CancellationToken cancellationToken) { if (!item.Properties.TryGetValue(nameof(CommentsElement.Description), out string description)) { return(Task.FromResult(CompletionDescription.Empty)); } return(Task.FromResult(CompletionDescription.Create(ImmutableArray.Create(new TaggedText[] { new TaggedText(TextTags.Text, description) })))); }
// Метод, определяющий, какой текст подсказки (hint) показывать для пункта IntelliSense public override Task <CompletionDescription> GetDescriptionAsync( Document document, CompletionItem item, CancellationToken cancellationToken) { // Добываем ранее записанный в метаинформацию XML-комментарий if (item.Properties.TryGetValue("comment", out string comment) && !String.IsNullOrWhiteSpace(comment)) { // Достаём содержимое тега <summary> и возвращаем его как подсказку string summary = XDocument.Parse(comment).Descendants("summary").FirstOrDefault()?.Value; if (!String.IsNullOrWhiteSpace(summary)) { return(Task.FromResult(CompletionDescription.FromText(summary))); } } return(base.GetDescriptionAsync(document, item, cancellationToken)); }
async Task GetSymbolComments(CompletionItem item) { await UpdateScrollViewer(); CompletionDescription description = await CompletionService.GetDescriptionAsync(Document, item); SourceText currText = await Document.GetTextAsync(); SourceText newText = currText.Replace(item.Span, item.DisplayText); SyntaxTree tree = await Document.WithText(newText).GetSyntaxTreeAsync(); CSharpCompilation comp = CSharpCompilation.Create("documentation", new[] { tree }, References); SemanticModel model = comp.GetSemanticModel(tree); TextSpan targetSpan = new TextSpan(item.Span.Start, item.DisplayText.Length); string documentationXml = ""; IEnumerable <SyntaxNode> nodes = tree.GetRoot().DescendantNodes(targetSpan); if (nodes.Any()) { SyntaxNode node = nodes.FirstOrDefault(n => (targetSpan.Contains(n.Span) && !n.IsKind(SyntaxKind.IncompleteMember))); if (node != null) { SymbolInfo info = model.GetSymbolInfo(node); ISymbol symbol = info.Symbol ?? (info.CandidateSymbols.Length > 0 ? info.CandidateSymbols[0] : null); if (symbol != null) { string documentationId = symbol.GetDocumentationCommentId(); documentationXml = symbol.GetDocumentationCommentXml(); if (string.IsNullOrEmpty(documentationXml) && !string.IsNullOrEmpty(documentationId)) { (await Utils.GetReferenceDocumentation()).TryGetValue(documentationId, out documentationXml); } } } } ShowDocumentationComments(description, documentationXml, EffectiveSelectedIndex * 20 - this.FindControl <ScrollViewer>("ItemsScrollViewer").Offset.Y); }
KeyValuePair <int, int>?GetMatchIndexes(RoslynCompletion completion, CompletionDescription description) { if (stringBuilder == null) { stringBuilder = new StringBuilder(); } else { stringBuilder.Clear(); } var displayText = completion.DisplayText; int matchIndex = -1; int index = -1; foreach (var part in description.TaggedParts) { index++; if (part.Tag == TextTags.LineBreak) { break; } if (matchIndex < 0) { if (!displayText.StartsWith(part.Text)) { continue; } matchIndex = index; } stringBuilder.Append(part.Text); if (stringBuilder.Length == displayText.Length) { if (stringBuilder.ToString() == completion.DisplayText) { return(new KeyValuePair <int, int>(matchIndex, index)); } break; } else if (stringBuilder.Length > displayText.Length) { break; } } return(null); }
public override Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken) { if (document == null) { throw new ArgumentNullException(nameof(document)); } if (item == null) { throw new ArgumentNullException(nameof(item)); } var descriptionContent = new List <TaggedText>(); if (item.Properties.TryGetValue(DescriptionKey, out var directiveDescription)) { var descriptionText = new TaggedText(TextTags.Text, directiveDescription); descriptionContent.Add(descriptionText); } var completionDescription = CompletionDescription.Create(descriptionContent.ToImmutableArray()); return(Task.FromResult(completionDescription)); }
object CreateContent(CompletionDescription description) { using (var elemProvider = taggedTextElementProviderService.Create(owner.contentType, AppearanceCategoryConstants.UIMisc)) return(elemProvider.Create(string.Empty, description.TaggedParts, colorize)); }
private void ShowDocumentationComments(CompletionDescription description, string documentationXml, double offset) { if (string.IsNullOrEmpty(description.Text) && string.IsNullOrEmpty(documentationXml)) { this.FindControl <Border>("DocumentationBorder").IsVisible = false; } else { VectSharp.Font labelFont = new VectSharp.Font(Editor.OpenSansRegular, this.FontSize); VectSharp.Font codeFont = new VectSharp.Font(Editor.RobotoMonoRegular, this.FontSize); double thisX = 0; double thisY = 0; if (this.RenderTransform != null) { thisY = ((TranslateTransform)this.RenderTransform).Y; thisX = ((TranslateTransform)this.RenderTransform).X; } double maxHeight = this.Parent.Bounds.Height - thisY - offset - 10 - 20; double maxWidthRight = this.Parent.Bounds.Width - thisX - this.Width - 12; double maxWidthLeft = thisX - 12; Control unlimitedContent = FormattedText.FormatDescription(description.TaggedParts, documentationXml, labelFont, codeFont).Render(double.PositiveInfinity, false); unlimitedContent.HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Left; unlimitedContent.VerticalAlignment = Avalonia.Layout.VerticalAlignment.Top; if (unlimitedContent.Width < maxWidthRight) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").Content = unlimitedContent; this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <Border>("DocumentationBorder").Height = Math.Min(maxHeight, unlimitedContent.Height + 4); if (unlimitedContent.Height + 4 > maxHeight) { this.FindControl <Border>("DocumentationBorder").Width = unlimitedContent.Width + 12 + 20; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Visible; } else { this.FindControl <Border>("DocumentationBorder").Width = unlimitedContent.Width + 12; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; } this.FindControl <Border>("DocumentationBorder").RenderTransform = new TranslateTransform() { X = this.Width, Y = offset }; } else if (unlimitedContent.Width < maxWidthLeft) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").Content = unlimitedContent; this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <Border>("DocumentationBorder").Height = Math.Min(maxHeight, unlimitedContent.Height + 4); if (unlimitedContent.Height + 4 > maxHeight) { this.FindControl <Border>("DocumentationBorder").Width = unlimitedContent.Width + 12 + 20; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Visible; } else { this.FindControl <Border>("DocumentationBorder").Width = unlimitedContent.Width + 12; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; } this.FindControl <Border>("DocumentationBorder").RenderTransform = new TranslateTransform() { X = -this.FindControl <Border>("DocumentationBorder").Width, Y = offset }; } else if (maxWidthRight >= maxWidthLeft) { Control content = FormattedText.FormatDescription(description.TaggedParts, documentationXml, labelFont, codeFont).Render(maxWidthRight - 20 - 12, false); content.HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Left; content.VerticalAlignment = Avalonia.Layout.VerticalAlignment.Top; this.FindControl <ScrollViewer>("DocumentationScrollViewer").Content = content; if (content.Width + 12 <= maxWidthRight && content.Height + 4 <= maxHeight) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <Border>("DocumentationBorder").Width = content.Width + 12; this.FindControl <Border>("DocumentationBorder").Height = content.Height + 4; } else if (content.Width + 12 + 20 <= maxWidthRight && content.Height + 4 > maxHeight) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <Border>("DocumentationBorder").Width = content.Width + 12 + 20; this.FindControl <Border>("DocumentationBorder").Height = maxHeight + (shifterY *= -1); } else if (content.Width + 12 > maxWidthRight && content.Height + 4 + 20 <= maxHeight) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <Border>("DocumentationBorder").Width = maxWidthRight + (shifterX *= -1); this.FindControl <Border>("DocumentationBorder").Height = content.Height + 4 + 20; } else { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <Border>("DocumentationBorder").Width = maxWidthRight + (shifterX *= -1); this.FindControl <Border>("DocumentationBorder").Height = maxHeight + (shifterY *= -1); } this.FindControl <Border>("DocumentationBorder").RenderTransform = new TranslateTransform() { X = this.Width, Y = offset }; } else { Control content = FormattedText.FormatDescription(description.TaggedParts, documentationXml, labelFont, codeFont).Render(maxWidthLeft - 20 - 12, false); content.HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Left; content.VerticalAlignment = Avalonia.Layout.VerticalAlignment.Top; this.FindControl <ScrollViewer>("DocumentationScrollViewer").Content = content; if (content.Width + 12 <= maxWidthLeft && content.Height + 4 <= maxHeight) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <Border>("DocumentationBorder").Width = content.Width + 12; this.FindControl <Border>("DocumentationBorder").Height = content.Height + 4; } else if (content.Width + 12 + 20 <= maxWidthLeft && content.Height + 4 > maxHeight) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <Border>("DocumentationBorder").Width = content.Width + 12 + 20; this.FindControl <Border>("DocumentationBorder").Height = maxHeight + (shifterY *= -1); } else if (content.Width + 12 > maxWidthLeft && content.Height + 4 + 20 <= maxHeight) { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; this.FindControl <Border>("DocumentationBorder").Width = maxWidthLeft + (shifterX *= -1); this.FindControl <Border>("DocumentationBorder").Height = content.Height + 4 + 20; } else { this.FindControl <ScrollViewer>("DocumentationScrollViewer").HorizontalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <ScrollViewer>("DocumentationScrollViewer").VerticalScrollBarVisibility = ScrollBarVisibility.Visible; this.FindControl <Border>("DocumentationBorder").Width = maxWidthLeft + (shifterX *= -1); this.FindControl <Border>("DocumentationBorder").Height = maxHeight + (shifterY *= -1); } this.FindControl <Border>("DocumentationBorder").RenderTransform = new TranslateTransform() { X = -this.FindControl <Border>("DocumentationBorder").Width, Y = offset }; } this.FindControl <Border>("DocumentationBorder").IsVisible = true; } }
protected virtual CompletionDescription UpdateDescription(CompletionDescription completionDescription) => completionDescription;
object CreateContent(CompletionDescription description) { using (var elemProvider = taggedTextElementProviderService.Create(GetClassifiers(), AppearanceCategoryConstants.CodeCompletionToolTip)) return(elemProvider.Create(description.TaggedParts)); }
public override Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken) => Task.FromResult(CompletionDescription.FromText(item.Properties["Summary"]));
public override async Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken) { return(CompletionDescription.FromText(item.DisplayText + "Description")); }