Skip to content

Commit d614aa5

Browse files
committed
fixed bug in ExcelObjectModel causing InvalidOperationException in resolver. closes #1145
1 parent 1d4421d commit d614aa5

File tree

4 files changed

+47
-73
lines changed

4 files changed

+47
-73
lines changed

Rubberduck.Parsing/Symbols/Declaration.cs

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Diagnostics;
55
using System.Linq;
66
using Antlr4.Runtime;
7-
using Microsoft.CSharp.RuntimeBinder;
87
using Microsoft.Vbe.Interop;
98
using Rubberduck.Parsing.Grammar;
109
using Rubberduck.VBEditor;
@@ -234,15 +233,8 @@ public bool IsArray()
234233
return false;
235234
}
236235

237-
try
238-
{
239-
var declaration = (dynamic)Context;
240-
return declaration.LPAREN() != null && declaration.RPAREN() != null;
241-
}
242-
catch (RuntimeBinderException)
243-
{
244-
return false;
245-
}
236+
var declaration = (dynamic)Context;
237+
return declaration.LPAREN() != null && declaration.RPAREN() != null;
246238
}
247239

248240
private bool? _isTypeSpecified;
@@ -281,15 +273,12 @@ public bool IsTypeSpecified()
281273
return false;
282274
}
283275

284-
try
285-
{
286-
var asType = ((dynamic)Context).asTypeClause() as VBAParser.AsTypeClauseContext;
287-
return asType != null || HasTypeHint();
288-
}
289-
catch (RuntimeBinderException)
276+
if (HasTypeHint())
290277
{
291-
return false;
278+
return true;
292279
}
280+
281+
return ((dynamic)Context).asTypeClause() is VBAParser.AsTypeClauseContext;
293282
}
294283

295284
private bool? _hasTypeHint;
@@ -337,17 +326,9 @@ public bool HasTypeHint(out string token)
337326
return false;
338327
}
339328

340-
try
341-
{
342-
var hint = ((dynamic)Context).typeHint() as VBAParser.TypeHintContext;
343-
token = hint == null ? null : hint.GetText();
344-
return hint != null;
345-
}
346-
catch (RuntimeBinderException)
347-
{
348-
token = null;
349-
return false;
350-
}
329+
var hint = ((dynamic)Context).typeHint() as VBAParser.TypeHintContext;
330+
token = hint == null ? null : hint.GetText();
331+
return hint != null;
351332
}
352333

353334
public bool IsSelected(QualifiedSelection selection)

