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

topLevelMethod() => 't';

const topLevelFieldForTopLevelMethod = topLevelMethod;
const topLevelFieldForStaticMethod = A.staticMethod;

class A {
  final Function closure;
  const A(this.closure);
  const A.defaultTopLevel([this.closure = topLevelMethod]);
  const A.defaultStatic([this.closure = staticMethod]);
  const A.defaultStatic2([this.closure = A.staticMethod]);
  run() => closure();

  static staticMethod() => 's';
  static const staticFieldForStaticMethod = staticMethod;
  static const staticFieldForTopLevelMethod = topLevelMethod;
}

main() {
  Expect.equals('t', (const A(topLevelMethod)).run());
  Expect.equals('s', (const A(A.staticMethod)).run());
  Expect.equals('t', (const A.defaultTopLevel()).run());
  Expect.equals('s', (const A.defaultStatic()).run());
  Expect.equals('s', (const A.defaultStatic2()).run());
  Expect.equals('t', (new A.defaultTopLevel()).run());
  Expect.equals('s', (new A.defaultStatic()).run());
  Expect.equals('s', (new A.defaultStatic2()).run());
  Expect.equals('t', topLevelFieldForTopLevelMethod());
  Expect.equals('s', topLevelFieldForStaticMethod());
  Expect.equals('t', A.staticFieldForTopLevelMethod());
  Expect.equals('s', A.staticFieldForStaticMethod());

  var map = const {'t': topLevelMethod, 's': A.staticMethod };
  Expect.equals('t', map['t']());
  Expect.equals('s', map['s']());
}
