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

import "package:expect/expect.dart";

// Class hierarchy on an abstract class
// that defines a "next" structure.

abstract class A {
  A next;
}

class B extends A {
  B(A n) {
    this.next = n;
  }
}

// Method that counts length of list.
// With only Bs, the getter can be
// inlined without check class.
int countMe(A i) {
  int x = 0;
  while (i != null) {
    A next = i.next;
    x++;
    i = next;
  }
  return x;
}

int doitHot(A a) {
  // Warm up the JIT.
  int d = 0;
  for (int i = 0; i < 1000; i++) {
    d += countMe(a);
  }
  return d;
}

// Nasty class that overrides the getter.
class C extends A {
  C(A n) {
    this.next = n;
  }
  // New override.
  A get next => null;
}

int bringInC(A a) {
  // Introduce C to compiler.
  a = new C(a);
  return doitHot(a);
}

main() {
  // Make a list with just Bs.
  A a = null;
  for (int i = 0; i < 1000; i++) {
    a = new B(a);
  }

  Expect.equals(1000 * 1000, doitHot(a));
  Expect.equals(1000, bringInC(a));
}
