public static bool TryGetInsertionText(CompletionItem item, [NotNullWhen(true)] out string?insertionText)
 => SymbolCompletionItem.TryGetInsertionText(item, out insertionText);
Exemple #2
0
            static async Task <TCompletionItem> CreateCompletionItemAsync <TCompletionItem>(
                LSP.CompletionParams request,
                Document document,
                CompletionItem item,
                CompletionResolveData?completionResolveData,
                bool supportsVSExtensions,
                Dictionary <ImmutableArray <CharacterSetModificationRule>, string[]> commitCharacterRulesCache,
                CompletionService completionService,
                string?clientName,
                bool returnTextEdits,
                bool snippetsSupported,
                StringBuilder stringBuilder,
                SourceText?documentText,
                TextSpan?defaultSpan,
                LSP.Range?defaultRange,
                CancellationToken cancellationToken) where TCompletionItem : LSP.CompletionItem, new()
            {
                // Generate display text
                stringBuilder.Append(item.DisplayTextPrefix);
                stringBuilder.Append(item.DisplayText);
                stringBuilder.Append(item.DisplayTextSuffix);
                var completeDisplayText = stringBuilder.ToString();

                stringBuilder.Clear();

                var completionItem = new TCompletionItem
                {
                    Label      = completeDisplayText,
                    SortText   = item.SortText,
                    FilterText = item.FilterText,
                    Kind       = GetCompletionKind(item.Tags),
                    Data       = completionResolveData,
                    Preselect  = ShouldItemBePreselected(item),
                };

                // Complex text edits (e.g. override and partial method completions) are always populated in the
                // resolve handler, so we leave both TextEdit and InsertText unpopulated in these cases.
                if (item.IsComplexTextEdit)
                {
                    // Razor C# is currently the only language client that supports LSP.InsertTextFormat.Snippet.
                    // We can enable it for regular C# once LSP is used for local completion.
                    if (snippetsSupported)
                    {
                        completionItem.InsertTextFormat = LSP.InsertTextFormat.Snippet;
                    }
                }
                // If the feature flag is on, always return a TextEdit.
                else if (returnTextEdits)
                {
                    var textEdit = await GenerateTextEdit(
                        document, item, completionService, documentText, defaultSpan, defaultRange, cancellationToken).ConfigureAwait(false);

                    completionItem.TextEdit = textEdit;
                }
                // If the feature flag is off, return an InsertText.
                else
                {
                    completionItem.InsertText = SymbolCompletionItem.TryGetInsertionText(item, out var insertionText) ? insertionText : completeDisplayText;
                }

                var commitCharacters = GetCommitCharacters(item, commitCharacterRulesCache, supportsVSExtensions);

                if (commitCharacters != null)
                {
                    completionItem.CommitCharacters = commitCharacters;
                }

                return(completionItem);