goog.module('jsfunction.Main$impl');

const j_l_Object = goog.require('java.lang.Object$impl');
const $Util = goog.require('nativebootstrap.Util$impl');

let Class = goog.forwardDeclare('java.lang.Class$impl');
let Double = goog.forwardDeclare('java.lang.Double$impl');
let Integer = goog.forwardDeclare('java.lang.Integer$impl');
let Number = goog.forwardDeclare('java.lang.Number$impl');
let j_l_String = goog.forwardDeclare('java.lang.String$impl');
let ArrayList = goog.forwardDeclare('java.util.ArrayList$impl');
let List = goog.forwardDeclare('java.util.List$impl');
let ClassWithJsFunctionProperty = goog.forwardDeclare('jsfunction.Main.ClassWithJsFunctionProperty$impl');
let DoubleDoubleJsBiFunction = goog.forwardDeclare('jsfunction.Main.DoubleDoubleJsBiFunction$impl');
let JsFunctionImplementation = goog.forwardDeclare('jsfunction.Main.JsFunctionImplementation$impl');
let TIntegerJsBiFunction = goog.forwardDeclare('jsfunction.Main.TIntegerJsBiFunction$impl');
let $Equality = goog.forwardDeclare('nativebootstrap.Equality$impl');
let $Arrays = goog.forwardDeclare('vmbootstrap.Arrays$impl');
let $Casts = goog.forwardDeclare('vmbootstrap.Casts$impl');
let $JavaScriptFunction = goog.forwardDeclare('vmbootstrap.JavaScriptFunction$impl');
let $Primitives = goog.forwardDeclare('vmbootstrap.Primitives$impl');
let $$int = goog.forwardDeclare('vmbootstrap.primitives.$int$impl');

class Main extends j_l_Object {
 /** @protected @nodts */
 constructor() {
  super();
  /**@type {?function(?):void} @nodts*/
  this.f_jsFunctionFieldWildcard__jsfunction_Main;
  /**@type {?function(?string):void} @nodts*/
  this.f_jsFunctionFieldParameterized__jsfunction_Main;
 }
 /** @nodts @return {!Main} */
 static $create__() {
  Main.$clinit();
  let $instance = new Main();
  $instance.$ctor__jsfunction_Main__void();
  return $instance;
 }
 /** @nodts */
 $ctor__jsfunction_Main__void() {
  this.$ctor__java_lang_Object__void();
  this.$init__void_$p_jsfunction_Main();
 }
 /** @return {?function(number):number} */
 static createNativeFunction() {
  Main.$clinit();
  return null;
 }
 /** @nodts @return {number} */
 static m_callFn__jsfunction_Main_JsFunctionInterface__int__int(/** ?function(number):number */ fn, /** number */ a) {
  Main.$clinit();
  return fn(a);
 }
 /** @nodts */
 m_testJsFunction__void() {
  let func = /**@type {JsFunctionImplementation}*/ (JsFunctionImplementation.$create__());
  (/**@type {function(number):number}*/ (func))(10);
  Main.m_callFn__jsfunction_Main_JsFunctionInterface__int__int(Main.createNativeFunction(), 10);
  let a = func.f_field__jsfunction_Main_JsFunctionImplementation;
  JsFunctionImplementation.m_bar__jsfunction_Main_JsFunctionImplementation__int(func);
 }
 /** @nodts */
 m_testJsFunctionsCapturingLocal__void() {
  let n = 4;
  Main.m_callFn__jsfunction_Main_JsFunctionInterface__int__int(/**  @return {number}*/ ((/** number */ number_1) =>{
   return number_1 + n | 0;
  }), n);
  Main.m_callFn__jsfunction_Main_JsFunctionInterface__int__int(/**  @return {number}*/ ((/** number */ a) =>{
   return a + n | 0;
  }), n);
  (/**  @return {number}*/ ((/** number */ a_1) =>{
   this.m_instanceMethod__void_$p_jsfunction_Main();
   return 0;
  }))(3);
 }
 /** @nodts */
 m_testJsFunctionThis__void() {
  (/**  @return {number}*/ ((/** number */ a) =>{
   this.m_instanceMethod__void_$p_jsfunction_Main();
   return 0;
  }))(3);
 }
 /** @nodts */
 m_instanceMethod__void_$p_jsfunction_Main() {}
 /** @nodts */
 m_testJsFunctionErasureCasts__void() {
  let list = /**@type {!ArrayList<?function(?string):?string>}*/ (ArrayList.$create__());
  Main.m_acceptsJsFunction__jsfunction_Main_Function__void(/**@type {?function(?string):?string}*/ ($Casts.$to(list.getAtIndex(0), $JavaScriptFunction)));
 }
 /** @nodts */
 static m_acceptsJsFunction__jsfunction_Main_Function__void(/** ?function(?string):?string */ f) {
  Main.$clinit();
 }
 /** @nodts @return {?function(number, ...number):number} */
 m_testJsFunctionVarargs__jsfunction_Main_JsFunctionVarargs_$pp_jsfunction() {
  let f = /**  @return {number}*/ ((/** number */ i, .../** ...number */ numbers) =>{
   $Arrays.$stampType(numbers, $$int);
   let sum = i;
   for (let $array = numbers, $index = 0; $index < $array.length; $index++) {
    let number_1 = $array[$index];
    {
     sum = sum + number_1 | 0;
    }
   }
   return sum;
  });
  return f;
 }
 /** @nodts @return {?function(number, ...number):number} */
 m_testJsFunctionVarargsInnerClass__jsfunction_Main_JsFunctionVarargs_$pp_jsfunction() {
  return /**  @return {number}*/ ((/** number */ i, .../** ...number */ numbers) =>{
   $Arrays.$stampType(numbers, $$int);
   let sum = i;
   for (let $array = numbers, $index = 0; $index < $array.length; $index++) {
    let number_1 = $array[$index];
    {
     sum = sum + number_1 | 0;
    }
   }
   return sum;
  });
 }
 /** @nodts */
 m_testVarArgsMethodReferenceToJsFuncion__void() {
  let c = /**  @return {*}*/ ((/** ?function(...*):* */ arg0, /** number */ arg1, /** Array<?function(...*):*> */ arg2) =>{
   let arg0_1 = /**@type {?function(...*):*}*/ ($Casts.$to(arg0, $JavaScriptFunction));
   let arg2_1 = /**@type {Array<?function(...*):*>}*/ ($Arrays.$castTo(arg2, $JavaScriptFunction, 1));
   return arg0_1(Integer.m_valueOf__int__java_lang_Integer(arg1), arg2_1);
  });
 }
 /** @nodts @template T */
 m_acceptsVarargsJsFunctionWithTypeVariable__jsfunction_Main_JsFunctionVarargsGenerics__void_$pp_jsfunction(/** ?function(number, ...T):number */ x) {}
 /** @nodts @template T */
 m_acceptsVarargsJsFunctionWithParemetrizedType__jsfunction_Main_JsFunctionVarargsGenerics__void_$pp_jsfunction(/** ?function(number, ...List<T>):number */ x) {}
 /** @template T */
 acceptsVarargsJsFunctionWithTypeVariableInVarargs(.../** ...?function(number, ...T):number */ x) {
  $Arrays.$stampType(x, $JavaScriptFunction);
 }
 /** @template T */
 acceptsVarargsJsFunctionWithParemetrizedTypeInVarargs(.../** ...?function(number, ...List<T>):number */ x) {
  $Arrays.$stampType(x, $JavaScriptFunction);
 }
 
 acceptsJsFunctionInVarargs(.../** ...?function():void */ x) {
  $Arrays.$stampType(x, $JavaScriptFunction);
 }
 /** @nodts */
 m_testJsFunctionClassLiterals__void_$pp_jsfunction() {
  let array = /**@type {!Array<?function():void>}*/ ($Arrays.$create([0], $JavaScriptFunction));
  let o = Class.$get($JavaScriptFunction);
  o = Class.$get($JavaScriptFunction, 1);
 }
 /** @nodts */
 m_testJsFunctionOptional__void_$pp_jsfunction() {
  let f = /**  @return {number}*/ ((/** number */ i, /** ?number= */ n) =>{
   return $Primitives.narrowDoubleToInt(i + Double.m_doubleValue__java_lang_Double__double(n));
  });
 }
 
