// 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() { JS('', r""" (function(){ // This code is 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(); Expect.equals(5, AA.foo("Hello")); Expect.equals(3, AA.bar((String s) => s.length)); Expect.equals(3, AA.baz((String s) => s.length)); Expect.equals(6, AA.lepton((String s) => s.length)); Expect.equals(6, AA.electron((String s) => s.length)); Expect.equals(12, AA._baryon((String s) => s.length)); Expect.equals(12, AA.proton((String s) => s.length)); }