Exemple #1
0
        public static async Task <QuickInfoItem> CreateQuickInfoItemAsync(
            Workspace workspace,
            SemanticModel semanticModel,
            TextSpan span,
            ImmutableArray <ISymbol> symbols,
            SupportedPlatformData?supportedPlatforms,
            bool showAwaitReturn,
            NullableFlowState flowState,
            CancellationToken cancellationToken
            )
        {
            var descriptionService = workspace.Services
                                     .GetLanguageServices(semanticModel.Language)
                                     .GetRequiredService <ISymbolDisplayService>();
            var groups = await descriptionService
                         .ToDescriptionGroupsAsync(
                workspace,
                semanticModel,
                span.Start,
                symbols,
                cancellationToken
                )
                         .ConfigureAwait(false);

            using var _1 = ArrayBuilder <QuickInfoSection> .GetInstance(out var sections);

            var symbol = symbols.First();

            if (showAwaitReturn)
            {
                // We show a special message if the Task being awaited has no return
                if (symbol is INamedTypeSymbol {
                    SpecialType : SpecialType.System_Void
                })
Exemple #2
0
 public static CompletionItem CreateSymbolCompletionItem(
     string displayText,
     IReadOnlyList <ISymbol> symbols,
     CompletionItemRules rules,
     int contextPosition,
     string?sortText      = null,
     string?insertionText = null,
     string?filterText    = null,
     SupportedPlatformData?supportedPlatforms        = null,
     ImmutableDictionary <string, string>?properties = null,
     ImmutableArray <string> tags = default
     ) =>
 SymbolCompletionItem.CreateWithSymbolId(
     displayText,
     displayTextSuffix: null,
     symbols,
     rules,
     contextPosition,
     sortText,
     insertionText,
     filterText,
     displayTextPrefix: null,
     inlineDescription: null,
     glyph: null,
     supportedPlatforms,
     properties,
     tags
     );
        private static CompletionItem CreateWorker(
            string displayText,
            string?displayTextSuffix,
            IReadOnlyList <ISymbol> symbols,
            CompletionItemRules rules,
            int contextPosition,
            Func <IReadOnlyList <ISymbol>, CompletionItem, CompletionItem> symbolEncoder,
            string?sortText      = null,
            string?insertionText = null,
            string?filterText    = null,
            SupportedPlatformData?supportedPlatforms        = null,
            ImmutableDictionary <string, string>?properties = null,
            ImmutableArray <string> tags = default,
            string?displayTextPrefix     = null,
            string?inlineDescription     = null,
            Glyph?glyph            = null,
            bool isComplexTextEdit = false)
        {
            var props = properties ?? ImmutableDictionary <string, string> .Empty;

            if (insertionText != null)
            {
                props = props.Add(InsertionTextProperty, insertionText);
            }

            props = props.Add("ContextPosition", contextPosition.ToString());

            var firstSymbol = symbols[0];
            var item        = CommonCompletionItem.Create(
                displayText: displayText,
                displayTextSuffix: displayTextSuffix,
                displayTextPrefix: displayTextPrefix,
                inlineDescription: inlineDescription,
                rules: rules,
                filterText: filterText ?? (displayText.Length > 0 && displayText[0] == '@' ? displayText : firstSymbol.Name),
                sortText: sortText ?? firstSymbol.Name,
                glyph: glyph ?? firstSymbol.GetGlyph(),
                showsWarningIcon: supportedPlatforms != null,
                properties: props,
                tags: tags,
                isComplexTextEdit: isComplexTextEdit);

            item = WithSupportedPlatforms(item, supportedPlatforms);
            return(symbolEncoder(symbols, item));
        }
Exemple #4
0
        protected override CompletionItem CreateItem(
            CompletionContext completionContext,
            string displayText,
            string displayTextSuffix,
            string insertionText,
            List <ISymbol> symbols,
            SyntaxContext context,
            bool preselect,
            SupportedPlatformData?supportedPlatformData)
        {
            var rules         = GetCompletionItemRules(symbols, context, preselect);
            var matchPriority = preselect ? ComputeSymbolMatchPriority(symbols[0]) : MatchPriority.Default;

            rules = rules.WithMatchPriority(matchPriority);

            if (ShouldSoftSelectInArgumentList(completionContext, context, preselect))
            {
                rules = rules.WithSelectionBehavior(CompletionItemSelectionBehavior.SoftSelection);
            }
            else if (context.IsRightSideOfNumericType)
            {
                rules = rules.WithSelectionBehavior(CompletionItemSelectionBehavior.SoftSelection);
            }
            else if (preselect)
            {
                rules = rules.WithSelectionBehavior(PreselectedItemSelectionBehavior);
            }

            return(SymbolCompletionItem.CreateWithNameAndKind(
                       displayText: displayText,
                       displayTextSuffix: displayTextSuffix,
                       symbols: symbols,
                       rules: rules,
                       contextPosition: context.Position,
                       insertionText: insertionText,
                       filterText: GetFilterText(symbols[0], displayText, context),
                       supportedPlatforms: supportedPlatformData));
        }
 public static CompletionItem CreateWithNameAndKind(
     string displayText,
     string displayTextSuffix,
     IReadOnlyList <ISymbol> symbols,
     CompletionItemRules rules,
     int contextPosition,
     string?sortText          = null,
     string?insertionText     = null,
     string?filterText        = null,
     string?displayTextPrefix = null,
     string?inlineDescription = null,
     Glyph?glyph = null,
     SupportedPlatformData?supportedPlatforms        = null,
     ImmutableDictionary <string, string>?properties = null,
     ImmutableArray <string> tags = default,
     bool isComplexTextEdit       = false)
 {
     return(CreateWorker(
                displayText, displayTextSuffix, symbols, rules, contextPosition,
                s_addSymbolInfo, sortText, insertionText,
                filterText, supportedPlatforms, properties, tags,
                displayTextPrefix, inlineDescription, glyph, isComplexTextEdit));
 }
 private static CompletionItem WithSupportedPlatforms(CompletionItem completionItem, SupportedPlatformData?supportedPlatforms)
 {
     if (supportedPlatforms != null)
     {
         return(completionItem
                .AddProperty("InvalidProjects", string.Join(";", supportedPlatforms.InvalidProjects.Select(id => id.Id)))
                .AddProperty("CandidateProjects", string.Join(";", supportedPlatforms.CandidateProjects.Select(id => id.Id))));
     }
     else
     {
         return(completionItem);
     }
 }
        private static Document FindAppropriateDocumentForDescriptionContext(Document document, SupportedPlatformData?supportedPlatforms)
        {
            if (supportedPlatforms != null && supportedPlatforms.InvalidProjects.Contains(document.Id.ProjectId))
            {
                var contextId = document.GetLinkedDocumentIds().FirstOrDefault(id => !supportedPlatforms.InvalidProjects.Contains(id.ProjectId));
                if (contextId != null)
                {
                    return(document.Project.Solution.GetRequiredDocument(contextId));
                }
            }

            return(document);
        }
Exemple #8
0
        public static Task <CompletionDescription> CreateDescriptionAsync(
            HostSolutionServices workspaceServices, SemanticModel semanticModel, int position, IReadOnlyList <ISymbol> symbols, SymbolDescriptionOptions options, SupportedPlatformData?supportedPlatforms, CancellationToken cancellationToken)
        {
            // Lets try to find the first non-obsolete symbol (overload) and fall-back
            // to the first symbol if all are obsolete.
            var symbol = symbols.FirstOrDefault(s => !s.IsObsolete()) ?? symbols[0];

            return(CreateDescriptionAsync(workspaceServices, semanticModel, position, symbol, overloadCount: symbols.Count - 1, options, supportedPlatforms, cancellationToken));
        }
Exemple #9
0
        public static async Task <CompletionDescription> CreateDescriptionAsync(
            HostSolutionServices workspaceServices, SemanticModel semanticModel, int position, ISymbol symbol, int overloadCount, SymbolDescriptionOptions options, SupportedPlatformData?supportedPlatforms, CancellationToken cancellationToken)
        {
            var symbolDisplayService = workspaceServices.GetRequiredLanguageService <ISymbolDisplayService>(semanticModel.Language);
            var formatter            = workspaceServices.GetRequiredLanguageService <IDocumentationCommentFormattingService>(semanticModel.Language);

            // TODO(cyrusn): Figure out a way to cancel this.
            var sections = await symbolDisplayService.ToDescriptionGroupsAsync(semanticModel, position, ImmutableArray.Create(symbol), options, cancellationToken).ConfigureAwait(false);

            if (!sections.ContainsKey(SymbolDescriptionGroups.MainDescription))
            {
                return(CompletionDescription.Empty);
            }

            var textContentBuilder = new List <TaggedText>();

            textContentBuilder.AddRange(sections[SymbolDescriptionGroups.MainDescription]);

            switch (symbol.Kind)
            {
            case SymbolKind.Method:
            case SymbolKind.Property:
            case SymbolKind.NamedType:
                if (overloadCount > 0)
                {
                    var isGeneric = symbol.GetArity() > 0;

                    textContentBuilder.AddSpace();
                    textContentBuilder.AddPunctuation("(");
                    textContentBuilder.AddPunctuation("+");
                    textContentBuilder.AddText(NonBreakingSpaceString + overloadCount.ToString());

                    AddOverloadPart(textContentBuilder, overloadCount, isGeneric);

                    textContentBuilder.AddPunctuation(")");
                }

                break;
            }

            AddDocumentationPart(textContentBuilder, symbol, semanticModel, position, formatter, cancellationToken);

            if (sections.TryGetValue(SymbolDescriptionGroups.AwaitableUsageText, out var parts))
            {
                textContentBuilder.AddRange(parts);
            }

            if (sections.TryGetValue(SymbolDescriptionGroups.StructuralTypes, out parts))
            {
                if (!parts.IsDefaultOrEmpty)
                {
                    textContentBuilder.AddLineBreak();
                    textContentBuilder.AddLineBreak();
                    textContentBuilder.AddRange(parts);
                }
            }

            if (supportedPlatforms != null)
            {
                textContentBuilder.AddLineBreak();
                textContentBuilder.AddRange(supportedPlatforms.ToDisplayParts().ToTaggedText());
            }

            return(CompletionDescription.Create(textContentBuilder.AsImmutable()));
        }