| 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:front_end/src/fasta/kernel/kernel_shadow_ast.dart' | 8 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' |
| 9 show | 9 show |
| 10 KernelArguments, | 10 KernelArguments, |
| 11 KernelComplexAssignment, | 11 KernelComplexAssignment, |
| 12 KernelConditionalExpression, | 12 KernelConditionalExpression, |
| 13 KernelMethodInvocation, | 13 KernelMethodInvocation, |
| 14 KernelPropertyAssign, | 14 KernelPropertyAssign, |
| 15 KernelPropertyGet, | 15 KernelPropertyGet, |
| 16 KernelPropertySet, | |
| 17 KernelThisExpression, | 16 KernelThisExpression, |
| 18 KernelVariableDeclaration, | 17 KernelVariableDeclaration, |
| 19 KernelVariableGet, | 18 KernelVariableGet; |
| 20 KernelVariableSet; | |
| 21 | 19 |
| 22 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; | 20 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; |
| 23 | 21 |
| 24 import 'package:front_end/src/scanner/token.dart' show Token; | 22 import 'package:front_end/src/scanner/token.dart' show Token; |
| 25 | 23 |
| 26 import 'package:front_end/src/fasta/kernel/fasta_accessors.dart' | 24 import 'package:front_end/src/fasta/kernel/fasta_accessors.dart' |
| 27 show BuilderHelper; | 25 show BuilderHelper; |
| 28 | 26 |
| 29 import 'package:kernel/ast.dart' hide MethodInvocation, InvalidExpression; | 27 import 'package:kernel/ast.dart' hide MethodInvocation, InvalidExpression; |
| 30 | 28 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 ..fileOffset = offsetForToken(token); | 209 ..fileOffset = offsetForToken(token); |
| 212 complexAssignment?.read = read; | 210 complexAssignment?.read = read; |
| 213 return read; | 211 return read; |
| 214 } | 212 } |
| 215 | 213 |
| 216 Expression _makeWrite(Expression value, bool voidContext, | 214 Expression _makeWrite(Expression value, bool voidContext, |
| 217 KernelComplexAssignment complexAssignment) { | 215 KernelComplexAssignment complexAssignment) { |
| 218 helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel); | 216 helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel); |
| 219 var write = variable.isFinal || variable.isConst | 217 var write = variable.isFinal || variable.isConst |
| 220 ? makeInvalidWrite(value) | 218 ? makeInvalidWrite(value) |
| 221 : new KernelVariableSet(variable, value) | 219 : new VariableSet(variable, value) |
| 222 ..fileOffset = offsetForToken(token); | 220 ..fileOffset = offsetForToken(token); |
| 223 complexAssignment?.write = write; | 221 complexAssignment?.write = write; |
| 224 return write; | 222 return write; |
| 225 } | 223 } |
| 226 } | 224 } |
| 227 | 225 |
| 228 class PropertyAccessor extends Accessor { | 226 class PropertyAccessor extends Accessor { |
| 229 VariableDeclaration _receiverVariable; | 227 VariableDeclaration _receiverVariable; |
| 230 Expression receiver; | 228 Expression receiver; |
| 231 Name name; | 229 Name name; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 244 | 242 |
| 245 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name, | 243 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name, |
| 246 this.getter, this.setter, Token token) | 244 this.getter, this.setter, Token token) |
| 247 : super(helper, token); | 245 : super(helper, token); |
| 248 | 246 |
| 249 Expression _makeSimpleRead() => new KernelPropertyGet(receiver, name, getter) | 247 Expression _makeSimpleRead() => new KernelPropertyGet(receiver, name, getter) |
| 250 ..fileOffset = offsetForToken(token); | 248 ..fileOffset = offsetForToken(token); |
| 251 | 249 |
| 252 Expression _makeSimpleWrite(Expression value, bool voidContext, | 250 Expression _makeSimpleWrite(Expression value, bool voidContext, |
| 253 KernelComplexAssignment complexAssignment) { | 251 KernelComplexAssignment complexAssignment) { |
| 254 var write = new KernelPropertySet(receiver, name, value, setter) | 252 var write = new PropertySet(receiver, name, value, setter) |
| 255 ..fileOffset = offsetForToken(token); | 253 ..fileOffset = offsetForToken(token); |
| 256 complexAssignment?.write = write; | 254 complexAssignment?.write = write; |
| 257 return write; | 255 return write; |
| 258 } | 256 } |
| 259 | 257 |
| 260 receiverAccess() { | 258 receiverAccess() { |
| 261 _receiverVariable ??= new VariableDeclaration.forValue(receiver); | 259 _receiverVariable ??= new VariableDeclaration.forValue(receiver); |
| 262 return new VariableGet(_receiverVariable) | 260 return new VariableGet(_receiverVariable) |
| 263 ..fileOffset = offsetForToken(token); | 261 ..fileOffset = offsetForToken(token); |
| 264 } | 262 } |
| 265 | 263 |
| 266 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 264 Expression _makeRead(KernelComplexAssignment complexAssignment) { |
| 267 var read = new KernelPropertyGet(receiverAccess(), name, getter) | 265 var read = new KernelPropertyGet(receiverAccess(), name, getter) |
| 268 ..fileOffset = offsetForToken(token); | 266 ..fileOffset = offsetForToken(token); |
| 269 complexAssignment?.read = read; | 267 complexAssignment?.read = read; |
| 270 return read; | 268 return read; |
| 271 } | 269 } |
| 272 | 270 |
| 273 Expression _makeWrite(Expression value, bool voidContext, | 271 Expression _makeWrite(Expression value, bool voidContext, |
| 274 KernelComplexAssignment complexAssignment) { | 272 KernelComplexAssignment complexAssignment) { |
| 275 var write = new KernelPropertySet(receiverAccess(), name, value, setter) | 273 var write = new PropertySet(receiverAccess(), name, value, setter) |
| 276 ..fileOffset = offsetForToken(token); | 274 ..fileOffset = offsetForToken(token); |
| 277 complexAssignment?.write = write; | 275 complexAssignment?.write = write; |
| 278 return write; | 276 return write; |
| 279 } | 277 } |
| 280 | 278 |
| 281 Expression _finish( | 279 Expression _finish( |
| 282 Expression body, KernelComplexAssignment complexAssignment) { | 280 Expression body, KernelComplexAssignment complexAssignment) { |
| 283 body = makeLet(_receiverVariable, body); | 281 body = makeLet(_receiverVariable, body); |
| 284 if (complexAssignment != null) { | 282 if (complexAssignment != null) { |
| 285 complexAssignment.desugared = body; | 283 complexAssignment.desugared = body; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 302 | 300 |
| 303 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 301 Expression _makeRead(KernelComplexAssignment complexAssignment) { |
| 304 var read = new KernelPropertyGet(new KernelThisExpression(), name, getter) | 302 var read = new KernelPropertyGet(new KernelThisExpression(), name, getter) |
| 305 ..fileOffset = offsetForToken(token); | 303 ..fileOffset = offsetForToken(token); |
| 306 complexAssignment?.read = read; | 304 complexAssignment?.read = read; |
| 307 return read; | 305 return read; |
| 308 } | 306 } |
| 309 | 307 |
| 310 Expression _makeWrite(Expression value, bool voidContext, | 308 Expression _makeWrite(Expression value, bool voidContext, |
| 311 KernelComplexAssignment complexAssignment) { | 309 KernelComplexAssignment complexAssignment) { |
| 312 var write = | 310 var write = new PropertySet(new KernelThisExpression(), name, value, setter) |
| 313 new KernelPropertySet(new KernelThisExpression(), name, value, setter) | 311 ..fileOffset = offsetForToken(token); |
| 314 ..fileOffset = offsetForToken(token); | |
| 315 complexAssignment?.write = write; | 312 complexAssignment?.write = write; |
| 316 return write; | 313 return write; |
| 317 } | 314 } |
| 318 } | 315 } |
| 319 | 316 |
| 320 class NullAwarePropertyAccessor extends Accessor { | 317 class NullAwarePropertyAccessor extends Accessor { |
| 321 VariableDeclaration receiver; | 318 VariableDeclaration receiver; |
| 322 Expression receiverExpression; | 319 Expression receiverExpression; |
| 323 Name name; | 320 Name name; |
| 324 Member getter, setter; | 321 Member getter, setter; |
| 325 DartType type; | 322 DartType type; |
| 326 | 323 |
| 327 NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression, | 324 NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression, |
| 328 this.name, this.getter, this.setter, this.type, Token token) | 325 this.name, this.getter, this.setter, this.type, Token token) |
| 329 : this.receiver = makeOrReuseVariable(receiverExpression), | 326 : this.receiver = makeOrReuseVariable(receiverExpression), |
| 330 super(helper, token); | 327 super(helper, token); |
| 331 | 328 |
| 332 receiverAccess() => new VariableGet(receiver); | 329 receiverAccess() => new VariableGet(receiver); |
| 333 | 330 |
| 334 Expression _makeRead(KernelComplexAssignment complexAssignment) { | 331 Expression _makeRead(KernelComplexAssignment complexAssignment) { |
| 335 var read = new KernelPropertyGet(receiverAccess(), name, getter) | 332 var read = new KernelPropertyGet(receiverAccess(), name, getter) |
| 336 ..fileOffset = offsetForToken(token); | 333 ..fileOffset = offsetForToken(token); |
| 337 complexAssignment?.read = read; | 334 complexAssignment?.read = read; |
| 338 return read; | 335 return read; |
| 339 } | 336 } |
| 340 | 337 |
| 341 Expression _makeWrite(Expression value, bool voidContext, | 338 Expression _makeWrite(Expression value, bool voidContext, |
| 342 KernelComplexAssignment complexAssignment) { | 339 KernelComplexAssignment complexAssignment) { |
| 343 var write = new KernelPropertySet(receiverAccess(), name, value, setter) | 340 var write = new PropertySet(receiverAccess(), name, value, setter) |
| 344 ..fileOffset = offsetForToken(token); | 341 ..fileOffset = offsetForToken(token); |
| 345 complexAssignment?.write = write; | 342 complexAssignment?.write = write; |
| 346 return write; | 343 return write; |
| 347 } | 344 } |
| 348 | 345 |
| 349 Expression _finish( | 346 Expression _finish( |
| 350 Expression body, KernelComplexAssignment complexAssignment) { | 347 Expression body, KernelComplexAssignment complexAssignment) { |
| 351 var nullAwareGuard = new KernelConditionalExpression( | 348 var nullAwareGuard = new KernelConditionalExpression( |
| 352 buildIsNull(receiverAccess(), offsetForToken(token)), | 349 buildIsNull(receiverAccess(), offsetForToken(token)), |
| 353 new NullLiteral(), | 350 new NullLiteral(), |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 | 722 |
| 726 Expression buildIsNull(Expression value, int offset) { | 723 Expression buildIsNull(Expression value, int offset) { |
| 727 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset); | 724 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset); |
| 728 } | 725 } |
| 729 | 726 |
| 730 VariableDeclaration makeOrReuseVariable(Expression value) { | 727 VariableDeclaration makeOrReuseVariable(Expression value) { |
| 731 // TODO: Devise a way to remember if a variable declaration was reused | 728 // TODO: Devise a way to remember if a variable declaration was reused |
| 732 // or is fresh (hence needs a let binding). | 729 // or is fresh (hence needs a let binding). |
| 733 return new VariableDeclaration.forValue(value); | 730 return new VariableDeclaration.forValue(value); |
| 734 } | 731 } |
| OLD | NEW |