Skip to content

Commit c45954b

Browse files
authored
Merge pull request #5116 from retailcoder/next
Stop reporting missing 'Option Explicit' in otherwise empty modules; reinstates parameter quickinfo during SCP handling.
2 parents 86b22cb + a4f4f3a commit c45954b

File tree

5 files changed

+45
-12
lines changed

5 files changed

+45
-12
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/OptionExplicitInspection.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
6060

6161
public class MissingOptionExplicitListener : VBAParserBaseListener, IInspectionListener
6262
{
63-
private readonly List<QualifiedContext<ParserRuleContext>> _contexts = new List<QualifiedContext<ParserRuleContext>>();
64-
public IReadOnlyList<QualifiedContext<ParserRuleContext>> Contexts => _contexts;
63+
private readonly IDictionary<string, QualifiedContext<ParserRuleContext>> _contexts = new Dictionary<string,QualifiedContext<ParserRuleContext>>();
64+
public IReadOnlyList<QualifiedContext<ParserRuleContext>> Contexts => _contexts.Values.ToList();
6565

6666
public QualifiedModuleName CurrentModuleName { get; set; }
6767

@@ -70,6 +70,14 @@ public void ClearContexts()
7070
_contexts.Clear();
7171
}
7272

73+
public override void ExitModuleBody(VBAParser.ModuleBodyContext context)
74+
{
75+
if (context.ChildCount == 0 && _contexts.ContainsKey(CurrentModuleName.Name))
76+
{
77+
_contexts.Remove(CurrentModuleName.Name);
78+
}
79+
}
80+
7381
public override void ExitModuleDeclarations([NotNull] VBAParser.ModuleDeclarationsContext context)
7482
{
7583
var hasOptionExplicit = false;
@@ -83,7 +91,7 @@ public override void ExitModuleDeclarations([NotNull] VBAParser.ModuleDeclaratio
8391

8492
if (!hasOptionExplicit)
8593
{
86-
_contexts.Add(new QualifiedContext<ParserRuleContext>(CurrentModuleName, (ParserRuleContext)context.Parent));
94+
_contexts.Add(CurrentModuleName.Name, new QualifiedContext<ParserRuleContext>(CurrentModuleName, (ParserRuleContext)context.Parent));
8795
}
8896
}
8997
}

Rubberduck.CodeAnalysis/QuickFixes/OptionExplicitQuickFix.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public OptionExplicitQuickFix()
1616
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
1717
{
1818
var rewriter = rewriteSession.CheckOutModuleRewriter(result.QualifiedSelection.QualifiedName);
19-
rewriter.InsertBefore(0, Tokens.Option + ' ' + Tokens.Explicit + Environment.NewLine + Environment.NewLine);
19+
rewriter.InsertBefore(0, Tokens.Option + ' ' + Tokens.Explicit + Environment.NewLine);
2020
}
2121

2222
public override string Description(IInspectionResult result) => Resources.Inspections.QuickFixes.OptionExplicitQuickFix;

Rubberduck.Core/AutoComplete/SelfClosingPairs/SelfClosingPairHandler.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public override bool Handle(AutoCompleteEventArgs e, AutoCompleteSettings settin
9191
// 1-based selection span in the code pane starts at column 1 but really encompasses the entire line.
9292
var snippetPosition = new Selection(result.SnippetPosition.StartLine, 1, result.SnippetPosition.EndLine, 1);
9393
result = new CodeString(result.Code, result.CaretPosition, snippetPosition);
94-
94+
_scpService.ShowIntellisense();
9595
e.Handled = true;
9696
return true;
9797
}
@@ -143,7 +143,6 @@ private bool HandleInternal(AutoCompleteEventArgs e, CodeString original, SelfCl
143143
{
144144
e.Handled = true;
145145
result = reprettified;
146-
_scpService.ShowIntellisense();
147146
return true;
148147
}
149148

RubberduckTests/Inspections/OptionExplicitInspectionTests.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,34 @@ namespace RubberduckTests.Inspections
1010
[TestFixture]
1111
public class OptionExplicitInspectionTests
1212
{
13+
private const string OptionExplicitNotSpecified = @"
14+
Sub DoSomething()
15+
End Sub";
16+
1317
[Test]
1418
[Category("Inspections")]
15-
public void NotAlreadySpecified_ReturnsResult()
19+
public void EmptyModule_NoResult()
1620
{
1721
const string inputCode = @"";
1822

23+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
24+
using (var state = MockParser.CreateAndParse(vbe.Object))
25+
{
26+
27+
var inspection = new OptionExplicitInspection(state);
28+
var inspector = InspectionsHelper.GetInspector(inspection);
29+
var inspectionResults = inspector.FindIssuesAsync(state, CancellationToken.None).Result;
30+
31+
Assert.AreEqual(0, inspectionResults.Count());
32+
}
33+
}
34+
35+
[Test]
36+
[Category("Inspections")]
37+
public void NotAlreadySpecified_ReturnsResult()
38+
{
39+
const string inputCode = OptionExplicitNotSpecified;
40+
1941
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
2042
using (var state = MockParser.CreateAndParse(vbe.Object))
2143
{
@@ -50,7 +72,7 @@ public void AlreadySpecified_DoesNotReturnResult()
5072
[Category("Inspections")]
5173
public void NotAlreadySpecified_ReturnsMultipleResults()
5274
{
53-
const string inputCode = @"";
75+
const string inputCode = OptionExplicitNotSpecified;
5476

5577
var builder = new MockVbeBuilder();
5678
var project = builder.ProjectBuilder("TestProject1", ProjectProtection.Unprotected)
@@ -74,7 +96,7 @@ public void NotAlreadySpecified_ReturnsMultipleResults()
7496
[Category("Inspections")]
7597
public void PartiallySpecified_ReturnsResults()
7698
{
77-
const string inputCode1 = @"";
99+
const string inputCode1 = OptionExplicitNotSpecified;
78100
const string inputCode2 = @"Option Explicit";
79101

80102
var builder = new MockVbeBuilder();

RubberduckTests/QuickFixes/OptionExplicitQuickFixTests.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@ public class OptionExplicitQuickFixTests : QuickFixTestBase
1313
[Category("QuickFixes")]
1414
public void NotAlreadySpecified_QuickFixWorks()
1515
{
16-
const string inputCode = "";
17-
const string expectedCode =
18-
@"Option Explicit
16+
const string inputCode = @"
17+
Public Sub Test() ' inspection won't yield any results if module is empty (#2621)
18+
End Sub
19+
";
20+
const string expectedCode = @"Option Explicit
1921
22+
Public Sub Test() ' inspection won't yield any results if module is empty (#2621)
23+
End Sub
2024
";
2125

2226
var actualCode = ApplyQuickFixToFirstInspectionResult(inputCode, state => new OptionExplicitInspection(state));

0 commit comments

Comments
 (0)