// 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.

import "package:expect/expect.dart";

foo() => 123;

void testShadowingScope1() {
  var foo = foo();
  Expect.equals(123, foo);
}

void testShadowingScope2() {
  {
    var foo = foo() + 444;
    Expect.equals(567, foo);
  }
  Expect.equals(123, foo());
}

void testShadowingCapture1() {
  var f;
  {
    var foo = 888;
    f = () => foo;
  }
  var foo = -888;
  Expect.equals(888, f());
}

void testShadowingCapture2() {
  var f = null;
  // this one uses a reentrant block
  for (int i = 0; i < 2; i++) {
    var foo = i + 888;
    if (f == null) f = () => foo;
  }
  var foo = -888;

  // this could break if it doesn't bind the right "foo"
  Expect.equals(888, f());
}

class BlockScopeTest1 {
  void testShadowingInstanceVar() {
    if (true) {
      var foo = foo() + 444;
      Expect.equals(1221, foo);
    }
    Expect.equals(777, foo());
  }
  static void testShadowingStatic() {
    if (true) {
      var bar = bar() + 444;
      Expect.equals(1221, bar);
    }
    Expect.equals(777, bar());
  }

  foo() => 777;
  static bar() => 777;
}

main() {
  testShadowingScope1();
  testShadowingScope2();
  testShadowingCapture1();
  testShadowingCapture2();
  new BlockScopeTest1().testShadowingInstanceVar();
  BlockScopeTest1.testShadowingStatic();
}
