Skip to content

Commit 23bc446

Browse files
committed
Merge pull request #901 from Hosch250/vbNullStringInspection
Vb null string inspection
2 parents f9c63a0 + 81b5b5f commit 23bc446

34 files changed

+379
-57
lines changed

RetailCoder.VBE/Inspections/AssignedByValParameterInspection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ public AssignedByValParameterInspection()
2222

2323
private string AnnotationName { get { return Name.Replace("Inspection", string.Empty); } }
2424

25-
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult)
25+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
2626
{
2727
var name = AnnotationName;
2828
var assignedByValParameters =
29-
parseResult.AllDeclarations.Where(declaration => !declaration.IsInspectionDisabled(name)
29+
state.AllDeclarations.Where(declaration => !declaration.IsInspectionDisabled(name)
3030
&& !declaration.IsBuiltIn
3131
&& declaration.DeclarationType == DeclarationType.Parameter
3232
&& ((VBAParser.ArgContext)declaration.Context).BYVAL() != null

RetailCoder.VBE/Inspections/ConstantNotUsedInspection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public ConstantNotUsedInspection()
1818
public CodeInspectionType InspectionType { get { return CodeInspectionType.CodeQualityIssues; } }
1919
public CodeInspectionSeverity Severity { get; set; }
2020

21-
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult)
21+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
2222
{
23-
var results = parseResult.AllDeclarations.Where(declaration =>
23+
var results = state.AllDeclarations.Where(declaration =>
2424
!declaration.IsBuiltIn
2525
&& declaration.DeclarationType == DeclarationType.Constant
2626
&& !declaration.References.Any());

RetailCoder.VBE/Inspections/DefaultProjectNameInspection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ public DefaultProjectNameInspection()
2222
public CodeInspectionType InspectionType { get { return CodeInspectionType.MaintainabilityAndReadabilityIssues; } }
2323
public CodeInspectionSeverity Severity { get; set; }
2424

25-
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult)
25+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
2626
{
27-
var issues = parseResult.AllDeclarations
27+
var issues = state.AllDeclarations
2828
.Where(declaration => !declaration.IsBuiltIn
2929
&& declaration.DeclarationType == DeclarationType.Project
3030
&& declaration.IdentifierName.StartsWith("VBAProject"))
31-
.Select(issue => new DefaultProjectNameInspectionResult(this, issue, parseResult, _wrapperFactory))
31+
.Select(issue => new DefaultProjectNameInspectionResult(this, issue, state, _wrapperFactory))
3232
.ToList();
3333

3434
return issues;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Antlr4.Runtime;
4+
using Rubberduck.Parsing;
5+
using Rubberduck.Parsing.VBA;
6+
7+
namespace Rubberduck.Inspections
8+
{
9+
public class EmptyStringLiteralInspection : IInspection
10+
{
11+
public EmptyStringLiteralInspection()
12+
{
13+
Severity = CodeInspectionSeverity.Warning;
14+
}
15+
16+
public string Name { get { return "EmptyStringLiteralInspection"; } }
17+
public string Description { get { return InspectionsUI.EmptyStringLiteralInspection; } }
18+
public CodeInspectionType InspectionType { get { return CodeInspectionType.LanguageOpportunities; } }
19+
public CodeInspectionSeverity Severity { get; set; }
20+
21+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
22+
{
23+
return
24+
state.EmptyStringLiterals.Select(
25+
context =>
26+
new EmptyStringLiteralInspectionResult(this,
27+
new QualifiedContext<ParserRuleContext>(context.ModuleName, context.Context)));
28+
}
29+
}
30+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System.Collections.Generic;
2+
using Antlr4.Runtime;
3+
using Rubberduck.Parsing;
4+
using Rubberduck.Parsing.Grammar;
5+
using Rubberduck.VBEditor;
6+
7+
namespace Rubberduck.Inspections
8+
{
9+
public class EmptyStringLiteralInspectionResult : CodeInspectionResultBase
10+
{
11+
private readonly IEnumerable<CodeInspectionQuickFix> _quickFixes;
12+
13+
public EmptyStringLiteralInspectionResult(IInspection inspection, QualifiedContext<ParserRuleContext> qualifiedContext)
14+
: base(inspection, inspection.Description, qualifiedContext.ModuleName, qualifiedContext.Context)
15+
{
16+
_quickFixes = new[]
17+
{
18+
new RepaceEmptyStringLiteralStatementQuickFix(Context, QualifiedSelection),
19+
};
20+
}
21+
22+
public override IEnumerable<CodeInspectionQuickFix> QuickFixes { get { return _quickFixes; } }
23+
}
24+
25+
public class RepaceEmptyStringLiteralStatementQuickFix : CodeInspectionQuickFix
26+
{
27+
public RepaceEmptyStringLiteralStatementQuickFix(ParserRuleContext context, QualifiedSelection selection)
28+
: base(context, selection, InspectionsUI.EmptyStringLiteralInspectionQuickFix)
29+
{
30+
}
31+
32+
public override void Fix()
33+
{
34+
var module = Selection.QualifiedName.Component.CodeModule;
35+
if (module == null)
36+
{
37+
return;
38+
}
39+
40+
var literal = (VBAParser.LiteralContext)Context;
41+
var newCodeLines = module.Lines[literal.Start.Line, 1].Replace("\"\"", "vbNullString");
42+
43+
module.ReplaceLine(literal.Start.Line, newCodeLines);
44+
}
45+
}
46+
}

RetailCoder.VBE/Inspections/IInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ public interface IInspection : IInspectionModel
1212
/// Runs code inspection on specified parse trees.
1313
/// </summary>
1414
/// <returns>Returns inspection results, if any.</returns>
15-
IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult);
15+
IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state);
1616
}
1717
}

RetailCoder.VBE/Inspections/ImplicitActiveSheetReferenceInspection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ public ImplicitActiveSheetReferenceInspection(VBE vbe)
3131
"Cells", "Range", "Columns", "Rows"
3232
};
3333

