// Copyright (c) 2019, 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.

// @dart = 2.7

class A {}

class B {}

class C {}

class D {}

class E {}

/*member: Class1.:static=[Object.(0)]*/
class Class1 {
  /*member: Class1.field1:
   static=[
    Rti._bind(1),
    Rti._eval(1),
    _arrayInstanceType(1),
    _asBool(1),
    _asBoolQ(1),
    _asBoolS(1),
    _asDouble(1),
    _asDoubleQ(1),
    _asDoubleS(1),
    _asInt(1),
    _asIntQ(1),
    _asIntS(1),
    _asNum(1),
    _asNumQ(1),
    _asNumS(1),
    _asObject(1),
    _asString(1),
    _asStringQ(1),
    _asStringS(1),
    _asTop(1),
    _generalAsCheckImplementation(1),
    _generalIsTestImplementation(1),
    _installSpecializedIsTest(1),
    _instanceType(1),
    _isBool(1),
    _isInt(1),
    _isNum(1),
    _isObject(1),
    _isString(1),
    _isTop(1),
    findType(1),
    instanceType(1)],
   type=[
    inst:Closure,
    inst:JSBool,
    inst:JSNull,
    param:A]
  */
  A field1;
}

/*member: method1:
 dynamic=[Class1.field1=],
 static=[
  Rti._bind(1),
  Rti._eval(1),
  _arrayInstanceType(1),
  _asBool(1),
  _asBoolQ(1),
  _asBoolS(1),
  _asDouble(1),
  _asDoubleQ(1),
  _asDoubleS(1),
  _asInt(1),
  _asIntQ(1),
  _asIntS(1),
  _asNum(1),
  _asNumQ(1),
  _asNumS(1),
  _asObject(1),
  _asString(1),
  _asStringQ(1),
  _asStringS(1),
  _asTop(1),
  _generalAsCheckImplementation(1),
  _generalIsTestImplementation(1),
  _installSpecializedIsTest(1),
  _instanceType(1),
  _isBool(1),
  _isInt(1),
  _isNum(1),
  _isObject(1),
  _isString(1),
  _isTop(1),
  findType(1),
  instanceType(1)],
 type=[
  impl:A,
  inst:Closure,
  inst:JSBool,
  is:Class1]
*/
method1(dynamic o, dynamic value) {
  if (o is! Class1) return;
  o.field1 = value;
}

/*member: Class2.:static=[Object.(0)]*/
class Class2<T> {
  /*member: Class2.field2:
   static=*,
   type=[inst:*,param:Class2.T]
   */
  T field2;
}

/*member: method2:
 dynamic=[Class2.field2=],
 static=*,
 type=[
  impl:A,
  inst:*,
  is:Class2<A>]
*/
method2(dynamic o, dynamic value) {
  if (o is! Class2<A>) return;
  o.field2 = value;
}

/*member: Class3.:static=[Object.(0)]*/
class Class3 {
  /*member: Class3.method3:
   static=[
    Rti._bind(1),
    Rti._eval(1),
    _arrayInstanceType(1),
    _asBool(1),
    _asBoolQ(1),
    _asBoolS(1),
    _asDouble(1),
    _asDoubleQ(1),
    _asDoubleS(1),
    _asInt(1),
    _asIntQ(1),
    _asIntS(1),
    _asNum(1),
    _asNumQ(1),
    _asNumS(1),
    _asObject(1),
    _asString(1),
    _asStringQ(1),
    _asStringS(1),
    _asTop(1),
    _generalAsCheckImplementation(1),
    _generalIsTestImplementation(1),
    _installSpecializedIsTest(1),
    _instanceType(1),
    _isBool(1),
    _isInt(1),
    _isNum(1),
    _isObject(1),
    _isString(1),
    _isTop(1),
    findType(1),
    instanceType(1)],
   type=[
    inst:Closure,
    inst:JSBool,
    inst:JSNull,
    param:A,
    param:B,
    param:C]
  */
  method3(A a, [B b, C c]) {}
}

