Skip to content

Commit 56b4b32

Browse files
authored
Merge pull request #2966 from Hosch250/refactorInspections
Refactor a few inspections
2 parents 0674b0b + 1b3b59e commit 56b4b32

File tree

48 files changed

+368
-166
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+368
-166
lines changed

RetailCoder.VBE/UI/Inspections/AggregateInspectionResult.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public AggregateInspectionResult(IInspectionResult firstResult, int count)
2020
public string Description => string.Format(InspectionsUI.AggregateInspectionResultFormat, _result.Inspection.Description, _count);
2121

2222
public QualifiedSelection QualifiedSelection => _result.QualifiedSelection;
23+
public QualifiedMemberName? QualifiedMemberName => _result.QualifiedMemberName;
2324
public IInspection Inspection => _result.Inspection;
2425

2526
public Declaration Target => _result.Target;

RetailCoder.VBE/UI/Inspections/InspectionResultsControl.xaml

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -593,20 +593,28 @@
593593

594594
<TextBlock Margin="4" Text="{Binding SelectedItem.Inspection.Meta}" FontSize="10" TextWrapping="WrapWithOverflow"/>
595595
<TextBlock Margin="8" Text="{Binding SelectedItem.QualifiedSelection}" FontSize="10" TextWrapping="WrapWithOverflow" />
596-
596+
597597
<WrapPanel>
598598
<controls:LinkButton Margin="4"
599-
Visibility="{Binding CanExecuteQuickFixInModule, Converter={StaticResource BoolToVisibility}}"
600-
Command="{Binding QuickFixInModuleCommand}"
601-
Content="{Resx ResxName=Rubberduck.Inspections.Resources.InspectionsUI, Key=QuickFix_ThisModule}" />
599+
Visibility="{Binding CanExecuteQuickFixInProcedure, Converter={StaticResource BoolToVisibility}}"
600+
Command="{Binding QuickFixInProcedureCommand}"
601+
Content="{Resx ResxName=Rubberduck.Parsing.Inspections.Resources.InspectionsUI, Key=QuickFix_ThisProcedure}" />
602+
<controls:LinkButton Margin="4"
603+
Visibility="{Binding CanExecuteQuickFixInModule, Converter={StaticResource BoolToVisibility}}"
604+
Command="{Binding QuickFixInModuleCommand}"
605+
Content="{Resx ResxName=Rubberduck.Parsing.Inspections.Resources.InspectionsUI, Key=QuickFix_ThisModule}" />
606+
<controls:LinkButton Margin="4"
607+
Visibility="{Binding CanExecuteQuickFixInProject, Converter={StaticResource BoolToVisibility}}"
608+
Command="{Binding QuickFixInProjectCommand}"
609+
Content="{Resx ResxName=Rubberduck.Parsing.Inspections.Resources.InspectionsUI, Key=QuickFix_ThisProject}" />
602610
<controls:LinkButton Margin="4"
603-
Visibility="{Binding CanExecuteQuickFixInProject, Converter={StaticResource BoolToVisibility}}"
604-
Command="{Binding QuickFixInProjectCommand}"
605-
Content="{Resx ResxName=Rubberduck.Inspections.Resources.InspectionsUI, Key=QuickFix_ThisProject}" />
611+
Visibility="{Binding CanExecuteQuickFixInProject, Converter={StaticResource BoolToVisibility}}"
612+
Command="{Binding QuickFixInAllProjectsCommand}"
613+
Content="{Resx ResxName=Rubberduck.Parsing.Inspections.Resources.InspectionsUI, Key=QuickFix_All}" />
606614
<controls:LinkButton Margin="4"
607615
Visibility="{Binding CanDisableInspection, Converter={StaticResource BoolToVisibility}}"
608616
Command="{Binding DisableInspectionCommand}"
609-
Content="{Resx ResxName=Rubberduck.Inspections.Resources.InspectionsUI, Key=DisableThisInspection}" />
617+
Content="{Resx ResxName=Rubberduck.Parsing.Inspections.Resources.InspectionsUI, Key=DisableThisInspection}" />
610618
</WrapPanel>
611619
</StackPanel>
612620
</Border>

