private IEnumerable <IGrouping <SyntaxNode, Diagnostic> > GetDiagnosticsGroupedByMember( ImmutableArray <Diagnostic> diagnostics, ISyntaxFactsService syntaxFacts, SyntaxNode root, out string diagnosticId, out UnusedValuePreference preference, out bool removeAssignments) { diagnosticId = diagnostics[0].Id; var success = AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.TryGetUnusedValuePreference(diagnostics[0], out preference); Debug.Assert(success); removeAssignments = AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.GetIsRemovableAssignmentDiagnostic(diagnostics[0]); #if DEBUG foreach (var diagnostic in diagnostics) { Debug.Assert(diagnosticId == diagnostic.Id); Debug.Assert(AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.TryGetUnusedValuePreference(diagnostic, out var diagnosticPreference) && diagnosticPreference == preference); Debug.Assert(removeAssignments == AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.GetIsRemovableAssignmentDiagnostic(diagnostic)); } #endif return(GetDiagnosticsGroupedByMember(diagnostics, syntaxFacts, root)); }
private static string GetEquivalenceKey(Diagnostic diagnostic) { if (!AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.TryGetUnusedValuePreference(diagnostic, out var preference)) { return(string.Empty); } var isRemovableAssignment = AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.GetIsRemovableAssignmentDiagnostic(diagnostic); return(GetEquivalenceKey(preference, isRemovableAssignment)); }
public sealed override Task RegisterCodeFixesAsync(CodeFixContext context) { var diagnostic = context.Diagnostics[0]; if (!AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.TryGetUnusedValuePreference(diagnostic, out var preference)) { return(Task.CompletedTask); } var isRemovableAssignment = AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.GetIsRemovableAssignmentDiagnostic(diagnostic); string title; if (isRemovableAssignment) { // Recommend removing the redundant constant value assignment. title = FeaturesResources.Remove_redundant_assignment; } else { // Recommend using discard/unused local for redundant non-constant assignment. switch (preference) { case UnusedValuePreference.DiscardVariable: if (IsForEachIterationVariableDiagnostic(diagnostic, context.Document, context.CancellationToken)) { // Do not offer a fix to replace unused foreach iteration variable with discard. // User should probably replace it with a for loop based on the collection length. return(Task.CompletedTask); } title = FeaturesResources.Use_discard_underscore; break; case UnusedValuePreference.UnusedLocalVariable: title = FeaturesResources.Use_discarded_local; break; default: return(Task.CompletedTask); } } context.RegisterCodeFix( new MyCodeAction( title, c => FixAsync(context.Document, diagnostic, c), equivalenceKey: GetEquivalenceKey(preference, isRemovableAssignment)), diagnostic); return(Task.CompletedTask); }