Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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.")
     })));
 }
Exemplo n.º 5
0
        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()))));
        }
Exemplo n.º 7
0
        /// <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)
            }))));
        }
Exemplo n.º 8
0
        // Метод, определяющий, какой текст подсказки (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);
        }
Exemplo n.º 10
0
        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));
        }
Exemplo n.º 12
0
 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;
            }
        }
Exemplo n.º 14
0
 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"]));
Exemplo n.º 17
0
 public override async Task <CompletionDescription> GetDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken)
 {
     return(CompletionDescription.FromText(item.DisplayText + "Description"));
 }