// TODO(multitest): This was automatically migrated from a multitest and may
// contain strange or dead code.

// @dart = 2.9

// Copyright (c) 2011, 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 "package:expect/expect.dart";

// Test the semantics of static members mixed with instance members.

// Following are relevant quotes from Dart Programming Language
// Specification, Draft Version 0.10, June 7, 2012.

// 7 Classes:

// "It is a compile-time error if a class has an instance method and a
// static member method with the same name."

// 7.1 Instance Methods:

// "Instance methods are functions (6) whose declarations are
// immediately contained within a class declaration and that are not
// declared static. The instance methods of a class C are those
// instance methods declared by C and the instance methods inherited
// by C from its superclass."

// 7.6 Static Methods

// "Static methods are functions whose declarations are immediately
// contained within a class declaration and that are declared
// static. The static methods of a class C are those static methods
// declared by C."

// 7.7 Static Variables

// "Static variables are variables whose declarations are immediately
// contained within a class declaration and that are declared
// static. The static variables of a class C are those static
// variables declared by C."

// "A static variable declaration of one of the forms static T v;,
// static T v = e; , static const T v = e; or static final T v = e;
// always induces an implicit static getter function (7.2) with
// signature static T get v whose invocation evaluates as described
// below (7.7.1)."

m() => 'top level';

class Super {
  // No error from hiding.
  static m() => 'super';

  static var i = 'super';

  static var i2 = 'super';

  instanceMethod() => m();

  instanceMethod2() => m();
}

class Sub extends Super {
  // According to 7.6, static methods are not inherited.
  static m() => 'sub';

  // According to 7.7, static variables are not inherited.
  static var i = 'sub';

  // According to 7.1, instance methods include those of the
  // superclass, and according to 7, it is a compile-time to have an
  // instance method and static method with the same name.

  instanceMethod() => m();

  // According to 7.7, static variables are not inherited.
  static i2() => m();

  // According to 7.1, instance methods include those of the
  // superclass, and according to 7, it is a compile-time to have an
  // instance method and static method with the same
  // name. Furthermore, according to 7.7 a static variable induces an
  // implicit getter function (a static method).


  foo() => 'foo';
}

main() {
  Expect.equals('foo', new Sub().foo());
  Expect.equals('top level', m());
  Expect.equals('super', Super.m());
  Expect.equals('sub', Sub.m());
  Expect.equals('super', Super.i);
  Expect.equals('sub', Sub.i);
  Expect.equals('super', Super.i2);
  Expect.equals('sub', Sub.i2());
  Expect.equals('super', new Super().instanceMethod());
  Expect.equals('sub', new Sub().instanceMethod());
  Expect.equals('super', new Super().instanceMethod2());
  Expect.equals('super', new Sub().instanceMethod2());
}