RetailCoder.VBE/UI/Inspections/InspectionResultsViewModel.cs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public InspectionResultsViewModel(RubberduckParserState state, IInspector inspec
6161

6262
DisableInspectionCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteDisableInspectionCommand);
6363
QuickFixCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixCommand, CanExecuteQuickFixCommand);
64+
QuickFixInProcedureCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixInProcedureCommand, _ => SelectedItem != null && _state.Status == ParserState.Ready);
6465
QuickFixInModuleCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixInModuleCommand, _ => SelectedItem != null && _state.Status == ParserState.Ready);
6566
QuickFixInProjectCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixInProjectCommand, _ => SelectedItem != null && _state.Status == ParserState.Ready);
6667
QuickFixInAllProjectsCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixInAllProjectsCommand, _ => SelectedItem != null && _state.Status == ParserState.Ready);
@@ -121,6 +122,7 @@ public INavigateSource SelectedItem
121122

122123
SelectedInspection = null;
123124
CanQuickFix = false;
125+
CanExecuteQuickFixInProcedure = false;
124126
CanExecuteQuickFixInModule = false;
125127
CanExecuteQuickFixInProject = false;
126128

@@ -130,11 +132,13 @@ public INavigateSource SelectedItem
130132
SelectedInspection = inspectionResult.Inspection;
131133
CanQuickFix = _quickFixProvider.HasQuickFixes(inspectionResult);
132134
_defaultFix = _quickFixProvider.QuickFixes(inspectionResult).FirstOrDefault();
135+
CanExecuteQuickFixInProcedure = _defaultFix != null && _defaultFix.CanFixInProcedure;
133136
CanExecuteQuickFixInModule = _defaultFix != null && _defaultFix.CanFixInModule;
137+
CanExecuteQuickFixInModule = _defaultFix != null && _defaultFix.CanFixInProcedure;
138+
CanExecuteQuickFixInProject = _defaultFix != null && _defaultFix.CanFixInProject;
134139
}
135140

136141
CanDisableInspection = SelectedInspection != null;
137-
CanExecuteQuickFixInProject = _defaultFix != null && _defaultFix.CanFixInProject;
138142
}
139143
}
140144

@@ -215,6 +219,7 @@ public bool GroupByLocation
215219
public CommandBase SetLocationGroupingCommand { get; }
216220
public CommandBase RefreshCommand { get; }
217221
public CommandBase QuickFixCommand { get; }
222+
public CommandBase QuickFixInProcedureCommand { get; }
218223
public CommandBase QuickFixInModuleCommand { get; }
219224
public CommandBase QuickFixInProjectCommand { get; }
220225
public CommandBase QuickFixInAllProjectsCommand { get; }
@@ -314,6 +319,30 @@ private bool CanExecuteQuickFixCommand(object parameter)
314319
return !IsBusy && quickFix != null && _state.Status == ParserState.Ready;
315320
}
316321

322+
private bool _canExecuteQuickFixInProcedure;
323+
public bool CanExecuteQuickFixInProcedure
324+
{
325+
get { return _canExecuteQuickFixInProcedure; }
326+
set { _canExecuteQuickFixInProcedure = value; OnPropertyChanged(); }
327+
}
328+
329+
private void ExecuteQuickFixInProcedureCommand(object parameter)
330+
{
331+
if (_defaultFix == null)
332+
{
333+
return;
334+
}
335+
336+
var selectedResult = SelectedItem as IInspectionResult;
337+
if (selectedResult == null)
338+
{
339+
return;
340+
}
341+
342+
_quickFixProvider.FixInProcedure(_defaultFix, selectedResult.QualifiedMemberName,
343+
selectedResult.Inspection.GetType(), Results);
344+
}
345+
317346
private bool _canExecuteQuickFixInModule;
318347
public bool CanExecuteQuickFixInModule
319348
{

Rubberduck.Inspections/Abstract/InspectionBase.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
using System.Collections.Generic;
33
using System.Globalization;
44
using System.Linq;
5+
using Rubberduck.Parsing;
56
using Rubberduck.Parsing.Annotations;
67
using Rubberduck.Parsing.Inspections.Abstract;
78
using Rubberduck.Parsing.Inspections.Resources;
89
using Rubberduck.Parsing.Symbols;
910
using Rubberduck.Parsing.VBA;
11+
using Rubberduck.VBEditor;
1012
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
1113

1214
namespace Rubberduck.Inspections.Abstract
@@ -93,6 +95,18 @@ protected virtual IEnumerable<Declaration> BuiltInDeclarations
9395
get { return State.AllDeclarations.Where(declaration => !declaration.IsUserDefined); }
9496
}
9597

