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

// Regression test for dart2js issue 6639.

library inline_super_test;

part 'inline_super_part.dart';

// Long comment to ensure source positions in the following code are
// larger than the part file.  Best way to ensure that is to include
// the part as a comment:
//
// class Player extends LivingActor {
//   Player (deathCallback) : super(null, deathCallback);
// }

class Percept {}

class Actor {
  final percept;
  Actor(this.percept);
}

class LivingActor extends Actor {
  // The bug occurs when inlining the node [:new Percept():] into
  // [Actor]'s constructor.  When this inlining is being initiated
  // from [Player], we must take care to ensure that we know that we
  // are inlining from this location, and not [Player].
  LivingActor () : super(new Percept());
}

main() {
  Expect.isTrue(new Player().percept is Percept);
}
