|  | // Copyright (c) 2021, 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"; | 
|  |  | 
|  | // Regression test for https://github.com/dart-lang/sdk/issues/47698. | 
|  |  | 
|  | // Exposes a class field. | 
|  | class A { | 
|  | int i; | 
|  | A(this.i); | 
|  | } | 
|  |  | 
|  | // Exposes a getter/setter pair. | 
|  | class B { | 
|  | int _j; | 
|  | int get j => _j; | 
|  | set j(int x) => _j = x; | 
|  | B(this._j); | 
|  | } | 
|  |  | 
|  | // A super class field used in constructor as getter and setter. | 
|  | class C extends A { | 
|  | C(int val) : super(val) { | 
|  | var x = super.i + 10; // Getter is used first. | 
|  | super.i = x + 100; // Boom! Missing setter. | 
|  | } | 
|  | } | 
|  |  | 
|  | class D extends A { | 
|  | D(int val) : super(val) { | 
|  | super.i = 100; // Setter is used first. | 
|  | super.i = super.i + 10 + val; // Boom! Missing getter. | 
|  | } | 
|  | } | 
|  |  | 
|  | // Actual super getter and setter used in constructor | 
|  | class E extends B { | 
|  | E(int val) : super(val) { | 
|  | var x = super.j + 10; // Getter is used first. | 
|  | super.j = x + 100; // Boom! Missing setter. | 
|  | } | 
|  | } | 
|  |  | 
|  | class F extends B { | 
|  | F(int val) : super(val) { | 
|  | super.j = 100; // Setter is used first. | 
|  | super.j = super.j + 10 + val; // Boom! Missing getter. | 
|  | } | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | var c = C(1); | 
|  | Expect.equals(c.i, 111); | 
|  | var d = D(1); | 
|  | Expect.equals(d.i, 111); | 
|  | var e = E(1); | 
|  | Expect.equals(e.j, 111); | 
|  | var f = F(1); | 
|  | Expect.equals(f.j, 111); | 
|  | } |