Skip to content

Commit 26a29f8

Browse files
committed
fixes #5735
1 parent d032b22 commit 26a29f8

File tree

4 files changed

+83
-44
lines changed

4 files changed

+83
-44
lines changed

Rubberduck.CodeAnalysis/Inspections/Abstract/ImplicitSheetReferenceInspectionBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ protected override IEnumerable<Declaration> ObjectionableDeclarations(Declaratio
3434
&& declaration.AsTypeName == "Range");
3535
}
3636

37-
private static readonly string[] GlobalObjectClassNames =
37+
protected virtual string[] GlobalObjectClassNames => new[]
3838
{
3939
"Global", "_Global",
4040
"Worksheet", "_Worksheet"
4141
};
4242

43-
private static readonly string[] TargetMemberNames =
43+
protected virtual string[] TargetMemberNames => new[]
4444
{
4545
"Cells", "Range", "Columns", "Rows"
4646
};

Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitActiveSheetReferenceInspection.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ public ImplicitActiveSheetReferenceInspection(IDeclarationFinderProvider declara
4747
: base(declarationFinderProvider)
4848
{}
4949

50+
protected override string[] GlobalObjectClassNames => new[] { "Global", "_Global", };
51+
5052
protected override bool IsResultReference(IdentifierReference reference, DeclarationFinder finder)
5153
{
52-
return !(Declaration.GetModuleParent(reference.ParentNonScoping) is DocumentModuleDeclaration document)
54+
var result = !(Declaration.GetModuleParent(reference.ParentNonScoping) is DocumentModuleDeclaration document)
5355
|| !document.SupertypeNames.Contains("Worksheet");
56+
return result;
5457
}
5558

5659
protected override string ResultDescription(IdentifierReference reference)

RubberduckTests/Inspections/ImplicitActiveSheetReferenceInspectionTests.cs

Lines changed: 73 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Linq;
23
using System.Threading;
34
using NUnit.Framework;
@@ -13,6 +14,12 @@ namespace RubberduckTests.Inspections
1314
[TestFixture]
1415
public class ImplicitActiveSheetReferenceInspectionTests : InspectionTestsBase
1516
{
17+
private static readonly IDictionary<string, IEnumerable<string>> DefaultDocumentModuleSupertypeNames = new Dictionary<string, IEnumerable<string>>
18+
{
19+
["ThisWorkbook"] = new[] { "Workbook", "_Workbook" },
20+
["Sheet1"] = new[] { "Worksheet", "_Worksheet" }
21+
};
22+
1623
[Test]
1724
[Category("Inspections")]
1825
public void ImplicitActiveSheetReference_ReportsRange()
@@ -23,8 +30,13 @@ Dim arr1() As Variant
2330
arr1 = Range(""A1:B2"")
2431
End Sub
2532
";
26-
var modules = new(string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) };
27-
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count());
33+
var modules = new(string, string, ComponentType)[]
34+
{
35+
("ThisWorkbook", string.Empty, ComponentType.Document),
36+
("Sheet1", string.Empty, ComponentType.Document),
37+
("Class1", inputCode, ComponentType.ClassModule)
38+
};
39+
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
2840
}
2941

3042
[Test]
@@ -37,8 +49,13 @@ Dim arr1() As Variant
3749
arr1 = Cells(1,2)
3850
End Sub
3951
";
40-
var modules = new (string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) };
41-
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count());
52+
var modules = new (string, string, ComponentType)[]
53+
{
54+
("ThisWorkbook", string.Empty, ComponentType.Document),
55+
("Sheet1", string.Empty, ComponentType.Document),
56+
("Class1", inputCode, ComponentType.ClassModule)
57+
};
58+
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
4259
}
4360

4461
[Test]
@@ -51,8 +68,13 @@ Dim arr1() As Variant
5168
arr1 = Columns(3)
5269
End Sub
5370
";
54-
var modules = new (string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) };
55-
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count());
71+
var modules = new (string, string, ComponentType)[]
72+
{
73+
("ThisWorkbook", string.Empty, ComponentType.Document),
74+
("Sheet1", string.Empty, ComponentType.Document),
75+
("Class1", inputCode, ComponentType.ClassModule)
76+
};
77+
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
5678
}
5779

5880
[Test]
@@ -65,8 +87,13 @@ Dim arr1() As Variant
6587
arr1 = Rows(3)
6688
End Sub
6789
";
68-
var modules = new (string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) };
69-
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count());
90+
var modules = new (string, string, ComponentType)[]
91+
{
92+
("ThisWorkbook", string.Empty, ComponentType.Document),
93+
("Sheet1", string.Empty, ComponentType.Document),
94+
("Class1", inputCode, ComponentType.ClassModule)
95+
};
96+
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
7097
}
7198

