| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |