| Index: frog/member.dart
|
| diff --git a/frog/member.dart b/frog/member.dart
|
| index d6b1b7d9a64837683e7cf7d27efc0ca4e58f1fd1..2a513e69e0afffef1d4b693c99e165c6093f8db6 100644
|
| --- a/frog/member.dart
|
| +++ b/frog/member.dart
|
| @@ -33,7 +33,8 @@ class Parameter {
|
| if (method.name == ':call') {
|
| // TODO(jimhug): Need simpler way to detect "true" function types vs.
|
| // regular methods being used as function types for closures.
|
| - if (method.definition.body == null) {
|
| + // TODO(sigmund): Disallow non-null default values for native calls?
|
| + if (method.definition.body == null && !method.isNative) {
|
| world.error('default value not allowed on function type',
|
| definition.span);
|
| }
|
| @@ -115,7 +116,7 @@ class Member extends Element {
|
| bool get isOperator() => name.startsWith(':');
|
| bool get isCallMethod() => name == ':call';
|
|
|
| - bool get prefersPropertySyntax() => true;
|
| + bool get requiresPropertySyntax() => false;
|
| bool get requiresFieldSyntax() => false;
|
|
|
| bool get isNative() => false;
|
| @@ -296,9 +297,6 @@ class FieldMember extends Member {
|
| }
|
| }
|
|
|
| - bool get prefersPropertySyntax() => false;
|
| - bool get requiresFieldSyntax() => isNative;
|
| -
|
| void provideFieldSyntax() {} // Nothing to do.
|
| void providePropertySyntax() { _providePropertySyntax = true; }
|
|
|
| @@ -462,11 +460,19 @@ class PropertyMember extends Member {
|
| bool get canGet() => getter != null;
|
| bool get canSet() => setter != null;
|
|
|
| - bool get prefersPropertySyntax() => true;
|
| - bool get requiresFieldSyntax() => false;
|
| + // If the property is just a declaration in an interface, continue to allow
|
| + // field syntax in the generated code.
|
| + bool get requiresPropertySyntax() => declaringType.isClass;
|
|
|
| void provideFieldSyntax() { _provideFieldSyntax = true; }
|
| - void providePropertySyntax() {}// Nothing to do.
|
| + void providePropertySyntax() {
|
| + // when overriding native fields, we still provide a field syntax to ensure
|
| + // that native functions will find the appropriate property implementation.
|
| + // TODO(sigmund): should check for this transitively...
|
| + if (_overriddenField != null && _overriddenField.isNative) {
|
| + provideFieldSyntax();
|
| + }
|
| + }
|
|
|
| // TODO(jimhug): Union of getter and setters sucks!
|
| bool get isStatic() => getter == null ? setter.isStatic : getter.isStatic;
|
| @@ -608,7 +614,7 @@ class ConcreteMember extends Member {
|
| bool get isMethod() => baseMember.isMethod;
|
| bool get isProperty() => baseMember.isProperty;
|
|
|
| - bool get prefersPropertySyntax() => baseMember.prefersPropertySyntax;
|
| + bool get requiresPropertySyntax() => baseMember.requiresPropertySyntax;
|
| bool get requiresFieldSyntax() => baseMember.requiresFieldSyntax;
|
|
|
| void provideFieldSyntax() => baseMember.provideFieldSyntax();
|
| @@ -710,9 +716,11 @@ class MethodMember extends Member {
|
|
|
| bool get isNative() => definition.nativeBody != null;
|
|
|
| - bool get canGet() => false; // TODO(jimhug): get bound method support.
|
| + bool get canGet() => true;
|
| bool get canSet() => false;
|
|
|
| + bool get requiresPropertySyntax() => true;
|
| +
|
| SourceSpan get span() => definition == null ? null : definition.span;
|
|
|
| String get constructorName() {
|
| @@ -789,9 +797,6 @@ class MethodMember extends Member {
|
| return -1;
|
| }
|
|
|
| - bool get prefersPropertySyntax() => true;
|
| - bool get requiresFieldSyntax() => false;
|
| -
|
| void provideFieldSyntax() { _provideFieldSyntax = true; }
|
| void providePropertySyntax() { _providePropertySyntax = true; }
|
|
|
| @@ -1485,16 +1490,9 @@ class MemberSet {
|
| if (_treatAsField == null) {
|
| // If this is the global MemberSet from world, always bind dynamically.
|
| // Note: we need this for proper noSuchMethod and REPL behavior.
|
| - _treatAsField = !isVar;
|
| - for (var member in members) {
|
| - if (member.requiresFieldSyntax) {
|
| - _treatAsField = true;
|
| - break;
|
| - }
|
| - if (member.prefersPropertySyntax) {
|
| - _treatAsField = false;
|
| - }
|
| - }
|
| + _treatAsField = !isVar && (members.some((m) => m.requiresFieldSyntax)
|
| + || members.every((m) => !m.requiresPropertySyntax));
|
| +
|
| for (var member in members) {
|
| if (_treatAsField) {
|
| member.provideFieldSyntax();
|
|
|