@@ -145,7 +145,7 @@ private static string FullObjectTypeName(Declaration setTypeDeterminingDeclarati
145
145
case VBAParser . InstanceExprContext instanceExpression :
146
146
return SetTypeDeterminingDeclarationOfInstance ( containingModule , finder ) ;
147
147
case VBAParser . IndexExprContext indexExpression :
148
- throw new NotImplementedException ( ) ;
148
+ return SetTypeDeterminingDeclarationOfIndexExpression ( indexExpression . lExpression ( ) , containingModule , finder ) ;
149
149
case VBAParser . MemberAccessExprContext memberAccessExpression :
150
150
return SetTypeDeterminingDeclarationOfExpression ( memberAccessExpression . unrestrictedIdentifier ( ) , containingModule , finder ) ;
151
151
case VBAParser . WithMemberAccessExprContext withMemberAccessExpression :
@@ -155,12 +155,66 @@ private static string FullObjectTypeName(Declaration setTypeDeterminingDeclarati
155
155
case VBAParser . WithDictionaryAccessExprContext withDictionaryAccessExpression :
156
156
return SetTypeDeterminingDeclarationOfExpression ( withDictionaryAccessExpression . dictionaryAccess ( ) , containingModule , finder ) ;
157
157
case VBAParser . WhitespaceIndexExprContext whitespaceIndexExpression :
158
- throw new NotImplementedException ( ) ;
158
+ return SetTypeDeterminingDeclarationOfIndexExpression ( whitespaceIndexExpression . lExpression ( ) , containingModule , finder ) ;
159
159
default :
160
160
return ( null , true ) ; //We should already cover every case. Return the value indicating that we have no idea.
161
161
}
162
162
}
163
163
164
+ private ( Declaration declaration , bool mightHaveSetType ) SetTypeDeterminingDeclarationOfIndexExpression ( VBAParser . LExpressionContext lExpression , QualifiedModuleName containingModule , DeclarationFinder finder )
165
+ {
166
+ var declaration = ResolveIndexExpressionAsMethod ( lExpression , containingModule , finder )
167
+ ?? ResolveIndexExpressionAsDefaultMemberAccess ( lExpression , containingModule , finder ) ;
168
+
169
+ if ( declaration != null )
170
+ {
171
+ return ( declaration , MightHaveSetType ( declaration ) ) ;
172
+ }
173
+
174
+ return ResolveIndexExpressionAsArrayAccess ( lExpression , containingModule , finder ) ;
175
+ }
176
+
177
+ private Declaration ResolveIndexExpressionAsMethod ( VBAParser . LExpressionContext lExpression , QualifiedModuleName containingModule , DeclarationFinder finder )
178
+ {
179
+ //For functions and properties, the identifier will be at the end of the lExpression.
180
+ var qualifiedSelection = new QualifiedSelection ( containingModule , lExpression . GetSelection ( ) . Collapse ( ) ) ;
181
+ var candidate = finder
182
+ . ContainingIdentifierReferences ( qualifiedSelection )
183
+ . LastOrDefault ( )
184
+ ? . Declaration ;
185
+ return candidate ? . DeclarationType . HasFlag ( DeclarationType . Member ) ?? false
186
+ ? candidate
187
+ : null ;
188
+ }
189
+
190
+ private ( Declaration declaration , bool mightHaveSetType ) ResolveIndexExpressionAsArrayAccess ( VBAParser . LExpressionContext lExpression , QualifiedModuleName containingModule , DeclarationFinder finder )
191
+ {
192
+ var ( potentialArrayDeclaration , lExpressionMightHaveSetType ) = SetTypeDeterminingDeclarationOfExpression ( lExpression , containingModule , finder ) ;
193
+
194
+ if ( potentialArrayDeclaration == null )
195
+ {
196
+ return ( null , lExpressionMightHaveSetType ) ;
197
+ }
198
+
199
+ if ( ! potentialArrayDeclaration . IsArray )
200
+ {
201
+ //This is not an array access. So, we have no idea.
202
+ return ( null , true ) ;
203
+ }
204
+
205
+ return ( potentialArrayDeclaration , MightHaveSetTypeOnArrayAccess ( potentialArrayDeclaration ) ) ;
206
+ }
207
+
208
+ private Declaration ResolveIndexExpressionAsDefaultMemberAccess ( VBAParser . LExpressionContext lExpression , QualifiedModuleName containingModule , DeclarationFinder finder )
209
+ {
210
+ // A default member access references the entire lExpression.
211
+ var qualifiedSelection = new QualifiedSelection ( containingModule , lExpression . GetSelection ( ) ) ;
212
+ return finder
213
+ . IdentifierReferences ( qualifiedSelection )
214
+ . FirstOrDefault ( reference => reference . IsDefaultMemberAccess )
215
+ ? . Declaration ;
216
+ }
217
+
164
218
private ( Declaration declaration , bool mightHaveSetType ) SetTypeDeterminingDeclarationOfExpression ( VBAParser . IdentifierContext identifier , QualifiedModuleName containingModule , DeclarationFinder finder )
165
219
{
166
220
var declaration = finder . IdentifierReferences ( identifier , containingModule )
@@ -194,6 +248,30 @@ private static bool MightHaveSetType(Declaration declaration)
194
248
|| declaration . DeclarationType . HasFlag ( DeclarationType . ClassModule ) ;
195
249
}
196
250
251
+ private static bool MightHaveSetTypeOnArrayAccess ( Declaration declaration )
252
+ {
253
+ return declaration == null
254
+ || IsObjectArray ( declaration )
255
+ || declaration . AsTypeName == Tokens . Variant ;
256
+ }
257
+
258
+ private static bool IsObjectArray ( Declaration declaration )
259
+ {
260
+ if ( ! declaration . IsArray )
261
+ {
262
+ return false ;
263
+ }
264
+
265
+ if ( declaration . AsTypeName == Tokens . Object ||
266
+ ( declaration . AsTypeDeclaration ? . DeclarationType . HasFlag ( DeclarationType . ClassModule ) ?? false ) )
267
+ {
268
+ return true ;
269
+ }
270
+
271
+ return false ;
272
+ }
273
+
274
+
197
275
private ( Declaration declaration , bool mightHaveSetType ) SetTypeDeterminingDeclarationOfInstance ( QualifiedModuleName instance , DeclarationFinder finder )
198
276
{
199
277
var classDeclaration = finder . Classes . FirstOrDefault ( cls => cls . QualifiedModuleName . Equals ( instance ) ) ;
0 commit comments