Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart

Issue 2931363003: Add type inference for assignments to properties. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 KernelPropertyGet, 15 KernelPropertyGet,
15 KernelPropertySet, 16 KernelPropertySet,
16 KernelThisExpression, 17 KernelThisExpression,
17 KernelVariableDeclaration, 18 KernelVariableDeclaration,
18 KernelVariableGet, 19 KernelVariableGet,
19 KernelVariableSet; 20 KernelVariableSet;
20 21
21 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; 22 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken;
22 23
23 import 'package:front_end/src/scanner/token.dart' show Token; 24 import 'package:front_end/src/scanner/token.dart' show Token;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 243
243 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name, 244 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name,
244 this.getter, this.setter, Token token) 245 this.getter, this.setter, Token token)
245 : super(helper, token); 246 : super(helper, token);
246 247
247 Expression _makeSimpleRead() => new KernelPropertyGet(receiver, name, getter) 248 Expression _makeSimpleRead() => new KernelPropertyGet(receiver, name, getter)
248 ..fileOffset = offsetForToken(token); 249 ..fileOffset = offsetForToken(token);
249 250
250 Expression _makeSimpleWrite(Expression value, bool voidContext, 251 Expression _makeSimpleWrite(Expression value, bool voidContext,
251 KernelComplexAssignment complexAssignment) { 252 KernelComplexAssignment complexAssignment) {
252 return new KernelPropertySet(receiver, name, value, setter) 253 var write = new KernelPropertySet(receiver, name, value, setter)
253 ..fileOffset = offsetForToken(token); 254 ..fileOffset = offsetForToken(token);
255 complexAssignment?.write = write;
256 return write;
254 } 257 }
255 258
256 receiverAccess() { 259 receiverAccess() {
257 _receiverVariable ??= new VariableDeclaration.forValue(receiver); 260 _receiverVariable ??= new VariableDeclaration.forValue(receiver);
258 return new VariableGet(_receiverVariable) 261 return new VariableGet(_receiverVariable)
259 ..fileOffset = offsetForToken(token); 262 ..fileOffset = offsetForToken(token);
260 } 263 }
261 264
262 Expression _makeRead(KernelComplexAssignment complexAssignment) => 265 Expression _makeRead(KernelComplexAssignment complexAssignment) {
263 new KernelPropertyGet(receiverAccess(), name, getter) 266 var read = new KernelPropertyGet(receiverAccess(), name, getter)
264 ..fileOffset = offsetForToken(token); 267 ..fileOffset = offsetForToken(token);
268 complexAssignment?.read = read;
269 return read;
270 }
265 271
266 Expression _makeWrite(Expression value, bool voidContext, 272 Expression _makeWrite(Expression value, bool voidContext,
267 KernelComplexAssignment complexAssignment) { 273 KernelComplexAssignment complexAssignment) {
268 return new KernelPropertySet(receiverAccess(), name, value, setter) 274 var write = new KernelPropertySet(receiverAccess(), name, value, setter)
269 ..fileOffset = offsetForToken(token); 275 ..fileOffset = offsetForToken(token);
276 complexAssignment?.write = write;
277 return write;
270 } 278 }
271 279
272 Expression _finish( 280 Expression _finish(
273 Expression body, KernelComplexAssignment complexAssignment) => 281 Expression body, KernelComplexAssignment complexAssignment) {
274 makeLet(_receiverVariable, body); 282 body = makeLet(_receiverVariable, body);
283 if (complexAssignment != null) {
284 complexAssignment.desugared = body;
285 return complexAssignment;
286 } else {
287 return body;
288 }
289 }
275 } 290 }
276 291
277 /// Special case of [PropertyAccessor] to avoid creating an indirect access to 292 /// Special case of [PropertyAccessor] to avoid creating an indirect access to
278 /// 'this'. 293 /// 'this'.
279 class ThisPropertyAccessor extends Accessor { 294 class ThisPropertyAccessor extends Accessor {
280 Name name; 295 Name name;
281 Member getter, setter; 296 Member getter, setter;
282 297
283 ThisPropertyAccessor( 298 ThisPropertyAccessor(
284 BuilderHelper helper, this.name, this.getter, this.setter, Token token) 299 BuilderHelper helper, this.name, this.getter, this.setter, Token token)
285 : super(helper, token); 300 : super(helper, token);
286 301
287 Expression _makeRead(KernelComplexAssignment complexAssignment) => 302 Expression _makeRead(KernelComplexAssignment complexAssignment) {
288 new KernelPropertyGet(new KernelThisExpression(), name, getter) 303 var read = new KernelPropertyGet(new KernelThisExpression(), name, getter)
289 ..fileOffset = offsetForToken(token); 304 ..fileOffset = offsetForToken(token);
305 complexAssignment?.read = read;
306 return read;
307 }
290 308
291 Expression _makeWrite(Expression value, bool voidContext, 309 Expression _makeWrite(Expression value, bool voidContext,
292 KernelComplexAssignment complexAssignment) { 310 KernelComplexAssignment complexAssignment) {
293 return new KernelPropertySet( 311 var write =
294 new KernelThisExpression(), name, value, setter) 312 new KernelPropertySet(new KernelThisExpression(), name, value, setter)
295 ..fileOffset = offsetForToken(token); 313 ..fileOffset = offsetForToken(token);
314 complexAssignment?.write = write;
315 return write;
296 } 316 }
297 } 317 }
298 318
299 class NullAwarePropertyAccessor extends Accessor { 319 class NullAwarePropertyAccessor extends Accessor {
300 VariableDeclaration receiver; 320 VariableDeclaration receiver;
321 Expression receiverExpression;
301 Name name; 322 Name name;
302 Member getter, setter; 323 Member getter, setter;
303 DartType type; 324 DartType type;
304 325
305 NullAwarePropertyAccessor(BuilderHelper helper, Expression receiver, 326 NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression,
306 this.name, this.getter, this.setter, this.type, Token token) 327 this.name, this.getter, this.setter, this.type, Token token)
307 : this.receiver = makeOrReuseVariable(receiver), 328 : this.receiver = makeOrReuseVariable(receiverExpression),
308 super(helper, token); 329 super(helper, token);
309 330
310 receiverAccess() => new VariableGet(receiver); 331 receiverAccess() => new VariableGet(receiver);
311 332
312 Expression _makeRead(KernelComplexAssignment complexAssignment) => 333 Expression _makeRead(KernelComplexAssignment complexAssignment) {
313 new KernelPropertyGet(receiverAccess(), name, getter); 334 var read = new KernelPropertyGet(receiverAccess(), name, getter)
335 ..fileOffset = offsetForToken(token);
336 complexAssignment?.read = read;
337 return read;
338 }
314 339
315 Expression _makeWrite(Expression value, bool voidContext, 340 Expression _makeWrite(Expression value, bool voidContext,
316 KernelComplexAssignment complexAssignment) { 341 KernelComplexAssignment complexAssignment) {
317 return new KernelPropertySet(receiverAccess(), name, value, setter); 342 var write = new KernelPropertySet(receiverAccess(), name, value, setter)
343 ..fileOffset = offsetForToken(token);
344 complexAssignment?.write = write;
345 return write;
318 } 346 }
319 347
320 Expression _finish( 348 Expression _finish(
321 Expression body, KernelComplexAssignment complexAssignment) => 349 Expression body, KernelComplexAssignment complexAssignment) {
322 makeLet( 350 var nullAwareGuard = new KernelConditionalExpression(
323 receiver, 351 buildIsNull(receiverAccess()), new NullLiteral(), body)
324 new KernelConditionalExpression( 352 ..fileOffset = offsetForToken(token);
325 buildIsNull(receiverAccess()), new NullLiteral(), body)); 353 body = makeLet(receiver, nullAwareGuard);
354 if (complexAssignment != null) {
355 KernelPropertyAssign kernelPropertyAssign = complexAssignment;
356 kernelPropertyAssign.nullAwareGuard = nullAwareGuard;
357 kernelPropertyAssign.desugared = body;
358 return kernelPropertyAssign;
359 } else {
360 return body;
361 }
362 }
326 } 363 }
327 364
328 class SuperPropertyAccessor extends Accessor { 365 class SuperPropertyAccessor extends Accessor {
329 Name name; 366 Name name;
330 Member getter, setter; 367 Member getter, setter;
331 368
332 SuperPropertyAccessor( 369 SuperPropertyAccessor(
333 BuilderHelper helper, this.name, this.getter, this.setter, Token token) 370 BuilderHelper helper, this.name, this.getter, this.setter, Token token)
334 : super(helper, token); 371 : super(helper, token);
335 372
336 Expression _makeRead(KernelComplexAssignment complexAssignment) { 373 Expression _makeRead(KernelComplexAssignment complexAssignment) {
337 if (getter == null) return makeInvalidRead(); 374 if (getter == null) return makeInvalidRead();
338 // TODO(ahe): Use [DirectPropertyGet] when possible. 375 // TODO(ahe): Use [DirectPropertyGet] when possible.
339 return new SuperPropertyGet(name, getter) 376 var read = new SuperPropertyGet(name, getter)
340 ..fileOffset = offsetForToken(token); 377 ..fileOffset = offsetForToken(token);
378 complexAssignment?.read = read;
379 return read;
341 } 380 }
342 381
343 Expression _makeWrite(Expression value, bool voidContext, 382 Expression _makeWrite(Expression value, bool voidContext,
344 KernelComplexAssignment complexAssignment) { 383 KernelComplexAssignment complexAssignment) {
345 if (setter == null) return makeInvalidWrite(value); 384 if (setter == null) return makeInvalidWrite(value);
346 // TODO(ahe): Use [DirectPropertySet] when possible. 385 // TODO(ahe): Use [DirectPropertySet] when possible.
347 return new SuperPropertySet(name, value, setter) 386 var write = new SuperPropertySet(name, value, setter)
348 ..fileOffset = offsetForToken(token); 387 ..fileOffset = offsetForToken(token);
388 complexAssignment?.write = write;
389 return write;
349 } 390 }
350 } 391 }
351 392
352 class IndexAccessor extends Accessor { 393 class IndexAccessor extends Accessor {
353 Expression receiver; 394 Expression receiver;
354 Expression index; 395 Expression index;
355 VariableDeclaration receiverVariable; 396 VariableDeclaration receiverVariable;
356 VariableDeclaration indexVariable; 397 VariableDeclaration indexVariable;
357 Procedure getter, setter; 398 Procedure getter, setter;
358 399
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 682
642 Expression buildIsNull(Expression value, {int offset: TreeNode.noOffset}) { 683 Expression buildIsNull(Expression value, {int offset: TreeNode.noOffset}) {
643 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset); 684 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset);
644 } 685 }
645 686
646 VariableDeclaration makeOrReuseVariable(Expression value) { 687 VariableDeclaration makeOrReuseVariable(Expression value) {
647 // TODO: Devise a way to remember if a variable declaration was reused 688 // TODO: Devise a way to remember if a variable declaration was reused
648 // or is fresh (hence needs a let binding). 689 // or is fresh (hence needs a let binding).
649 return new VariableDeclaration.forValue(value); 690 return new VariableDeclaration.forValue(value);
650 } 691 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698