| // Copyright (c) 2015, 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. |
| |
| // Accessing static native methods names: |
| // plain declaration -> use @Native tag as 'scope' for declared name. |
| // identifier @JSName -> use @Native tag as 'scope' for @JSName. |
| // other @JSName -> use @JSName as an expression. |
| |
| import 'native_testing.dart'; |
| import 'dart:_js_helper' show convertDartClosureToJS; |
| |
| typedef int Callback(String s); |
| |
| @Native("CC") // Tag can be different to class name. |
| class AA { |
| // This name is not an identifier, so completely defines how to access method. |
| @JSName('CC.foo') |
| static int foo(String s) native ; |
| |
| // This name is not an identifier, so completely defines how to access method. |
| @JSName('CC.bar') |
| static int bar(Callback c) native ; |
| static int baz(Callback c) { |
| return bar(c); |
| } |
| |
| // Compiler should automatically use the tag and the declared name, i.e. call |
| // `CC.lepton`. |
| static int lepton(Callback c) native ; |
| static int electron(c) => lepton(c); |
| |
| // Compiler should automatically use the tag and JSName, i.e. call |
| // `CC.baryon`. |
| @JSName('baryon') |
| static int _baryon(Callback c) native ; |
| static int proton(c) => _baryon(c); |
| } |
| |
| void setup() native r""" |
| // This code is all inside 'setup' and so not accessible from the global scope. |
| |
| function CC(){} |
| |
| CC.foo = function(s) { return s.length; } |
| CC.bar = function(f) { return f("Bye"); } |
| CC.lepton = function(f) { return f("Lepton"); } |
| CC.baryon = function(f) { return f("three quarks"); } |
| |
| self.CC = CC; |
| """; |
| |
| main() { |
| nativeTesting(); |
| setup(); |
| |
| // TODO(sra): Investigate why this line is necessary to get a correctly |
| // compiled convertDartClosureToJS. Without this line, the compiler crashes. |
| convertDartClosureToJS(main, 1); |
| |
| Expect.equals(5, AA.foo("Hello")); |
| |
| Expect.equals(3, AA.bar((s) => s.length)); |
| Expect.equals(3, AA.baz((s) => s.length)); |
| |
| Expect.equals(6, AA.lepton((s) => s.length)); |
| Expect.equals(6, AA.electron((s) => s.length)); |
| |
| Expect.equals(12, AA._baryon((s) => s.length)); |
| Expect.equals(12, AA.proton((s) => s.length)); |
| Expect.throws(() => AA.baryon((s) => s.length)); // Not defined on AA. |
| } |