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 })
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)); }
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); }
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)); }
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())); }