Skip to content

Commit b0211a0

Browse files
authored
Merge branch 'next' into CodeExplorer
2 parents a93ecc7 + 4bfe08e commit b0211a0

File tree

10 files changed

+331
-24
lines changed

10 files changed

+331
-24
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Antlr4.Runtime;
5+
using Antlr4.Runtime.Misc;
6+
using Rubberduck.Inspections.Abstract;
7+
using Rubberduck.Inspections.Results;
8+
using Rubberduck.Parsing;
9+
using Rubberduck.Parsing.Grammar;
10+
using Rubberduck.Parsing.Inspections.Abstract;
11+
using Rubberduck.Parsing.Inspections.Resources;
12+
using Rubberduck.Parsing.VBA;
13+
using Rubberduck.VBEditor;
14+
15+
namespace Rubberduck.Inspections.Concrete
16+
{
17+
public sealed class StopKeywordInspection : ParseTreeInspectionBase
18+
{
19+
public StopKeywordInspection(RubberduckParserState state)
20+
: base(state, CodeInspectionSeverity.Suggestion) { }
21+
22+
public override Type Type => typeof(StopKeywordInspection);
23+
24+
public override CodeInspectionType InspectionType => CodeInspectionType.CodeQualityIssues;
25+
26+
public override IInspectionListener Listener { get; } =
27+
new StopKeywordListener();
28+
29+
public override IEnumerable<IInspectionResult> GetInspectionResults()
30+
{
31+
return Listener.Contexts
32+
.Where(result => !IsIgnoringInspectionResultFor(result.ModuleName, result.Context.Start.Line))
33+
.Select(result => new QualifiedContextInspectionResult(this,
34+
InspectionsUI.StopKeywordInspectionResultFormat,
35+
result));
36+
}
37+
38+
public class StopKeywordListener : VBAParserBaseListener, IInspectionListener
39+
{
40+
private readonly List<QualifiedContext<ParserRuleContext>> _contexts = new List<QualifiedContext<ParserRuleContext>>();
41+
public IReadOnlyList<QualifiedContext<ParserRuleContext>> Contexts => _contexts;
42+
43+
public QualifiedModuleName CurrentModuleName { get; set; }
44+
45+
public void ClearContexts()
46+
{
47+
_contexts.Clear();
48+
}
49+
50+
public override void ExitStopStmt([NotNull] VBAParser.StopStmtContext context)
51+
{
52+
_contexts.Add(new QualifiedContext<ParserRuleContext>(CurrentModuleName, context));
53+
}
54+
}
55+
}
56+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Rubberduck.Inspections.Concrete;
5+
using Rubberduck.Parsing.Inspections.Abstract;
6+
using Rubberduck.Parsing.Inspections.Resources;
7+
using Rubberduck.Parsing.VBA;
8+
9+
namespace Rubberduck.Inspections.QuickFixes
10+
{
11+
public sealed class RemoveStopKeywordQuickFix : IQuickFix
12+
{
13+
private readonly RubberduckParserState _state;
14+
private static readonly HashSet<Type> _supportedInspections = new HashSet<Type>
15+
{
16+
typeof(StopKeywordInspection)
17+
};
18+
19+
public RemoveStopKeywordQuickFix(RubberduckParserState state)
20+
{
21+
_state = state;
22+
}
23+
24+
public IReadOnlyCollection<Type> SupportedInspections => _supportedInspections.ToList();
25+
26+
public void Fix(IInspectionResult result)
27+
{
28+
var rewriter = _state.GetRewriter(result.QualifiedSelection.QualifiedName);
29+
rewriter.Remove(result.Context);
30+
}
31+
32+
public string Description(IInspectionResult result)
33+
{
34+
return InspectionsUI.RemoveStopKeywordQuickFix;
35+
}
36+
37+
public bool CanFixInProcedure => false;
38+
public bool CanFixInModule => false;
39+
public bool CanFixInProject => false;
40+
}
41+
}

Rubberduck.Inspections/Rubberduck.Inspections.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<Compile Include="Abstract\ParseTreeInspectionBase.cs" />
5858
<Compile Include="Concrete\ApplicationWorksheetFunctionInspection.cs" />
5959
<Compile Include="Concrete\AssignedByValParameterInspection.cs" />
60+
<Compile Include="Concrete\StopKeywordInspection.cs" />
6061
<Compile Include="Concrete\LineLabelNotUsedInspection.cs" />
6162
<Compile Include="Concrete\IntegerDataTypeInspection.cs" />
6263
<Compile Include="ParseTreeListeners\AttributeAnnotationListener.cs" />
@@ -107,6 +108,7 @@
107108
<Compile Include="QuickFixes\AssignedByValParameterMakeLocalCopyQuickFix.cs" />
108109
<Compile Include="QuickFixes\ChangeDimToPrivateQuickFix.cs" />
109110
<Compile Include="QuickFixes\ChangeIntegerToLongQuickFix.cs" />
111+
<Compile Include="QuickFixes\RemoveStopKeywordQuickFix.cs" />
110112
<Compile Include="QuickFixes\SpecifyExplicitByRefModifierQuickFix.cs" />
111113
<Compile Include="QuickFixes\ChangeProcedureToFunctionQuickFix.cs" />
112114
<Compile Include="QuickFixes\ConvertToProcedureQuickFix.cs" />

Rubberduck.Parsing/Inspections/Resources/InspectionsUI.resx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,4 +790,17 @@ If the parameter can be null, ignore this inspection result; passing a null valu
790790
<data name="IntegerDataTypeQuickFix" xml:space="preserve">
791791
<value>Change declaration type to Long</value>
792792
</data>
793+
<data name="RemoveStopKeywordQuickFix" xml:space="preserve">
794+
<value>Remove usage of the 'stop' keyword</value>
795+
</data>
796+
<data name="StopKeywordInspectionMeta" xml:space="preserve">
797+
<value>The 'stop' keyword halts execution and brings up the debugger. Avoid its usage.</value>
798+
</data>
799+
<data name="StopKeywordInspectionName" xml:space="preserve">
800+
<value>Stop keyword</value>
801+
</data>
802+
<data name="StopKeywordInspectionResultFormat" xml:space="preserve">
803+
<value>Stop keyword detected</value>
804+
<comment>{0} Property name</comment>
805+
</data>
793806
</root>

Rubberduck.Parsing/Inspections/Resources/InspectionsUI1.Designer.cs

Lines changed: 37 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.sln

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 14
4-
VisualStudioVersion = 14.0.25420.1
3+
# Visual Studio 15
4+
VisualStudioVersion = 15.0.26730.12
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rubberduck", "RetailCoder.VBE\Rubberduck.csproj", "{20589DE8-432E-4359-9232-69EB070B7185}"
77
ProjectSection(ProjectDependencies) = postProject

RubberduckTests/Inspections/ObsoleteCallStatementInspectionTests.cs

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ public void ObsoleteCallStatement_ReturnsResult()
2020
@"Sub Foo()
2121
Call Foo
2222
End Sub";
23-
24-
IVBComponent component;
25-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
23+
24+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var _);
2625
var state = MockParser.CreateAndParse(vbe.Object);
2726