 static set parametricJsFunction(/** ?function(*):void */ fn) {
  Main.$clinit();
 }
 /** @return {?function(*):void} */
 static get parametricJsFunction() {
  Main.$clinit();
  return null;
 }
 /** @nodts */
 m_testFunctionExpressionTypeReplacement__void_$pp_jsfunction() {
  let f = (/** ?string */ unused) =>{
   let unused_1 = /**@type {?string}*/ ($Casts.$to(unused, j_l_String));
   let l = /**@type {!ArrayList<List<?>>}*/ (ArrayList.$create__());
   l.add(/**@type {!ArrayList<?string>}*/ (ArrayList.$create__()));
  };
 }
 /** @nodts */
 m_testJsFunctionPropertyCall__void_$pp_jsfunction() {
  let c = ClassWithJsFunctionProperty.$create__();
  {
   let $function = c.f_function__jsfunction_Main_ClassWithJsFunctionProperty;
   $function('');
  }
  {
   let $function_1 = c.function;
   $function_1('');
  }
  {
   let $function_2 = c.f_function__jsfunction_Main_ClassWithJsFunctionProperty;
   $function_2('');
  }
  {
   let $function_3 = !$Equality.$same(c, null) ? c.f_function__jsfunction_Main_ClassWithJsFunctionProperty : null;
   $function_3('');
  }
 }
 /** @nodts @return {*} */
 static m_callInterfaceRaw__jsfunction_Main_JsBiFunction__java_lang_Object__java_lang_Number__java_lang_Object(/** ?function(?, ?):? */ f, /** * */ o, /** (Number|number) */ n) {
  Main.$clinit();
  return f(o, n);
 }
 /** @nodts @return {?string} */
 static m_callInterfaceParameterized__jsfunction_Main_JsBiFunction__java_lang_String__java_lang_String(/** ?function(?string, Integer):?string */ f, /** ?string */ s) {
  Main.$clinit();
  return /**@type {?string}*/ ($Casts.$to(f(s, Integer.m_valueOf__int__java_lang_Integer(1)), j_l_String));
 }
 /** @nodts @template U, V @return {U} */
 static m_callInterfaceUnparameterized__jsfunction_Main_JsBiFunction__java_lang_Object__java_lang_Number__java_lang_Object(/** ?function(U, V):U */ f, /** U */ u, /** V */ v) {
  Main.$clinit();
  return f(u, v);
 }
 /** @nodts @return {*} */
 static m_callImplementorRaw__jsfunction_Main_TIntegerJsBiFunction__java_lang_Object__java_lang_Integer__java_lang_Object(/** TIntegerJsBiFunction */ f, /** * */ o, /** Integer */ n) {
  Main.$clinit();
  return TIntegerJsBiFunction.m_apply__jsfunction_Main_TIntegerJsBiFunction__java_lang_Object__java_lang_Integer__java_lang_Object(f, o, n);
 }
 /** @nodts @return {?string} */
 static m_callImplementorParameterized__jsfunction_Main_TIntegerJsBiFunction__java_lang_String__java_lang_String(/** TIntegerJsBiFunction<?string> */ f, /** ?string */ s) {
  Main.$clinit();
  return /**@type {?string}*/ ($Casts.$to(TIntegerJsBiFunction.m_apply__jsfunction_Main_TIntegerJsBiFunction__java_lang_Object__java_lang_Integer__java_lang_Object(f, s, Integer.m_valueOf__int__java_lang_Integer(1)), j_l_String));
 }
 /** @nodts */
 static m_testParameterTypes__void() {
  Main.$clinit();
  let /** ?function(?, ?):? */ tIntegerJsBiFunction = /**@type {?function(?, ?):?}*/ (TIntegerJsBiFunction.$create__());
  let /** ?function(?, ?):? */ doubleDoubleJsBiFunction = DoubleDoubleJsBiFunction.$create__();
  Main.m_callInterfaceRaw__jsfunction_Main_JsBiFunction__java_lang_Object__java_lang_Number__java_lang_Object(tIntegerJsBiFunction, 'a', Integer.m_valueOf__int__java_lang_Integer(1));
  Main.m_callInterfaceRaw__jsfunction_Main_JsBiFunction__java_lang_Object__java_lang_Number__java_lang_Object(doubleDoubleJsBiFunction, 1.1, 1.1);
  Main.m_callInterfaceParameterized__jsfunction_Main_JsBiFunction__java_lang_String__java_lang_String(tIntegerJsBiFunction, 'a');
  Main.m_callInterfaceUnparameterized__jsfunction_Main_JsBiFunction__java_lang_Object__java_lang_Number__java_lang_Object(tIntegerJsBiFunction, 'a', Integer.m_valueOf__int__java_lang_Integer(1));
  Main.m_callInterfaceUnparameterized__jsfunction_Main_JsBiFunction__java_lang_Object__java_lang_Number__java_lang_Object(doubleDoubleJsBiFunction, 1.1, 1.1);
  Main.m_callImplementorRaw__jsfunction_Main_TIntegerJsBiFunction__java_lang_Object__java_lang_Integer__java_lang_Object(/**@type {!TIntegerJsBiFunction<?number>}*/ (TIntegerJsBiFunction.$create__()), 1.1, Integer.m_valueOf__int__java_lang_Integer(1));
  Main.m_callImplementorParameterized__jsfunction_Main_TIntegerJsBiFunction__java_lang_String__java_lang_String(/**@type {!TIntegerJsBiFunction<?string>}*/ (TIntegerJsBiFunction.$create__()), '');
  tIntegerJsBiFunction('a', Integer.m_valueOf__int__java_lang_Integer(1));
  doubleDoubleJsBiFunction(1.1, 1.1);
  Main.callOnFunction(DoubleDoubleJsBiFunction.$create__());
 }
 /** @return {number} */
 static callOnFunction(/** ?function(?number, ?number):?number */ f) {
  Main.$clinit();
  return 0;
 }
 /** @nodts */
 static m_testCast__void() {
  Main.$clinit();
  let o = /**@type {!TIntegerJsBiFunction<?string>}*/ (TIntegerJsBiFunction.$create__());
  let /** TIntegerJsBiFunction */ rawTIntegerJsBiFunction = /**@type {TIntegerJsBiFunction}*/ ($Casts.$to(o, TIntegerJsBiFunction));
  let parameterizedTIntegerJsBiFunction = /**@type {TIntegerJsBiFunction<?string>}*/ ($Casts.$to(o, TIntegerJsBiFunction));
  let /** ?function(?, ?):? */ anotherRawJsBiFunction = /**@type {?function(?, ?):?}*/ ($Casts.$to(o, $JavaScriptFunction));
  let anotherParameterizedJsBiFunction = /**@type {?function(?string, Integer):?string}*/ ($Casts.$to(o, $JavaScriptFunction));
  let doubleDoubleJsBiFunction = /**@type {DoubleDoubleJsBiFunction}*/ ($Casts.$to(o, DoubleDoubleJsBiFunction));
 }
 /** @nodts */
 static m_testNewInstance__void() {
  Main.$clinit();
  let /** TIntegerJsBiFunction */ rawTIntegerJsBiFunction = /**@type {TIntegerJsBiFunction}*/ (TIntegerJsBiFunction.$create__());
  let parameterizedTIntegerJsBiFunction = /**@type {!TIntegerJsBiFunction}*/ (TIntegerJsBiFunction.$create__());
  let /** ?function(?, ?):? */ rawJsBiFunction = DoubleDoubleJsBiFunction.$create__();
 }
 /** @private @nodts */
 $init__void_$p_jsfunction_Main() {
  this.f_jsFunctionFieldWildcard__jsfunction_Main = (/** ? */ event) =>{};
  this.f_jsFunctionFieldParameterized__jsfunction_Main = (/** ?string */ event_1) =>{
   let event_2 = /**@type {?string}*/ ($Casts.$to(event_1, j_l_String));
  };
 }
 /** @nodts */
 static $clinit() {
  Main.$clinit = () =>{};
  Main.$loadModules();
  j_l_Object.$clinit();
 }
 /** @nodts @return {boolean} */
 static $isInstance(/** ? */ instance) {
  return instance instanceof Main;
 }
 
