| // 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. |
| |
| // @dart = 2.9 |
| |
| 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'. |
| } |