@@ -116,21 +116,81 @@ private IBoundExpression Resolve(IBoundExpression lExpression, ArgumentList argu
116
116
|| lExpression . Classification == ExpressionClassification . Function
117
117
|| lExpression . Classification == ExpressionClassification . Subroutine )
118
118
{
119
- return ResolveLExpressionIsPropertyFunctionSubroutine ( lExpression , argumentList , expression , defaultMemberResolutionRecursionDepth , containedExpression ) ;
119
+ var procedureDeclaration = lExpression . ReferencedDeclaration as IParameterizedDeclaration ;
120
+ var parameters = procedureDeclaration ? . Parameters ? . ToList ( ) ;
121
+ if ( parameters != null
122
+ && ArgumentListIsCompatible ( parameters , argumentList ) )
123
+ {
124
+ return ResolveLExpressionIsPropertyFunctionSubroutine ( lExpression , argumentList , expression , defaultMemberResolutionRecursionDepth , containedExpression ) ;
125
+ }
120
126
}
121
127
122
128
ResolveArgumentList ( null , argumentList ) ;
123
129
return CreateFailedExpression ( lExpression , argumentList , expression , defaultMemberResolutionRecursionDepth > 0 ) ;
124
130
}
125
131
126
132
private static IBoundExpression CreateFailedExpression ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext context , bool isDefaultMemberResolution )
133
+ {
134
+ if ( IsFailedDefaultMemberResolution ( lExpression ) )
135
+ {
136
+ return CreateFailedDefaultMemberAccessExpression ( lExpression , argumentList , context ) ;
137
+ }
138
+
139
+ return CreateResolutionFailedExpression ( lExpression , argumentList , context , isDefaultMemberResolution ) ;
140
+ }
141
+
142
+ private static bool IsFailedDefaultMemberResolution ( IBoundExpression lExpression )
143
+ {
144
+ if ( lExpression . Classification == ExpressionClassification . ResolutionFailed )
145
+ {
146
+ return false ;
147
+ }
148
+
149
+ if ( IsVariablePropertyFunctionWithoutParameters ( lExpression ) )
150
+ {
151
+ return true ;
152
+ }
153
+
154
+ if ( lExpression is IndexExpression indexExpression )
155
+ {
156
+ var indexedDeclaration = indexExpression . ReferencedDeclaration ;
157
+ if ( indexedDeclaration != null
158
+ && ( ! indexedDeclaration . IsArray
159
+ || indexExpression . IsArrayAccess ) )
160
+ {
161
+ return true ;
162
+ }
163
+ }
164
+
165
+ if ( lExpression is DictionaryAccessExpression dictionaryExpression )
166
+ {
167
+ var indexedDeclaration = dictionaryExpression . ReferencedDeclaration ;
168
+ if ( indexedDeclaration != null
169
+ && ! indexedDeclaration . IsArray )
170
+ {
171
+ return true ;
172
+ }
173
+ }
174
+
175
+ return false ;
176
+ }
177
+
178
+ private static IBoundExpression CreateResolutionFailedExpression ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext context , bool isDefaultMemberResolution )
127
179
{
128
180
var failedExpr = new ResolutionFailedExpression ( context , isDefaultMemberResolution ) ;
129
181
failedExpr . AddSuccessfullyResolvedExpression ( lExpression ) ;
130
182
var argumentExpressions = argumentList . Arguments . Select ( arg => arg . Expression ) ;
131
183
return failedExpr . JoinAsFailedResolution ( context , argumentExpressions ) ;
132
184
}
133
185
186
+ private static IBoundExpression CreateFailedDefaultMemberAccessExpression ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext context )
187
+ {
188
+ var failedExpr = new IndexExpression ( lExpression . ReferencedDeclaration , ExpressionClassification . ResolutionFailed , context , lExpression , argumentList , isDefaultMemberAccess : true ) ;
189
+
190
+ var argumentExpressions = argumentList . Arguments . Select ( arg => arg . Expression ) ;
191
+ return failedExpr . JoinAsFailedResolution ( context , argumentExpressions . Concat ( new [ ] { lExpression } ) ) ;
192
+ }
193
+
134
194
private IBoundExpression ResolveLExpressionIsVariablePropertyFunctionNoParameters ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
135
195
{
136
196
/*
@@ -147,7 +207,7 @@ with a parameter list that cannot accept any parameters and an <argument-list> t
147
207
return null ;
148
208
}
149
209
150
- if ( indexedDeclaration . IsArray )
210
+ if ( indexedDeclaration . IsArray && ! ( lExpression is IndexExpression indexExpression && indexExpression . IsArrayAccess ) )
151
211
{
152
212
return ResolveLExpressionDeclaredTypeIsArray ( lExpression . ReferencedDeclaration , lExpression . Classification , argumentList , expression , defaultMemberResolutionRecursionDepth , containedExpression ) ;
153
213
}
@@ -257,7 +317,7 @@ declared type.
257
317
if ( ArgumentListIsCompatible ( parameters , argumentList ) )
258
318
{
259
319
ResolveArgumentList ( defaultMember , argumentList ) ;
260
- return new IndexExpression ( defaultMember , defaultMemberClassification , expression , _lExpression , argumentList , isDefaultMemberAccess : true , defaultMemberRecursionDepth : defaultMemberResolutionRecursionDepth , containedDefaultMemberRecursionExpression : containedExpression ) ;
320
+ return new IndexExpression ( defaultMember , ExpressionClassification . Variable , expression , _lExpression , argumentList , isDefaultMemberAccess : true , defaultMemberRecursionDepth : defaultMemberResolutionRecursionDepth , containedDefaultMemberRecursionExpression : containedExpression ) ;
261
321
}
262
322
263
323
/**
@@ -279,7 +339,7 @@ private static bool ArgumentListIsCompatible(ICollection<ParameterDeclaration> p
279
339
{
280
340
return ( parameters . Count >= ( argumentList ? . Arguments . Count ?? 0 )
281
341
|| parameters . Any ( parameter => parameter . IsParamArray ) )
282
- && parameters . Count ( parameter => ! parameter . IsOptional ) <= ( argumentList ? . Arguments . Count ?? 0 ) ;
342
+ && parameters . Count ( parameter => ! parameter . IsOptional && ! parameter . IsParamArray ) <= ( argumentList ? . Arguments . Count ?? 0 ) ;
283
343
}
284
344
285
345
private IBoundExpression ResolveRecursiveDefaultMember ( Declaration defaultMember , ExpressionClassification defaultMemberClassification , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
@@ -375,10 +435,10 @@ classification and declared type.
375
435
list>. In this case, the index expression references <l-expression> and takes on its classification
376
436
and declared type.
377
437
378
- Note: We assume compatibility through enforcement by the VBE.
438
+ Note: Apart from a check of the number of arguments provided, we assume compatibility through enforcement by the VBE.
379
439
*/
380
440
ResolveArgumentList ( lExpression . ReferencedDeclaration , argumentList ) ;
381
- return new IndexExpression ( lExpression . ReferencedDeclaration , lExpression . Classification , expression , _lExpression , argumentList , defaultMemberRecursionDepth : defaultMemberRecursionDepth , containedDefaultMemberRecursionExpression : containedExpression ) ;
441
+ return new IndexExpression ( lExpression . ReferencedDeclaration , ExpressionClassification . Variable , expression , _lExpression , argumentList , defaultMemberRecursionDepth : defaultMemberRecursionDepth , containedDefaultMemberRecursionExpression : containedExpression ) ;
382
442
}
383
443
384
444
private IBoundExpression ResolveLExpressionIsUnbound ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
0 commit comments