Skip to content

Commit 3c48a19

Browse files
committed
closes #283.
1 parent 34fc1a6 commit 3c48a19

10 files changed

+85
-162
lines changed

RetailCoder.VBE/Inspections/ImplicitByRefParameterInspection.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ public ImplicitByRefParameterInspection()
1919

2020
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(VBProjectParseResult parseResult)
2121
{
22-
var declarations = from item in parseResult.Declarations.Items
22+
var interfaceMembers = parseResult.Declarations.FindInterfaceImplementationMembers();
23+
var issues = (from item in parseResult.Declarations.Items
2324
where item.DeclarationType == DeclarationType.Parameter
25+
&& !interfaceMembers.Select(m => m.Scope).Contains(item.ParentScope)
2426
let arg = item.Context.Parent as VBAParser.ArgContext
2527
where arg != null && arg.BYREF() == null && arg.BYVAL() == null
26-
select new QualifiedContext<VBAParser.ArgContext>(item.QualifiedName, arg);
28+
select new QualifiedContext<VBAParser.ArgContext>(item.QualifiedName, arg))
29+
.Select(issue => new ImplicitByRefParameterInspectionResult(string.Format(Name, issue.Context.ambiguousIdentifier().GetText()), Severity, issue));
2730

28-
foreach (var parameter in declarations)
29-
{
30-
yield return new ImplicitByRefParameterInspectionResult(string.Format(Name, parameter.Context.ambiguousIdentifier().GetText()), Severity, parameter);
31-
}
31+
return issues;
3232
}
3333
}
3434
}

RetailCoder.VBE/Inspections/ModuleOptionsNotSpecifiedFirstInspection.cs

Lines changed: 0 additions & 64 deletions
This file was deleted.

RetailCoder.VBE/Inspections/ModuleOptionsNotSpecifiedFirstInspectionResult.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.

RetailCoder.VBE/Inspections/NonReturningFunctionInspection.cs

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Linq;
33
using Antlr4.Runtime;
44
using Rubberduck.Parsing;
5-
using Rubberduck.Parsing.Grammar;
65
using Rubberduck.Parsing.Symbols;
76

87
namespace Rubberduck.Inspections
@@ -26,35 +25,18 @@ public NonReturningFunctionInspection()
2625

2726
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(VBProjectParseResult parseResult)
2827
{
29-
var functions = parseResult.Declarations.Items.Where(declaration =>
30-
ReturningMemberTypes.Contains(declaration.DeclarationType));
28+
var interfaceMembers = parseResult.Declarations.FindInterfaceMembers();
29+
var interfaceImplementationMembers = parseResult.Declarations.FindInterfaceImplementationMembers();
30+
var functions = parseResult.Declarations.Items
31+
.Where(declaration =>
32+
!interfaceMembers.Contains(declaration)
33+
&& ReturningMemberTypes.Contains(declaration.DeclarationType));
3134

3235
var issues = functions
33-
.Where(declaration =>
34-
!IsInterfaceMember(parseResult.Declarations, declaration)
35-
&& declaration.References.All(r => !r.IsAssignment))
36-
.Select(issue => new NonReturningFunctionInspectionResult(string.Format(Name, issue.IdentifierName), Severity, new QualifiedContext<ParserRuleContext>(issue.QualifiedName, issue.Context)));
36+
.Where(declaration => declaration.References.All(r => !r.IsAssignment))
37+
.Select(issue => new NonReturningFunctionInspectionResult(string.Format(Name, issue.IdentifierName), Severity, new QualifiedContext<ParserRuleContext>(issue.QualifiedName, issue.Context), interfaceImplementationMembers.Select(m => m.Scope).Contains(issue.Scope)));
3738

3839
return issues;
3940
}
40-
41-
private bool IsInterfaceMember(Declarations declarations, Declaration procedure)
42-
{
43-
var parent = declarations.Items.SingleOrDefault(item =>
44-
item.Project == procedure.Project &&
45-
item.IdentifierName == procedure.ComponentName &&
46-
(item.DeclarationType == DeclarationType.Class));
47-
48-
if (parent == null)
49-
{
50-
return false;
51-
}
52-
53-
var classes = declarations.Items.Where(item => item.DeclarationType == DeclarationType.Class);
54-
var interfaces = classes.Where(item => item.References.Any(reference =>
55-
reference.Context.Parent is VBAParser.ImplementsStmtContext));
56-
57-
return interfaces.Select(i => i.ComponentName).Contains(procedure.ComponentName);
58-
}
5941
}
6042
}

