Skip to content

Commit 9734c7f

Browse files
authored
Merge pull request #5384 from MDoerner/LetDeclarationInspectionsUseBaseClasses
Let declaration inspections use base classes
2 parents d2d3f1f + cf659ec commit 9734c7f

File tree

124 files changed

+2746
-1450
lines changed

Some content is hidden

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

124 files changed

+2746
-1450
lines changed

Rubberduck.CodeAnalysis/Inspections/Abstract/ArgumentReferenceInspectionFromDeclarationsBase.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,30 @@ protected ArgumentReferenceInspectionFromDeclarationsBase(RubberduckParserState
1414

1515
protected abstract bool IsUnsuitableArgument(ArgumentReference reference, DeclarationFinder finder);
1616

17-
protected virtual (bool isResult, object properties) IsUnsuitableArgumentWithAdditionalProperties(ArgumentReference reference, DeclarationFinder finder)
17+
protected override IEnumerable<IdentifierReference> ObjectionableReferences(DeclarationFinder finder)
18+
{
19+
return ObjectionableDeclarations(finder)
20+
.OfType<ParameterDeclaration>()
21+
.SelectMany(parameter => parameter.ArgumentReferences);
22+
}
23+
24+
protected override bool IsResultReference(IdentifierReference reference, DeclarationFinder finder)
1825
{
19-
return (IsUnsuitableArgument(reference, finder), null);
26+
if (!(reference is ArgumentReference argumentReference))
27+
{
28+
return false;
29+
}
30+
31+
return IsUnsuitableArgument(argumentReference, finder);
2032
}
33+
}
34+
35+
public abstract class ArgumentReferenceInspectionFromDeclarationsBase<T> : IdentifierReferenceInspectionFromDeclarationsBase<T>
36+
{
37+
protected ArgumentReferenceInspectionFromDeclarationsBase(RubberduckParserState state)
38+
: base(state) { }
39+
40+
protected abstract (bool isResult, T properties) IsUnsuitableArgumentWithAdditionalProperties(ArgumentReference reference, DeclarationFinder finder);
2141

2242
protected override IEnumerable<IdentifierReference> ObjectionableReferences(DeclarationFinder finder)
2343
{
@@ -26,11 +46,11 @@ protected override IEnumerable<IdentifierReference> ObjectionableReferences(Decl
2646
.SelectMany(parameter => parameter.ArgumentReferences);
2747
}
2848

29-
protected override (bool isResult, object properties) IsResultReferenceWithAdditionalProperties(IdentifierReference reference, DeclarationFinder finder)
49+
protected override (bool isResult, T properties) IsResultReferenceWithAdditionalProperties(IdentifierReference reference, DeclarationFinder finder)
3050
{
3151
if (!(reference is ArgumentReference argumentReference))
3252
{
33-
return (false, null);
53+
return (false, default);
3454
}
3555

3656
return IsUnsuitableArgumentWithAdditionalProperties(argumentReference, finder);

Rubberduck.CodeAnalysis/Inspections/Abstract/DeclarationInspectionBase.cs

Lines changed: 59 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,63 +4,89 @@
44
using Rubberduck.Parsing.Inspections.Abstract;
55
using Rubberduck.Parsing.Symbols;
66
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.Parsing.VBA.DeclarationCaching;
78
using Rubberduck.VBEditor;
89

910
namespace Rubberduck.Inspections.Abstract
1011
{
11-
public abstract class DeclarationInspectionBase : InspectionBase
12+
public abstract class DeclarationInspectionBase : DeclarationInspectionBaseBase
1213
{
13-
protected readonly DeclarationType[] RelevantDeclarationTypes;
14-
1514
protected DeclarationInspectionBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
16-
: base(state)
17-
{
18-
RelevantDeclarationTypes = relevantDeclarationTypes;
19-
}
15+
: base(state, relevantDeclarationTypes)
16+
{}
17+
18+
protected DeclarationInspectionBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
19+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
20+
{}
2021

21-
protected abstract bool IsResultDeclaration(Declaration declaration);
22+
protected abstract bool IsResultDeclaration(Declaration declaration, DeclarationFinder finder);
2223
protected abstract string ResultDescription(Declaration declaration);
2324

24-
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
25+
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration) => new List<string>();
26+
27+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
2528
{
26-
var results = new List<IInspectionResult>();
27-
foreach (var moduleDeclaration in State.DeclarationFinder.UserDeclarations(DeclarationType.Module))
28-
{
29-
if (moduleDeclaration == null)
30-
{
31-
continue;
32-
}
29+
var objectionableDeclarations = RelevantDeclarationsInModule(module, finder)
30+
.Where(declaration => IsResultDeclaration(declaration, finder));
3331

34-
var module = moduleDeclaration.QualifiedModuleName;
35-
results.AddRange(DoGetInspectionResults(module));
36-
}
32+
return objectionableDeclarations
33+
.Select(InspectionResult)
34+
.ToList();
35+
}
3736

38-
return results;
37+
protected virtual IInspectionResult InspectionResult(Declaration declaration)
38+
{
39+
return new DeclarationInspectionResult(
40+
this,
41+
ResultDescription(declaration),
42+
declaration,
43+
disabledQuickFixes: DisabledQuickFixes(declaration));
3944
}
45+
}
46+
47+
public abstract class DeclarationInspectionBase<T> : DeclarationInspectionBaseBase
48+
{
49+
protected DeclarationInspectionBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
50+
: base(state, relevantDeclarationTypes)
51+
{}
52+
53+
protected DeclarationInspectionBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
54+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
55+
{}
56+
57+
protected abstract (bool isResult, T properties) IsResultDeclarationWithAdditionalProperties(Declaration declaration, DeclarationFinder finder);
58+
protected abstract string ResultDescription(Declaration declaration, T properties);
4059

41-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
60+
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration, T properties) => new List<string>();
61+
62+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
4263
{
43-
var objectionableDeclarations = RelevantDeclarationsInModule(module)
44-
.Where(IsResultDeclaration);
64+
var objectionableDeclarationsWithAdditionalProperties = RelevantDeclarationsInModule(module, finder)
65+
.Select(declaration => DeclarationWithResultProperties(declaration, finder))
66+
.Where(result => result.HasValue)
67+
.Select(result => result.Value);
4568

46-
return objectionableDeclarations
47-
.Select(InspectionResult)
69+
return objectionableDeclarationsWithAdditionalProperties
70+
.Select(tpl => InspectionResult(tpl.declaration, tpl.properties))
4871
.ToList();
4972
}
5073

51-
protected virtual IEnumerable<Declaration> RelevantDeclarationsInModule(QualifiedModuleName module)
74+
private (Declaration declaration, T properties)? DeclarationWithResultProperties(Declaration declaration, DeclarationFinder finder)
5275
{
53-
return RelevantDeclarationTypes
54-
.SelectMany(declarationType => DeclarationFinderProvider.DeclarationFinder.Members(module, declarationType))
55-
.Distinct();
76+
var (isResult, properties) = IsResultDeclarationWithAdditionalProperties(declaration, finder);
77+
return isResult
78+
? (declaration, properties)
79+
: ((Declaration declaration, T properties)?) null;
5680
}
5781

58-
protected virtual IInspectionResult InspectionResult(Declaration declaration)
82+
protected virtual IInspectionResult InspectionResult(Declaration declaration, T properties)
5983
{
60-
return new DeclarationInspectionResult(
84+
return new DeclarationInspectionResult<T>(
6185
this,
62-
ResultDescription(declaration),
63-
declaration);
86+
ResultDescription(declaration, properties),
87+
declaration,
88+
properties: properties,
89+
disabledQuickFixes: DisabledQuickFixes(declaration, properties));
6490
}
6591
}
6692
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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+
return finder.UserDeclarations(DeclarationType.Module)
37+
.Concat(finder.UserDeclarations(DeclarationType.Project))
38+
.Where(declaration => declaration != null)
39+
.SelectMany(declaration => DoGetInspectionResults(declaration.QualifiedModuleName, finder))
40+
.ToList();
41+
}
42+
43+
protected virtual IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
44+
{
45+
var finder = DeclarationFinderProvider.DeclarationFinder;
46+
return DoGetInspectionResults(module, finder);
47+
}
48+
49+
protected virtual IEnumerable<Declaration> RelevantDeclarationsInModule(QualifiedModuleName module, DeclarationFinder finder)
50+
{
51+
var potentiallyRelevantDeclarations = RelevantDeclarationTypes.Length == 0
52+
? finder.Members(module)
53+
: RelevantDeclarationTypes
54+
.SelectMany(declarationType => finder.Members(module, declarationType))
55+
.Distinct();
56+
return potentiallyRelevantDeclarations
57+
.Where(declaration => !ExcludeDeclarationTypes.Contains(declaration.DeclarationType));
58+
}
59+
}
60+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Rubberduck.Inspections.Results;
4+
using Rubberduck.Parsing.Inspections.Abstract;
5+
using Rubberduck.Parsing.Symbols;
6+
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.Parsing.VBA.DeclarationCaching;
8+
using Rubberduck.VBEditor;
9+
10+
namespace Rubberduck.Inspections.Abstract
11+
{
12+
public abstract class DeclarationInspectionMultiResultBase<T> : DeclarationInspectionBaseBase
13+
{
14+
protected DeclarationInspectionMultiResultBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
15+
: base(state, relevantDeclarationTypes)
16+
{}
17+
18+
protected DeclarationInspectionMultiResultBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
19+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
20+
{}
21+
22+
protected abstract IEnumerable<T> ResultProperties(Declaration declaration, DeclarationFinder finder);
23+
protected abstract string ResultDescription(Declaration declaration, T properties);
24+
25+
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration, T properties) => new List<string>();
26+
27+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
28+
{
29+
var objectionableDeclarationsWithAdditionalProperties = RelevantDeclarationsInModule(module, finder)
30+
.SelectMany(declaration => ResultProperties(declaration, finder)
31+
.Select(properties => (declaration, properties)));
32+
33+
return objectionableDeclarationsWithAdditionalProperties
34+
.Select(tpl => InspectionResult(tpl.declaration, tpl.properties))
35+
.ToList();
36+
}
37+
38+
protected virtual IInspectionResult InspectionResult(Declaration declaration, T properties)
39+
{
40+
return new DeclarationInspectionResult<T>(
41+
this,
42+
ResultDescription(declaration, properties),
43+
declaration,
44+
properties: properties,
45+
disabledQuickFixes: DisabledQuickFixes(declaration, properties));
46+
}
47+
}
48+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Rubberduck.Inspections.Results;
4+
using Rubberduck.Parsing.Inspections.Abstract;
5+
using Rubberduck.Parsing.Symbols;
6+
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.Parsing.VBA.DeclarationCaching;
8+
using Rubberduck.VBEditor;
9+
10+
namespace Rubberduck.Inspections.Abstract
11+
{
12+
public abstract class DeclarationInspectionUsingGlobalInformationBase<TGlobalInfo> : DeclarationInspectionUsingGlobalInformationBaseBase<TGlobalInfo>
13+
{
14+
protected DeclarationInspectionUsingGlobalInformationBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
15+
: base(state, relevantDeclarationTypes)
16+
{}
17+
18+
protected DeclarationInspectionUsingGlobalInformationBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
19+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
20+
{}
21+
22+
protected abstract bool IsResultDeclaration(Declaration declaration, DeclarationFinder finder, TGlobalInfo globalInfo);
23+
protected abstract string ResultDescription(Declaration declaration);
24+
25+
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration) => new List<string>();
26+
27+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder, TGlobalInfo globalInfo)
28+
{
29+
var objectionableDeclarations = RelevantDeclarationsInModule(module, finder)
30+
.Where(declaration => IsResultDeclaration(declaration, finder, globalInfo));
31+
32+
return objectionableDeclarations
33+
.Select(InspectionResult)
34+
.ToList();
35+
}
36+
37+
protected virtual IInspectionResult InspectionResult(Declaration declaration)
38+
{
39+
return new DeclarationInspectionResult(
40+
this,
41+
ResultDescription(declaration),
42+
declaration,
43+
disabledQuickFixes: DisabledQuickFixes(declaration));
44+
}
45+
}
46+
47+
public abstract class DeclarationInspectionUsingGlobalInformationBase<TGlobalInfo,TProperties> : DeclarationInspectionUsingGlobalInformationBaseBase<TGlobalInfo>
48+
{
49+
protected DeclarationInspectionUsingGlobalInformationBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
50+
: base(state, relevantDeclarationTypes)
51+
{}
52+
53+
protected DeclarationInspectionUsingGlobalInformationBase(RubberduckParserState state, DeclarationType[] relevantDeclarationTypes, DeclarationType[] excludeDeclarationTypes)
54+
: base(state, relevantDeclarationTypes, excludeDeclarationTypes)
55+
{}
56+
57+
protected abstract (bool isResult, TProperties properties) IsResultDeclarationWithAdditionalProperties(Declaration declaration, DeclarationFinder finder, TGlobalInfo globalInformation);
58+
protected abstract string ResultDescription(Declaration declaration, TProperties properties);
59+
60+
protected virtual ICollection<string> DisabledQuickFixes(Declaration declaration, TProperties properties) => new List<string>();
61+
62+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder, TGlobalInfo globalInformation)
63+
{
64+
var objectionableDeclarationsWithAdditionalProperties = RelevantDeclarationsInModule(module, finder)
65+
.Select(declaration => DeclarationWithResultProperties(declaration, finder, globalInformation))
66+
.Where(result => result.HasValue)
67+
.Select(result => result.Value);
68+
69+
return objectionableDeclarationsWithAdditionalProperties
70+
.Select(tpl => InspectionResult(tpl.declaration, tpl.properties))
71+
.ToList();
72+
}
73+
74+
private (Declaration declaration, TProperties properties)? DeclarationWithResultProperties(Declaration declaration, DeclarationFinder finder, TGlobalInfo globalInformation)
75+
{
76+
var (isResult, properties) = IsResultDeclarationWithAdditionalProperties(declaration, finder, globalInformation);
77+
return isResult
78+
? (declaration, properties)
79+
: ((Declaration declaration, TProperties properties)?)null;
80+
}
81+
82+
protected virtual IInspectionResult InspectionResult(Declaration declaration, TProperties properties)
83+
{
84+
return new DeclarationInspectionResult<TProperties>(
85+
this,
86+
ResultDescription(declaration, properties),
87+
declaration,
88+
properties: properties,
89+
disabledQuickFixes: DisabledQuickFixes(declaration, properties));
90+
}
91+
}
92+
}

0 commit comments

Comments
 (0)