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

class B {
  final int x;

  B(this.x);
}

class C extends B {
  late final y = x + 1;

  C(int x) : super(x);

  method() => x;
}

int? lateTopLevelField1Init;
int initLateTopLevelField1(int value) {
  return lateTopLevelField1Init = value;
}

late final int lateTopLevelField1 = initLateTopLevelField1(123);

class Class<T> {
  static int? lateStaticField1Init;
  static int initLateStaticField1(int value) {
    return lateStaticField1Init = value;
  }

  static late final int lateStaticField1 = initLateStaticField1(87);

  static int? lateStaticField2Init;
  static int initLateStaticField2(int value) {
    return lateStaticField2Init = value;
  }

  static late final int lateStaticField2 = initLateStaticField2(42);

  static staticMethod() {
    expect(null, lateStaticField2Init);
    expect(42, lateStaticField2);
    expect(42, lateStaticField2Init);
  }

  int? lateInstanceFieldInit;
  int initLateInstanceField(int value) {
    return lateInstanceFieldInit = value;
  }

  late final int lateInstanceField = initLateInstanceField(16);

  T? lateGenericFieldInit;
  T initLateGenericField(T value) {
    return lateGenericFieldInit = value;
  }

  final T field;
  late final T lateGenericField = initLateGenericField(field);

  Class(this.field);

  instanceMethod() {
    expect(null, lateInstanceFieldInit);
    expect(16, lateInstanceField);
    expect(16, lateInstanceFieldInit);

    expect(null, lateGenericFieldInit);
    expect(field, lateGenericField);
    expect(field, lateGenericFieldInit);
  }
}

extension Extension<T> on Class<T> {
  static int? lateExtensionField1Init;
  static int initLateExtensionField1(int value) {
    return lateExtensionField1Init = value;
  }

  static late final int lateExtensionField1 = initLateExtensionField1(87);

  static int? lateExtensionField2Init;
  static int initLateExtensionField2(int value) {
    return lateExtensionField2Init = value;
  }

  static late final int lateExtensionField2 = initLateExtensionField2(42);

  static staticMethod() {
    expect(null, lateExtensionField2Init);
    expect(42, lateExtensionField2);
    expect(42, lateExtensionField2Init);
  }
}

main() {
  expect(null, lateTopLevelField1Init);
  expect(123, lateTopLevelField1);
  expect(123, lateTopLevelField1Init);

  expect(null, Class.lateStaticField1Init);
  expect(87, Class.lateStaticField1);
  expect(87, Class.lateStaticField1Init);

  Class.staticMethod();
  new Class<int>(0).instanceMethod();

  expect(null, Extension.lateExtensionField1Init);
  expect(87, Extension.lateExtensionField1);
  expect(87, Extension.lateExtensionField1Init);

  Extension.staticMethod();
  expect(2, C(1).y);
}

expect(expected, actual) {
  if (expected != actual) throw 'Expected $expected, actual $actual';
}