2827
var inspection = new ObsoleteCallStatementInspection(state);
@@ -41,8 +40,7 @@ public void ObsoleteCallStatement_DoesNotReturnResult()
4140
Foo
4241
End Sub";
4342

44-
IVBComponent component;
45-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
43+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var _);
4644
var state = MockParser.CreateAndParse(vbe.Object);
4745

4846
var inspection = new ObsoleteCallStatementInspection(state);
@@ -81,8 +79,7 @@ public void ObsoleteCallStatement_ReturnsResult_ColonInComment()
8179
Call Foo ' I''ve got a colon: see?
8280
End Sub";
8381

84-
IVBComponent component;
85-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
82+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var _);
8683
var state = MockParser.CreateAndParse(vbe.Object);
8784

8885
var inspection = new ObsoleteCallStatementInspection(state);
@@ -101,8 +98,7 @@ public void ObsoleteCallStatement_ReturnsResult_ColonInStringLiteral()
10198
Call Foo("":"")
10299
End Sub";
103100

104-
IVBComponent component;
105-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
101+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var _);
106102
var state = MockParser.CreateAndParse(vbe.Object);
107103

108104
var inspection = new ObsoleteCallStatementInspection(state);
@@ -125,8 +121,7 @@ Sub Goo(arg1 As Integer, arg1 As String)
125121
Call Foo
126122
End Sub";
127123

128-
IVBComponent component;
129-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
124+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var _);
130125
var state = MockParser.CreateAndParse(vbe.Object);
131126

132127
var inspection = new ObsoleteCallStatementInspection(state);
@@ -149,8 +144,7 @@ Sub Goo(arg1 As Integer, arg1 As String)
149144
Foo
150145
End Sub";
151146

152-
IVBComponent component;
153-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
147+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var _);
154148
var state = MockParser.CreateAndParse(vbe.Object);
155149

156150
var inspection = new ObsoleteCallStatementInspection(state);
@@ -170,8 +164,7 @@ public void ObsoleteCallStatement_Ignored_DoesNotReturnResult()
170164
Call Foo
171165
End Sub";
172166

173-
IVBComponent component;
174-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
167+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var _);
175168
var state = MockParser.CreateAndParse(vbe.Object);
176169

177170
var inspection = new ObsoleteCallStatementInspection(state);
@@ -203,8 +196,7 @@ Sub Goo(arg1 As Integer, arg1 As String)
203196
Foo
204197
End Sub";
205198

206-
IVBComponent component;
207-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
199+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component);
208200
var state = MockParser.CreateAndParse(vbe.Object);
209201

210202
var inspection = new ObsoleteCallStatementInspection(state);
@@ -244,8 +236,7 @@ Sub Goo(arg1 As Integer, arg1 As String)
244236
Call Foo
245237
End Sub";
246238

247-
IVBComponent component;
248-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out component);
239+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component);
249240
var state = MockParser.CreateAndParse(vbe.Object);
250241

251242
var inspection = new ObsoleteCallStatementInspection(state);

0 commit comments

Comments
 (0)