private async Task CreateSpellCheckCodeIssueAsync(CodeFixContext context, TSimpleName nameNode, string nameText, CancellationToken cancellationToken) { var document = context.Document; var completionList = await CompletionService.GetCompletionListAsync( document, nameNode.SpanStart, CompletionTriggerInfo.CreateInvokeCompletionTriggerInfo(), cancellationToken : cancellationToken).ConfigureAwait(false); if (completionList == null) { return; } var completionRules = CompletionService.GetCompletionRules(document); var onlyConsiderGenerics = IsGeneric(nameNode); var results = new MultiDictionary <double, string>(); using (var similarityChecker = new WordSimilarityChecker(nameText, substringsAreSimilar: true)) { foreach (var item in completionList.Items) { if (onlyConsiderGenerics && !IsGeneric(item)) { continue; } var candidateText = item.FilterText; double matchCost; if (!similarityChecker.AreSimilar(candidateText, out matchCost)) { continue; } var insertionText = completionRules.GetTextChange(item).NewText; results.Add(matchCost, insertionText); } } var matches = results.OrderBy(kvp => kvp.Key) .SelectMany(kvp => kvp.Value.Order()) .Where(t => t != nameText) .Take(3) .Select(n => CreateCodeAction(nameNode, nameText, n, document)); context.RegisterFixes(matches, context.Diagnostics); }