// TODO(multitest): This was automatically migrated from a multitest and may // contain strange or dead code. // 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()); }