Skip to content

Commit 75034e3

Browse files
committed
Multiple resolver and parser/parser state fixes, ExcelObjectModel, and inspections fixes, fixes #1157
1 parent 5ee6467 commit 75034e3

File tree

9 files changed

+110
-51
lines changed

9 files changed

+110
-51
lines changed

RetailCoder.VBE/Inspections/ImplicitActiveSheetReferenceInspection.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
3737
// if host isn't Excel, the ExcelObjectModel declarations shouldn't be loaded anyway.
3838
}
3939

40-
var issues = Declarations.Where(item => item.IsBuiltIn
41-
&& item.ParentScope == "Excel.Global"
42-
&& Targets.Contains(item.IdentifierName)
43-
&& item.References.Any())
40+
var matches = BuiltInDeclarations.Where(item =>
41+
(item.ParentScope == "Excel.Global" || item.ParentScope == "Excel.Application")
42+
&& Targets.Contains(item.IdentifierName)).ToList();
43+
44+
var issues = matches.Where(item => item.References.Any())
4445
.SelectMany(declaration => declaration.References);
4546

4647
return issues.Select(issue =>

RetailCoder.VBE/Inspections/InspectionBase.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ protected virtual IEnumerable<Declaration> Declarations
7474
get { return State.AllDeclarations.Where(declaration => !declaration.IsInspectionDisabled(AnnotationName)); }
7575
}
7676

77+
protected virtual IEnumerable<Declaration> BuiltInDeclarations
78+
{
79+
get { return State.AllDeclarations.Where(declaration => declaration.IsBuiltIn); }
80+
}
81+
7782
/// <summary>
7883
/// Gets all user declarations in the parser state without an @Ignore annotation for this inspection.
7984
/// </summary>

RetailCoder.VBE/Inspections/InspectionsUI.Designer.cs

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

RetailCoder.VBE/Inspections/InspectionsUI.resx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,13 @@
166166
<value>Ignore once</value>
167167
</data>
168168
<data name="ImplicitActiveSheetReferenceInspectionMeta" xml:space="preserve">
169-
<value>Implicit references to the active sheet make the code frail and harder to debug. Consider making these references explicit when they're intended, and prefer working off object references.</value>
169+
<value>Implicit references to the active sheet make the code frail and harder to debug. Consider making these references explicit when they're intended, and prefer working off object references. Ignore if the member call is referring to a type Rubberduck can't resolve.</value>
170170
</data>
171171
<data name="ImplicitActiveSheetReferenceInspectionName" xml:space="preserve">
172172
<value>Implicit reference to ActiveSheet</value>
173173
</data>
174174
<data name="ImplicitActiveWorkbookReferenceInspectionMeta" xml:space="preserve">
175-
<value>Implicit references to the active workbook make the code frail and harder to debug. Consider making these references explicit when they're intended, and prefer working off object references.</value>
175+
<value>Implicit references to the active workbook make the code frail and harder to debug. Consider making these references explicit when they're intended, and prefer working off object references. Ignore if the member call is referring to a type Rubberduck can't resolve.</value>
176176
</data>
177177
<data name="ImplicitActiveWorkbookReferenceInspectionName" xml:space="preserve">
178178
<value>Implicit reference to ActiveWorkbook</value>
@@ -274,7 +274,7 @@
274274
<value>'Option Base 1' is specified</value>
275275
</data>
276276
<data name="OptionExplicitInspectionMeta" xml:space="preserve">
277-
<value>Rubberduck cannot see variables that aren't declared. VBA will happily compile a typo and you'll soon be asking an embarassing question on Stack Overflow. Avoid problems, use 'Option Explicit'. </value>
277+
<value>Rubberduck cannot see variables that aren't declared. VBA will happily compile a typo: use 'Option Explicit' to prevent successfully compiling an erroneous program.</value>
278278
</data>
279279
<data name="OptionExplicitInspectionName" xml:space="preserve">
280280
<value>'Option Explicit' is not specified</value>

Rubberduck.Parsing/Symbols/Declaration.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,5 +432,15 @@ public override int GetHashCode()
432432
return hash;
433433
}
434434
}
435+
436+
public void ClearReferences()
437+
{
438+
var references = _references.ToList();
439+
for (var i = 0; i < references.Count; i++)
440+
{
441+
IdentifierReference reference;
442+
_references.TryTake(out reference);
443+
}
444+
}
435445
}
436446
}

Rubberduck.Parsing/Symbols/ExcelObjectModel.cs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ private class ExcelLib
4444