RetailCoder.VBE/Inspections/NonReturningFunctionInspectionResult.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,25 @@ namespace Rubberduck.Inspections
1111
{
1212
public class NonReturningFunctionInspectionResult : CodeInspectionResultBase
1313
{
14-
public NonReturningFunctionInspectionResult(string inspection, CodeInspectionSeverity type, QualifiedContext<ParserRuleContext> qualifiedContext)
14+
private readonly bool _isInterfaceImplementation;
15+
16+
public NonReturningFunctionInspectionResult(string inspection, CodeInspectionSeverity type, QualifiedContext<ParserRuleContext> qualifiedContext, bool isInterfaceImplementation)
1517
: base(inspection, type, qualifiedContext.ModuleName, qualifiedContext.Context)
1618
{
19+
_isInterfaceImplementation = isInterfaceImplementation;
1720
}
1821

1922
private new VBAParser.FunctionStmtContext Context { get { return base.Context as VBAParser.FunctionStmtContext; } }
2023

2124
public override IDictionary<string, Action<VBE>> GetQuickFixes()
2225
{
23-
return new Dictionary<string, Action<VBE>>
26+
var result = new Dictionary<string, Action<VBE>>();
27+
if (!_isInterfaceImplementation) // changing procedure type would break interface implementation
2428
{
25-
{"Convert function to procedure", ConvertFunctionToProcedure}
26-
};
29+
result.Add("Convert function to procedure", ConvertFunctionToProcedure);
30+
}
31+
32+
return result;
2733
}
2834

2935
private void ConvertFunctionToProcedure(VBE vbe)

RetailCoder.VBE/Inspections/ParameterCanBeByValInspection.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ public ParameterCanBeByValInspection()
1919

2020
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(VBProjectParseResult parseResult)
2121
{
22-
var declarations =
23-
parseResult.Declarations.Items.Where(declaration =>
24-
declaration.DeclarationType == DeclarationType.Parameter
25-
&& ((VBAParser.ArgContext) declaration.Context).BYVAL() == null
26-
&& !declaration.References.Any(reference => reference.IsAssignment));
22+
var interfaceMembers = parseResult.Declarations.FindInterfaceMembers()
23+
.Concat(parseResult.Declarations.FindInterfaceImplementationMembers());
24+
var issues = parseResult.Declarations.Items.Where(declaration =>
25+
declaration.DeclarationType == DeclarationType.Parameter
26+
&& !interfaceMembers.Select(m => m.Scope).Contains(declaration.ParentScope)
27+
&& ((VBAParser.ArgContext) declaration.Context).BYVAL() == null
28+
&& !declaration.References.Any(reference => reference.IsAssignment))
29+
.Select(issue => new ParameterCanBeByValInspectionResult(string.Format(Name, issue.IdentifierName), Severity, issue.Context, issue.QualifiedName));
2730

28-
foreach (var issue in declarations)
29-
{
30-
yield return new ParameterCanBeByValInspectionResult(string.Format(Name, issue.IdentifierName), Severity, issue.Context, issue.QualifiedName);
31-
}
31+
return issues;
3232
}
3333
}
3434
}

RetailCoder.VBE/Inspections/ParameterNotUsedInspection.cs

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,17 @@ public ParameterNotUsedInspection()
1919

2020
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(VBProjectParseResult parseResult)
2121
{
22-
var interfaceMembers = FindInterfaceMemberScopes(parseResult.Declarations);
22+
var interfaceMembers = parseResult.Declarations.FindInterfaceMembers();
23+
var interfaceImplementationMembers = parseResult.Declarations.FindInterfaceImplementationMembers();
2324
var issues = parseResult.Declarations.Items.Where(parameter =>
2425
parameter.DeclarationType == DeclarationType.Parameter
2526
&& !(parameter.Context.Parent.Parent is VBAParser.EventStmtContext)
2627
&& !(parameter.Context.Parent.Parent is VBAParser.DeclareStmtContext)
27-
&& !interfaceMembers.Contains(parameter.ParentScope)
28+
&& !interfaceMembers.Select(m => m.Scope).Contains(parameter.ParentScope)
2829
&& !parameter.References.Any())
29-
.Select(issue => new ParameterNotUsedInspectionResult(string.Format(Name, issue.IdentifierName), Severity, issue.Context, issue.QualifiedName));
30+
.Select(issue => new ParameterNotUsedInspectionResult(string.Format(Name, issue.IdentifierName), Severity, issue.Context, issue.QualifiedName, interfaceImplementationMembers.Select(m => m.Scope).Contains(issue.ParentScope)));
3031

3132
return issues;
3233
}
33-
34-
private static readonly DeclarationType[] ProcedureTypes =
35-
{
36-
DeclarationType.Procedure,
37-
DeclarationType.Function,
38-
DeclarationType.PropertyGet,
39-
DeclarationType.PropertyLet,
40-
DeclarationType.PropertySet
41-
};
42-
43-
private IEnumerable<string> FindInterfaceMemberScopes(Declarations declarations)
44-
{
45-
var classes = declarations.Items.Where(item => item.DeclarationType == DeclarationType.Class);
46-
var interfaces = classes.Where(item => item.References.Any(reference =>
47-
reference.Context.Parent is VBAParser.ImplementsStmtContext))
48-
.Select(i => i.Scope)
49-
.ToList();
50-
51-
return declarations.Items.Where(item => ProcedureTypes.Contains(item.DeclarationType) && interfaces.Any(i => item.ParentScope.StartsWith(i)))
52-
.Select(member => member.Scope)
53-
.ToList();
54-
}
5534
}
5635
}

