Chromium Code Reviews| 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) { |
|
Jennifer Messerly
2011/12/15 01:13:14
what case was this change needed for?
Siggi Cherem (dart-lang)
2011/12/15 04:35:56
As I add support to bind native methods, I tried t
|
| 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... |
|
Jennifer Messerly
2011/12/15 01:13:14
could you just walk the chain of _overriddenFields
Siggi Cherem (dart-lang)
2011/12/15 04:35:56
Currently we don't have a chain (PropertyMember._o
|
| + 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(); |