|  | // Copyright (c) 2012, 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"; | 
|  |  | 
|  | // Tests classes with getters and setters that do not have the same type. | 
|  |  | 
|  | class A { | 
|  | int a() { | 
|  | return 37; | 
|  | } | 
|  | } | 
|  |  | 
|  | class B extends A { | 
|  | int b() { | 
|  | return 38; | 
|  | } | 
|  | } | 
|  |  | 
|  | class C {} | 
|  |  | 
|  | class T1 { | 
|  | late A getterField; | 
|  | A get field { | 
|  | return getterField; | 
|  | } | 
|  |  | 
|  | void set field(B arg) { | 
|  | getterField = arg; | 
|  | } | 
|  | } | 
|  |  | 
|  | class T2 { | 
|  | late A getterField; | 
|  | late C setterField; | 
|  | A get field { | 
|  | return getterField; | 
|  | } | 
|  |  | 
|  | // Type C is not assignable to A | 
|  | void set field(C arg) { | 
|  | setterField = arg; | 
|  | } | 
|  | } | 
|  |  | 
|  | class T3 { | 
|  | late B getterField; | 
|  | B get field { | 
|  | return getterField; | 
|  | } | 
|  |  | 
|  | void set field(A arg) { | 
|  | getterField = arg; | 
|  | //            ^^^ | 
|  | // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT | 
|  | // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'. | 
|  | } | 
|  | } | 
|  |  | 
|  | main() { | 
|  | T1 instance1 = new T1(); | 
|  | T2 instance2 = new T2(); | 
|  | T3 instance3 = new T3(); | 
|  |  | 
|  | instance1.field = new B(); | 
|  | A resultA = instance1.field; | 
|  | Expect.throwsTypeError(() => instance1.field = new A() as dynamic); | 
|  | B resultB = instance1.field; | 
|  | //          ^^^^^^^^^^^^^^^ | 
|  | // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT | 
|  | //                    ^ | 
|  | // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'. | 
|  |  | 
|  | int result; | 
|  | result = instance1.field.a(); | 
|  | Expect.equals(37, result); | 
|  |  | 
|  | // Type 'A' has no method named 'b' | 
|  | instance1.field.b(); | 
|  | //              ^ | 
|  | // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD | 
|  | // [cfe] The method 'b' isn't defined for the type 'A'. | 
|  |  | 
|  | instance3.field = new B(); | 
|  | result = instance3.field.a(); | 
|  | Expect.equals(37, result); | 
|  | result = instance3.field.b(); | 
|  | Expect.equals(38, result); | 
|  | } |