7299
[Test]
@@ -79,21 +106,13 @@ Dim arr1() As Variant
79106
arr1 = Cells(1,2)
80107
End Sub
81108
";
82-
var module = ("Sheet1", inputCode, ComponentType.Document);
83-
var vbe = MockVbeBuilder.BuildFromModules(module, ReferenceLibrary.Excel).Object;
84-
85-
using (var state = MockParser.CreateAndParse(vbe))
109+
var modules = new (string, string, ComponentType)[]
86110
{
87-
var documentModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Document)
88-
.OfType<DocumentModuleDeclaration>()
89-
.Single();
90-
documentModule.AddSupertypeName("Worksheet");
91-
92-
var inspection = InspectionUnderTest(state);
93-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
94-
95-
Assert.AreEqual(0, inspectionResults.Count());
96-
}
111+
("ThisWorkbook", string.Empty, ComponentType.Document),
112+
("Sheet1", inputCode, ComponentType.Document),
113+
("Class1", string.Empty, ComponentType.ClassModule)
114+
};
115+
Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
97116
}
98117

99118
[Test]
@@ -106,21 +125,33 @@ Dim arr1() As Variant
106125
arr1 = Cells(1,2)
107126
End Sub
108127
";
109-
var module = ("Sheet1", inputCode, ComponentType.Document);
110-
var vbe = MockVbeBuilder.BuildFromModules(module, ReferenceLibrary.Excel).Object;
111-
112-
using (var state = MockParser.CreateAndParse(vbe))
128+
var modules = new (string, string, ComponentType)[]
113129
{
114-
var documentModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Document)
115-
.OfType<DocumentModuleDeclaration>()
116-
.Single();
117-
documentModule.AddSupertypeName("Workbook");
118-
119-
var inspection = InspectionUnderTest(state);
120-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
130+
("ThisWorkbook", inputCode, ComponentType.Document),
131+
("Sheet1", string.Empty, ComponentType.Document),
132+
("Class1", string.Empty, ComponentType.ClassModule)
133+
};
134+
Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
135+
}
121136

122-
Assert.AreEqual(1, inspectionResults.Count());
123-
}
137+
[Test]
138+
[Category("Inspections")]
139+
public void ImplicitActiveSheetReference_NoResultForWorksheetVariable()
140+
{
141+
const string inputCode =
142+
@"Sub foo()
143+
Dim sh As Worksheet
144+
Set sh = Sheet1
145+
Debug.Print sh.Cells(1, 1)
146+
End Sub
147+
";
148+
var modules = new (string, string, ComponentType)[]
149+
{
150+
("ThisWorkbook", string.Empty, ComponentType.Document),
151+
("Sheet1", string.Empty, ComponentType.Document),
152+
("Module1", inputCode, ComponentType.StandardModule)
153+
};
154+
Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
124155
}
125156

126157
[Test]
@@ -135,9 +166,14 @@ Dim arr1() As Variant
135166
arr1 = Range(""A1:B2"")
136167
End Sub
137168
";
169+
var modules = new (string, string, ComponentType)[]
170+
{
171+
("ThisWorkbook", string.Empty, ComponentType.Document),
172+
("Sheet1", string.Empty, ComponentType.Document),
173+
("Class1", inputCode, ComponentType.ClassModule)
174+
};
138175

139-
var modules = new(string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) };
140-
Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count());
176+
Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count());
141177
}
142178

143179
[Test]

RubberduckTests/Inspections/InspectionTestsBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ public IEnumerable<IInspectionResult> InspectionResultsForModules(IEnumerable<(s
3838
public IEnumerable<IInspectionResult> InspectionResultsForModules((string name, string content, ComponentType componentType) module, params ReferenceLibrary[] libraries)
3939
=> InspectionResultsForModules(new (string, string, ComponentType)[] { module }, libraries);
4040

41-
public IEnumerable<IInspectionResult> InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, ReferenceLibrary library)
42-
=> InspectionResultsForModules(modules, new ReferenceLibrary[] { library });
41+
public IEnumerable<IInspectionResult> InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, ReferenceLibrary library, IDictionary<string, IEnumerable<string>> documentModuleSupertypeNames = null)
42+
=> InspectionResultsForModules(modules, new ReferenceLibrary[] { library }, documentModuleSupertypeNames);
4343

44-
public IEnumerable<IInspectionResult> InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, IEnumerable<ReferenceLibrary> libraries)
44+
public IEnumerable<IInspectionResult> InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, IEnumerable<ReferenceLibrary> libraries, IDictionary<string, IEnumerable<string>> documentModuleSupertypeNames = null)
4545
{
4646
var vbe = MockVbeBuilder.BuildFromModules(modules, libraries).Object;
47-
return InspectionResults(vbe);
47+
return InspectionResults(vbe, documentModuleSupertypeNames);
4848
}
4949

5050
public IEnumerable<IInspectionResult> InspectionResults(IVBE vbe, IDictionary<string, IEnumerable<string>> documentModuleSupertypeNames = null)

0 commit comments

Comments
 (0)