4545
private class WorkbookClass
4646
{
47-
public static readonly Declaration Workbook = new Declaration(new QualifiedMemberName(ExcelModuleName, "Workbook"), ExcelLib.Excel, "Excel", "Workbook", false, false, Accessibility.Global, DeclarationType.Class);
47+
public static readonly Declaration Workbook = new Declaration(new QualifiedMemberName(WorkbookModuleName, "Workbook"), ExcelLib.Excel, "Excel", "Workbook", false, false, Accessibility.Global, DeclarationType.Class);
4848

4949
public static Declaration ActiveSheet = new Declaration(new QualifiedMemberName(WorkbookModuleName, "ActiveSheet"), Workbook, "Excel.Workbook", "Worksheet", false, false, Accessibility.Public, DeclarationType.PropertyGet); // cheating on return type
5050
public static Declaration Sheets = new Declaration(new QualifiedMemberName(WorkbookModuleName, "Sheets"), Workbook, "Excel.Workbook", "Sheets", false, false, Accessibility.Public, DeclarationType.PropertyGet);
@@ -91,7 +91,7 @@ private class WorkbookClass
9191

9292
private class WorksheetClass
9393
{
94-
public static readonly Declaration Worksheet = new Declaration(new QualifiedMemberName(ExcelModuleName, "Worksheet"), ExcelLib.Excel, "Excel", "Worksheet", false, false, Accessibility.Global, DeclarationType.Class);
94+
public static readonly Declaration Worksheet = new Declaration(new QualifiedMemberName(WorksheetModuleName, "Worksheet"), ExcelLib.Excel, "Excel", "Worksheet", false, false, Accessibility.Global, DeclarationType.Class);
9595

9696
public static Declaration Evaluate = new Declaration(new QualifiedMemberName(WorksheetModuleName, "Evaluate"), Worksheet, "Excel.Worksheet", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
9797
public static Declaration Range = new Declaration(new QualifiedMemberName(WorksheetModuleName, "Range"), Worksheet, "Excel.Worksheet", "Range", true, false, Accessibility.Public, DeclarationType.PropertyGet);
@@ -125,7 +125,7 @@ private class WorksheetClass
125125

126126
private class RangeClass
127127
{
128-
public static readonly Declaration Range = new Declaration(new QualifiedMemberName(ExcelModuleName, "Range"), ExcelLib.Excel, "Excel", "Range", false, false, Accessibility.Global, DeclarationType.Class);
128+
public static readonly Declaration Range = new Declaration(new QualifiedMemberName(RangeModuleName, "Range"), ExcelLib.Excel, "Excel", "Range", false, false, Accessibility.Global, DeclarationType.Class);
129129

130130
public static Declaration Cells = new Declaration(new QualifiedMemberName(RangeModuleName, "Cells"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
131131
public static Declaration CellsAssign = new Declaration(new QualifiedMemberName(RangeModuleName, "Cells"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyLet); // cheating to simulate default property of return type.
@@ -163,28 +163,28 @@ private class GlobalClass
163163

164164
private class ApplicationClass
165165
{
166-
public static readonly Declaration Application = new Declaration(new QualifiedMemberName(ExcelModuleName, "Application"), ExcelLib.Excel, "Application", "Application", false, false, Accessibility.Global, DeclarationType.Module); // cheating, it's actually a class.
167-
168-
public static Declaration Evaluate = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Evaluate"), Application, "Excel.Application", "Variant", false, false, Accessibility.Global, DeclarationType.Function);
169-
public static Declaration Range = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Range"), Application, "Excel.Application", "Range", true, false, Accessibility.Global, DeclarationType.PropertyGet);
170-
public static Declaration RangeAssign = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Range"), Application, "Excel.Application", "Range", true, false, Accessibility.Global, DeclarationType.PropertyLet); // cheating to simuate default property of return type.
171-
public static Declaration Selection = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Selection"), Application, "Excel.Application", "Object", true, false, Accessibility.Global, DeclarationType.PropertyGet);
172-
173-
public static Declaration Activate = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Activate"), Application, "Excel.Application", "Variant", false, false, Accessibility.Global, DeclarationType.Function);
174-
public static Declaration Select = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Select"), Application, "Excel.Application", "Variant", false, false, Accessibility.Global, DeclarationType.Function);
175-
public static Declaration Cells = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Cells"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
176-
public static Declaration CellsAssign = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Cells"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyLet); // cheating to simulate default property of return type.
177-
public static Declaration Names = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Names"), Application, "Excel.Application", "Names", false, false, Accessibility.Global, DeclarationType.PropertyGet);
178-
public static Declaration Sheets = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Sheets"), Application, "Excel.Application", "Sheets", false, false, Accessibility.Global, DeclarationType.PropertyGet);
179-
public static Declaration Worksheets = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Worksheets"), Application, "Excel.Application", "Worksheets", false, false, Accessibility.Global, DeclarationType.PropertyGet);
180-
public static Declaration WorksheetFunction = new Declaration(new QualifiedMemberName(ApplicationModuleName, "WorksheetFunction"), Application, "Excel.Application", "WorksheetFunction", false, false, Accessibility.Global, DeclarationType.PropertyGet);
181-
182-
public static Declaration Columns = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Columns"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
183-
public static Declaration Rows = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Rows"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
184-
185-
public static Declaration ActiveCell = new Declaration(new QualifiedMemberName(ApplicationModuleName, "ActiveCell"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
186-
public static Declaration ActiveSheet = new Declaration(new QualifiedMemberName(ApplicationModuleName, "ActiveSheet"), Application, "Excel.Application", "Worksheet", false, false, Accessibility.Global, DeclarationType.PropertyGet); // cheating on return type
187-
public static Declaration ActiveWorkbook = new Declaration(new QualifiedMemberName(ApplicationModuleName, "ActiveWorkbook"), Application, "Excel.Application", "Workbook", false, false, Accessibility.Global, DeclarationType.PropertyGet);
166+
public static readonly Declaration Application = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Application"), ExcelLib.Excel, "Application", "Application", false, false, Accessibility.Global, DeclarationType.Module); // cheating, it's actually a class.
167+
168+
public static Declaration Evaluate = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Evaluate"), Application, "Excel.Application", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
169+
public static Declaration Range = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Range"), Application, "Excel.Application", "Range", true, false, Accessibility.Public, DeclarationType.PropertyGet);
170+
public static Declaration RangeAssign = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Range"), Application, "Excel.Application", "Range", true, false, Accessibility.Public, DeclarationType.PropertyLet); // cheating to simuate default property of return type.
171+
public static Declaration Selection = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Selection"), Application, "Excel.Application", "Object", true, false, Accessibility.Public, DeclarationType.PropertyGet);
172+
173+
public static Declaration Activate = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Activate"), Application, "Excel.Application", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
174+
public static Declaration Select = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Select"), Application, "Excel.Application", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
175+
public static Declaration Cells = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Cells"), Application, "Excel.Application", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
176+
public static Declaration CellsAssign = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Cells"), Application, "Excel.Application", "Range", false, false, Accessibility.Public, DeclarationType.PropertyLet); // cheating to simulate default property of return type.
177+
public static Declaration Names = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Names"), Application, "Excel.Application", "Names", false, false, Accessibility.Public, DeclarationType.PropertyGet);
178+
public static Declaration Sheets = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Sheets"), Application, "Excel.Application", "Sheets", false, false, Accessibility.Public, DeclarationType.PropertyGet);
179+
public static Declaration Worksheets = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Worksheets"), Application, "Excel.Application", "Worksheets", false, false, Accessibility.Public, DeclarationType.PropertyGet);
180+
public static Declaration WorksheetFunction = new Declaration(new QualifiedMemberName(ApplicationModuleName, "WorksheetFunction"), Application, "Excel.Application", "WorksheetFunction", false, false, Accessibility.Public, DeclarationType.PropertyGet);
181+
182+
public static Declaration Columns = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Columns"), Application, "Excel.Application", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
183+
public static Declaration Rows = new Declaration(new QualifiedMemberName(ApplicationModuleName, "Rows"), Application, "Excel.Application", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
184+
185+
public static Declaration ActiveCell = new Declaration(new QualifiedMemberName(ApplicationModuleName, "ActiveCell"), Application, "Excel.Application", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
186+
public static Declaration ActiveSheet = new Declaration(new QualifiedMemberName(ApplicationModuleName, "ActiveSheet"), Application, "Excel.Application", "Worksheet", false, false, Accessibility.Public, DeclarationType.PropertyGet); // cheating on return type
187+
public static Declaration ActiveWorkbook = new Declaration(new QualifiedMemberName(ApplicationModuleName, "ActiveWorkbook"), Application, "Excel.Application", "Workbook", false, false, Accessibility.Public, DeclarationType.PropertyGet);
188188
}
189189
}
190190
}

0 commit comments

Comments
 (0)