| // 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. | 
 |   static | 
 |   instanceMethod() => m(); | 
 | //^^^^^^^^^^^^^^ | 
 | // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE | 
 | // [cfe] Can't declare a member that conflicts with an inherited one. | 
 |  | 
 |   // 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). | 
 |   static var instanceMethod2; | 
 |   //         ^^^^^^^^^^^^^^^ | 
 |   // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE | 
 |   // [cfe] Can't declare a member that conflicts with an inherited one. | 
 |  | 
 |   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()); | 
 |   //                             ^ | 
 |   // [cfe] The method 'instanceMethod' isn't defined for the class 'Sub'. | 
 |   Expect.equals('super', new Super().instanceMethod2()); | 
 |   Expect.equals('super', new Sub().instanceMethod2()); | 
 |   //                               ^ | 
 |   // [cfe] The method 'instanceMethod2' isn't defined for the class 'Sub'. | 
 | } |