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

// @dart = 2.9

import "package:expect/expect.dart";

// Regression test for https://github.com/dart-lang/sdk/issues/29733 in DDC.
foo(a) {
  var a = 123;
  return a;
}

// Regression test for https://github.com/dart-lang/sdk/issues/30792 in DDC.
bar(a) async {
  var a = 123;
  return a;
}

baz(a) sync* {
  var a = 123;
  yield a;
}

qux(a) async* {
  var a = 123;
  yield a;
}

// Regression test for https://github.com/dart-lang/sdk/issues/32140
class C {
  var x, y, localY, _value;

  C(a) {
    var a = 123;
    this.x = a;
  }

  C.initY(this.y) {
    var y = 123;
    this.localY = y;
  }

  method(a) {
    var a = 123;
    return a;
  }

  mOptional([a = 0]) {
    var a = 123;
    return a;
  }

  mNamed({a = 0}) {
    var a = 123;
    return a;
  }

  mAsync({a: 0}) async {
    var a = 123;
    return a;
  }

  mSyncStar({a: 0}) sync* {
    var a = 123;
    yield a;
  }

  mAsyncStar({a: 0}) async* {
    var a = 123;
    yield a;
  }

  get accessor => _value;
  set accessor(a) {
    var a = 123;
    this._value = a;
  }
}

testCatch() {
  try {
    throw 'oops';
  } catch (e) {
    var e = 123;
    return e;
  }
}

testStackTrace() {
  try {
    throw 'oops';
  } catch (e, s) {
    var s = 123;
    return s;
  }
}

main() async {
  Expect.equals(123, foo(42));
  Expect.equals(123, await bar(42));
  Expect.equals(123, baz(42).single);
  Expect.equals(123, await qux(42).single);

  await testClass();

  Expect.equals(123, testCatch());
  Expect.equals(123, testStackTrace());
}

testClass() async {
  var c = new C('hi');
  Expect.equals(123, c.x);
  Expect.equals(123, c.method(42));
  c.accessor = 42;
  Expect.equals(123, c.accessor);
  c = new C.initY(42);
  Expect.equals(42, c.y);
  Expect.equals(123, c.localY);

  Expect.equals(123, c.mOptional());
  Expect.equals(123, c.mOptional(42));

  Expect.equals(123, c.mNamed());
  Expect.equals(123, c.mNamed(a: 42));

  Expect.equals(123, await c.mAsync());

  var iter = c.mSyncStar();
  Expect.listEquals([123], iter.toList());
  Expect.listEquals([123], iter.toList(), 'second iteration yields same value');

  var stream = c.mAsyncStar();
  Expect.listEquals([123], await stream.toList());
}