 /** @nodts */
 static $loadModules() {
  Class = goog.module.get('java.lang.Class$impl');
  Double = goog.module.get('java.lang.Double$impl');
  Integer = goog.module.get('java.lang.Integer$impl');
  j_l_String = goog.module.get('java.lang.String$impl');
  ArrayList = goog.module.get('java.util.ArrayList$impl');
  ClassWithJsFunctionProperty = goog.module.get('jsfunction.Main.ClassWithJsFunctionProperty$impl');
  DoubleDoubleJsBiFunction = goog.module.get('jsfunction.Main.DoubleDoubleJsBiFunction$impl');
  JsFunctionImplementation = goog.module.get('jsfunction.Main.JsFunctionImplementation$impl');
  TIntegerJsBiFunction = goog.module.get('jsfunction.Main.TIntegerJsBiFunction$impl');
  $Equality = goog.module.get('nativebootstrap.Equality$impl');
  $Arrays = goog.module.get('vmbootstrap.Arrays$impl');
  $Casts = goog.module.get('vmbootstrap.Casts$impl');
  $JavaScriptFunction = goog.module.get('vmbootstrap.JavaScriptFunction$impl');
  $Primitives = goog.module.get('vmbootstrap.Primitives$impl');
  $$int = goog.module.get('vmbootstrap.primitives.$int$impl');
 }
}
$Util.$setClassMetadata(Main, 'jsfunction.Main');

/* NATIVE.JS EPILOG */

const jsfunction_Main = Main;

// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * @return {function(number):number}
 * @public
 */
Main.createNativeFunction = function() {
  return function(a) {
    return a;
  };
};

/**
 * @param {function(?number, ?number):?number} fn
 * @return {?number}
 * @public
 */
Main.callOnFunction = function(fn) {
  return fn(1.1, 1.1);
};


exports = Main;

//# sourceMappingURL=Main.js.map
