diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2018-02-23 14:32:42 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-23 14:32:42 +0300 |
commit | 585ff30adb47745c120ab3980ca8a373bcfbf2b2 (patch) | |
tree | 39b6244de24d15405be4ce6f7fe23d2fca0db91e | |
parent | 21178cdd45b363a3c726f795f2d4687bdf477aee (diff) | |
parent | 2c2bb96ef6c5b628f15a087ac7d98ad04df7fa70 (diff) |
Merge pull request #3939 from mono/master-fix569951
Fixed VSTS 569951: Method description is not displayed for code
2 files changed, 68 insertions, 6 deletions
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CompletionProvider/ProtocolMemberCompletionProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CompletionProvider/ProtocolMemberCompletionProvider.cs index 3907ae0484..c54a3274d7 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CompletionProvider/ProtocolMemberCompletionProvider.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/CompletionProvider/ProtocolMemberCompletionProvider.cs @@ -37,15 +37,18 @@ using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Text; +using Microsoft.CodeAnalysis.LanguageServices; using MonoDevelop.Core; using MonoDevelop.CSharp.Refactoring; using MonoDevelop.Ide; using MonoDevelop.Ide.TypeSystem; +using System.Text; +using Microsoft.CodeAnalysis.DocumentationComments; namespace MonoDevelop.CSharp.Completion.Provider { [ExportCompletionProvider ("ProtocolMemberCompletionProvider", LanguageNames.CSharp)] - class ProtocolMemberCompletionProvider : CommonCompletionProvider + class ProtocolMemberCompletionProvider : CompletionProvider { public override async Task ProvideCompletionsAsync (Microsoft.CodeAnalysis.Completion.CompletionContext context) { @@ -111,7 +114,7 @@ namespace MonoDevelop.CSharp.Completion.Provider } - protected void CreateCompletionData (CompletionContext context, SemanticModel semanticModel, int position, ITypeSymbol returnType, Accessibility seenAccessibility, SyntaxToken startToken, SyntaxToken tokenBeforeReturnType, bool afterKeyword, CancellationToken cancellationToken) + protected async void CreateCompletionData (CompletionContext context, SemanticModel semanticModel, int position, ITypeSymbol returnType, Accessibility seenAccessibility, SyntaxToken startToken, SyntaxToken tokenBeforeReturnType, bool afterKeyword, CancellationToken cancellationToken) { if (!TryDetermineOverridableProtocolMembers (semanticModel, tokenBeforeReturnType, seenAccessibility, out ISet<ISymbol> overridableMembers, cancellationToken)) { return; @@ -144,18 +147,72 @@ namespace MonoDevelop.CSharp.Completion.Provider var lastRegion = result.BodyRegions.LastOrDefault (); var region = lastRegion == null ? null : new CodeGeneratorBodyRegion (lastRegion.StartOffset - trimStart, lastRegion.EndOffset - trimStart); - + pDict = pDict.Add ("InsertionText", sb.ToString ()); - pDict = pDict.Add ("DescriptionMarkup", "- <span foreground=\"darkgray\" size='small'>" + GettextCatalog.GetString("Implement protocol member") + "</span>"); + pDict = pDict.Add ("DescriptionMarkup", "- <span foreground=\"darkgray\" size='small'>" + GettextCatalog.GetString ("Implement protocol member") + "</span>"); + pDict = pDict.Add ("Description", await GenerateQuickInfo (semanticModel, position, m, cancellationToken)); + var tags = ImmutableArray<string>.Empty.Add ("NewMethod"); var completionData = CompletionItem.Create (m.Name, properties: pDict, rules: ProtocolCompletionRules, tags: tags); context.AddItem (completionData); } } + static async Task<string> GenerateQuickInfo (SemanticModel semanticModel, int position, ISymbol m, CancellationToken cancellationToken) + { + var ws = IdeApp.Workbench.ActiveDocument.RoslynWorkspace; + + var displayService = ws.Services.GetLanguageServices (LanguageNames.CSharp).GetService<ISymbolDisplayService> (); + + var sections = await displayService.ToDescriptionGroupsAsync (ws, semanticModel, position, new [] { m }.AsImmutable (), default (CancellationToken)).ConfigureAwait (false); + ImmutableArray<TaggedText> parts; + + var description = new StringBuilder (); + description.Append ("Text|"); + description.AppendLine (GettextCatalog.GetString ("Creates an implementation for:")); + description.AppendLine (); + foreach (var sect in sections) { + if (sections.TryGetValue (SymbolDescriptionGroups.MainDescription, out parts)) { + foreach (var part in parts) { + description.Append ("|"); + description.Append (part.Tag); + description.Append ("|"); + description.Append (part.Text); + } + } + } + var formatter = ws.Services.GetLanguageServices (LanguageNames.CSharp).GetService<IDocumentationCommentFormattingService> (); + + var documentation = m.GetDocumentationParts (semanticModel, position, formatter, cancellationToken); + + if (documentation != null && documentation.Any ()) { + description.Append ("|LineBreak|\n|LineBreak|\n"); + + foreach (var part in documentation) { + description.Append ("|"); + description.Append (part.Tag); + description.Append ("|"); + description.Append (part.Text); + } + } + return description.ToString (); + } + static CompletionItemRules ProtocolCompletionRules = CompletionItemRules.Create (formatOnCommit: true); - protected override Task<TextChange?> GetTextChangeAsync (CompletionItem selectedItem, char? ch, CancellationToken cancellationToken) + public override async Task<CompletionChange> GetChangeAsync (Document document, CompletionItem item, char? commitKey, CancellationToken cancellationToken) + { + var change = (await GetTextChangeAsync (document, item, commitKey, cancellationToken).ConfigureAwait (false)) + ?? new TextChange (item.Span, item.DisplayText); + return CompletionChange.Create (change); + } + + public virtual Task<TextChange?> GetTextChangeAsync (Document document, CompletionItem selectedItem, char? ch, CancellationToken cancellationToken) + { + return GetTextChangeAsync (selectedItem, ch, cancellationToken); + } + + Task<TextChange?> GetTextChangeAsync (CompletionItem selectedItem, char? ch, CancellationToken cancellationToken) { var text = Microsoft.CodeAnalysis.Completion.Providers.SymbolCompletionItem.GetInsertionText (selectedItem); return Task.FromResult<TextChange?> (new TextChange (new TextSpan (selectedItem.Span.Start, selectedItem.Span.Length), text)); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/RoslynCompletionData.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/RoslynCompletionData.cs index cb3c9da9ff..ff0978a2a9 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/RoslynCompletionData.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/RoslynCompletionData.cs @@ -273,7 +273,12 @@ namespace MonoDevelop.Ide.CodeCompletion public override async Task<TooltipInformation> CreateTooltipInformation (bool smartWrap, CancellationToken cancelToken) { - var description = await Task.Run (() => completionService.GetDescriptionAsync (doc, CompletionItem)).ConfigureAwait (false); + CompletionDescription description; + if (CommonCompletionItem.HasDescription (CompletionItem)) { + description = CommonCompletionItem.GetDescription (CompletionItem); + } else { + description = await Task.Run (() => completionService.GetDescriptionAsync (doc, CompletionItem)).ConfigureAwait (false); + } var markup = new StringBuilder (); var theme = SyntaxHighlightingService.GetIdeFittingTheme (DefaultSourceEditorOptions.Instance.GetEditorTheme ()); var taggedParts = description.TaggedParts; |