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

Side by Side Diff: frog/member.dart

Issue 8483005: better property overriding field (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 9 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « frog/frogsh ('k') | tests/language/language.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 formal parameter to a [Method]. */ 5 /** A formal parameter to a [Method]. */
6 class Parameter { 6 class Parameter {
7 FormalNode definition; 7 FormalNode definition;
8 8
9 String name; 9 String name;
10 Type type; 10 Type type;
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 var lhs = get_(context, node, target, isDynamic); 371 var lhs = get_(context, node, target, isDynamic);
372 value = value.convertTo(context, type, node, isDynamic); 372 value = value.convertTo(context, type, node, isDynamic);
373 return new Value(type, '${lhs.code} = ${value.code}'); 373 return new Value(type, '${lhs.code} = ${value.code}');
374 } 374 }
375 } 375 }
376 376
377 class PropertyMember extends Member { 377 class PropertyMember extends Member {
378 MethodMember getter; 378 MethodMember getter;
379 MethodMember setter; 379 MethodMember setter;
380 380
381 Member _overriddenField;
382
381 bool _provideFieldSyntax = false; 383 bool _provideFieldSyntax = false;
382 384
383 // TODO(jimhug): What is the right span for this beast? 385 // TODO(jimhug): What is the right span for this beast?
384 SourceSpan get span() => getter != null ? getter.span : null; 386 SourceSpan get span() => getter != null ? getter.span : null;
385 387
386 bool get canGet() => getter != null; 388 bool get canGet() => getter != null;
387 bool get canSet() => setter != null; 389 bool get canSet() => setter != null;
388 390
389 bool get prefersPropertySyntax() => true; 391 bool get prefersPropertySyntax() => true;
390 bool get requiresFieldSyntax() => false; 392 bool get requiresFieldSyntax() => false;
(...skipping 13 matching lines...) Expand all
404 PropertyMember(String name, Type declaringType): super(name, declaringType); 406 PropertyMember(String name, Type declaringType): super(name, declaringType);
405 407
406 bool override(Member other) { 408 bool override(Member other) {
407 if (!super.override(other)) return false; 409 if (!super.override(other)) return false;
408 410
409 // properties can override other properties and fields 411 // properties can override other properties and fields
410 if (other.isProperty || other.isField) { 412 if (other.isProperty || other.isField) {
411 // TODO(jimhug): 413 // TODO(jimhug):
412 // other.returnType.ensureAssignableFrom(returnType, null, true); 414 // other.returnType.ensureAssignableFrom(returnType, null, true);
413 if (other.isProperty) addFromParent(other); 415 if (other.isProperty) addFromParent(other);
416 else _overriddenField = other;
414 return true; 417 return true;
415 } else { 418 } else {
416 world.error('property can only override field or property', 419 world.error('property can only override field or property',
417 span, other.span); 420 span, other.span);
418 return false; 421 return false;
419 } 422 }
420 } 423 }
421 424
422 Value get_(MethodGenerator context, Node node, Value target, 425 Value get_(MethodGenerator context, Node node, Value target,
423 [bool isDynamic=false]) { 426 [bool isDynamic=false]) {
424 if (getter == null) { 427 if (getter == null) {
428 if (_overriddenField != null) {
429 return _overriddenField.get_(context, node, target, isDynamic);
430 }
425 return target.invokeNoSuchMethod(context, 'get:$name', node); 431 return target.invokeNoSuchMethod(context, 'get:$name', node);
426 } 432 }
427 return getter.invoke(context, node, target, Arguments.EMPTY); 433 return getter.invoke(context, node, target, Arguments.EMPTY);
428 } 434 }
429 435
430 Value set_(MethodGenerator context, Node node, Value target, Value value, 436 Value set_(MethodGenerator context, Node node, Value target, Value value,
431 [bool isDynamic=false]) { 437 [bool isDynamic=false]) {
438 if (setter == null) {
439 if (_overriddenField != null) {
440 return _overriddenField.set_(context, node, target, value, isDynamic);
441 }
442 return target.invokeNoSuchMethod(context, 'set:$name', node,
443 new Arguments(null, [value]));
444 }
432 return setter.invoke(context, node, target, new Arguments(null, [value]), 445 return setter.invoke(context, node, target, new Arguments(null, [value]),
433 isDynamic); 446 isDynamic);
434 } 447 }
435 448
436 addFromParent(Member parentMember) { 449 addFromParent(Member parentMember) {
437 // TODO(jimhug): Egregious Hack! 450 // TODO(jimhug): Egregious Hack!
438 if (parentMember is ConcreteMember) { 451 if (parentMember is ConcreteMember) {
439 parentMember = parentMember.baseMember; 452 parentMember = parentMember.baseMember;
440 } 453 }
441 454
(...skipping 1067 matching lines...) Expand 10 before | Expand all | Expand 10 after
1509 } 1522 }
1510 1523
1511 void forEach(void f(Member member)) { 1524 void forEach(void f(Member member)) {
1512 factories.forEach((_, Map constructors) { 1525 factories.forEach((_, Map constructors) {
1513 constructors.forEach((_, Member member) { 1526 constructors.forEach((_, Member member) {
1514 f(member); 1527 f(member);
1515 }); 1528 });
1516 }); 1529 });
1517 } 1530 }
1518 } 1531 }
OLDNEW
« no previous file with comments | « frog/frogsh ('k') | tests/language/language.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698