// Copyright (c) 2013, 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.

// Test type promotion of locals potentially mutated in closures.

import "package:meta/meta.dart" show virtual;

class A {
  @virtual
  var a = "a";
  A operator +(int i) => this;
}

class B extends A {
  @virtual
  var b = "b";
}

class C extends B {
  @virtual
  var c = "c";
}

class D extends A {
  @virtual
  var d = "d";
}

class E extends D implements C {
  var a = "";
  var b = "";
  var c = "";
  var d = "";
}

func(x) => true;

void main() {
  test1();
  test2();
  test3();
  test3a();
  test4();
  test5();
  test6();
  test6a();
  test7();
  test8();
  test9();
  test10();
  test11();
  test12();
}

void test1() {
  A a = new E();
  if (a is B) {
    print(a.a);
    print(a.b); //# 01: static type warning
  }
  void foo() {
    a = new D();
  }
}

void test2() {
  A a = new E();
  void foo() {
    a = new D();
  }

  if (a is B) {
    print(a.a);
    print(a.b); //# 02: static type warning
  }
}

void test3() {
  A a = new E();
  void foo() {
    a = new D();
  }

  if (a is B) {
    print(a.a);
    print(a.b); //# 03: static type warning
    void foo() {
      a = new D();
    }

    print(a.a);
    print(a.b); //# 04: static type warning
  }
}

void test3a() {
  A a = new E();
  void foo() {
    a = new D();
  }

  if ((((a)) is B)) {
    print(a.a);
    print(a.b); //# 15: static type warning
    void foo() {
      a = new D();
    }

    print(a.a);
    print(a.b); //# 16: static type warning
  }
}

void test4() {
  A a = new E();
  if (a is B) {
    func(() => a.b); //# 05: ok
    print(a.a);
    print(a.b);
  }
}

void test5() {
  A a = new E();
  if (a is B) {
    func(() => a.b); //# 06: static type warning
    print(a.a);
  }
  a = null;
}

void test6() {
  A a = new E();
  if (a is B) {
    func(() => a);
    print(a.a);
    print(a.b); //# 07: static type warning
  }
  a = null;
}

void test6a() {
  A a = new E();
  if (((a) is B)) {
    func(() => a);
    print(a.a);
    print(a.b); //# 14: static type warning
  }
  a = null;
}

void test7() {
  A a = new E();
  if (a is B && func(() => a)) {
    print(a.a);
    print(a.b); //# 08: ok
  }
  a = null;
}

void test8() {
  A a = new E();
  if (a is B
      && func(() => a.b) //# 09: static type warning
      ) {
    print(a.a);
  }
  a = null;
}

void test9() {
  A a = new E();
  var b = a is B ? func(() => a.b) : false; //# 10: static type warning
  a = null;
}

void test10() {
  List<A> a = <E>[new E()];
  if (a is List<B>) {
    func(() => a[0]);
    print(a[0].b); //# 11: static type warning
  }
  a = null;
}

void test11() {
  List<A> a = <E>[new E()];
  if (a is List<B>) {
    func(() => a[0] = null);
    print(a[0].b); //# 12: static type warning
  }
  a = null;
}

void test12() {
  A a = new E();
  if (a is B) {
    func(() => a++);
    print(a.a);
    print(a.b); //# 13: static type warning
  }
  a = null;
}