34-
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult)
34+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
3535
{
3636
if (_hostApp().ApplicationName != "Excel")
3737
{
3838
return new CodeInspectionResultBase[] {};
3939
// if host isn't Excel, the ExcelObjectModel declarations shouldn't be loaded anyway.
4040
}
4141

42-
var issues = parseResult.AllDeclarations.Where(item => item.IsBuiltIn
42+
var issues = state.AllDeclarations.Where(item => item.IsBuiltIn
4343
&& item.ParentScope == "Excel.Global"
4444
&& Targets.Contains(item.IdentifierName)
4545
&& item.References.Any())

RetailCoder.VBE/Inspections/ImplicitActiveWorkbookReferenceInspection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ public ImplicitActiveWorkbookReferenceInspection(VBE vbe)
2929
"Worksheets", "Sheets", "Names",
3030
};
3131

32-
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult)
32+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
3333
{
3434
if (!_hostApp.IsValueCreated || _hostApp.Value == null || _hostApp.Value.ApplicationName != "Excel")
3535
{
3636
return new CodeInspectionResultBase[] {};
3737
// if host isn't Excel, the ExcelObjectModel declarations shouldn't be loaded anyway.
3838
}
3939

40-
var issues = parseResult.AllDeclarations.Where(item => item.IsBuiltIn
40+
var issues = state.AllDeclarations.Where(item => item.IsBuiltIn
4141
&& item.ParentScope == "Excel.Global"
4242
&& Targets.Contains(item.IdentifierName)
4343
&& item.References.Any())

RetailCoder.VBE/Inspections/ImplicitByRefParameterInspection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ public ImplicitByRefParameterInspection()
2323

2424
private string AnnotationName { get { return Name.Replace("Inspection", string.Empty); } }
2525

26-
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult)
26+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
2727
{
28-
var declarations = parseResult.AllDeclarations.ToList();
28+
var declarations = state.AllDeclarations.ToList();
2929

3030
var interfaceMembers = declarations.FindInterfaceImplementationMembers();
3131

RetailCoder.VBE/Inspections/ImplicitPublicMemberInspection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public ImplicitPublicMemberInspection()
3131

3232
private string AnnotationName { get { return Name.Replace("Inspection", string.Empty); } }
3333

34-
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState parseResult)
34+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(RubberduckParserState state)
3535
{
36-
var issues = from item in parseResult.AllDeclarations
36+
var issues = from item in state.AllDeclarations
3737
where !item.IsInspectionDisabled(AnnotationName)
3838
&& !item.IsBuiltIn
3939
&& ProcedureTypes.Contains(item.DeclarationType)

0 commit comments

Comments
 (0)