// 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.

/*member: main:calls=*,params=0*/
main() {
  method1(new Class1a()..field1);
  method2(new Class2a<int>()..field2);
  method3(new Class3a()..field3);
  method3(new Class3b()..field3);
  method4(new Class4a()..field4);
  method4(new Class4b()..field4);
}

class Class1a {
  /*member: Class1a.field1:emitted*/
  int? field1;
}

/*member: method1:assign=[field1],params=1*/
@pragma('dart2js:noInline')
method1(dynamic c) {
  c.field1 = 42;
}

class Class2a<T> {
  /*spec.member: Class2a.field2:
   checked,
   emitted
  */
  /*prod.member: Class2a.field2:emitted*/
  T? field2;
}

@pragma('dart2js:noInline')
/*spec.member: method2:
 calls=[set$field2(1)],
 params=1
*/
/*prod.member: method2:
 assign=[field2],
 params=1
*/
method2(dynamic c) {
  c.field2 = 42;
}

class Class3a {
  /*spec.member: Class3a.field3:
   checked,
   emitted
  */
  /*prod.member: Class3a.field3:
   emitted,
   set=simple
  */
  int? field3;
}

class Class3b {
  /*spec.member: Class3b.field3:
   checked,
   emitted
  */
  /*prod.member: Class3b.field3:
   emitted,
   set=simple
  */
  int? field3;
}

/*member: method3:calls=[set$field3(1)],params=1*/
@pragma('dart2js:noInline')
method3(dynamic c) {
  c.field3 = 42;
}

class Class4a {
  /*spec.member: Class4a.field4:
   checked,
   emitted
  */
  /*prod.member: Class4a.field4:
   emitted,
   set=simple
  */
  int? field4;
}

class Class4b implements Class4a {
  @override
  /*spec.member: Class4b.field4:
   checked,
   emitted
  */
  /*prod.member: Class4b.field4:
   emitted,
   set=simple
  */
  int? field4;
}

/*member: method4:calls=[set$field4(1)],params=1*/
@pragma('dart2js:noInline')
method4(Class4a c) {
  c.field4 = 42;
}
