Index: frog/tests/frog_native/native_field_rename_1_frog_test.dart |
diff --git a/frog/tests/frog_native/native_field_rename_1_frog_test.dart b/frog/tests/frog_native/native_field_rename_1_frog_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..112854f27085cba0cd73c09544031f501e9f7f8b |
--- /dev/null |
+++ b/frog/tests/frog_native/native_field_rename_1_frog_test.dart |
@@ -0,0 +1,79 @@ |
+// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+// A native method prevents other members from having that name, including |
+// fields. However, native fields keep their name. The implication: a getter |
+// for the field must be based on the field's name, not the field's jsname. |
+ |
+class A native "*A" { |
+ int key; // jsname is 'key' |
+ int getKey() => key; |
+} |
+ |
+class B { |
+ int key; // jsname is not 'key' |
+ B([this.key = 222]); |
+ int getKey() => key; |
+} |
+ |
+class X native "*X" { |
+ int native_key_method() native 'key'; |
+ // This should cause B.key to be renamed, but not A.key. |
+ |
+ int key() native 'key'; |
+} |
+ |
+A makeA() native; |
+X makeX() native; |
+ |
+ |
+void setup() native """ |
+// This code is all inside 'setup' and so not accesible from the global scope. |
+function A(){ this.key = 111; } |
+A.prototype.getKey = function(){return this.key;}; |
+ |
+function X(){} |
+X.prototype.key = function(){return 666;}; |
+ |
+makeA = function(){return new A}; |
+makeX = function(){return new X}; |
+"""; |
+ |
+testDynamic() { |
+ var things = [makeA(), new B(), makeX()]; |
+ var a = things[0]; |
+ var b = things[1]; |
+ var x = things[2]; |
+ |
+ Expect.equals(111, a.key); |
+ Expect.equals(222, b.key); |
+ Expect.equals(111, a.getKey()); |
+ Expect.equals(222, b.getKey()); |
+ |
+ |
+ Expect.equals(666, x.native_key_method()); |
+ Expect.equals(666, x.key()); |
+ // The getter for the closurized member must also have the right name. |
+ var fn = x.key; |
+ Expect.equals(666, fn()); |
+} |
+ |
+testTyped() { |
+ A a = makeA(); |
+ B b = new B(); |
+ X x = makeX(); |
+ |
+ Expect.equals(666, x.native_key_method()); |
+ Expect.equals(111, a.key); |
+ Expect.equals(222, b.key); |
+ Expect.equals(111, a.getKey()); |
+ Expect.equals(222, b.getKey()); |
+} |
+ |
+main() { |
+ setup(); |
+ |
+ testTyped(); |
+ testDynamic(); |
+} |