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

Unified Diff: frog/member.dart

Issue 8914024: frog: better binding of methods. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: '' Created 9 years 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 side-by-side diff with in-line comments
Download patch
« frog/gen.dart ('K') | « frog/lib/corelib_impl.dart ('k') | frog/minfrog » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« frog/gen.dart ('K') | « frog/lib/corelib_impl.dart ('k') | frog/minfrog » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698