Skip to content

Commit e18fc63

Browse files
committed
Inspection fixes; closes #378
1 parent 85e52bf commit e18fc63

10 files changed

+62
-79
lines changed

RetailCoder.VBE/Inspections/ImplicitByRefParameterInspectionResult.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ public ImplicitByRefParameterInspectionResult(string inspection, CodeInspectionS
1919

2020
public override IDictionary<string, Action<VBE>> GetQuickFixes()
2121
{
22-
if (Context.LPAREN() != null && Context.RPAREN() != null)
22+
if ((Context.LPAREN() != null && Context.RPAREN() != null) || Context.PARAMARRAY() != null)
2323
{
24-
// array parameters must be passed by reference
24+
// array parameters & paramarrays must be passed by reference
2525
return new Dictionary<string, Action<VBE>>
2626
{
2727
{"Pass parameter by reference explicitly", PassParameterByRef}
@@ -30,10 +30,8 @@ public override IDictionary<string, Action<VBE>> GetQuickFixes()
3030

3131
return new Dictionary<string, Action<VBE>>
3232
{
33-
// this inspection doesn't know if parameter is assigned; suggest to pass ByRef explicitly
34-
// and then let ParameterCanBeByVal inspection do its job.
35-
//{"Pass parameter by value", PassParameterByVal},
36-
{"Pass parameter by reference explicitly", PassParameterByRef}
33+
{"Pass parameter by reference explicitly", PassParameterByRef},
34+
{"Pass parameter by value", PassParameterByVal}
3735
};
3836
}
3937

RetailCoder.VBE/Inspections/ImplicitPublicMemberInspection.cs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
1-
using System;
21
using System.Collections.Generic;
32
using System.Linq;
43
using Antlr4.Runtime;
54
using Rubberduck.Parsing;
6-
using Rubberduck.Parsing.Listeners;
7-
using Rubberduck.Parsing;
8-
using Rubberduck.Parsing.Grammar;
9-
using Rubberduck.Parsing.Listeners;
105
using Rubberduck.Parsing.Symbols;
116

127
namespace Rubberduck.Inspections
@@ -33,15 +28,12 @@ public ImplicitPublicMemberInspection()
3328

3429
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(VBProjectParseResult parseResult)
3530
{
36-
var declarations = from item in parseResult.Declarations.Items
37-
where ProcedureTypes.Contains(item.DeclarationType)
31+
var issues = from item in parseResult.Declarations.Items
32+
where ProcedureTypes.Contains(item.DeclarationType)
3833
&& item.Accessibility == Accessibility.Implicit
39-
select new QualifiedContext<ParserRuleContext>(item.QualifiedName, item.Context.Parent as ParserRuleContext);
40-
41-
foreach (var declaration in declarations)
42-
{
43-
yield return new ImplicitPublicMemberInspectionResult(string.Format(Name, ((dynamic)declaration.Context).ambiguousIdentifier().GetText()), Severity, declaration);
44-
}
34+
let context = new QualifiedContext<ParserRuleContext>(item.QualifiedName, item.Context)
35+
select new ImplicitPublicMemberInspectionResult(string.Format(Name, ((dynamic)context.Context).ambiguousIdentifier().GetText()), Severity, context);
36+
return issues;
4537
}
4638
}
4739
}

RetailCoder.VBE/Inspections/ParameterCanBeByValInspection.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,31 @@ public ParameterCanBeByValInspection()
1717
public CodeInspectionType InspectionType { get { return CodeInspectionType.CodeQualityIssues; } }
1818
public CodeInspectionSeverity Severity { get; set; }
1919

20+
private static string[] PrimitiveTypes =
21+
{
22+
Tokens.Boolean,
23+
Tokens.Byte,
24+
Tokens.Date,
25+
Tokens.Decimal,
26+
Tokens.Double,
27+
Tokens.Long,
28+
Tokens.LongLong,
29+
Tokens.LongPtr,
30+
Tokens.Integer,
31+
Tokens.Single,
32+
Tokens.String,
33+
Tokens.StrPtr
34+
};
35+
2036
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(VBProjectParseResult parseResult)
2137
{
2238
var interfaceMembers = parseResult.Declarations.FindInterfaceMembers()
2339
.Concat(parseResult.Declarations.FindInterfaceImplementationMembers());
40+
2441
var issues = parseResult.Declarations.Items.Where(declaration =>
2542
declaration.DeclarationType == DeclarationType.Parameter
2643
&& !interfaceMembers.Select(m => m.Scope).Contains(declaration.ParentScope)
44+
&& PrimitiveTypes.Contains(declaration.AsTypeName)
2745
&& ((VBAParser.ArgContext) declaration.Context).BYVAL() == null
2846
&& !declaration.References.Any(reference => reference.IsAssignment))
2947
.Select(issue => new ParameterCanBeByValInspectionResult(string.Format(Name, issue.IdentifierName), Severity, issue.Context, issue.QualifiedName));

RetailCoder.VBE/Inspections/VariableNotDeclaredInspectionResult.cs

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

RetailCoder.VBE/Inspections/VariableTypeNotDeclaredInspection.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public IEnumerable<CodeInspectionResultBase> GetInspectionResults(VBProjectParse
2121
{
2222
var issues = from item in parseResult.Declarations.Items
2323
where (item.DeclarationType == DeclarationType.Variable
24-
|| item.DeclarationType == DeclarationType.Constant)
24+
|| item.DeclarationType == DeclarationType.Constant
25+
|| item.DeclarationType == DeclarationType.Parameter)
2526
&& !item.IsTypeSpecified()
2627
select new VariableTypeNotDeclaredInspectionResult(string.Format(Name, item.DeclarationType, item.IdentifierName), Severity, item.Context, item.QualifiedName.QualifiedModuleName);
2728

RetailCoder.VBE/Inspections/VariableTypeNotDeclaredInspectionResult.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ private void DeclareAsExplicitVariant(VBE vbe)
4242
{
4343
fix = DeclareExplicitVariant(Context as VBAParser.ConstSubStmtContext, out originalInstruction);
4444
}
45+
46+
if (string.IsNullOrEmpty(originalInstruction))
47+
{
48+
fix = DeclareExplicitVariant(Context as VBAParser.ArgContext, out originalInstruction);
49+
}
4550

4651
var fixedCodeLine = codeLine.Replace(originalInstruction, fix);
4752
component.CodeModule.ReplaceLine(QualifiedSelection.Selection.StartLine, fixedCodeLine);
@@ -59,6 +64,18 @@ private string DeclareExplicitVariant(VBAParser.VariableSubStmtContext context,
5964
return instruction + ' ' + Tokens.As + ' ' + Tokens.Variant;
6065
}
6166

67+
private string DeclareExplicitVariant(VBAParser.ArgContext context, out string instruction)
68+
{
69+
if (context == null)
70+
{
71+
instruction = null;
72+
return null;
73+
}
74+
75+
instruction = context.GetText();
76+
return instruction + ' ' + Tokens.As + ' ' + Tokens.Variant;
77+
}
78+
6279
private string DeclareExplicitVariant(VBAParser.ConstSubStmtContext context, out string instruction)
6380
{
6481
if (context == null)

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@
252252
<Compile Include="Inspections\ProcedureNotUsedInspection.cs" />
253253
<Compile Include="Inspections\UnassignedVariableUsageInspection.cs" />
254254
<Compile Include="Inspections\UnassignedVariableUsageInspectionResult.cs" />
255-
<Compile Include="Inspections\VariableNotDeclaredInspectionResult.cs" />
256255
<Compile Include="Inspections\VariableNotUsedInspection.cs" />
257256
<Compile Include="Inspections\IdentifierNotUsedInspectionResult.cs" />
258257
<Compile Include="Inspections\VariableNotAssignedInspection.cs" />

Rubberduck.Parsing/Grammar/Tokens.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Parsing/Grammar/Tokens.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,4 +666,7 @@
666666
<data name="LineContinuation" xml:space="preserve">
667667
<value> _</value>
668668
</data>
669+
<data name="LongPtr" xml:space="preserve">
670+
<value>LongPtr</value>
671+
</data>
669672
</root>

Rubberduck.Parsing/Symbols/DeclarationSymbolsListener.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,10 @@ private Declaration CreateDeclaration(string identifierName, string asTypeName,
6464
/// <summary>
6565
/// Gets the <c>Accessibility</c> for a procedure member.
6666
/// </summary>
67-
/// <param name="visibilityContext"></param>
68-
/// <returns>Returns <c>Public</c> by default.</returns>
6967
private Accessibility GetProcedureAccessibility(VBAParser.VisibilityContext visibilityContext)
7068
{
7169
var visibility = visibilityContext == null
72-
? "Public"
70+
? "Implicit" // "Public"
7371
: visibilityContext.GetText();
7472

7573
return (Accessibility)Enum.Parse(typeof(Accessibility), visibility);
@@ -78,12 +76,10 @@ private Accessibility GetProcedureAccessibility(VBAParser.VisibilityContext visi
7876
/// <summary>
7977
/// Gets the <c>Accessibility</c> for a non-procedure member.
8078
/// </summary>
81-
/// <param name="visibilityContext"></param>
82-
/// <returns>Returns <c>Private</c> by default.</returns>
8379
private Accessibility GetMemberAccessibility(VBAParser.VisibilityContext visibilityContext)
8480
{
8581
var visibility = visibilityContext == null
86-
? "Private"
82+
? "Implicit" // "Private"
8783
: visibilityContext.GetText();
8884

8985
return (Accessibility)Enum.Parse(typeof(Accessibility), visibility);
@@ -258,7 +254,8 @@ public override void EnterArgList(VBAParser.ArgListContext context)
258254
? Tokens.Variant
259255
: asTypeClause.type().GetText();
260256

261-
_declarations.Add(CreateDeclaration(argContext.ambiguousIdentifier().GetText(), asTypeName, Accessibility.Implicit, DeclarationType.Parameter, argContext, argContext.ambiguousIdentifier().GetSelection()));
257+
var identifier = argContext.ambiguousIdentifier();
258+
_declarations.Add(CreateDeclaration(identifier.GetText(), asTypeName, Accessibility.Implicit, DeclarationType.Parameter, argContext, argContext.GetSelection()));
262259
}
263260
}
264261

0 commit comments

Comments
 (0)