RetailCoder.VBE/Inspections/ParameterNotUsedInspectionResult.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,25 @@ namespace Rubberduck.Inspections
88
{
99
public class ParameterNotUsedInspectionResult : CodeInspectionResultBase
1010
{
11+
private readonly bool _isInterfaceImplementation;
12+
1113
public ParameterNotUsedInspectionResult(string inspection, CodeInspectionSeverity type,
12-
ParserRuleContext context, QualifiedMemberName qualifiedName)
14+
ParserRuleContext context, QualifiedMemberName qualifiedName, bool isInterfaceImplementation)
1315
: base(inspection, type, qualifiedName.QualifiedModuleName, context)
1416
{
17+
_isInterfaceImplementation = isInterfaceImplementation;
1518
}
1619

1720
public override IDictionary<string, Action<VBE>> GetQuickFixes()
1821
{
19-
// don't bother implementing this without implementing a ChangeSignatureRefactoring
20-
return new Dictionary<string, Action<VBE>>
22+
var result = new Dictionary<string, Action<VBE>>();
23+
if (!_isInterfaceImplementation)
2124
{
25+
// don't bother implementing this without implementing a ChangeSignatureRefactoring
2226
//{"Remove unused parameter", RemoveUnusedParameter}
2327
};
28+
29+
return result;
2430
}
2531
}
2632
}

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,6 @@
233233
<Compile Include="Inspections\ImplicitPublicMemberInspection.cs" />
234234
<Compile Include="Inspections\ImplicitPublicMemberInspectionResult.cs" />
235235
<Compile Include="Inspections\Inspector.cs" />
236-
<Compile Include="Inspections\ModuleOptionsNotSpecifiedFirstInspection.cs" />
237-
<Compile Include="Inspections\ModuleOptionsNotSpecifiedFirstInspectionResult.cs" />
238236
<Compile Include="Inspections\NonReturningFunctionInspection.cs" />
239237
<Compile Include="Inspections\NonReturningFunctionInspectionResult.cs" />
240238
<Compile Include="Inspections\ObsoleteCallStatementInspection.cs" />

Rubberduck.Parsing/Symbols/Declarations.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Concurrent;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using Rubberduck.Parsing.Grammar;
45

56
namespace Rubberduck.Parsing.Symbols
67
{
@@ -45,5 +46,43 @@ public IEnumerable<Declaration> FindEventHandlers(Declaration control)
4546
&& declaration.DeclarationType == DeclarationType.Procedure
4647
&& declaration.IdentifierName.StartsWith(control.IdentifierName + "_"));
4748
}
49+
50+
private static readonly DeclarationType[] ProcedureTypes =
51+
{
52+
DeclarationType.Procedure,
53+
DeclarationType.Function,
54+
DeclarationType.PropertyGet,
55+
DeclarationType.PropertyLet,
56+
DeclarationType.PropertySet
57+
};
58+
59+
/// <summary>
60+
/// Finds all interface members.
61+
/// </summary>
62+
public IEnumerable<Declaration> FindInterfaceMembers()
63+
{
64+
var classes = _declarations.Where(item => item.DeclarationType == DeclarationType.Class);
65+
var interfaces = classes.Where(item => item.References.Any(reference =>
66+
reference.Context.Parent is VBAParser.ImplementsStmtContext))
67+
.Select(i => i.Scope)
68+
.ToList();
69+
70+
var members = _declarations.Where(item => ProcedureTypes.Contains(item.DeclarationType)
71+
&& interfaces.Any(i => item.ParentScope.StartsWith(i)));
72+
73+
return members;
74+
}
75+
76+
/// <summary>
77+
/// Finds all class members that are interface implementation members.
78+
/// </summary>
79+
public IEnumerable<Declaration> FindInterfaceImplementationMembers()
80+
{
81+
var members = FindInterfaceMembers();
82+
var implementations = _declarations.Where(item => ProcedureTypes.Contains(item.DeclarationType)
83+
&& members.Select(m => m.ComponentName + '_' + m.IdentifierName).Contains(item.IdentifierName));
84+
85+
return implementations;
86+
}
4887
}
4988
}

0 commit comments

Comments
 (0)