98+
protected QualifiedMemberName? GetQualifiedMemberName(QualifiedContext context)
99+
{
100+
var members = State.DeclarationFinder.Members(context.ModuleName);
101+
return members.SingleOrDefault(m => m.Selection.Contains(context.Context.GetSelection()))?.QualifiedName;
102+
}
103+
104+
protected QualifiedMemberName? GetQualifiedMemberName(IdentifierReference reference)
105+
{
106+
var members = State.DeclarationFinder.Members(reference.QualifiedModuleName);
107+
return members.SingleOrDefault(m => m.Selection.Contains(reference.Selection))?.QualifiedName;
108+
}
109+
96110
protected bool IsIgnoringInspectionResultFor(IVBComponent component, int line)
97111
{
98112
var annotations = State.GetModuleAnnotations(component).ToList();
@@ -105,8 +119,18 @@ protected bool IsIgnoringInspectionResultFor(IVBComponent component, int line)
105119
// VBE 1-based indexing
106120
for (var i = line; i >= 1; i--)
107121
{
108-
var annotation = annotations.SingleOrDefault(a => a.QualifiedSelection.Selection.StartLine == i) as IgnoreAnnotation;
109-
if (annotation != null && annotation.InspectionNames.Contains(AnnotationName))
122+
var annotation = annotations.SingleOrDefault(a => a.QualifiedSelection.Selection.StartLine == i);
123+
var ignoreAnnotation = annotation as IgnoreAnnotation;
124+
var ignoreModuleAnnotation = annotation as IgnoreModuleAnnotation;
125+
126+
if (ignoreAnnotation?.InspectionNames.Contains(AnnotationName) == true)
127+
{
128+
return true;
129+
}
130+
131+
if (ignoreModuleAnnotation != null &&
132+
(ignoreModuleAnnotation.InspectionNames.Contains(AnnotationName) ||
133+
!ignoreModuleAnnotation.InspectionNames.Any()))
110134
{
111135
return true;
112136
}

Rubberduck.Inspections/Abstract/InspectionResultBase.cs

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,45 +14,50 @@ namespace Rubberduck.Inspections.Abstract
1414
public abstract class InspectionResultBase : IInspectionResult, INavigateSource, IExportable
1515
{
1616
protected InspectionResultBase(IInspection inspection, Declaration target)
17-
: this(inspection, target.QualifiedName.QualifiedModuleName, target.Context)
18-
{
19-
Target = target;
20-
}
21-
22-
/// <summary>
23-
/// Creates a comment inspection result.
24-
/// </summary>
25-
protected InspectionResultBase(IInspection inspection, QualifiedModuleName qualifiedName)
26-
: this(inspection, qualifiedName, null)
17+
: this(inspection, target.QualifiedName.QualifiedModuleName, target.Context, target)
2718
{ }
28-
29-
/// <summary>
30-
/// Creates an inspection result.
31-
/// </summary>
32-
protected InspectionResultBase(IInspection inspection, QualifiedModuleName qualifiedName, ParserRuleContext context)
19+
20+
protected InspectionResultBase(IInspection inspection, QualifiedModuleName qualifiedName, QualifiedMemberName? qualifiedMemberName, ParserRuleContext context)
3321
{
3422
Inspection = inspection;
3523
QualifiedName = qualifiedName;
24+
QualifiedMemberName = qualifiedMemberName;
3625
Context = context;
3726
}
38-
39-
/// <summary>
40-
/// Creates an inspection result.
41-
/// </summary>
42-
protected InspectionResultBase(IInspection inspection, QualifiedModuleName qualifiedName, ParserRuleContext context, Declaration declaration)
27+
28+
protected InspectionResultBase(IInspection inspection, QualifiedModuleName qualifiedName, ParserRuleContext context, Declaration target)
4329
{
4430
Inspection = inspection;
4531
QualifiedName = qualifiedName;
4632
Context = context;
47-
Target = declaration;
33+
Target = target;
34+
35+
QualifiedMemberName = GetQualifiedMemberName(target);
4836
}
4937

38+
private QualifiedMemberName? GetQualifiedMemberName(Declaration target)
39+
{
40+
if (string.IsNullOrEmpty(target?.QualifiedName.QualifiedModuleName.ComponentName))
41+
{
42+
return null;
43+
}
44+
45+
if (target.DeclarationType.HasFlag(DeclarationType.Member))
46+
{
47+
return target.QualifiedName;
48+
}
49+
50+
return GetQualifiedMemberName(target.ParentDeclaration);
51+
}
52+
5053
public IInspection Inspection { get; }
5154

5255
public abstract string Description { get; }
5356

5457
protected QualifiedModuleName QualifiedName { get; }
5558

59+
public QualifiedMemberName? QualifiedMemberName { get; }
60+
5661
public ParserRuleContext Context { get; }
5762

5863
public Declaration Target { get; }

Rubberduck.Inspections/Concrete/ConstantNotUsedInspection.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ public ConstantNotUsedInspection(RubberduckParserState state)
1818

1919
public override IEnumerable<IInspectionResult> GetInspectionResults()
2020
{
21-
var results = State.DeclarationFinder
22-
.UserDeclarations(DeclarationType.Constant)
21+
var results = State.DeclarationFinder.UserDeclarations(DeclarationType.Constant)
2322
.Where(declaration => declaration.Context != null
2423
&& !declaration.References.Any()
2524
&& !IsIgnoringInspectionResultFor(declaration, AnnotationName))

Rubberduck.Inspections/Concrete/EmptyStringLiteralInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public override IEnumerable<IInspectionResult> GetInspectionResults()
2626
{
2727
return Listener.Contexts
2828
.Where(result => !IsIgnoringInspectionResultFor(result.ModuleName.Component, result.Context.Start.Line))
29-
.Select(result => new EmptyStringLiteralInspectionResult(this, result));
29+
.Select(result => new EmptyStringLiteralInspectionResult(this, result, GetQualifiedMemberName(result)));
3030
}
3131

3232
public class EmptyStringLiteralListener : VBAParserBaseListener, IInspectionListener

Rubberduck.Inspections/Concrete/ImplicitActiveSheetReferenceInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public override IEnumerable<IInspectionResult> GetInspectionResults()
3939
return members
4040
.SelectMany(declaration => declaration.References)
4141
.Where(issue => !issue.IsIgnoringInspectionResultFor(AnnotationName))
42-
.Select(issue => new ImplicitActiveSheetReferenceInspectionResult(this, issue))
42+
.Select(issue => new ImplicitActiveSheetReferenceInspectionResult(this, issue, GetQualifiedMemberName(issue)))
4343
.ToList();
4444
}
4545
}

Rubberduck.Inspections/Concrete/ImplicitActiveWorkbookReferenceInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public override IEnumerable<IInspectionResult> GetInspectionResults()
4141
.SelectMany(item => item.References.Where(reference => !IsIgnoringInspectionResultFor(reference, AnnotationName)))
4242
.ToList();
4343

44-
return members.Select(issue => new ImplicitActiveWorkbookReferenceInspectionResult(this, issue));
44+
return members.Select(issue => new ImplicitActiveWorkbookReferenceInspectionResult(this, issue, GetQualifiedMemberName(issue)));
4545
}
4646
}
4747
}

Rubberduck.Inspections/Concrete/ImplicitDefaultMemberAssignmentInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public override IEnumerable<IInspectionResult> GetInspectionResults()
3030
return reference.IsAssignment && letStmtContext != null && letStmtContext.LET() == null;
3131
});
3232

33-
return interestingReferences.Select(reference => new ImplicitDefaultMemberAssignmentInspectionResult(this, reference));
33+
return interestingReferences.Select(reference => new ImplicitDefaultMemberAssignmentInspectionResult(this, reference, GetQualifiedMemberName(reference)));
3434
}
3535

3636
public override CodeInspectionType InspectionType => CodeInspectionType.MaintainabilityAndReadabilityIssues;

0 commit comments

Comments
 (0)