| // Copyright (c) 2019, 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"; |
| |
| /////////////////////////////////////////////////////////////////////// |
| // The following tests check that setters or getters in an extension |
| // correctly shadow members with the same basename in the surrounding |
| // scope. |
| /////////////////////////////////////////////////////////////////////// |
| |
| String get topLevelGetter => "-1"; |
| void set topLevelSetter(String _) {} |
| String topLevelField = "-3"; |
| String topLevelMethod(String x) => "-4"; |
| |
| // Location that extension setters write to. |
| int? _storeTo = null; |
| // Check that the most recent setter call set the value |
| // of _storeTo. |
| void checkSetter(int x) { |
| int? written = _storeTo; |
| _storeTo = null; |
| Expect.equals(written, x); |
| } |
| |
| // Check that an instance getter in an extension shadows top level |
| // members with the same basename. |
| extension E1 on A1 { |
| int get topLevelSetter => 1; |
| int get topLevelField => 2; |
| int get topLevelMethod => 3; |
| void test() { |
| // Reading the local getters is valid |
| Expect.equals(topLevelSetter + 1, 2); |
| Expect.equals(topLevelField + 1, 3); |
| Expect.equals(topLevelMethod + 1, 4); |
| } |
| } |
| |
| class A1 {} |
| |
| // Check that an instance setter in an extension shadows top level |
| // members with the same basename. |
| extension E2 on A2 { |
| void set topLevelGetter(int x) { |
| _storeTo = x; |
| } |
| |
| void set topLevelField(int x) { |
| _storeTo = x; |
| } |
| |
| void set topLevelMethod(int x) { |
| _storeTo = x; |
| } |
| |
| void test() { |
| checkSetter(topLevelGetter = 42); |
| checkSetter(topLevelField = 42); |
| checkSetter(topLevelMethod = 42); |
| } |
| } |
| |
| class A2 {} |
| |
| // Check that a static getter in an extension shadows top level |
| // members with the same basename. |
| extension E3 on A3 { |
| static int get topLevelSetter => 1; |
| static int get topLevelField => 2; |
| static int get topLevelMethod => 3; |
| void test() { |
| // Reading the local getters is valid |
| Expect.equals(topLevelSetter + 1, 2); |
| Expect.equals(topLevelField + 1, 3); |
| Expect.equals(topLevelMethod + 1, 4); |
| } |
| } |
| |
| class A3 {} |
| |
| // Check that a static setter in an extension shadows top level |
| // members with the same basename. |
| extension E4 on A4 { |
| static void set topLevelGetter(int x) { |
| _storeTo = x; |
| } |
| |
| static void set topLevelField(int x) { |
| _storeTo = x; |
| } |
| |
| static void set topLevelMethod(int x) { |
| _storeTo = x; |
| } |
| |
| void test() { |
| checkSetter(topLevelGetter = 42); |
| checkSetter(topLevelField = 42); |
| checkSetter(topLevelMethod = 42); |
| } |
| } |
| |
| class A4 {} |
| |
| // Define extensions on A6. |
| extension E5 on A6 { |
| void set extensionSetter(int x) {} |
| int extensionMethod(int x) => -3; |
| } |
| |
| // Check that an instance getter in an extension shadows extension |
| // members with the same basename from a different extension. |
| extension E6 on A6 { |
| int get extensionSetter => 1; |
| int get extensionMethod => 3; |
| void test() { |
| // Reading the local getters is valid |
| Expect.equals(extensionSetter + 1, 2); |
| Expect.equals(extensionMethod + 1, 4); |
| } |
| } |
| |
| class A6 {} |
| |
| // Check that an instance getter in a class shadows extension |
| // members with the same basename from extension E5. |
| class A7 extends A6 { |
| int get extensionSetter => 1; |
| int get extensionMethod => 3; |
| void test() { |
| // Reading the local getters is valid |
| Expect.equals(extensionSetter + 1, 2); |
| Expect.equals(extensionMethod + 1, 4); |
| } |
| } |
| |
| // Define extensions on A8. |
| extension E7 on A8 { |
| int get extensionGetter => -1; |
| int extensionMethod(int x) => -3; |
| } |
| |
| // Check that an instance setter in an extension shadows extension |
| // members with the same basename from a different extension. |
| extension E8 on A8 { |
| void set extensionGetter(int x) { |
| _storeTo = x; |
| } |
| |
| void set extensionMethod(int x) { |
| _storeTo = x; |
| } |
| |
| void test() { |
| checkSetter(extensionGetter = 42); |
| checkSetter(extensionMethod = 42); |
| } |
| } |
| |
| class A8 {} |
| |
| // Check that an instance setter in a class shadows extension |
| // members with the same basename from extension E7. |
| class A9 extends A8 { |
| void set extensionGetter(int x) { |
| _storeTo = x; |
| } |
| |
| void set extensionMethod(int x) { |
| _storeTo = x; |
| } |
| |
| void test() { |
| checkSetter(extensionGetter = 42); |
| checkSetter(extensionMethod = 42); |
| } |
| } |
| |
| // Define extensions on A10. |
| extension E9 on A10 { |
| void set extensionSetter(int x) {} |
| void set extensionFieldSetter(int x) {} |
| int extensionMethod(int x) => -3; |
| } |
| |
| // Check that a static getter in an extension shadows extension |
| // members with the same basename from a different extension. |
| extension E10 on A10 { |
| static int get extensionSetter => 1; |
| static final int extensionFieldSetter = 2; |
| static int get extensionMethod => 3; |
| void test() { |
| // Reading the local getters is valid |
| Expect.equals(extensionSetter + 1, 2); |
| Expect.equals(extensionFieldSetter + 1, 3); |
| Expect.equals(extensionMethod + 1, 4); |
| } |
| } |
| |
| class A10 {} |
| |
| // Check that a static getter in a class shadows extension |
| // members with the same basename from extension E9. |
| class A11 extends A10 { |
| static int get extensionSetter => 1; |
| static final int extensionFieldSetter = 2; |
| static int get extensionMethod => 3; |
| void test() { |
| // Reading the local getters is valid |
| Expect.equals(extensionSetter + 1, 2); |
| Expect.equals(extensionFieldSetter + 1, 3); |
| Expect.equals(extensionMethod + 1, 4); |
| } |
| } |
| |
| // Define extensions on A12. |
| extension E11 on A12 { |
| int get extensionGetter => -1; |
| int extensionMethod(int x) => -3; |
| } |
| |
| // Check that a static setter in an extension shadows extension |
| // members with the same basename from a different extension. |
| extension E12 on A12 { |
| static void set extensionGetter(int x) { |
| _storeTo = x; |
| } |
| |
| static void set extensionMethod(int x) { |
| _storeTo = x; |
| } |
| |
| void test() { |
| checkSetter(extensionGetter = 42); |
| checkSetter(extensionMethod = 42); |
| } |
| } |
| |
| class A12 {} |
| |
| // Check that a static setter in a class shadows extension |
| // members with the same basename from extension E11. |
| class A13 extends A12 { |
| static void set extensionGetter(int x) { |
| _storeTo = x; |
| } |
| |
| static void set extensionMethod(int x) { |
| _storeTo = x; |
| } |
| |
| void test() { |
| checkSetter(extensionGetter = 42); |
| checkSetter(extensionMethod = 42); |
| } |
| } |
| |
| void main() { |
| A1().test(); |
| A2().test(); |
| A3().test(); |
| A4().test(); |
| A6().test(); |
| A7().test(); |
| A8().test(); |
| A9().test(); |
| A10().test(); |
| A11().test(); |
| A12().test(); |
| A13().test(); |
| } |