@@ -41,7 +41,7 @@ func (interpreter *Interpreter) assignmentGetterSetter(expression ast.Expression
41
41
42
42
case * ast.IndexExpression :
43
43
if attachmentType , ok := interpreter .Program .Elaboration .AttachmentAccessTypes (expression ); ok {
44
- return interpreter .typeIndexExpressionGetterSetter (expression , attachmentType )
44
+ return interpreter .typeIndexExpressionGetterSetter (expression , attachmentType , locationRange )
45
45
}
46
46
return interpreter .valueIndexExpressionGetterSetter (expression , locationRange )
47
47
@@ -89,25 +89,21 @@ func (interpreter *Interpreter) identifierExpressionGetterSetter(
89
89
func (interpreter * Interpreter ) typeIndexExpressionGetterSetter (
90
90
indexExpression * ast.IndexExpression ,
91
91
attachmentType sema.Type ,
92
+ locationRange LocationRange ,
92
93
) getterSetter {
93
94
target , ok := interpreter .evalExpression (indexExpression .TargetExpression ).(TypeIndexableValue )
94
95
if ! ok {
95
96
panic (errors .NewUnreachableError ())
96
97
}
97
98
98
- locationRange := LocationRange {
99
- Location : interpreter .Location ,
100
- HasPosition : indexExpression ,
101
- }
102
-
103
99
return getterSetter {
104
100
target : target ,
105
101
get : func (_ bool ) Value {
106
- interpreter . checkInvalidatedResourceOrResourceReference (target , indexExpression )
102
+ checkInvalidatedResourceOrResourceReference (target , locationRange , interpreter )
107
103
return target .GetTypeKey (interpreter , locationRange , attachmentType )
108
104
},
109
105
set : func (_ Value ) {
110
- interpreter . checkInvalidatedResourceOrResourceReference (target , indexExpression )
106
+ checkInvalidatedResourceOrResourceReference (target , locationRange , interpreter )
111
107
// writing to composites with indexing syntax is not supported
112
108
panic (errors .NewUnreachableError ())
113
109
},
@@ -201,14 +197,14 @@ func (interpreter *Interpreter) valueIndexExpressionGetterSetter(
201
197
202
198
if isNestedResourceMove {
203
199
get = func (_ bool ) Value {
204
- interpreter . checkInvalidatedResourceOrResourceReference (target , targetExpression )
200
+ checkInvalidatedResourceOrResourceReference (target , locationRange , interpreter )
205
201
value := target .RemoveKey (interpreter , locationRange , transferredIndexingValue )
206
202
target .InsertKey (interpreter , locationRange , transferredIndexingValue , placeholder )
207
203
return value
208
204
}
209
205
} else {
210
206
get = func (_ bool ) Value {
211
- interpreter . checkInvalidatedResourceOrResourceReference (target , targetExpression )
207
+ checkInvalidatedResourceOrResourceReference (target , locationRange , interpreter )
212
208
value := target .GetKey (interpreter , locationRange , transferredIndexingValue )
213
209
214
210
// If the indexing value is a reference, then return a reference for the resulting value.
@@ -220,7 +216,7 @@ func (interpreter *Interpreter) valueIndexExpressionGetterSetter(
220
216
target : target ,
221
217
get : get ,
222
218
set : func (value Value ) {
223
- interpreter . checkInvalidatedResourceOrResourceReference (target , targetExpression )
219
+ checkInvalidatedResourceOrResourceReference (target , locationRange , interpreter )
224
220
target .SetKey (interpreter , locationRange , transferredIndexingValue , value )
225
221
},
226
222
}
@@ -362,7 +358,7 @@ func (interpreter *Interpreter) checkMemberAccess(
362
358
locationRange LocationRange ,
363
359
) {
364
360
365
- interpreter . checkInvalidatedResourceOrResourceReference (target , memberExpression )
361
+ checkInvalidatedResourceOrResourceReference (target , locationRange , interpreter )
366
362
367
363
memberInfo , _ := interpreter .Program .Elaboration .MemberExpressionMemberAccessInfo (memberExpression )
368
364
expectedType := memberInfo .AccessedType
@@ -433,15 +429,23 @@ func (interpreter *Interpreter) VisitIdentifierExpression(expression *ast.Identi
433
429
434
430
func (interpreter * Interpreter ) evalExpression (expression ast.Expression ) Value {
435
431
result := ast .AcceptExpression [Value ](expression , interpreter )
436
- interpreter .checkInvalidatedResourceOrResourceReference (result , expression )
432
+ locationRange := LocationRange {
433
+ Location : interpreter .Location ,
434
+ HasPosition : expression ,
435
+ }
436
+ checkInvalidatedResourceOrResourceReference (
437
+ result ,
438
+ locationRange ,
439
+ interpreter ,
440
+ )
437
441
return result
438
442
}
439
443
440
- func ( interpreter * Interpreter ) checkInvalidatedResourceOrResourceReference (value Value , hasPosition ast. HasPosition ) {
441
- if interpreter == nil {
442
- return
443
- }
444
-
444
+ func checkInvalidatedResourceOrResourceReference (
445
+ value Value ,
446
+ locationRange LocationRange ,
447
+ context ValueStaticTypeContext ,
448
+ ) {
445
449
// Unwrap SomeValue, to access references wrapped inside optionals.
446
450
someValue , isSomeValue := value .(* SomeValue )
447
451
for isSomeValue && someValue .value != nil {
@@ -451,28 +455,26 @@ func (interpreter *Interpreter) checkInvalidatedResourceOrResourceReference(valu
451
455
452
456
switch value := value .(type ) {
453
457
case ResourceKindedValue :
454
- if value .isInvalidatedResource (interpreter ) {
458
+ if value .isInvalidatedResource (context ) {
455
459
panic (InvalidatedResourceError {
456
- LocationRange : LocationRange {
457
- Location : interpreter .Location ,
458
- HasPosition : hasPosition ,
459
- },
460
+ LocationRange : locationRange ,
460
461
})
461
462
}
462
463
case * EphemeralReferenceValue :
463
464
if value .Value == nil {
464
465
panic (InvalidatedResourceReferenceError {
465
- LocationRange : LocationRange {
466
- Location : interpreter .Location ,
467
- HasPosition : hasPosition ,
468
- },
466
+ LocationRange : locationRange ,
469
467
})
470
468
} else {
471
469
// If the value is there, check whether the referenced value is an invalidated one.
472
470
// This step is not really needed, since reference tracking is supposed to clear the
473
471
// `value.Value` if the referenced-value was moved/deleted.
474
472
// However, have this as a second layer of defensive.
475
- interpreter .checkInvalidatedResourceOrResourceReference (value .Value , hasPosition )
473
+ checkInvalidatedResourceOrResourceReference (
474
+ value .Value ,
475
+ locationRange ,
476
+ context ,
477
+ )
476
478
}
477
479
}
478
480
}
0 commit comments