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

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

Issue 2925603002: Add type inference for `this` expressions. (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 library fasta.fasta_accessors; 5 library fasta.fasta_accessors;
6 6
7 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' 7 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'
8 show KernelArguments; 8 show KernelArguments, KernelThisExpression;
9 9
10 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; 10 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken;
11 11
12 import 'package:front_end/src/scanner/token.dart' show Token; 12 import 'package:front_end/src/scanner/token.dart' show Token;
13 13
14 import 'frontend_accessors.dart' show Accessor; 14 import 'frontend_accessors.dart' show Accessor;
15 15
16 import 'package:front_end/src/fasta/type_inference/type_promotion.dart' 16 import 'package:front_end/src/fasta/type_inference/type_promotion.dart'
17 show TypePromoter; 17 show TypePromoter;
18 18
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 279
280 final bool isSuper; 280 final bool isSuper;
281 281
282 ThisAccessor(this.helper, this.token, this.isInitializer, 282 ThisAccessor(this.helper, this.token, this.isInitializer,
283 {this.isSuper: false}); 283 {this.isSuper: false});
284 284
285 String get plainNameForRead => internalError(isSuper ? "super" : "this"); 285 String get plainNameForRead => internalError(isSuper ? "super" : "this");
286 286
287 Expression buildSimpleRead() { 287 Expression buildSimpleRead() {
288 if (!isSuper) { 288 if (!isSuper) {
289 return new ThisExpression(); 289 return new KernelThisExpression();
290 } else { 290 } else {
291 return helper.buildCompileTimeError( 291 return helper.buildCompileTimeError(
292 "Can't use `super` as an expression.", offsetForToken(token)); 292 "Can't use `super` as an expression.", offsetForToken(token));
293 } 293 }
294 } 294 }
295 295
296 Initializer buildFieldInitializer( 296 Initializer buildFieldInitializer(
297 Map<String, FieldInitializer> initializers) { 297 Map<String, FieldInitializer> initializers) {
298 String keyword = isSuper ? "super" : "this"; 298 String keyword = isSuper ? "super" : "this";
299 int offset = offsetForToken(token); 299 int offset = offsetForToken(token);
300 return helper.buildInvalidIntializer( 300 return helper.buildInvalidIntializer(
301 helper.buildCompileTimeError( 301 helper.buildCompileTimeError(
302 "Can't use '$keyword' here, did you mean '$keyword()'?", offset), 302 "Can't use '$keyword' here, did you mean '$keyword()'?", offset),
303 offset); 303 offset);
304 } 304 }
305 305
306 buildPropertyAccess( 306 buildPropertyAccess(
307 IncompleteSend send, int operatorOffset, bool isNullAware) { 307 IncompleteSend send, int operatorOffset, bool isNullAware) {
308 if (isInitializer && send is SendAccessor) { 308 if (isInitializer && send is SendAccessor) {
309 return buildConstructorInitializer( 309 return buildConstructorInitializer(
310 offsetForToken(send.token), send.name, send.arguments); 310 offsetForToken(send.token), send.name, send.arguments);
311 } 311 }
312 if (send is SendAccessor) { 312 if (send is SendAccessor) {
313 // Notice that 'this' or 'super' can't be null. So we can ignore the 313 // Notice that 'this' or 'super' can't be null. So we can ignore the
314 // value of [isNullAware]. 314 // value of [isNullAware].
315 MethodInvocation result = helper.buildMethodInvocation( 315 MethodInvocation result = helper.buildMethodInvocation(
316 new ThisExpression(), 316 new KernelThisExpression(),
317 send.name, 317 send.name,
318 send.arguments, 318 send.arguments,
319 offsetForToken(token)); 319 offsetForToken(token));
320 return isSuper ? helper.toSuperMethodInvocation(result) : result; 320 return isSuper ? helper.toSuperMethodInvocation(result) : result;
321 } else { 321 } else {
322 if (isSuper) { 322 if (isSuper) {
323 Member getter = helper.lookupSuperMember(send.name); 323 Member getter = helper.lookupSuperMember(send.name);
324 Member setter = helper.lookupSuperMember(send.name, isSetter: true); 324 Member setter = helper.lookupSuperMember(send.name, isSetter: true);
325 return new SuperPropertyAccessor( 325 return new SuperPropertyAccessor(
326 helper, send.token, send.name, getter, setter); 326 helper, send.token, send.name, getter, setter);
327 } else { 327 } else {
328 return new ThisPropertyAccessor( 328 return new ThisPropertyAccessor(
329 helper, send.token, send.name, null, null); 329 helper, send.token, send.name, null, null);
330 } 330 }
331 } 331 }
332 } 332 }
333 333
334 doInvocation(int offset, Arguments arguments) { 334 doInvocation(int offset, Arguments arguments) {
335 if (isInitializer) { 335 if (isInitializer) {
336 return buildConstructorInitializer(offset, new Name(""), arguments); 336 return buildConstructorInitializer(offset, new Name(""), arguments);
337 } else { 337 } else {
338 return helper.buildMethodInvocation( 338 return helper.buildMethodInvocation(
339 new ThisExpression(), callName, arguments, offset); 339 new KernelThisExpression(), callName, arguments, offset);
340 } 340 }
341 } 341 }
342 342
343 Initializer buildConstructorInitializer( 343 Initializer buildConstructorInitializer(
344 int offset, Name name, Arguments arguments) { 344 int offset, Name name, Arguments arguments) {
345 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper); 345 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
346 if (constructor == null || 346 if (constructor == null ||
347 !helper.checkArguments( 347 !helper.checkArguments(
348 constructor.function, arguments, <TypeParameter>[])) { 348 constructor.function, arguments, <TypeParameter>[])) {
349 return helper.buildInvalidIntializer( 349 return helper.buildInvalidIntializer(
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 bool get isThisPropertyAccessor => true; 749 bool get isThisPropertyAccessor => true;
750 750
751 Expression doInvocation(int offset, Arguments arguments) { 751 Expression doInvocation(int offset, Arguments arguments) {
752 Member interfaceTarget = getter; 752 Member interfaceTarget = getter;
753 if (interfaceTarget is Field) { 753 if (interfaceTarget is Field) {
754 // TODO(ahe): In strong mode we should probably rewrite this to 754 // TODO(ahe): In strong mode we should probably rewrite this to
755 // `this.name.call(arguments)`. 755 // `this.name.call(arguments)`.
756 interfaceTarget = null; 756 interfaceTarget = null;
757 } 757 }
758 return helper.buildMethodInvocation( 758 return helper.buildMethodInvocation(
759 new ThisExpression(), name, arguments, offset); 759 new KernelThisExpression(), name, arguments, offset);
760 } 760 }
761 761
762 toString() => "ThisPropertyAccessor()"; 762 toString() => "ThisPropertyAccessor()";
763 } 763 }
764 764
765 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor 765 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor
766 with FastaAccessor { 766 with FastaAccessor {
767 final BuilderHelper helper; 767 final BuilderHelper helper;
768 768
769 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver, 769 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver,
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 {bool isGetter: false, bool isSetter: false, int offset}) { 930 {bool isGetter: false, bool isSetter: false, int offset}) {
931 return helper.throwNoSuchMethodError( 931 return helper.throwNoSuchMethodError(
932 plainNameForRead, arguments, offset ?? offsetForToken(this.token), 932 plainNameForRead, arguments, offset ?? offsetForToken(this.token),
933 isGetter: isGetter, isSetter: isSetter); 933 isGetter: isGetter, isSetter: isSetter);
934 } 934 }
935 } 935 }
936 936
937 bool isFieldOrGetter(Member member) { 937 bool isFieldOrGetter(Member member) {
938 return member is Field || (member is Procedure && member.isGetter); 938 return member is Field || (member is Procedure && member.isGetter);
939 } 939 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698