Skip to content

Commit a1b4ee7

Browse files
committed
Only inspect correctly scoped declarations in declaration inspection base classes
In the case where the declaration type does not matter all declarations were inspected instead of those in the module. This led to results being generated multiple times if there are multiple modules. In addition, common behaviour of the declaration inspection base classes has been extracted into a further base class.
1 parent c8f7242 commit a1b4ee7

File tree

3 files changed

+86
-153
lines changed

3 files changed

+86
-153
lines changed

Rubberduck.CodeAnalysis/Inspections/Abstract/DeclarationInspectionBase.cs

Lines changed: 12 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -9,56 +9,22 @@
99

1010
namespace Rubberduck.Inspections.Abstract
1111
{
12-
public abstract class DeclarationInspectionBase : InspectionBase
12+
public abstract class DeclarationInspectionBase : DeclarationInspectionBaseBase
1313
{
14-
protected readonly DeclarationType[] RelevantDeclarationTypes;
15-
protected readonly DeclarationType[] ExcludeDeclarationTypes;
16-
1714
protected DeclarationInspectionBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
18-
: base(state)
19-
{
20-
RelevantDeclarationTypes = relevantDeclarationTypes;
21-
ExcludeDeclarationTypes = new DeclarationType[0];
22-
}
15+
: base(state, relevantDeclarationTypes)
16+
{}
2317

2418
protected DeclarationInspectionBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
25-
: base(state)
26-
{
27-
RelevantDeclarationTypes = relevantDeclarationTypes;
28-
ExcludeDeclarationTypes = excludeDeclarationTypes;
29-
}
19+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
20+
{}
3021

3122
protected abstract bool IsResultDeclaration(Declaration declaration, DeclarationFinder finder);
3223
protected abstract string ResultDescription(Declaration declaration);
3324

3425
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration) => new List<string>();
3526

36-
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
37-
{
38-
var finder = DeclarationFinderProvider.DeclarationFinder;
39-
40-
var results = new List<IInspectionResult>();
41-
foreach (var moduleDeclaration in State.DeclarationFinder.UserDeclarations(DeclarationType.Module))
42-
{
43-
if (moduleDeclaration == null)
44-
{
45-
continue;
46-
}
47-
48-
var module = moduleDeclaration.QualifiedModuleName;
49-
results.AddRange(DoGetInspectionResults(module, finder));
50-
}
51-
52-
return results;
53-
}
54-
55-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
56-
{
57-
var finder = DeclarationFinderProvider.DeclarationFinder;
58-
return DoGetInspectionResults(module, finder);
59-
}
60-
61-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
27+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
6228
{
6329
var objectionableDeclarations = RelevantDeclarationsInModule(module, finder)
6430
.Where(declaration => IsResultDeclaration(declaration, finder));
@@ -68,17 +34,6 @@ private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleNam
6834
.ToList();
6935
}
7036

71-
protected virtual IEnumerable<Declaration> RelevantDeclarationsInModule(QualifiedModuleName module, DeclarationFinder finder)
72-
{
73-
var potentiallyRelevantDeclarations = RelevantDeclarationTypes.Length == 0
74-
? finder.AllUserDeclarations
75-
: RelevantDeclarationTypes
76-
.SelectMany(declarationType => finder.Members(module, declarationType))
77-
.Distinct();
78-
return potentiallyRelevantDeclarations
79-
.Where(declaration => !ExcludeDeclarationTypes.Contains(declaration.DeclarationType));
80-
}
81-
8237
protected virtual IInspectionResult InspectionResult(Declaration declaration)
8338
{
8439
return new DeclarationInspectionResult(
@@ -89,56 +44,22 @@ protected virtual IInspectionResult InspectionResult(Declaration declaration)
8944
}
9045
}
9146

92-
public abstract class DeclarationInspectionBase<T> : InspectionBase
47+
public abstract class DeclarationInspectionBase<T> : DeclarationInspectionBaseBase
9348
{
94-
protected readonly DeclarationType[] RelevantDeclarationTypes;
95-
protected readonly DeclarationType[] ExcludeDeclarationTypes;
96-
9749
protected DeclarationInspectionBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
98-
: base(state)
99-
{
100-
RelevantDeclarationTypes = relevantDeclarationTypes;
101-
ExcludeDeclarationTypes = new DeclarationType[0];
102-
}
50+
: base(state, relevantDeclarationTypes)
51+
{}
10352

10453
protected DeclarationInspectionBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
105-
: base(state)
106-
{
107-
RelevantDeclarationTypes = relevantDeclarationTypes;
108-
ExcludeDeclarationTypes = excludeDeclarationTypes;
109-
}
54+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
55+
{}
11056

11157
protected abstract (bool isResult, T properties) IsResultDeclarationWithAdditionalProperties(Declaration declaration, DeclarationFinder finder);
11258
protected abstract string ResultDescription(Declaration declaration, T properties);
11359

11460
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration, T properties) => new List<string>();
11561

116-
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
117-
{
118-
var finder = DeclarationFinderProvider.DeclarationFinder;
119-
120-
var results = new List<IInspectionResult>();
121-
foreach (var moduleDeclaration in State.DeclarationFinder.UserDeclarations(DeclarationType.Module))
122-
{
123-
if (moduleDeclaration == null)
124-
{
125-
continue;
126-
}
127-
128-
var module = moduleDeclaration.QualifiedModuleName;
129-
results.AddRange(DoGetInspectionResults(module, finder));
130-
}
131-
132-
return results;
133-
}
134-
135-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
136-
{
137-
var finder = DeclarationFinderProvider.DeclarationFinder;
138-
return DoGetInspectionResults(module, finder);
139-
}
140-
141-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
62+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
14263
{
14364
var objectionableDeclarationsWithAdditionalProperties = RelevantDeclarationsInModule(module, finder)
14465
.Select(declaration => (declaration, IsResultDeclarationWithAdditionalProperties(declaration, finder)))
@@ -150,17 +71,6 @@ private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleNam
15071
.ToList();
15172
}
15273

153-
protected virtual IEnumerable<Declaration> RelevantDeclarationsInModule(QualifiedModuleName module, DeclarationFinder finder)
154-
{
155-
var potentiallyRelevantDeclarations = RelevantDeclarationTypes.Length == 0
156-
? finder.AllUserDeclarations
157-
: RelevantDeclarationTypes
158-
.SelectMany(declarationType => finder.Members(module, declarationType))
159-
.Distinct();
160-
return potentiallyRelevantDeclarations
161-
.Where(declaration => ! ExcludeDeclarationTypes.Contains(declaration.DeclarationType));
162-
}
163-
16474
protected virtual IInspectionResult InspectionResult(Declaration declaration, T properties)
16575
{
16676
return new DeclarationInspectionResult<T>(
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Rubberduck.Parsing.Inspections.Abstract;
4+
using Rubberduck.Parsing.Symbols;
5+
using Rubberduck.Parsing.VBA;
6+
using Rubberduck.Parsing.VBA.DeclarationCaching;
7+
using Rubberduck.VBEditor;
8+
9+
namespace Rubberduck.Inspections.Abstract
10+
{
11+
public abstract class DeclarationInspectionBaseBase : InspectionBase
12+
{
13+
protected readonly DeclarationType[] RelevantDeclarationTypes;
14+
protected readonly DeclarationType[] ExcludeDeclarationTypes;
15+
16+
protected DeclarationInspectionBaseBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
17+
: base(state)
18+
{
19+
RelevantDeclarationTypes = relevantDeclarationTypes;
20+
ExcludeDeclarationTypes = new DeclarationType[0];
21+
}
22+
23+
protected DeclarationInspectionBaseBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
24+
: base(state)
25+
{
26+
RelevantDeclarationTypes = relevantDeclarationTypes;
27+
ExcludeDeclarationTypes = excludeDeclarationTypes;
28+
}
29+
30+
protected abstract IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder);
31+
32+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
33+
{
34+
var finder = DeclarationFinderProvider.DeclarationFinder;
35+
36+
var results = new List<IInspectionResult>();
37+
foreach (var moduleDeclaration in State.DeclarationFinder.UserDeclarations(DeclarationType.Module))
38+
{
39+
if (moduleDeclaration == null)
40+
{
41+
continue;
42+
}
43+
44+
var module = moduleDeclaration.QualifiedModuleName;
45+
results.AddRange(DoGetInspectionResults(module, finder));
46+
}
47+
48+
return results;
49+
}
50+
51+
protected IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
52+
{
53+
var finder = DeclarationFinderProvider.DeclarationFinder;
54+
return DoGetInspectionResults(module, finder);
55+
}
56+
57+
protected IEnumerable<Declaration> RelevantDeclarationsInModule(QualifiedModuleName module, DeclarationFinder finder)
58+
{
59+
var potentiallyRelevantDeclarations = RelevantDeclarationTypes.Length == 0
60+
? finder.Members(module)
61+
: RelevantDeclarationTypes
62+
.SelectMany(declarationType => finder.Members(module, declarationType))
63+
.Distinct();
64+
return potentiallyRelevantDeclarations
65+
.Where(declaration => !ExcludeDeclarationTypes.Contains(declaration.DeclarationType));
66+
}
67+
}
68+
}

Rubberduck.CodeAnalysis/Inspections/Abstract/DeclarationInspectionMultiResultBase.cs

Lines changed: 6 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -9,56 +9,22 @@
99

1010
namespace Rubberduck.Inspections.Abstract
1111
{
12-
public abstract class DeclarationInspectionMultiResultBase<T> : InspectionBase
12+
public abstract class DeclarationInspectionMultiResultBase<T> : DeclarationInspectionBaseBase
1313
{
14-
protected readonly DeclarationType[] RelevantDeclarationTypes;
15-
protected readonly DeclarationType[] ExcludeDeclarationTypes;
16-
1714
protected DeclarationInspectionMultiResultBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
18-
: base(state)
19-
{
20-
RelevantDeclarationTypes = relevantDeclarationTypes;
21-
ExcludeDeclarationTypes = new DeclarationType[0];
22-
}
15+
: base(state, relevantDeclarationTypes)
16+
{}
2317

2418
protected DeclarationInspectionMultiResultBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
25-
: base(state)
26-
{
27-
RelevantDeclarationTypes = relevantDeclarationTypes;
28-
ExcludeDeclarationTypes = excludeDeclarationTypes;
29-
}
19+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
20+
{}
3021

3122
protected abstract IEnumerable<T> ResultProperties(Declaration declaration, DeclarationFinder finder);
3223
protected abstract string ResultDescription(Declaration declaration, T properties);
3324

3425
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration, T properties) => new List<string>();
3526

36-
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
37-
{
38-
var finder = DeclarationFinderProvider.DeclarationFinder;
39-
40-
var results = new List<IInspectionResult>();
41-
foreach (var moduleDeclaration in State.DeclarationFinder.UserDeclarations(DeclarationType.Module))
42-
{
43-
if (moduleDeclaration == null)
44-
{
45-
continue;
46-
}
47-
48-
var module = moduleDeclaration.QualifiedModuleName;
49-
results.AddRange(DoGetInspectionResults(module, finder));
50-
}
51-
52-
return results;
53-
}
54-
55-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
56-
{
57-
var finder = DeclarationFinderProvider.DeclarationFinder;
58-
return DoGetInspectionResults(module, finder);
59-
}
60-
61-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
27+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
6228
{
6329
var objectionableDeclarationsWithAdditionalProperties = RelevantDeclarationsInModule(module, finder)
6430
.SelectMany(declaration => ResultProperties(declaration, finder)
@@ -69,17 +35,6 @@ private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleNam
6935
.ToList();
7036
}
7137

72-
protected virtual IEnumerable<Declaration> RelevantDeclarationsInModule(QualifiedModuleName module, DeclarationFinder finder)
73-
{
74-
var potentiallyRelevantDeclarations = RelevantDeclarationTypes.Length == 0
75-
? finder.AllUserDeclarations
76-
: RelevantDeclarationTypes
77-
.SelectMany(declarationType => finder.Members(module, declarationType))
78-
.Distinct();
79-
return potentiallyRelevantDeclarations
80-
.Where(declaration => ! ExcludeDeclarationTypes.Contains(declaration.DeclarationType));
81-
}
82-
8338
protected virtual IInspectionResult InspectionResult(Declaration declaration, T properties)
8439
{
8540
return new DeclarationInspectionResult<T>(

0 commit comments

Comments
 (0)