Skip to content

Commit f98aa57

Browse files
committed
Merge pull request #1148 from retailcoder/CodeExplorer
ExcelObjectModel + resolver fix
2 parents c3932ae + d614aa5 commit f98aa57

File tree

4 files changed

+63
-142
lines changed

4 files changed

+63
-142
lines changed

Rubberduck.Parsing/Symbols/Declaration.cs

Lines changed: 17 additions & 106 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;
@@ -228,27 +227,14 @@ public bool IsArray()
228227
return _isArray.Value;
229228
}
230229

231-
var variableContext = Context as VBAParser.VariableSubStmtContext;
232-
if (variableContext != null)
233-
{
234-
return variableContext.LPAREN() != null && variableContext.RPAREN() != null;
235-
}
236-
237-
var typeElementContext = Context as VBAParser.TypeStmt_ElementContext;
238-
if (typeElementContext != null)
239-
{
240-
return typeElementContext.LPAREN() != null && typeElementContext.RPAREN() != null;
241-
}
242-
243-
try
244-
{
245-
var declaration = (dynamic)Context;
246-
return declaration.LPAREN() != null && declaration.RPAREN() != null;
247-
}
248-
catch (RuntimeBinderException)
230+
var rParenMethod = Context.GetType().GetMethod("RPAREN");
231+
if (rParenMethod == null)
249232
{
250233
return false;
251234
}
235+
236+
var declaration = (dynamic)Context;
237+
return declaration.LPAREN() != null && declaration.RPAREN() != null;
252238
}
253239

254240
private bool? _isTypeSpecified;
@@ -281,51 +267,18 @@ public bool IsTypeSpecified()
281267
return _isTypeSpecified.Value;
282268
}
283269

284-
var variableContext = Context as VBAParser.VariableSubStmtContext;
285-
if (variableContext != null)
286-
{
287-
return variableContext.asTypeClause() != null || HasTypeHint();
288-
}
289-
290-
var argContext = Context as VBAParser.ArgContext;
291-
if (argContext != null)
270+
var method = Context.GetType().GetMethod("asTypeClause");
271+
if (method == null)
292272
{
293-
return argContext.asTypeClause() != null || HasTypeHint();
294-
}
295-
296-
var constContext = Context as VBAParser.ConstSubStmtContext;
297-
if (constContext != null)
298-
{
299-
return constContext.asTypeClause() != null || HasTypeHint();
300-
}
301-
302-
var functionContext = Context as VBAParser.FunctionStmtContext;
303-
if (functionContext != null)
304-
{
305-
return functionContext.asTypeClause() != null || HasTypeHint();
306-
}
307-
308-
var getterContext = Context as VBAParser.PropertyGetStmtContext;
309-
if (getterContext != null)
310-
{
311-
return getterContext.asTypeClause() != null || HasTypeHint();
273+
return false;
312274
}
313275

314-
var typeElementContext = Context as VBAParser.TypeStmt_ElementContext;
315-
if (typeElementContext != null)
276+
if (HasTypeHint())
316277
{
317-
return typeElementContext.asTypeClause() != null || HasTypeHint();
278+
return true;
318279
}
319280

320-
try
321-
{
322-
var asType = ((dynamic)Context).asTypeClause() as VBAParser.AsTypeClauseContext;
323-
return asType != null || HasTypeHint();
324-
}
325-
catch (RuntimeBinderException)
326-
{
327-
return false;
328-
}
281+
return ((dynamic)Context).asTypeClause() is VBAParser.AsTypeClauseContext;
329282
}
330283

331284
private bool? _hasTypeHint;
@@ -366,58 +319,16 @@ public bool HasTypeHint(out string token)
366319
return false;
367320
}
368321

369-
VBAParser.TypeHintContext hint;
370-
var variableContext = Context as VBAParser.VariableSubStmtContext;
371-
if (variableContext != null)
372-
{
373-
hint = variableContext.typeHint();
374-
token = hint == null ? null : hint.GetText();
375-
return hint != null;
376-
}
377-
378-
var argContext = Context as VBAParser.ArgContext;
379-
if (argContext != null)
380-
{
381-
hint = argContext.typeHint();
382-
token = hint == null ? null : hint.GetText();
383-
return hint != null;
384-
}
385-
386-
var constContext = Context as VBAParser.ConstSubStmtContext;
387-
if (constContext != null)
388-
{
389-
hint = constContext.typeHint();
390-
token = hint == null ? null : hint.GetText();
391-
return hint != null;
392-
}
393-
394-
var functionContext = Context as VBAParser.FunctionStmtContext;
395-
if (functionContext != null)
396-
{
397-
hint = functionContext.typeHint();
398-
token = hint == null ? null : hint.GetText();
399-
return hint != null;
400-
}
401-
402-
var getterContext = Context as VBAParser.PropertyGetStmtContext;
403-
if (getterContext != null)
404-
{
405-
hint = getterContext.typeHint();
406-
token = hint == null ? null : hint.GetText();
407-
return hint != null;
408-
}
409-
410-
try
411-
{
412-
hint = ((dynamic)Context).typeHint() as VBAParser.TypeHintContext;
413-
token = hint == null ? null : hint.GetText();
414-
return hint != null;
415-
}
416-
catch (RuntimeBinderException)
322+
var method = Context.GetType().GetMethod("typeHint");
323+
if (method == null)
417324
{
418325
token = null;
419326
return false;
420327
}
328+
329+
var hint = ((dynamic)Context).typeHint() as VBAParser.TypeHintContext;
330+
token = hint == null ? null : hint.GetText();
331+
return hint != null;
421332
}
422333

423334
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: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,14 @@ private bool HasExplicitCallStatement(VBAParser.ECS_ProcedureCallContext call)
9595
return statement != null && statement.Symbol.Text == Tokens.Call;
9696
}
9797

98+
private bool? _hasTypeHint;
9899
public bool HasTypeHint()
99100
{
101+
if (_hasTypeHint.HasValue)
102+
{
103+
return _hasTypeHint.Value;
104+
}
105+
100106
string token;
101107
return HasTypeHint(out token);
102108
}
@@ -106,20 +112,22 @@ public bool HasTypeHint(out string token)
106112
if (Context == null)
107113
{
108114
token = null;
115+
_hasTypeHint = false;
109116
return false;
110117
}
111118

112-
try
113-
{
114-
var hint = ((dynamic)Context.Parent).typeHint() as VBAParser.TypeHintContext;
115-
token = hint == null ? null : hint.GetText();
116-
return hint != null;
117-
}
118-
catch (RuntimeBinderException)
119+
var method = Context.Parent.GetType().GetMethod("typeHint");
120+
if (method == null)
119121
{
120122
token = null;
123+
_hasTypeHint = false;
121124
return false;
122125
}
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;
123131
}
124132

125133
public bool IsSelected(QualifiedSelection selection)

0 commit comments

Comments
 (0)