| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// A library to help transform compounds and null-aware accessors into | 5 /// A library to help transform compounds and null-aware accessors into |
| 6 /// let expressions. | 6 /// let expressions. |
| 7 | 7 |
| 8 import 'package:kernel/ast.dart' hide MethodInvocation, InvalidExpression; | 8 import 'package:kernel/ast.dart' hide MethodInvocation, InvalidExpression; |
| 9 | 9 |
| 10 import '../../scanner/token.dart' show Token; | 10 import '../../scanner/token.dart' show Token; |
| 11 | 11 |
| 12 import '../names.dart' show equalsName, indexGetName, indexSetName; | 12 import '../names.dart' show equalsName, indexGetName, indexSetName; |
| 13 | 13 |
| 14 import '../problems.dart' show unhandled; | 14 import '../problems.dart' show unhandled; |
| 15 | 15 |
| 16 import 'fasta_accessors.dart' show BuilderHelper; | 16 import 'fasta_accessors.dart' show BuilderHelper; |
| 17 | 17 |
| 18 import 'kernel_shadow_ast.dart' | 18 import 'kernel_shadow_ast.dart' |
| 19 show | 19 show |
| 20 KernelArguments, | 20 ShadowArguments, |
| 21 KernelComplexAssignment, | 21 ShadowComplexAssignment, |
| 22 KernelConditionalExpression, | 22 ShadowConditionalExpression, |
| 23 KernelIllegalAssignment, | 23 ShadowIllegalAssignment, |
| 24 KernelMethodInvocation, | 24 ShadowMethodInvocation, |
| 25 KernelNullAwarePropertyGet, | 25 ShadowNullAwarePropertyGet, |
| 26 KernelPropertyAssign, | 26 ShadowPropertyAssign, |
| 27 KernelPropertyGet, | 27 ShadowPropertyGet, |
| 28 KernelSuperMethodInvocation, | 28 ShadowSuperMethodInvocation, |
| 29 KernelSuperPropertyGet, | 29 ShadowSuperPropertyGet, |
| 30 KernelThisExpression, | 30 ShadowThisExpression, |
| 31 KernelVariableDeclaration, | 31 ShadowVariableDeclaration, |
| 32 KernelVariableGet; | 32 ShadowVariableGet; |
| 33 | 33 |
| 34 import 'utils.dart' show offsetForToken; | 34 import 'utils.dart' show offsetForToken; |
| 35 | 35 |
| 36 /// An [Accessor] represents a subexpression for which we can't yet build a | 36 /// An [Accessor] represents a subexpression for which we can't yet build a |
| 37 /// kernel [Expression] because we don't yet know the context in which it is | 37 /// kernel [Expression] because we don't yet know the context in which it is |
| 38 /// used. | 38 /// used. |
| 39 /// | 39 /// |
| 40 /// Once the context is known, an [Accessor] can be converted into an | 40 /// Once the context is known, an [Accessor] can be converted into an |
| 41 /// [Expression] by calling a "build" method. | 41 /// [Expression] by calling a "build" method. |
| 42 /// | 42 /// |
| (...skipping 29 matching lines...) Expand all Loading... |
| 72 /// | 72 /// |
| 73 /// The returned expression evaluates to the assigned value, unless | 73 /// The returned expression evaluates to the assigned value, unless |
| 74 /// [voidContext] is true, in which case it may evaluate to anything. | 74 /// [voidContext] is true, in which case it may evaluate to anything. |
| 75 /// | 75 /// |
| 76 /// [type] is the static type of the RHS. | 76 /// [type] is the static type of the RHS. |
| 77 Expression buildNullAwareAssignment( | 77 Expression buildNullAwareAssignment( |
| 78 Expression value, DartType type, int offset, | 78 Expression value, DartType type, int offset, |
| 79 {bool voidContext: false}) { | 79 {bool voidContext: false}) { |
| 80 var complexAssignment = startComplexAssignment(value); | 80 var complexAssignment = startComplexAssignment(value); |
| 81 if (voidContext) { | 81 if (voidContext) { |
| 82 var nullAwareCombiner = new KernelConditionalExpression( | 82 var nullAwareCombiner = new ShadowConditionalExpression( |
| 83 buildIsNull(_makeRead(complexAssignment), offset), | 83 buildIsNull(_makeRead(complexAssignment), offset), |
| 84 _makeWrite(value, false, complexAssignment), | 84 _makeWrite(value, false, complexAssignment), |
| 85 new NullLiteral()); | 85 new NullLiteral()); |
| 86 complexAssignment?.nullAwareCombiner = nullAwareCombiner; | 86 complexAssignment?.nullAwareCombiner = nullAwareCombiner; |
| 87 return _finish(nullAwareCombiner, complexAssignment); | 87 return _finish(nullAwareCombiner, complexAssignment); |
| 88 } | 88 } |
| 89 var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment)); | 89 var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment)); |
| 90 var nullAwareCombiner = new KernelConditionalExpression( | 90 var nullAwareCombiner = new ShadowConditionalExpression( |
| 91 buildIsNull(new VariableGet(tmp), offset), | 91 buildIsNull(new VariableGet(tmp), offset), |
| 92 _makeWrite(value, false, complexAssignment), | 92 _makeWrite(value, false, complexAssignment), |
| 93 new VariableGet(tmp)); | 93 new VariableGet(tmp)); |
| 94 complexAssignment?.nullAwareCombiner = nullAwareCombiner; | 94 complexAssignment?.nullAwareCombiner = nullAwareCombiner; |
| 95 return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment); | 95 return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment); |
| 96 } | 96 } |
| 97 | 97 |
| 98 /// Returns an [Expression] representing a compound assignment (e.g. `+=`) | 98 /// Returns an [Expression] representing a compound assignment (e.g. `+=`) |
| 99 /// with the accessor on the LHS and [value] on the RHS. | 99 /// with the accessor on the LHS and [value] on the RHS. |
| 100 Expression buildCompoundAssignment(Name binaryOperator, Expression value, | 100 Expression buildCompoundAssignment(Name binaryOperator, Expression value, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 } | 137 } |
| 138 var rhs = new IntLiteral(1); | 138 var rhs = new IntLiteral(1); |
| 139 var complexAssignment = startComplexAssignment(rhs); | 139 var complexAssignment = startComplexAssignment(rhs); |
| 140 var value = new VariableDeclaration.forValue(_makeRead(complexAssignment)); | 140 var value = new VariableDeclaration.forValue(_makeRead(complexAssignment)); |
| 141 valueAccess() => new VariableGet(value); | 141 valueAccess() => new VariableGet(value); |
| 142 var combiner = makeBinary( | 142 var combiner = makeBinary( |
| 143 valueAccess(), binaryOperator, interfaceTarget, rhs, | 143 valueAccess(), binaryOperator, interfaceTarget, rhs, |
| 144 offset: offset); | 144 offset: offset); |
| 145 complexAssignment?.combiner = combiner; | 145 complexAssignment?.combiner = combiner; |
| 146 complexAssignment?.isPostIncDec = true; | 146 complexAssignment?.isPostIncDec = true; |
| 147 var dummy = new KernelVariableDeclaration.forValue( | 147 var dummy = new ShadowVariableDeclaration.forValue( |
| 148 _makeWrite(combiner, true, complexAssignment), | 148 _makeWrite(combiner, true, complexAssignment), |
| 149 helper.functionNestingLevel); | 149 helper.functionNestingLevel); |
| 150 return _finish( | 150 return _finish( |
| 151 makeLet(value, makeLet(dummy, valueAccess())), complexAssignment); | 151 makeLet(value, makeLet(dummy, valueAccess())), complexAssignment); |
| 152 } | 152 } |
| 153 | 153 |
| 154 Expression _makeSimpleRead() => _makeRead(null); | 154 Expression _makeSimpleRead() => _makeRead(null); |
| 155 | 155 |
| 156 Expression _makeSimpleWrite(Expression value, bool voidContext, | 156 Expression _makeSimpleWrite(Expression value, bool voidContext, |
| 157 KernelComplexAssignment complexAssignment) { | 157 ShadowComplexAssignment complexAssignment) { |
| 158 return _makeWrite(value, voidContext, complexAssignment); | 158 return _makeWrite(value, voidContext, complexAssignment); |
| 159 } | 159 } |
| 160 | 160 |
| 161 Expression _makeRead(KernelComplexAssignment complexAssignment); | 161 Expression _makeRead(ShadowComplexAssignment complexAssignment); |
| 162 | 162 |
| 163 Expression _makeWrite(Expression value, bool voidContext, | 163 Expression _makeWrite(Expression value, bool voidContext, |
| 164 KernelComplexAssignment complexAssignment); | 164 ShadowComplexAssignment complexAssignment); |
| 165 | 165 |
| 166 Expression _finish( | 166 Expression _finish( |
| 167 Expression body, KernelComplexAssignment complexAssignment) { | 167 Expression body, ShadowComplexAssignment complexAssignment) { |
| 168 if (complexAssignment != null) { | 168 if (complexAssignment != null) { |
| 169 complexAssignment.desugared = body; | 169 complexAssignment.desugared = body; |
| 170 return complexAssignment; | 170 return complexAssignment; |
| 171 } else { | 171 } else { |
| 172 return body; | 172 return body; |
| 173 } | 173 } |
| 174 } | 174 } |
| 175 | 175 |
| 176 /// Returns an [Expression] representing a compile-time error. | 176 /// Returns an [Expression] representing a compile-time error. |
| 177 /// | 177 /// |
| 178 /// At runtime, an exception will be thrown. | 178 /// At runtime, an exception will be thrown. |
| 179 makeInvalidRead() { | 179 makeInvalidRead() { |
| 180 return unhandled("compile-time error", "$runtimeType", | 180 return unhandled("compile-time error", "$runtimeType", |
| 181 offsetForToken(token), helper.uri); | 181 offsetForToken(token), helper.uri); |
| 182 } | 182 } |
| 183 | 183 |
| 184 /// Returns an [Expression] representing a compile-time error wrapping | 184 /// Returns an [Expression] representing a compile-time error wrapping |
| 185 /// [value]. | 185 /// [value]. |
| 186 /// | 186 /// |
| 187 /// At runtime, [value] will be evaluated before throwing an exception. | 187 /// At runtime, [value] will be evaluated before throwing an exception. |
| 188 makeInvalidWrite(Expression value) { | 188 makeInvalidWrite(Expression value) { |
| 189 return unhandled("compile-time error", "$runtimeType", | 189 return unhandled("compile-time error", "$runtimeType", |
| 190 offsetForToken(token), helper.uri); | 190 offsetForToken(token), helper.uri); |
| 191 } | 191 } |
| 192 | 192 |
| 193 /// Creates a data structure for tracking the desugaring of a complex | 193 /// Creates a data structure for tracking the desugaring of a complex |
| 194 /// assignment expression whose right hand side is [rhs]. | 194 /// assignment expression whose right hand side is [rhs]. |
| 195 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 195 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 196 new KernelIllegalAssignment(rhs); | 196 new ShadowIllegalAssignment(rhs); |
| 197 } | 197 } |
| 198 | 198 |
| 199 abstract class VariableAccessor extends Accessor { | 199 abstract class VariableAccessor extends Accessor { |
| 200 VariableDeclaration variable; | 200 VariableDeclaration variable; |
| 201 DartType promotedType; | 201 DartType promotedType; |
| 202 | 202 |
| 203 VariableAccessor( | 203 VariableAccessor( |
| 204 BuilderHelper helper, this.variable, this.promotedType, Token token) | 204 BuilderHelper helper, this.variable, this.promotedType, Token token) |
| 205 : super(helper, token); | 205 : super(helper, token); |
| 206 | 206 |
| 207 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 207 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 208 var fact = helper.typePromoter | 208 var fact = helper.typePromoter |
| 209 .getFactForAccess(variable, helper.functionNestingLevel); | 209 .getFactForAccess(variable, helper.functionNestingLevel); |
| 210 var scope = helper.typePromoter.currentScope; | 210 var scope = helper.typePromoter.currentScope; |
| 211 var read = new KernelVariableGet(variable, fact, scope) | 211 var read = new ShadowVariableGet(variable, fact, scope) |
| 212 ..fileOffset = offsetForToken(token); | 212 ..fileOffset = offsetForToken(token); |
| 213 complexAssignment?.read = read; | 213 complexAssignment?.read = read; |
| 214 return read; | 214 return read; |
| 215 } | 215 } |
| 216 | 216 |
| 217 Expression _makeWrite(Expression value, bool voidContext, | 217 Expression _makeWrite(Expression value, bool voidContext, |
| 218 KernelComplexAssignment complexAssignment) { | 218 ShadowComplexAssignment complexAssignment) { |
| 219 helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel); | 219 helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel); |
| 220 var write = variable.isFinal || variable.isConst | 220 var write = variable.isFinal || variable.isConst |
| 221 ? makeInvalidWrite(value) | 221 ? makeInvalidWrite(value) |
| 222 : new VariableSet(variable, value) | 222 : new VariableSet(variable, value) |
| 223 ..fileOffset = offsetForToken(token); | 223 ..fileOffset = offsetForToken(token); |
| 224 complexAssignment?.write = write; | 224 complexAssignment?.write = write; |
| 225 return write; | 225 return write; |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 | 228 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 240 } else { | 240 } else { |
| 241 return new PropertyAccessor.internal( | 241 return new PropertyAccessor.internal( |
| 242 helper, receiver, name, getter, setter, token); | 242 helper, receiver, name, getter, setter, token); |
| 243 } | 243 } |
| 244 } | 244 } |
| 245 | 245 |
| 246 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name, | 246 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name, |
| 247 this.getter, this.setter, Token token) | 247 this.getter, this.setter, Token token) |
| 248 : super(helper, token); | 248 : super(helper, token); |
| 249 | 249 |
| 250 Expression _makeSimpleRead() => new KernelPropertyGet(receiver, name, getter) | 250 Expression _makeSimpleRead() => new ShadowPropertyGet(receiver, name, getter) |
| 251 ..fileOffset = offsetForToken(token); | 251 ..fileOffset = offsetForToken(token); |
| 252 | 252 |
| 253 Expression _makeSimpleWrite(Expression value, bool voidContext, | 253 Expression _makeSimpleWrite(Expression value, bool voidContext, |
| 254 KernelComplexAssignment complexAssignment) { | 254 ShadowComplexAssignment complexAssignment) { |
| 255 var write = new PropertySet(receiver, name, value, setter) | 255 var write = new PropertySet(receiver, name, value, setter) |
| 256 ..fileOffset = offsetForToken(token); | 256 ..fileOffset = offsetForToken(token); |
| 257 complexAssignment?.write = write; | 257 complexAssignment?.write = write; |
| 258 return write; | 258 return write; |
| 259 } | 259 } |
| 260 | 260 |
| 261 receiverAccess() { | 261 receiverAccess() { |
| 262 _receiverVariable ??= new VariableDeclaration.forValue(receiver); | 262 _receiverVariable ??= new VariableDeclaration.forValue(receiver); |
| 263 return new VariableGet(_receiverVariable) | 263 return new VariableGet(_receiverVariable) |
| 264 ..fileOffset = offsetForToken(token); | 264 ..fileOffset = offsetForToken(token); |
| 265 } | 265 } |
| 266 | 266 |
| 267 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 267 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 268 var read = new KernelPropertyGet(receiverAccess(), name, getter) | 268 var read = new ShadowPropertyGet(receiverAccess(), name, getter) |
| 269 ..fileOffset = offsetForToken(token); | 269 ..fileOffset = offsetForToken(token); |
| 270 complexAssignment?.read = read; | 270 complexAssignment?.read = read; |
| 271 return read; | 271 return read; |
| 272 } | 272 } |
| 273 | 273 |
| 274 Expression _makeWrite(Expression value, bool voidContext, | 274 Expression _makeWrite(Expression value, bool voidContext, |
| 275 KernelComplexAssignment complexAssignment) { | 275 ShadowComplexAssignment complexAssignment) { |
| 276 var write = new PropertySet(receiverAccess(), name, value, setter) | 276 var write = new PropertySet(receiverAccess(), name, value, setter) |
| 277 ..fileOffset = offsetForToken(token); | 277 ..fileOffset = offsetForToken(token); |
| 278 complexAssignment?.write = write; | 278 complexAssignment?.write = write; |
| 279 return write; | 279 return write; |
| 280 } | 280 } |
| 281 | 281 |
| 282 Expression _finish( | 282 Expression _finish( |
| 283 Expression body, KernelComplexAssignment complexAssignment) { | 283 Expression body, ShadowComplexAssignment complexAssignment) { |
| 284 return super._finish(makeLet(_receiverVariable, body), complexAssignment); | 284 return super._finish(makeLet(_receiverVariable, body), complexAssignment); |
| 285 } | 285 } |
| 286 } | 286 } |
| 287 | 287 |
| 288 /// Special case of [PropertyAccessor] to avoid creating an indirect access to | 288 /// Special case of [PropertyAccessor] to avoid creating an indirect access to |
| 289 /// 'this'. | 289 /// 'this'. |
| 290 class ThisPropertyAccessor extends Accessor { | 290 class ThisPropertyAccessor extends Accessor { |
| 291 Name name; | 291 Name name; |
| 292 Member getter, setter; | 292 Member getter, setter; |
| 293 | 293 |
| 294 ThisPropertyAccessor( | 294 ThisPropertyAccessor( |
| 295 BuilderHelper helper, this.name, this.getter, this.setter, Token token) | 295 BuilderHelper helper, this.name, this.getter, this.setter, Token token) |
| 296 : super(helper, token); | 296 : super(helper, token); |
| 297 | 297 |
| 298 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 298 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 299 var read = new KernelPropertyGet(new KernelThisExpression(), name, getter) | 299 var read = new ShadowPropertyGet(new ShadowThisExpression(), name, getter) |
| 300 ..fileOffset = offsetForToken(token); | 300 ..fileOffset = offsetForToken(token); |
| 301 complexAssignment?.read = read; | 301 complexAssignment?.read = read; |
| 302 return read; | 302 return read; |
| 303 } | 303 } |
| 304 | 304 |
| 305 Expression _makeWrite(Expression value, bool voidContext, | 305 Expression _makeWrite(Expression value, bool voidContext, |
| 306 KernelComplexAssignment complexAssignment) { | 306 ShadowComplexAssignment complexAssignment) { |
| 307 var write = new PropertySet(new KernelThisExpression(), name, value, setter) | 307 var write = new PropertySet(new ShadowThisExpression(), name, value, setter) |
| 308 ..fileOffset = offsetForToken(token); | 308 ..fileOffset = offsetForToken(token); |
| 309 complexAssignment?.write = write; | 309 complexAssignment?.write = write; |
| 310 return write; | 310 return write; |
| 311 } | 311 } |
| 312 } | 312 } |
| 313 | 313 |
| 314 class NullAwarePropertyAccessor extends Accessor { | 314 class NullAwarePropertyAccessor extends Accessor { |
| 315 VariableDeclaration receiver; | 315 VariableDeclaration receiver; |
| 316 Expression receiverExpression; | 316 Expression receiverExpression; |
| 317 Name name; | 317 Name name; |
| 318 Member getter, setter; | 318 Member getter, setter; |
| 319 DartType type; | 319 DartType type; |
| 320 | 320 |
| 321 NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression, | 321 NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression, |
| 322 this.name, this.getter, this.setter, this.type, Token token) | 322 this.name, this.getter, this.setter, this.type, Token token) |
| 323 : this.receiver = makeOrReuseVariable(receiverExpression), | 323 : this.receiver = makeOrReuseVariable(receiverExpression), |
| 324 super(helper, token); | 324 super(helper, token); |
| 325 | 325 |
| 326 receiverAccess() => new VariableGet(receiver); | 326 receiverAccess() => new VariableGet(receiver); |
| 327 | 327 |
| 328 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 328 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 329 var read = new KernelPropertyGet(receiverAccess(), name, getter) | 329 var read = new ShadowPropertyGet(receiverAccess(), name, getter) |
| 330 ..fileOffset = offsetForToken(token); | 330 ..fileOffset = offsetForToken(token); |
| 331 complexAssignment?.read = read; | 331 complexAssignment?.read = read; |
| 332 return read; | 332 return read; |
| 333 } | 333 } |
| 334 | 334 |
| 335 Expression _makeWrite(Expression value, bool voidContext, | 335 Expression _makeWrite(Expression value, bool voidContext, |
| 336 KernelComplexAssignment complexAssignment) { | 336 ShadowComplexAssignment complexAssignment) { |
| 337 var write = new PropertySet(receiverAccess(), name, value, setter) | 337 var write = new PropertySet(receiverAccess(), name, value, setter) |
| 338 ..fileOffset = offsetForToken(token); | 338 ..fileOffset = offsetForToken(token); |
| 339 complexAssignment?.write = write; | 339 complexAssignment?.write = write; |
| 340 return write; | 340 return write; |
| 341 } | 341 } |
| 342 | 342 |
| 343 Expression _finish( | 343 Expression _finish( |
| 344 Expression body, KernelComplexAssignment complexAssignment) { | 344 Expression body, ShadowComplexAssignment complexAssignment) { |
| 345 var offset = offsetForToken(token); | 345 var offset = offsetForToken(token); |
| 346 var nullAwareGuard = new ConditionalExpression( | 346 var nullAwareGuard = new ConditionalExpression( |
| 347 buildIsNull(receiverAccess(), offset), new NullLiteral(), body, null) | 347 buildIsNull(receiverAccess(), offset), new NullLiteral(), body, null) |
| 348 ..fileOffset = offset; | 348 ..fileOffset = offset; |
| 349 if (complexAssignment != null) { | 349 if (complexAssignment != null) { |
| 350 body = makeLet(receiver, nullAwareGuard); | 350 body = makeLet(receiver, nullAwareGuard); |
| 351 KernelPropertyAssign kernelPropertyAssign = complexAssignment; | 351 ShadowPropertyAssign kernelPropertyAssign = complexAssignment; |
| 352 kernelPropertyAssign.nullAwareGuard = nullAwareGuard; | 352 kernelPropertyAssign.nullAwareGuard = nullAwareGuard; |
| 353 kernelPropertyAssign.desugared = body; | 353 kernelPropertyAssign.desugared = body; |
| 354 return kernelPropertyAssign; | 354 return kernelPropertyAssign; |
| 355 } else { | 355 } else { |
| 356 return new KernelNullAwarePropertyGet(receiver, nullAwareGuard) | 356 return new ShadowNullAwarePropertyGet(receiver, nullAwareGuard) |
| 357 ..fileOffset = offset; | 357 ..fileOffset = offset; |
| 358 } | 358 } |
| 359 } | 359 } |
| 360 } | 360 } |
| 361 | 361 |
| 362 class SuperPropertyAccessor extends Accessor { | 362 class SuperPropertyAccessor extends Accessor { |
| 363 Name name; | 363 Name name; |
| 364 Member getter, setter; | 364 Member getter, setter; |
| 365 | 365 |
| 366 SuperPropertyAccessor( | 366 SuperPropertyAccessor( |
| 367 BuilderHelper helper, this.name, this.getter, this.setter, Token token) | 367 BuilderHelper helper, this.name, this.getter, this.setter, Token token) |
| 368 : super(helper, token); | 368 : super(helper, token); |
| 369 | 369 |
| 370 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 370 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 371 if (getter == null) { | 371 if (getter == null) { |
| 372 helper.warnUnresolvedSuperGet(name, offsetForToken(token)); | 372 helper.warnUnresolvedSuperGet(name, offsetForToken(token)); |
| 373 } | 373 } |
| 374 // TODO(ahe): Use [DirectPropertyGet] when possible. | 374 // TODO(ahe): Use [DirectPropertyGet] when possible. |
| 375 var read = new KernelSuperPropertyGet(name, getter) | 375 var read = new ShadowSuperPropertyGet(name, getter) |
| 376 ..fileOffset = offsetForToken(token); | 376 ..fileOffset = offsetForToken(token); |
| 377 complexAssignment?.read = read; | 377 complexAssignment?.read = read; |
| 378 return read; | 378 return read; |
| 379 } | 379 } |
| 380 | 380 |
| 381 Expression _makeWrite(Expression value, bool voidContext, | 381 Expression _makeWrite(Expression value, bool voidContext, |
| 382 KernelComplexAssignment complexAssignment) { | 382 ShadowComplexAssignment complexAssignment) { |
| 383 if (setter == null) { | 383 if (setter == null) { |
| 384 helper.warnUnresolvedSuperSet(name, offsetForToken(token)); | 384 helper.warnUnresolvedSuperSet(name, offsetForToken(token)); |
| 385 } | 385 } |
| 386 // TODO(ahe): Use [DirectPropertySet] when possible. | 386 // TODO(ahe): Use [DirectPropertySet] when possible. |
| 387 var write = new SuperPropertySet(name, value, setter) | 387 var write = new SuperPropertySet(name, value, setter) |
| 388 ..fileOffset = offsetForToken(token); | 388 ..fileOffset = offsetForToken(token); |
| 389 complexAssignment?.write = write; | 389 complexAssignment?.write = write; |
| 390 return write; | 390 return write; |
| 391 } | 391 } |
| 392 } | 392 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 407 return new IndexAccessor.internal( | 407 return new IndexAccessor.internal( |
| 408 helper, receiver, index, getter, setter, token); | 408 helper, receiver, index, getter, setter, token); |
| 409 } | 409 } |
| 410 } | 410 } |
| 411 | 411 |
| 412 IndexAccessor.internal(BuilderHelper helper, this.receiver, this.index, | 412 IndexAccessor.internal(BuilderHelper helper, this.receiver, this.index, |
| 413 this.getter, this.setter, Token token) | 413 this.getter, this.setter, Token token) |
| 414 : super(helper, token); | 414 : super(helper, token); |
| 415 | 415 |
| 416 Expression _makeSimpleRead() { | 416 Expression _makeSimpleRead() { |
| 417 var read = new KernelMethodInvocation( | 417 var read = new ShadowMethodInvocation( |
| 418 receiver, indexGetName, new KernelArguments(<Expression>[index]), | 418 receiver, indexGetName, new ShadowArguments(<Expression>[index]), |
| 419 interfaceTarget: getter) | 419 interfaceTarget: getter) |
| 420 ..fileOffset = offsetForToken(token); | 420 ..fileOffset = offsetForToken(token); |
| 421 return read; | 421 return read; |
| 422 } | 422 } |
| 423 | 423 |
| 424 Expression _makeSimpleWrite(Expression value, bool voidContext, | 424 Expression _makeSimpleWrite(Expression value, bool voidContext, |
| 425 KernelComplexAssignment complexAssignment) { | 425 ShadowComplexAssignment complexAssignment) { |
| 426 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); | 426 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); |
| 427 var write = new KernelMethodInvocation( | 427 var write = new ShadowMethodInvocation( |
| 428 receiver, indexSetName, new KernelArguments(<Expression>[index, value]), | 428 receiver, indexSetName, new ShadowArguments(<Expression>[index, value]), |
| 429 interfaceTarget: setter) | 429 interfaceTarget: setter) |
| 430 ..fileOffset = offsetForToken(token); | 430 ..fileOffset = offsetForToken(token); |
| 431 complexAssignment?.write = write; | 431 complexAssignment?.write = write; |
| 432 return write; | 432 return write; |
| 433 } | 433 } |
| 434 | 434 |
| 435 receiverAccess() { | 435 receiverAccess() { |
| 436 // We cannot reuse the receiver if it is a variable since it might be | 436 // We cannot reuse the receiver if it is a variable since it might be |
| 437 // reassigned in the index expression. | 437 // reassigned in the index expression. |
| 438 receiverVariable ??= new VariableDeclaration.forValue(receiver); | 438 receiverVariable ??= new VariableDeclaration.forValue(receiver); |
| 439 return new VariableGet(receiverVariable) | 439 return new VariableGet(receiverVariable) |
| 440 ..fileOffset = offsetForToken(token); | 440 ..fileOffset = offsetForToken(token); |
| 441 } | 441 } |
| 442 | 442 |
| 443 indexAccess() { | 443 indexAccess() { |
| 444 indexVariable ??= new VariableDeclaration.forValue(index); | 444 indexVariable ??= new VariableDeclaration.forValue(index); |
| 445 return new VariableGet(indexVariable)..fileOffset = offsetForToken(token); | 445 return new VariableGet(indexVariable)..fileOffset = offsetForToken(token); |
| 446 } | 446 } |
| 447 | 447 |
| 448 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 448 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 449 var read = new KernelMethodInvocation(receiverAccess(), indexGetName, | 449 var read = new ShadowMethodInvocation(receiverAccess(), indexGetName, |
| 450 new KernelArguments(<Expression>[indexAccess()]), | 450 new ShadowArguments(<Expression>[indexAccess()]), |
| 451 interfaceTarget: getter) | 451 interfaceTarget: getter) |
| 452 ..fileOffset = offsetForToken(token); | 452 ..fileOffset = offsetForToken(token); |
| 453 complexAssignment?.read = read; | 453 complexAssignment?.read = read; |
| 454 return read; | 454 return read; |
| 455 } | 455 } |
| 456 | 456 |
| 457 Expression _makeWrite(Expression value, bool voidContext, | 457 Expression _makeWrite(Expression value, bool voidContext, |
| 458 KernelComplexAssignment complexAssignment) { | 458 ShadowComplexAssignment complexAssignment) { |
| 459 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); | 459 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); |
| 460 var write = new KernelMethodInvocation(receiverAccess(), indexSetName, | 460 var write = new ShadowMethodInvocation(receiverAccess(), indexSetName, |
| 461 new KernelArguments(<Expression>[indexAccess(), value]), | 461 new ShadowArguments(<Expression>[indexAccess(), value]), |
| 462 interfaceTarget: setter) | 462 interfaceTarget: setter) |
| 463 ..fileOffset = offsetForToken(token); | 463 ..fileOffset = offsetForToken(token); |
| 464 complexAssignment?.write = write; | 464 complexAssignment?.write = write; |
| 465 return write; | 465 return write; |
| 466 } | 466 } |
| 467 | 467 |
| 468 // TODO(dmitryas): remove this method after the "[]=" operator of the Context | 468 // TODO(dmitryas): remove this method after the "[]=" operator of the Context |
| 469 // class is made to return a value. | 469 // class is made to return a value. |
| 470 _makeWriteAndReturn( | 470 _makeWriteAndReturn( |
| 471 Expression value, KernelComplexAssignment complexAssignment) { | 471 Expression value, ShadowComplexAssignment complexAssignment) { |
| 472 // The call to []= does not return the value like direct-style assignments | 472 // The call to []= does not return the value like direct-style assignments |
| 473 // do. We need to bind the value in a let. | 473 // do. We need to bind the value in a let. |
| 474 var valueVariable = new VariableDeclaration.forValue(value); | 474 var valueVariable = new VariableDeclaration.forValue(value); |
| 475 var write = new KernelMethodInvocation( | 475 var write = new ShadowMethodInvocation( |
| 476 receiverAccess(), | 476 receiverAccess(), |
| 477 indexSetName, | 477 indexSetName, |
| 478 new KernelArguments( | 478 new ShadowArguments( |
| 479 <Expression>[indexAccess(), new VariableGet(valueVariable)]), | 479 <Expression>[indexAccess(), new VariableGet(valueVariable)]), |
| 480 interfaceTarget: setter) | 480 interfaceTarget: setter) |
| 481 ..fileOffset = offsetForToken(token); | 481 ..fileOffset = offsetForToken(token); |
| 482 complexAssignment?.write = write; | 482 complexAssignment?.write = write; |
| 483 var dummy = new KernelVariableDeclaration.forValue( | 483 var dummy = new ShadowVariableDeclaration.forValue( |
| 484 write, helper.functionNestingLevel); | 484 write, helper.functionNestingLevel); |
| 485 return makeLet( | 485 return makeLet( |
| 486 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); | 486 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); |
| 487 } | 487 } |
| 488 | 488 |
| 489 Expression _finish( | 489 Expression _finish( |
| 490 Expression body, KernelComplexAssignment complexAssignment) { | 490 Expression body, ShadowComplexAssignment complexAssignment) { |
| 491 return super._finish( | 491 return super._finish( |
| 492 makeLet(receiverVariable, makeLet(indexVariable, body)), | 492 makeLet(receiverVariable, makeLet(indexVariable, body)), |
| 493 complexAssignment); | 493 complexAssignment); |
| 494 } | 494 } |
| 495 } | 495 } |
| 496 | 496 |
| 497 /// Special case of [IndexAccessor] to avoid creating an indirect access to | 497 /// Special case of [IndexAccessor] to avoid creating an indirect access to |
| 498 /// 'this'. | 498 /// 'this'. |
| 499 class ThisIndexAccessor extends Accessor { | 499 class ThisIndexAccessor extends Accessor { |
| 500 Expression index; | 500 Expression index; |
| 501 VariableDeclaration indexVariable; | 501 VariableDeclaration indexVariable; |
| 502 Procedure getter, setter; | 502 Procedure getter, setter; |
| 503 | 503 |
| 504 ThisIndexAccessor( | 504 ThisIndexAccessor( |
| 505 BuilderHelper helper, this.index, this.getter, this.setter, Token token) | 505 BuilderHelper helper, this.index, this.getter, this.setter, Token token) |
| 506 : super(helper, token); | 506 : super(helper, token); |
| 507 | 507 |
| 508 Expression _makeSimpleRead() { | 508 Expression _makeSimpleRead() { |
| 509 return new KernelMethodInvocation(new KernelThisExpression(), indexGetName, | 509 return new ShadowMethodInvocation(new ShadowThisExpression(), indexGetName, |
| 510 new KernelArguments(<Expression>[index]), | 510 new ShadowArguments(<Expression>[index]), |
| 511 interfaceTarget: getter); | 511 interfaceTarget: getter); |
| 512 } | 512 } |
| 513 | 513 |
| 514 Expression _makeSimpleWrite(Expression value, bool voidContext, | 514 Expression _makeSimpleWrite(Expression value, bool voidContext, |
| 515 KernelComplexAssignment complexAssignment) { | 515 ShadowComplexAssignment complexAssignment) { |
| 516 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); | 516 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); |
| 517 var write = new KernelMethodInvocation(new KernelThisExpression(), | 517 var write = new ShadowMethodInvocation(new ShadowThisExpression(), |
| 518 indexSetName, new KernelArguments(<Expression>[index, value]), | 518 indexSetName, new ShadowArguments(<Expression>[index, value]), |
| 519 interfaceTarget: setter) | 519 interfaceTarget: setter) |
| 520 ..fileOffset = offsetForToken(token); | 520 ..fileOffset = offsetForToken(token); |
| 521 complexAssignment?.write = write; | 521 complexAssignment?.write = write; |
| 522 return write; | 522 return write; |
| 523 } | 523 } |
| 524 | 524 |
| 525 indexAccess() { | 525 indexAccess() { |
| 526 indexVariable ??= new VariableDeclaration.forValue(index); | 526 indexVariable ??= new VariableDeclaration.forValue(index); |
| 527 return new VariableGet(indexVariable); | 527 return new VariableGet(indexVariable); |
| 528 } | 528 } |
| 529 | 529 |
| 530 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 530 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 531 var read = new KernelMethodInvocation(new KernelThisExpression(), | 531 var read = new ShadowMethodInvocation(new ShadowThisExpression(), |
| 532 indexGetName, new KernelArguments(<Expression>[indexAccess()]), | 532 indexGetName, new ShadowArguments(<Expression>[indexAccess()]), |
| 533 interfaceTarget: getter) | 533 interfaceTarget: getter) |
| 534 ..fileOffset = offsetForToken(token); | 534 ..fileOffset = offsetForToken(token); |
| 535 complexAssignment?.read = read; | 535 complexAssignment?.read = read; |
| 536 return read; | 536 return read; |
| 537 } | 537 } |
| 538 | 538 |
| 539 Expression _makeWrite(Expression value, bool voidContext, | 539 Expression _makeWrite(Expression value, bool voidContext, |
| 540 KernelComplexAssignment complexAssignment) { | 540 ShadowComplexAssignment complexAssignment) { |
| 541 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); | 541 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); |
| 542 var write = new KernelMethodInvocation(new KernelThisExpression(), | 542 var write = new ShadowMethodInvocation(new ShadowThisExpression(), |
| 543 indexSetName, new KernelArguments(<Expression>[indexAccess(), value]), | 543 indexSetName, new ShadowArguments(<Expression>[indexAccess(), value]), |
| 544 interfaceTarget: setter) | 544 interfaceTarget: setter) |
| 545 ..fileOffset = offsetForToken(token); | 545 ..fileOffset = offsetForToken(token); |
| 546 complexAssignment?.write = write; | 546 complexAssignment?.write = write; |
| 547 return write; | 547 return write; |
| 548 } | 548 } |
| 549 | 549 |
| 550 _makeWriteAndReturn( | 550 _makeWriteAndReturn( |
| 551 Expression value, KernelComplexAssignment complexAssignment) { | 551 Expression value, ShadowComplexAssignment complexAssignment) { |
| 552 var valueVariable = new VariableDeclaration.forValue(value); | 552 var valueVariable = new VariableDeclaration.forValue(value); |
| 553 var write = new KernelMethodInvocation( | 553 var write = new ShadowMethodInvocation( |
| 554 new KernelThisExpression(), | 554 new ShadowThisExpression(), |
| 555 indexSetName, | 555 indexSetName, |
| 556 new KernelArguments( | 556 new ShadowArguments( |
| 557 <Expression>[indexAccess(), new VariableGet(valueVariable)]), | 557 <Expression>[indexAccess(), new VariableGet(valueVariable)]), |
| 558 interfaceTarget: setter) | 558 interfaceTarget: setter) |
| 559 ..fileOffset = offsetForToken(token); | 559 ..fileOffset = offsetForToken(token); |
| 560 complexAssignment?.write = write; | 560 complexAssignment?.write = write; |
| 561 var dummy = new VariableDeclaration.forValue(write); | 561 var dummy = new VariableDeclaration.forValue(write); |
| 562 return makeLet( | 562 return makeLet( |
| 563 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); | 563 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); |
| 564 } | 564 } |
| 565 | 565 |
| 566 Expression _finish( | 566 Expression _finish( |
| 567 Expression body, KernelComplexAssignment complexAssignment) { | 567 Expression body, ShadowComplexAssignment complexAssignment) { |
| 568 return super._finish(makeLet(indexVariable, body), complexAssignment); | 568 return super._finish(makeLet(indexVariable, body), complexAssignment); |
| 569 } | 569 } |
| 570 } | 570 } |
| 571 | 571 |
| 572 class SuperIndexAccessor extends Accessor { | 572 class SuperIndexAccessor extends Accessor { |
| 573 Expression index; | 573 Expression index; |
| 574 VariableDeclaration indexVariable; | 574 VariableDeclaration indexVariable; |
| 575 Member getter, setter; | 575 Member getter, setter; |
| 576 | 576 |
| 577 SuperIndexAccessor( | 577 SuperIndexAccessor( |
| 578 BuilderHelper helper, this.index, this.getter, this.setter, Token token) | 578 BuilderHelper helper, this.index, this.getter, this.setter, Token token) |
| 579 : super(helper, token); | 579 : super(helper, token); |
| 580 | 580 |
| 581 indexAccess() { | 581 indexAccess() { |
| 582 indexVariable ??= new VariableDeclaration.forValue(index); | 582 indexVariable ??= new VariableDeclaration.forValue(index); |
| 583 return new VariableGet(indexVariable); | 583 return new VariableGet(indexVariable); |
| 584 } | 584 } |
| 585 | 585 |
| 586 Expression _makeSimpleRead() { | 586 Expression _makeSimpleRead() { |
| 587 if (getter == null) { | 587 if (getter == null) { |
| 588 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token)); | 588 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token)); |
| 589 } | 589 } |
| 590 // TODO(ahe): Use [DirectMethodInvocation] when possible. | 590 // TODO(ahe): Use [DirectMethodInvocation] when possible. |
| 591 return new KernelSuperMethodInvocation( | 591 return new ShadowSuperMethodInvocation( |
| 592 indexGetName, new KernelArguments(<Expression>[index]), getter) | 592 indexGetName, new ShadowArguments(<Expression>[index]), getter) |
| 593 ..fileOffset = offsetForToken(token); | 593 ..fileOffset = offsetForToken(token); |
| 594 } | 594 } |
| 595 | 595 |
| 596 Expression _makeSimpleWrite(Expression value, bool voidContext, | 596 Expression _makeSimpleWrite(Expression value, bool voidContext, |
| 597 KernelComplexAssignment complexAssignment) { | 597 ShadowComplexAssignment complexAssignment) { |
| 598 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); | 598 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); |
| 599 if (setter == null) { | 599 if (setter == null) { |
| 600 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); | 600 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); |
| 601 } | 601 } |
| 602 var write = new SuperMethodInvocation( | 602 var write = new SuperMethodInvocation( |
| 603 indexSetName, new KernelArguments(<Expression>[index, value]), setter) | 603 indexSetName, new ShadowArguments(<Expression>[index, value]), setter) |
| 604 ..fileOffset = offsetForToken(token); | 604 ..fileOffset = offsetForToken(token); |
| 605 complexAssignment?.write = write; | 605 complexAssignment?.write = write; |
| 606 return write; | 606 return write; |
| 607 } | 607 } |
| 608 | 608 |
| 609 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 609 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 610 if (getter == null) { | 610 if (getter == null) { |
| 611 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token)); | 611 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token)); |
| 612 } | 612 } |
| 613 var read = new SuperMethodInvocation( | 613 var read = new SuperMethodInvocation( |
| 614 indexGetName, new KernelArguments(<Expression>[indexAccess()]), getter) | 614 indexGetName, new ShadowArguments(<Expression>[indexAccess()]), getter) |
| 615 ..fileOffset = offsetForToken(token); | 615 ..fileOffset = offsetForToken(token); |
| 616 complexAssignment?.read = read; | 616 complexAssignment?.read = read; |
| 617 return read; | 617 return read; |
| 618 } | 618 } |
| 619 | 619 |
| 620 Expression _makeWrite(Expression value, bool voidContext, | 620 Expression _makeWrite(Expression value, bool voidContext, |
| 621 KernelComplexAssignment complexAssignment) { | 621 ShadowComplexAssignment complexAssignment) { |
| 622 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); | 622 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); |
| 623 if (setter == null) { | 623 if (setter == null) { |
| 624 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); | 624 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); |
| 625 } | 625 } |
| 626 var write = new SuperMethodInvocation(indexSetName, | 626 var write = new SuperMethodInvocation(indexSetName, |
| 627 new KernelArguments(<Expression>[indexAccess(), value]), setter) | 627 new ShadowArguments(<Expression>[indexAccess(), value]), setter) |
| 628 ..fileOffset = offsetForToken(token); | 628 ..fileOffset = offsetForToken(token); |
| 629 complexAssignment?.write = write; | 629 complexAssignment?.write = write; |
| 630 return write; | 630 return write; |
| 631 } | 631 } |
| 632 | 632 |
| 633 _makeWriteAndReturn( | 633 _makeWriteAndReturn( |
| 634 Expression value, KernelComplexAssignment complexAssignment) { | 634 Expression value, ShadowComplexAssignment complexAssignment) { |
| 635 var valueVariable = new VariableDeclaration.forValue(value); | 635 var valueVariable = new VariableDeclaration.forValue(value); |
| 636 if (setter == null) { | 636 if (setter == null) { |
| 637 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); | 637 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); |
| 638 } | 638 } |
| 639 var write = new SuperMethodInvocation( | 639 var write = new SuperMethodInvocation( |
| 640 indexSetName, | 640 indexSetName, |
| 641 new KernelArguments( | 641 new ShadowArguments( |
| 642 <Expression>[indexAccess(), new VariableGet(valueVariable)]), | 642 <Expression>[indexAccess(), new VariableGet(valueVariable)]), |
| 643 setter) | 643 setter) |
| 644 ..fileOffset = offsetForToken(token); | 644 ..fileOffset = offsetForToken(token); |
| 645 complexAssignment?.write = write; | 645 complexAssignment?.write = write; |
| 646 var dummy = new VariableDeclaration.forValue(write); | 646 var dummy = new VariableDeclaration.forValue(write); |
| 647 return makeLet( | 647 return makeLet( |
| 648 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); | 648 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); |
| 649 } | 649 } |
| 650 | 650 |
| 651 Expression _finish( | 651 Expression _finish( |
| 652 Expression body, KernelComplexAssignment complexAssignment) { | 652 Expression body, ShadowComplexAssignment complexAssignment) { |
| 653 return super._finish(makeLet(indexVariable, body), complexAssignment); | 653 return super._finish(makeLet(indexVariable, body), complexAssignment); |
| 654 } | 654 } |
| 655 } | 655 } |
| 656 | 656 |
| 657 class StaticAccessor extends Accessor { | 657 class StaticAccessor extends Accessor { |
| 658 Member readTarget; | 658 Member readTarget; |
| 659 Member writeTarget; | 659 Member writeTarget; |
| 660 | 660 |
| 661 StaticAccessor( | 661 StaticAccessor( |
| 662 BuilderHelper helper, this.readTarget, this.writeTarget, Token token) | 662 BuilderHelper helper, this.readTarget, this.writeTarget, Token token) |
| 663 : super(helper, token); | 663 : super(helper, token); |
| 664 | 664 |
| 665 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 665 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 666 if (readTarget == null) { | 666 if (readTarget == null) { |
| 667 return makeInvalidRead(); | 667 return makeInvalidRead(); |
| 668 } else { | 668 } else { |
| 669 var read = helper.makeStaticGet(readTarget, token); | 669 var read = helper.makeStaticGet(readTarget, token); |
| 670 complexAssignment?.read = read; | 670 complexAssignment?.read = read; |
| 671 return read; | 671 return read; |
| 672 } | 672 } |
| 673 } | 673 } |
| 674 | 674 |
| 675 Expression _makeWrite(Expression value, bool voidContext, | 675 Expression _makeWrite(Expression value, bool voidContext, |
| 676 KernelComplexAssignment complexAssignment) { | 676 ShadowComplexAssignment complexAssignment) { |
| 677 Expression write; | 677 Expression write; |
| 678 if (writeTarget == null) { | 678 if (writeTarget == null) { |
| 679 write = makeInvalidWrite(value); | 679 write = makeInvalidWrite(value); |
| 680 } else { | 680 } else { |
| 681 write = new StaticSet(writeTarget, value); | 681 write = new StaticSet(writeTarget, value); |
| 682 complexAssignment?.write = write; | 682 complexAssignment?.write = write; |
| 683 } | 683 } |
| 684 write.fileOffset = offsetForToken(token); | 684 write.fileOffset = offsetForToken(token); |
| 685 return write; | 685 return write; |
| 686 } | 686 } |
| 687 } | 687 } |
| 688 | 688 |
| 689 class ReadOnlyAccessor extends Accessor { | 689 class ReadOnlyAccessor extends Accessor { |
| 690 Expression expression; | 690 Expression expression; |
| 691 VariableDeclaration value; | 691 VariableDeclaration value; |
| 692 | 692 |
| 693 ReadOnlyAccessor(BuilderHelper helper, this.expression, Token token) | 693 ReadOnlyAccessor(BuilderHelper helper, this.expression, Token token) |
| 694 : super(helper, token); | 694 : super(helper, token); |
| 695 | 695 |
| 696 Expression _makeSimpleRead() => expression; | 696 Expression _makeSimpleRead() => expression; |
| 697 | 697 |
| 698 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 698 Expression _makeRead(ShadowComplexAssignment complexAssignment) { |
| 699 value ??= new VariableDeclaration.forValue(expression); | 699 value ??= new VariableDeclaration.forValue(expression); |
| 700 return new VariableGet(value); | 700 return new VariableGet(value); |
| 701 } | 701 } |
| 702 | 702 |
| 703 Expression _makeWrite(Expression value, bool voidContext, | 703 Expression _makeWrite(Expression value, bool voidContext, |
| 704 KernelComplexAssignment complexAssignment) => | 704 ShadowComplexAssignment complexAssignment) => |
| 705 makeInvalidWrite(value); | 705 makeInvalidWrite(value); |
| 706 | 706 |
| 707 Expression _finish( | 707 Expression _finish( |
| 708 Expression body, KernelComplexAssignment complexAssignment) => | 708 Expression body, ShadowComplexAssignment complexAssignment) => |
| 709 super._finish(makeLet(value, body), complexAssignment); | 709 super._finish(makeLet(value, body), complexAssignment); |
| 710 } | 710 } |
| 711 | 711 |
| 712 Expression makeLet(VariableDeclaration variable, Expression body) { | 712 Expression makeLet(VariableDeclaration variable, Expression body) { |
| 713 if (variable == null) return body; | 713 if (variable == null) return body; |
| 714 return new Let(variable, body); | 714 return new Let(variable, body); |
| 715 } | 715 } |
| 716 | 716 |
| 717 Expression makeBinary( | 717 Expression makeBinary( |
| 718 Expression left, Name operator, Procedure interfaceTarget, Expression right, | 718 Expression left, Name operator, Procedure interfaceTarget, Expression right, |
| 719 {int offset: TreeNode.noOffset}) { | 719 {int offset: TreeNode.noOffset}) { |
| 720 return new KernelMethodInvocation( | 720 return new ShadowMethodInvocation( |
| 721 left, operator, new KernelArguments(<Expression>[right]), | 721 left, operator, new ShadowArguments(<Expression>[right]), |
| 722 interfaceTarget: interfaceTarget) | 722 interfaceTarget: interfaceTarget) |
| 723 ..fileOffset = offset; | 723 ..fileOffset = offset; |
| 724 } | 724 } |
| 725 | 725 |
| 726 Expression buildIsNull(Expression value, int offset) { | 726 Expression buildIsNull(Expression value, int offset) { |
| 727 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset); | 727 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset); |
| 728 } | 728 } |
| 729 | 729 |
| 730 VariableDeclaration makeOrReuseVariable(Expression value) { | 730 VariableDeclaration makeOrReuseVariable(Expression value) { |
| 731 // TODO: Devise a way to remember if a variable declaration was reused | 731 // TODO: Devise a way to remember if a variable declaration was reused |
| 732 // or is fresh (hence needs a let binding). | 732 // or is fresh (hence needs a let binding). |
| 733 return new VariableDeclaration.forValue(value); | 733 return new VariableDeclaration.forValue(value); |
| 734 } | 734 } |
| OLD | NEW |