Rubberduck.Parsing/Symbols/ExcelObjectModel.cs

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ internal static class ExcelObjectModel
1414
{
1515
private static IEnumerable<Declaration> _excelDeclarations;
1616
private static readonly QualifiedModuleName ExcelModuleName = new QualifiedModuleName("Excel", "Excel");
17-
public static readonly QualifiedModuleName WorkbookModuleName = new QualifiedModuleName("Excel", "Workbook");
18-
public static readonly QualifiedModuleName WorksheetModuleName = new QualifiedModuleName("Excel", "Worksheet");
17+
private static readonly QualifiedModuleName WorkbookModuleName = new QualifiedModuleName("Excel", "Workbook");
18+
private static readonly QualifiedModuleName WorksheetModuleName = new QualifiedModuleName("Excel", "Worksheet");
19+
private static readonly QualifiedModuleName RangeModuleName = new QualifiedModuleName("Excel", "Range");
20+
private static readonly QualifiedModuleName ApplicationModuleName = new QualifiedModuleName("Excel", "Application");
1921

2022
public static IEnumerable<Declaration> Declarations
2123
{
@@ -125,12 +127,12 @@ private class RangeClass
125127
{
126128
public static readonly Declaration Range = new Declaration(new QualifiedMemberName(ExcelModuleName, "Range"), ExcelLib.Excel, "Excel", "Range", false, false, Accessibility.Global, DeclarationType.Class);
127129

128-
public static Declaration Cells = new Declaration(new QualifiedMemberName(ExcelModuleName, "Cells"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
129-
public static Declaration CellsAssign = new Declaration(new QualifiedMemberName(ExcelModuleName, "Cells"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyLet); // cheating to simulate default property of return type.
130-
public static Declaration Activate = new Declaration(new QualifiedMemberName(ExcelModuleName, "Activate"), Range, "Excel.Range", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
131-
public static Declaration Select = new Declaration(new QualifiedMemberName(ExcelModuleName, "Select"), Range, "Excel.Range", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
132-
public static Declaration Columns = new Declaration(new QualifiedMemberName(ExcelModuleName, "Columns"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
133-
public static Declaration Rows = new Declaration(new QualifiedMemberName(ExcelModuleName, "Rows"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
130+
public static Declaration Cells = new Declaration(new QualifiedMemberName(RangeModuleName, "Cells"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
131+
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.
132+
public static Declaration Activate = new Declaration(new QualifiedMemberName(RangeModuleName, "Activate"), Range, "Excel.Range", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
133+
public static Declaration Select = new Declaration(new QualifiedMemberName(RangeModuleName, "Select"), Range, "Excel.Range", "Variant", false, false, Accessibility.Public, DeclarationType.Function);
134+
public static Declaration Columns = new Declaration(new QualifiedMemberName(RangeModuleName, "Columns"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
135+
public static Declaration Rows = new Declaration(new QualifiedMemberName(RangeModuleName, "Rows"), Range, "Excel.Range", "Range", false, false, Accessibility.Public, DeclarationType.PropertyGet);
134136
}
135137

136138
private class GlobalClass
@@ -163,26 +165,26 @@ private class ApplicationClass
163165
{
164166
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.
165167

166-
public static Declaration Evaluate = new Declaration(new QualifiedMemberName(ExcelModuleName, "Evaluate"), Application, "Excel.Application", "Variant", false, false, Accessibility.Global, DeclarationType.Function);
167-
public static Declaration Range = new Declaration(new QualifiedMemberName(ExcelModuleName, "Range"), Application, "Excel.Application", "Range", true, false, Accessibility.Global, DeclarationType.PropertyGet);
168-
public static Declaration RangeAssign = new Declaration(new QualifiedMemberName(ExcelModuleName, "Range"), Application, "Excel.Application", "Range", true, false, Accessibility.Global, DeclarationType.PropertyLet); // cheating to simuate default property of return type.
169-
public static Declaration Selection = new Declaration(new QualifiedMemberName(ExcelModuleName, "Selection"), Application, "Excel.Application", "Object", true, false, Accessibility.Global, DeclarationType.PropertyGet);
170-
171-
public static Declaration Activate = new Declaration(new QualifiedMemberName(ExcelModuleName, "Activate"), Application, "Excel.Application", "Variant", false, false, Accessibility.Global, DeclarationType.Function);
172-
public static Declaration Select = new Declaration(new QualifiedMemberName(ExcelModuleName, "Select"), Application, "Excel.Application", "Variant", false, false, Accessibility.Global, DeclarationType.Function);
173-
public static Declaration Cells = new Declaration(new QualifiedMemberName(ExcelModuleName, "Cells"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
174-
public static Declaration CellsAssign = new Declaration(new QualifiedMemberName(ExcelModuleName, "Cells"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyLet); // cheating to simulate default property of return type.
175-
public static Declaration Names = new Declaration(new QualifiedMemberName(ExcelModuleName, "Names"), Application, "Excel.Application", "Names", false, false, Accessibility.Global, DeclarationType.PropertyGet);
176-
public static Declaration Sheets = new Declaration(new QualifiedMemberName(ExcelModuleName, "Sheets"), Application, "Excel.Application", "Sheets", false, false, Accessibility.Global, DeclarationType.PropertyGet);
177-
public static Declaration Worksheets = new Declaration(new QualifiedMemberName(ExcelModuleName, "Worksheets"), Application, "Excel.Application", "Worksheets", false, false, Accessibility.Global, DeclarationType.PropertyGet);
178-
public static Declaration WorksheetFunction = new Declaration(new QualifiedMemberName(ExcelModuleName, "WorksheetFunction"), Application, "Excel.Application", "WorksheetFunction", false, false, Accessibility.Global, DeclarationType.PropertyGet);
179-
180-
public static Declaration Columns = new Declaration(new QualifiedMemberName(ExcelModuleName, "Columns"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
181-
public static Declaration Rows = new Declaration(new QualifiedMemberName(ExcelModuleName, "Rows"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
182-
183-
public static Declaration ActiveCell = new Declaration(new QualifiedMemberName(ExcelModuleName, "ActiveCell"), Application, "Excel.Application", "Range", false, false, Accessibility.Global, DeclarationType.PropertyGet);
184-
public static Declaration ActiveSheet = new Declaration(new QualifiedMemberName(ExcelModuleName, "ActiveSheet"), Application, "Excel.Application", "Worksheet", false, false, Accessibility.Global, DeclarationType.PropertyGet); // cheating on return type
185-
public static Declaration ActiveWorkbook = new Declaration(new QualifiedMemberName(ExcelModuleName, "ActiveWorkbook"), Application, "Excel.Application", "Workbook", false, false, Accessibility.Global, DeclarationType.PropertyGet);
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);
186188
}
187189
}
188190
}

Rubberduck.Parsing/Symbols/IdentifierReference.cs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,27 +116,18 @@ public bool HasTypeHint(out string token)
116116
return false;
117117
}
118118

119-
try
120-
{
121-
var method = Context.Parent.GetType().GetMethod("typeHint");
122-
if (method == null)
123-
{
124-
token = null;
125-
_hasTypeHint = false;
126-
return false;
127-
}
128-
129-
var hint = ((dynamic)Context.Parent).typeHint() as VBAParser.TypeHintContext;
130-
token = hint == null ? null : hint.GetText();
131-
_hasTypeHint = hint != null;
132-
return _hasTypeHint.Value;
133-
}
134-
catch (RuntimeBinderException)
119+
var method = Context.Parent.GetType().GetMethod("typeHint");
120+
if (method == null)
135121
{
136122
token = null;
137123
_hasTypeHint = false;
138124
return false;
139125
}
126+
127+
var hint = ((dynamic)Context.Parent).typeHint() as VBAParser.TypeHintContext;
128+
token = hint == null ? null : hint.GetText();
129+
_hasTypeHint = hint != null;
130+
return _hasTypeHint.Value;
140131
}
141132

142133
public bool IsSelected(QualifiedSelection selection)

Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ public void Resolve(VBAParser.ICS_B_MemberProcedureCallContext context)
728728

729729
var identifierContext = context.ambiguousIdentifier();
730730
var member = _declarations.Where(d => d.IdentifierName == identifierContext.GetText())
731-
.SingleOrDefault(item => item.ComponentName == parentType.ComponentName);
731+
.SingleOrDefault(item => item.QualifiedName.QualifiedModuleName == parentType.QualifiedName.QualifiedModuleName);
732732

733733
if (member != null)
734734
{

0 commit comments

Comments
 (0)