/*member: method3:
 dynamic=[Class3.method3(3)],
 static=[
  Rti._bind(1),
  Rti._eval(1),
  _arrayInstanceType(1),
  _asBool(1),
  _asBoolQ(1),
  _asBoolS(1),
  _asDouble(1),
  _asDoubleQ(1),
  _asDoubleS(1),
  _asInt(1),
  _asIntQ(1),
  _asIntS(1),
  _asNum(1),
  _asNumQ(1),
  _asNumS(1),
  _asObject(1),
  _asString(1),
  _asStringQ(1),
  _asStringS(1),
  _asTop(1),
  _generalAsCheckImplementation(1),
  _generalIsTestImplementation(1),
  _installSpecializedIsTest(1),
  _instanceType(1),
  _isBool(1),
  _isInt(1),
  _isNum(1),
  _isObject(1),
  _isString(1),
  _isTop(1),
  findType(1),
  instanceType(1)],
 type=[
  impl:A,
  impl:C,
  inst:Closure,
  inst:JSBool,
  is:Class3,
  param:B]
*/
method3(dynamic o, dynamic a, B b, dynamic c) {
  if (o is! Class3) return;
  o.method3(a, b, c);
}

/*member: Class4.:static=[Object.(0)]*/
class Class4 {
  /*member: Class4.method4:
   static=[
    Rti._bind(1),
    Rti._eval(1),
    _arrayInstanceType(1),
    _asBool(1),
    _asBoolQ(1),
    _asBoolS(1),
    _asDouble(1),
    _asDoubleQ(1),
    _asDoubleS(1),
    _asInt(1),
    _asIntQ(1),
    _asIntS(1),
    _asNum(1),
    _asNumQ(1),
    _asNumS(1),
    _asObject(1),
    _asString(1),
    _asStringQ(1),
    _asStringS(1),
    _asTop(1),
    _generalAsCheckImplementation(1),
    _generalIsTestImplementation(1),
    _installSpecializedIsTest(1),
    _instanceType(1),
    _isBool(1),
    _isInt(1),
    _isNum(1),
    _isObject(1),
    _isString(1),
    _isTop(1),
    findType(1),
    instanceType(1)],
   type=[
    inst:Closure,
    inst:JSBool,
    inst:JSNull,
    param:A,
    param:B,
    param:C]
  */
  method4(A a, {B b, C c}) {}
}

/*member: method4:
 dynamic=[Class4.method4(1,b,c)],
 static=[
  Rti._bind(1),
  Rti._eval(1),
  _arrayInstanceType(1),
  _asBool(1),
  _asBoolQ(1),
  _asBoolS(1),
  _asDouble(1),
  _asDoubleQ(1),
  _asDoubleS(1),
  _asInt(1),
  _asIntQ(1),
  _asIntS(1),
  _asNum(1),
  _asNumQ(1),
  _asNumS(1),
  _asObject(1),
  _asString(1),
  _asStringQ(1),
  _asStringS(1),
  _asTop(1),
  _generalAsCheckImplementation(1),
  _generalIsTestImplementation(1),
  _installSpecializedIsTest(1),
  _instanceType(1),
  _isBool(1),
  _isInt(1),
  _isNum(1),
  _isObject(1),
  _isString(1),
  _isTop(1),
  findType(1),
  instanceType(1)],
 type=[
  impl:A,
  impl:C,
  inst:Closure,
  inst:JSBool,
  is:Class4,
  param:B]
*/
method4(dynamic o, dynamic a, B b, dynamic c) {
  if (o is! Class4) return;
  o.method4(a, c: c, b: b);
}

/*member: Class5.:static=[Object.(0)]*/
class Class5<T1, T2> {
  /*member: Class5.method5:
   static=*,
   type=[
    inst:*,
    param:C,
    param:Class5.T1,
    param:Class5.T2,
    param:Object,
    param:method5.S1,
    param:method5.S2]
  */
  method5<S1, S2>(T1 a, [T2 b, C c, S1 d, S2 e]) {}
}

/*member: method5:
 dynamic=[Class5.method5<D,E>(5)],
 static=*,
 type=[
  impl:A,
  impl:D,
  inst:*,
  is:Class5<A,B>,
  param:B,
  param:C,
  param:E]
*/
method5(dynamic o, dynamic a, B b, C c, dynamic d, E e) {
  if (o is! Class5<A, B>) return;
  o.method5<D, E>(a, b, c, d, e);
}

