diff --git a/src/Features/Core/Portable/AddParameter/AbstractAddParameterCodeFixProvider.cs b/src/Features/Core/Portable/AddParameter/AbstractAddParameterCodeFixProvider.cs index 19c8ada2341bef6903396c9f23ee400f0d7f276a..42126c1a5b856808de0d9515a0dd0a05c8269663 100644 --- a/src/Features/Core/Portable/AddParameter/AbstractAddParameterCodeFixProvider.cs +++ b/src/Features/Core/Portable/AddParameter/AbstractAddParameterCodeFixProvider.cs @@ -139,7 +139,8 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) var arguments = (SeparatedSyntaxList)syntaxFacts.GetArgumentsOfObjectCreationExpression(objectCreation); var methodCandidates = type.InstanceConstructors; - var insertionData = GetArgumentInsertPositionForMethodCandidates(argumentOpt, semanticModel, syntaxFacts, arguments, methodCandidates); + var insertionData = GetArgumentInsertPositionForMethodCandidates( + argumentOpt, semanticModel, syntaxFacts, arguments, methodCandidates); RegisterFixForMethodOverloads(context, arguments, insertionData); } @@ -206,12 +207,15 @@ private int NonParamsParameterCount(IMethodSymbol method) var title = GetCodeFixTitle(FeaturesResources.Add_parameter_to_0, methodToUpdate, parameters); var hasCascadingDeclarations = HasCascadingDeclarations(methodToUpdate); + var codeFixForDeclarationOnly = new MyCodeAction(title, + c => FixAsync(context.Document, methodToUpdate, argumentToInsert, arguments, fixAllReferences: false, c)); if (hasCascadingDeclarations) { - var titleForCascadingFix = GetCodeFixTitle(FeaturesResources.Add_parameter_to_0_including_overrides_implementations, methodToUpdate, parameters); + var titleForCascadingFix = GetCodeFixTitle( + FeaturesResources.Add_parameter_to_0_including_overrides_implementations, methodToUpdate, parameters); + context.RegisterCodeFix(new CodeAction.CodeActionWithNestedActions(title, ImmutableArray.Create( - new MyCodeAction(title, - c => FixAsync(context.Document, methodToUpdate, argumentToInsert, arguments, fixAllReferences: false, c)), + codeFixForDeclarationOnly, new MyCodeAction(titleForCascadingFix, c => FixAsync(context.Document, methodToUpdate, argumentToInsert, arguments, fixAllReferences: true, c))), isInlinable: true), @@ -220,8 +224,7 @@ private int NonParamsParameterCount(IMethodSymbol method) else { context.RegisterCodeFix( - new MyCodeAction(title, - c => FixAsync(context.Document, methodToUpdate, argumentToInsert, arguments, fixAllReferences: false, c)), + codeFixForDeclarationOnly, context.Diagnostics); } } @@ -293,17 +296,24 @@ private static string GetCodeFixTitle(string resourceString, IMethodSymbol metho { var solution = invocationDocument.Project.Solution; var argumentType = await GetArgumentTypeAsync(invocationDocument, argument, cancellationToken).ConfigureAwait(false); - // the argumentNameSuggestion is the base for the parameter name. For each method declaration the name is made unique to avoid name collisions. - var (argumentNameSuggestion, isNamedArgument) = await GetNameSuggestionForArgumentAsync(invocationDocument, argument, cancellationToken).ConfigureAwait(false); + + // The argumentNameSuggestion is the base for the parameter name. + // For each method declaration the name is made unique to avoid name collisions. + var (argumentNameSuggestion, isNamedArgument) = await GetNameSuggestionForArgumentAsync( + invocationDocument, argument, cancellationToken).ConfigureAwait(false); + var referencedSymbols = fixAllReferences ? await FindMethodDeclarationReferences(invocationDocument, method, cancellationToken).ConfigureAwait(false) : method.GetAllMethodSymbolsOfPartialParts(); - // TODO: Insert hint in the fix with a warning if anySymbolsReferenceNotInSource is true + var anySymbolReferencesNotInSource = referencedSymbols.Any(symbol => !symbol.IsFromSource()); var locationsInSource = referencedSymbols.Where(symbol => symbol.IsFromSource()); - // Indexing Locations[0] is valid because IMethodSymbols have one location at most and IsFromSource() tests if there is at least one location. + + // Indexing Locations[0] is valid because IMethodSymbols have one location at most + // and IsFromSource() tests if there is at least one location. var locationsByDocument = locationsInSource.ToLookup(declarationLocation => solution.GetDocument(declarationLocation.Locations[0].SourceTree)); + foreach (var documentLookup in locationsByDocument) { var document = documentLookup.Key;