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

import 'api_test_macro.dart';

main() {}

var field;
get getter => null;
set setter(_) => null;

@ClassMacro()
class Class1 {
  var field1;

  Class1();
}

@ClassMacro()
abstract class Class2 {}

@ClassMacro()
class Class3 extends Class2 implements Interface1 {
  var field1;
  var field2;

  Class3.new();
  Class3.named();
  factory Class3.fact() => Class3.named();
  factory Class3.redirect() = Class3.named;

  void method1() {}
  void method2() {}

  get getter1 => null;
  set setter1(_) {}

  get property1 => null;
  set property1(_) {}

  static var staticField1;
  static void staticMethod1() {}
}

@ClassMacro()
class Class4 extends Class1 with Mixin1 {}

@ClassMacro()
class Class5 extends Class2
    with Mixin1, Mixin2
    implements Interface1, Interface2 {}

mixin Mixin1 {}

mixin Mixin2 {}

@ClassMacro()
abstract class Interface1 {}

@ClassMacro()
abstract class Interface2 {}

@FunctionMacro()
void topLevelFunction1(Class1 a, {Class1? b, required Class2? c}) {}

@FunctionMacro()
external Class2 topLevelFunction2(Class1 a, [Class2? b]);