/*member: Class6.:static=[Object.(0)]*/
class Class6<T1, T2> {
  /*member: Class6.method6:
   static=*,
   type=[
    inst:*,
    param:C,
    param:Class6.T1,
    param:Class6.T2,
    param:Object,
    param:method6.S1,
    param:method6.S2]
  */
  method6<S1, S2>(T1 a, {T2 b, C c, S1 d, S2 e}) {}
}

/*member: method6:
 dynamic=[Class6.method6<D,E>(1,b,c,d,e)],
 static=*,
 type=[
  impl:A,
  impl:D,
  inst:*,
  is:Class6<A,B>,
  param:B,
  param:C,
  param:E]
*/
method6(dynamic o, dynamic a, B b, C c, dynamic d, E e) {
  if (o is! Class6<A, B>) return;
  o.method6<D, E>(a, d: d, b: b, e: e, c: c);
}

/*member: Class7.:static=[Object.(0)]*/
class Class7 {
  /*member: Class7.f:type=[inst:JSNull]*/
  A Function(A) get f => null;
}

/*member: method7:
 dynamic=[
  Class7.f(1),
  call(1)],
 static=[
  Rti._bind(1),
  Rti._eval(1),
  _arrayInstanceType(1),
  _asBool(1),
  _asBoolQ(1),
  _asBoolS(1),
  _asDouble(1),
  _asDoubleQ(1),
  _asDoubleS(1),
  _asInt(1),
  _asIntQ(1),
  _asIntS(1),
  _asNum(1),
  _asNumQ(1),
  _asNumS(1),
  _asObject(1),
  _asString(1),
  _asStringQ(1),
  _asStringS(1),
  _asTop(1),
  _generalAsCheckImplementation(1),
  _generalIsTestImplementation(1),
  _installSpecializedIsTest(1),
  _instanceType(1),
  _isBool(1),
  _isInt(1),
  _isNum(1),
  _isObject(1),
  _isString(1),
  _isTop(1),
  findType(1),
  instanceType(1)],
 type=[
  impl:A,
  inst:Closure,
  inst:JSBool,
  is:Class7]
*/
method7(dynamic o, dynamic a) {
  if (o is! Class7) return;
  o.f(a);
}

/*member: F.:static=[Object.(0)]*/
class F<T> {
  /*member: F.method:static=*,type=[inst:*,param:List<F.T>]*/
  T method(List<T> list) => null;

  /*member: F.field:static=*,type=[inst:*,param:F.T]*/
  T field;
}

/*member: G.:static=[F.(0)]*/
class G extends F<int> {}

/*member: method8:
 dynamic=[G.method(1)],
 static=*,
 type=[impl:List<int>,inst:*,is:G,param:Iterable<int>]
*/
method8(dynamic g, Iterable<int> iterable) {
  if (g is! G) return null;
  return g.method(iterable);
}

/*member: method9:
 dynamic=[G.field=],
 static=[
  Rti._bind(1),
  Rti._eval(1),
  _arrayInstanceType(1),
  _asBool(1),
  _asBoolQ(1),
  _asBoolS(1),
  _asDouble(1),
  _asDoubleQ(1),
  _asDoubleS(1),
  _asInt(1),
  _asIntQ(1),
  _asIntS(1),
  _asNum(1),
  _asNumQ(1),
  _asNumS(1),
  _asObject(1),
  _asString(1),
  _asStringQ(1),
  _asStringS(1),
  _asTop(1),
  _generalAsCheckImplementation(1),
  _generalIsTestImplementation(1),
  _installSpecializedIsTest(1),
  _instanceType(1),
  _isBool(1),
  _isInt(1),
  _isNum(1),
  _isObject(1),
  _isString(1),
  _isTop(1),
  findType(1),
  instanceType(1)],
 type=[
  impl:int,
  inst:Closure,
  inst:JSBool,
  inst:JSNull,
  is:G,
  param:num]
*/
method9(dynamic g, num value) {
  if (g is! G) return null;
  return g.field = value;
}

/*member: main:**/
main() {
  method1(new Class1(), null);
  method2(new Class2<A>(), null);
  method3(new Class3(), null, null, null);
  method4(new Class4(), null, null, null);
  method5(new Class5<A, B>(), null, null, null, null, null);
  method6(new Class6<A, B>(), null, null, null, null, null);
  method7(new Class7(), null);
  method8(new G(), null);
  method9(new G(), null);
}
