public override async Task ProvideCompletionsAsync(CompletionContext context) { try { if (!context.Document.SupportsSemanticModel || !context.Document.SupportsSyntaxTree) { return; } var hasNSubstituteReferenced = context.Document.Project.MetadataReferences.Any(r => r.Display.Contains(this._provider.AssemblyName)); if (!hasNSubstituteReferenced) { return; } var syntaxRoot = await context.Document.GetSyntaxRootAsync(); var token = SyntaxHelpers.GetSelectedTokens(syntaxRoot, context.Position); // Not in an opened method if (token.Parent == null) { return; } var mockedMethodArgumentList = token.Parent as ArgumentListSyntax; var mockedMethodInvocation = mockedMethodArgumentList.Ancestors() .OfType <InvocationExpressionSyntax>() .FirstOrDefault(); if (mockedMethodInvocation == null) { return; } var semanticModel = await context.Document.GetSemanticModelAsync(); var matchingMockedMethods = SyntaxHelpers.GetCandidatesMockedMethodSignatures(semanticModel, mockedMethodInvocation); var completionService = new CompletionService(context, token, semanticModel, this._provider); foreach (IMethodSymbol matchingMockedMethodSymbol in matchingMockedMethods) { completionService.AddSuggestionsForMethod(matchingMockedMethodSymbol, mockedMethodArgumentList); } } catch { } }