Skip to content

Commit 0abb2c3

Browse files
committed
Merge branch 'master' of https://github.com/retailcoder/Rubberduck into source_control
2 parents 3e8944d + c7e44bb commit 0abb2c3

File tree

6 files changed

+105
-1
lines changed

6 files changed

+105
-1
lines changed

RetailCoder.VBE/Inspections/ImplicitByRefParameterInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public IEnumerable<CodeInspectionResultBase> GetInspectionResults(IEnumerable<VB
2424
{
2525
foreach (var module in parseResult)
2626
{
27-
var procedures = (IEnumerable<ParserRuleContext>) module.ParseTree.GetContexts<ProcedureListener, ParserRuleContext>(new ProcedureListener());
27+
var procedures = module.ParseTree.GetContexts<ProcedureListener, ParserRuleContext>(new ProcedureListener());
2828
foreach (var procedure in procedures)
2929
{
3030
var args = GetArguments(procedure);

RetailCoder.VBE/Inspections/InspectionNames.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.

RetailCoder.VBE/Inspections/InspectionNames.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@
126126
<data name="MultipleDeclarations" xml:space="preserve">
127127
<value>Instruction contains multiple declarations</value>
128128
</data>
129+
<data name="NonReturningFunction" xml:space="preserve">
130+
<value>Function does not return anything</value>
131+
</data>
129132
<data name="ObsoleteCall" xml:space="preserve">
130133
<value>Use of obsolete Call statement</value>
131134
</data>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Antlr4.Runtime;
4+
using Rubberduck.VBA;
5+
using Rubberduck.VBA.Grammar;
6+
using Rubberduck.VBA.Nodes;
7+
using Rubberduck.VBA.ParseTreeListeners;
8+
9+
namespace Rubberduck.Inspections
10+
{
11+
public class NonReturningFunctionInspection : IInspection
12+
{
13+
public NonReturningFunctionInspection()
14+
{
15+
Severity = CodeInspectionSeverity.Error;
16+
}
17+
18+
public string Name { get { return InspectionNames.NonReturningFunction; } }
19+
public CodeInspectionType InspectionType { get { return CodeInspectionType.CodeQualityIssues; } }
20+
public CodeInspectionSeverity Severity { get; set; }
21+
22+
public IEnumerable<CodeInspectionResultBase> GetInspectionResults(IEnumerable<VBComponentParseResult> parseResult)
23+
{
24+
foreach (var module in parseResult)
25+
{
26+
var procedures = module.ParseTree.GetContexts<ProcedureListener, ParserRuleContext>(new ProcedureListener());
27+
var functions = procedures.OfType<VisualBasic6Parser.FunctionStmtContext>()
28+
.Where(function => function.GetContexts<VariableAssignmentListener, VisualBasic6Parser.AmbiguousIdentifierContext>(new VariableAssignmentListener())
29+
.All(assignment => assignment.GetText() != function.ambiguousIdentifier().GetText()));
30+
foreach (var unassignedFunction in functions)
31+
{
32+
yield return new NonReturningFunctionInspectionResult(Name, Severity, new QualifiedContext<ParserRuleContext>(module.QualifiedName, unassignedFunction));
33+
}
34+
}
35+
}
36+
}
37+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Linq;
5+
using Antlr4.Runtime;
6+
using Microsoft.Vbe.Interop;
7+
using Rubberduck.Extensions;
8+
using Rubberduck.VBA;
9+
using Rubberduck.VBA.Grammar;
10+
using Rubberduck.VBA.Nodes;
11+
12+
namespace Rubberduck.Inspections
13+
{
14+
public class NonReturningFunctionInspectionResult : CodeInspectionResultBase
15+
{
16+
public NonReturningFunctionInspectionResult(string inspection, CodeInspectionSeverity type, QualifiedContext<ParserRuleContext> qualifiedContext)
17+
: base(inspection, type, qualifiedContext.QualifiedName, qualifiedContext.Context)
18+
{
19+
}
20+
21+
private new VisualBasic6Parser.FunctionStmtContext Context { get { return base.Context as VisualBasic6Parser.FunctionStmtContext; } }
22+
23+
public override IDictionary<string, Action<VBE>> GetQuickFixes()
24+
{
25+
return new Dictionary<string, Action<VBE>>
26+
{
27+
{"Convert function to procedure", ConvertFunctionToProcedure}
28+
};
29+
}
30+
31+
private void ConvertFunctionToProcedure(VBE vbe)
32+
{
33+
var visibility = Context.visibility() == null ? string.Empty : Context.visibility().GetText() + ' ';
34+
var name = ' ' + Context.ambiguousIdentifier().GetText();
35+
var args = Context.argList().GetText();
36+
var asType = Context.asTypeClause() == null ? string.Empty : ' ' + Context.asTypeClause().GetText();
37+
38+
var oldSignature = visibility + Tokens.Function + name + args + asType;
39+
var newSignature = visibility + Tokens.Sub + name + args;
40+
41+
var procedure = Context.GetText();
42+
var result = procedure.Replace(oldSignature, newSignature)
43+
.Replace(Tokens.End + ' ' + Tokens.Function, Tokens.End + ' ' + Tokens.Sub)
44+
.Replace(Tokens.Exit + ' ' + Tokens.Function, Tokens.Exit + ' ' + Tokens.Sub);
45+
46+
var module = vbe.FindCodeModules(QualifiedName).First();
47+
var selection = Context.GetSelection();
48+
49+
module.DeleteLines(selection.StartLine, selection.LineCount);
50+
module.InsertLines(selection.StartLine, result);
51+
}
52+
}
53+
}

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
</ItemGroup>
8989
<ItemGroup>
9090
<Compile Include="Extensions\VbProjectExtensions.cs" />
91+
<Compile Include="Inspections\NonReturningFunctionInspection.cs" />
92+
<Compile Include="Inspections\NonReturningFunctionInspectionResult.cs" />
9193
<Compile Include="Inspections\ObsoleteCallStatementUsageInspection.cs" />
9294
<Compile Include="Inspections\ObsoleteCallStatementUsageInspectionResult.cs" />
9395
<Compile Include="Inspections\ObsoleteLetStatementUsageInspection.cs" />

0 commit comments

Comments
 (0)