@@ -13,6 +13,7 @@ public sealed class IndexDefaultBinding : IExpressionBinding
13
13
private readonly IExpressionBinding _lExpressionBinding ;
14
14
private IBoundExpression _lExpression ;
15
15
private readonly ArgumentList _argumentList ;
16
+ private readonly Declaration _parent ;
16
17
17
18
private const int DEFAULT_MEMBER_RECURSION_LIMIT = 32 ;
18
19
@@ -25,23 +26,27 @@ public sealed class IndexDefaultBinding : IExpressionBinding
25
26
public IndexDefaultBinding (
26
27
ParserRuleContext expression ,
27
28
IExpressionBinding lExpressionBinding ,
28
- ArgumentList argumentList )
29
+ ArgumentList argumentList ,
30
+ Declaration parent )
29
31
: this (
30
32
expression ,
31
33
( IBoundExpression ) null ,
32
- argumentList )
34
+ argumentList ,
35
+ parent )
33
36
{
34
37
_lExpressionBinding = lExpressionBinding ;
35
38
}
36
39
37
40
public IndexDefaultBinding (
38
41
ParserRuleContext expression ,
39
42
IBoundExpression lExpression ,
40
- ArgumentList argumentList )
43
+ ArgumentList argumentList ,
44
+ Declaration parent )
41
45
{
42
46
_expression = expression ;
43
47
_lExpression = lExpression ;
44
48
_argumentList = argumentList ;
49
+ _parent = parent ;
45
50
}
46
51
47
52
private static void ResolveArgumentList ( Declaration calledProcedure , ArgumentList argumentList , bool isArrayAccess = false )
@@ -60,10 +65,10 @@ public IBoundExpression Resolve()
60
65
_lExpression = _lExpressionBinding . Resolve ( ) ;
61
66
}
62
67
63
- return Resolve ( _lExpression , _argumentList , _expression ) ;
68
+ return Resolve ( _lExpression , _argumentList , _expression , _parent ) ;
64
69
}
65
70
66
- private IBoundExpression Resolve ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth = 0 , RecursiveDefaultMemberAccessExpression containedExpression = null )
71
+ private IBoundExpression Resolve ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext expression , Declaration parent , int defaultMemberResolutionRecursionDepth = 0 , RecursiveDefaultMemberAccessExpression containedExpression = null )
67
72
{
68
73
if ( lExpression . Classification == ExpressionClassification . ResolutionFailed )
69
74
{
@@ -84,15 +89,15 @@ private IBoundExpression Resolve(IBoundExpression lExpression, ArgumentList argu
84
89
switch ( lExpression )
85
90
{
86
91
case IndexExpression indexExpression :
87
- var doubleIndexExpression = ResolveLExpressionIsIndexExpression ( indexExpression , argumentList , expression , defaultMemberResolutionRecursionDepth , containedExpression ) ;
92
+ var doubleIndexExpression = ResolveLExpressionIsIndexExpression ( indexExpression , argumentList , expression , parent , defaultMemberResolutionRecursionDepth , containedExpression ) ;
88
93
if ( doubleIndexExpression != null )
89
94
{
90
95
return doubleIndexExpression ;
91
96
}
92
97
93
98
break ;
94
99
case DictionaryAccessExpression dictionaryAccessExpression :
95
- var indexOnBangExpression = ResolveLExpressionIsDictionaryAccessExpression ( dictionaryAccessExpression , argumentList , expression , defaultMemberResolutionRecursionDepth , containedExpression ) ;
100
+ var indexOnBangExpression = ResolveLExpressionIsDictionaryAccessExpression ( dictionaryAccessExpression , argumentList , expression , parent , defaultMemberResolutionRecursionDepth , containedExpression ) ;
96
101
if ( indexOnBangExpression != null )
97
102
{
98
103
return indexOnBangExpression ;
@@ -101,9 +106,11 @@ private IBoundExpression Resolve(IBoundExpression lExpression, ArgumentList argu
101
106
break ;
102
107
}
103
108
104
- if ( IsVariablePropertyFunctionWithoutParameters ( lExpression ) )
109
+ if ( IsVariablePropertyFunctionWithoutParameters ( lExpression )
110
+ && ! ( lExpression . Classification == ExpressionClassification . Variable
111
+ && parent . Equals ( lExpression . ReferencedDeclaration ) ) )
105
112
{
106
- var parameterlessLExpressionAccess = ResolveLExpressionIsVariablePropertyFunctionNoParameters ( lExpression , argumentList , expression , defaultMemberResolutionRecursionDepth , containedExpression ) ;
113
+ var parameterlessLExpressionAccess = ResolveLExpressionIsVariablePropertyFunctionNoParameters ( lExpression , argumentList , expression , parent , defaultMemberResolutionRecursionDepth , containedExpression ) ;
107
114
if ( parameterlessLExpressionAccess != null )
108
115
{
109
116
return parameterlessLExpressionAccess ;
@@ -114,7 +121,9 @@ private IBoundExpression Resolve(IBoundExpression lExpression, ArgumentList argu
114
121
115
122
if ( lExpression . Classification == ExpressionClassification . Property
116
123
|| lExpression . Classification == ExpressionClassification . Function
117
- || lExpression . Classification == ExpressionClassification . Subroutine )
124
+ || lExpression . Classification == ExpressionClassification . Subroutine
125
+ || lExpression . Classification == ExpressionClassification . Variable
126
+ && parent . Equals ( lExpression . ReferencedDeclaration ) )
118
127
{
119
128
var procedureDeclaration = lExpression . ReferencedDeclaration as IParameterizedDeclaration ;
120
129
var parameters = procedureDeclaration ? . Parameters ? . ToList ( ) ;
@@ -126,27 +135,29 @@ private IBoundExpression Resolve(IBoundExpression lExpression, ArgumentList argu
126
135
}
127
136
128
137
ResolveArgumentList ( null , argumentList ) ;
129
- return CreateFailedExpression ( lExpression , argumentList , expression , defaultMemberResolutionRecursionDepth > 0 ) ;
138
+ return CreateFailedExpression ( lExpression , argumentList , expression , parent , defaultMemberResolutionRecursionDepth > 0 ) ;
130
139
}
131
140
132
- private static IBoundExpression CreateFailedExpression ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext context , bool isDefaultMemberResolution )
141
+ private static IBoundExpression CreateFailedExpression ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext context , Declaration parent , bool isDefaultMemberResolution )
133
142
{
134
- if ( IsFailedDefaultMemberResolution ( lExpression ) )
143
+ if ( IsFailedDefaultMemberResolution ( lExpression , parent ) )
135
144
{
136
145
return CreateFailedDefaultMemberAccessExpression ( lExpression , argumentList , context ) ;
137
146
}
138
147
139
148
return CreateResolutionFailedExpression ( lExpression , argumentList , context , isDefaultMemberResolution ) ;
140
149
}
141
150
142
- private static bool IsFailedDefaultMemberResolution ( IBoundExpression lExpression )
151
+ private static bool IsFailedDefaultMemberResolution ( IBoundExpression lExpression , Declaration parent )
143
152
{
144
153
if ( lExpression . Classification == ExpressionClassification . ResolutionFailed )
145
154
{
146
155
return false ;
147
156
}
148
157
149
- if ( IsVariablePropertyFunctionWithoutParameters ( lExpression ) )
158
+ if ( IsVariablePropertyFunctionWithoutParameters ( lExpression )
159
+ && ! ( lExpression . Classification == ExpressionClassification . Variable
160
+ && parent . Equals ( lExpression . ReferencedDeclaration ) ) )
150
161
{
151
162
return true ;
152
163
}
@@ -191,7 +202,7 @@ private static IBoundExpression CreateFailedDefaultMemberAccessExpression(IBound
191
202
return failedExpr . JoinAsFailedResolution ( context , argumentExpressions . Concat ( new [ ] { lExpression } ) ) ;
192
203
}
193
204
194
- private IBoundExpression ResolveLExpressionIsVariablePropertyFunctionNoParameters ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
205
+ private IBoundExpression ResolveLExpressionIsVariablePropertyFunctionNoParameters ( IBoundExpression lExpression , ArgumentList argumentList , ParserRuleContext expression , Declaration parent , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
195
206
{
196
207
/*
197
208
<l-expression> is classified as a variable, or <l-expression> is classified as a property or function
@@ -215,7 +226,7 @@ with a parameter list that cannot accept any parameters and an <argument-list> t
215
226
var asTypeName = indexedDeclaration . AsTypeName ;
216
227
var asTypeDeclaration = indexedDeclaration . AsTypeDeclaration ;
217
228
218
- return ResolveDefaultMember ( asTypeName , asTypeDeclaration , argumentList , expression , defaultMemberResolutionRecursionDepth + 1 , containedExpression ) ;
229
+ return ResolveDefaultMember ( asTypeName , asTypeDeclaration , argumentList , expression , parent , defaultMemberResolutionRecursionDepth + 1 , containedExpression ) ;
219
230
}
220
231
221
232
private static bool IsVariablePropertyFunctionWithoutParameters ( IBoundExpression lExpression )
@@ -232,7 +243,7 @@ private static bool IsVariablePropertyFunctionWithoutParameters(IBoundExpression
232
243
}
233
244
}
234
245
235
- private IBoundExpression ResolveLExpressionIsIndexExpression ( IndexExpression indexExpression , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
246
+ private IBoundExpression ResolveLExpressionIsIndexExpression ( IndexExpression indexExpression , ArgumentList argumentList , ParserRuleContext expression , Declaration parent , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
236
247
{
237
248
/*
238
249
<l-expression> is classified as an index expression and the argument list is not empty.
@@ -256,10 +267,10 @@ private IBoundExpression ResolveLExpressionIsIndexExpression(IndexExpression ind
256
267
var asTypeName = indexedDeclaration . AsTypeName ;
257
268
var asTypeDeclaration = indexedDeclaration . AsTypeDeclaration ;
258
269
259
- return ResolveDefaultMember ( asTypeName , asTypeDeclaration , argumentList , expression , defaultMemberResolutionRecursionDepth + 1 , containedExpression ) ;
270
+ return ResolveDefaultMember ( asTypeName , asTypeDeclaration , argumentList , expression , parent , defaultMemberResolutionRecursionDepth + 1 , containedExpression ) ;
260
271
}
261
272
262
- private IBoundExpression ResolveLExpressionIsDictionaryAccessExpression ( DictionaryAccessExpression dictionaryAccessExpression , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
273
+ private IBoundExpression ResolveLExpressionIsDictionaryAccessExpression ( DictionaryAccessExpression dictionaryAccessExpression , ArgumentList argumentList , ParserRuleContext expression , Declaration parent , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
263
274
{
264
275
//This is equivalent to the case in which the lExpression is an IndexExpression with the difference that it cannot be an array access.
265
276
@@ -277,10 +288,10 @@ private IBoundExpression ResolveLExpressionIsDictionaryAccessExpression(Dictiona
277
288
var asTypeName = indexedDeclaration . AsTypeName ;
278
289
var asTypeDeclaration = indexedDeclaration . AsTypeDeclaration ;
279
290
280
- return ResolveDefaultMember ( asTypeName , asTypeDeclaration , argumentList , expression , defaultMemberResolutionRecursionDepth + 1 , containedExpression ) ;
291
+ return ResolveDefaultMember ( asTypeName , asTypeDeclaration , argumentList , expression , parent , defaultMemberResolutionRecursionDepth + 1 , containedExpression ) ;
281
292
}
282
293
283
- private IBoundExpression ResolveDefaultMember ( string asTypeName , Declaration asTypeDeclaration , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
294
+ private IBoundExpression ResolveDefaultMember ( string asTypeName , Declaration asTypeDeclaration , ArgumentList argumentList , ParserRuleContext expression , Declaration parent , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
284
295
{
285
296
/*
286
297
The declared type of <l-expression> is Object or Variant, and <argument-list> contains no
@@ -328,7 +339,7 @@ declared type.
328
339
if ( parameters . All ( parameter => parameter . IsOptional )
329
340
&& DEFAULT_MEMBER_RECURSION_LIMIT >= defaultMemberResolutionRecursionDepth )
330
341
{
331
- return ResolveRecursiveDefaultMember ( defaultMember , defaultMemberClassification , argumentList , expression , defaultMemberResolutionRecursionDepth , containedExpression ) ;
342
+ return ResolveRecursiveDefaultMember ( defaultMember , defaultMemberClassification , argumentList , expression , parent , defaultMemberResolutionRecursionDepth , containedExpression ) ;
332
343
}
333
344
}
334
345
@@ -342,12 +353,12 @@ private static bool ArgumentListIsCompatible(ICollection<ParameterDeclaration> p
342
353
&& parameters . Count ( parameter => ! parameter . IsOptional && ! parameter . IsParamArray ) <= ( argumentList ? . Arguments . Count ?? 0 ) ;
343
354
}
344
355
345
- private IBoundExpression ResolveRecursiveDefaultMember ( Declaration defaultMember , ExpressionClassification defaultMemberClassification , ArgumentList argumentList , ParserRuleContext expression , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
356
+ private IBoundExpression ResolveRecursiveDefaultMember ( Declaration defaultMember , ExpressionClassification defaultMemberClassification , ArgumentList argumentList , ParserRuleContext expression , Declaration parent , int defaultMemberResolutionRecursionDepth , RecursiveDefaultMemberAccessExpression containedExpression )
346
357
{
347
358
var defaultMemberRecursionExpression = new RecursiveDefaultMemberAccessExpression ( defaultMember , defaultMemberClassification , _lExpression . Context , defaultMemberResolutionRecursionDepth , containedExpression ) ;
348
359
349
360
var defaultMemberAsLExpression = new SimpleNameExpression ( defaultMember , defaultMemberClassification , expression ) ;
350
- return Resolve ( defaultMemberAsLExpression , argumentList , expression , defaultMemberResolutionRecursionDepth , defaultMemberRecursionExpression ) ;
361
+ return Resolve ( defaultMemberAsLExpression , argumentList , expression , parent , defaultMemberResolutionRecursionDepth , defaultMemberRecursionExpression ) ;
351
362
}
352
363
353
364
private ExpressionClassification DefaultMemberExpressionClassification ( Declaration defaultMember )
0 commit comments