// 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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(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);
}
