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

// @dart = 2.9

import "package:expect/expect.dart";

class A {
  int value;
  A(this.value);
  void set(int value) {
    this.value = value;
  }

  int get() => value;
  int operator [](int index) => value + index;
  void operator []=(int index, int newValue) {
    value += -index + newValue;
  }

  void test(int expected) {
    Expect.equals(expected, value);
  }

  Function limp(int n) {
    if (n == 0) return set;
    return () => limp(n - 1);
  }

  A get self => this;
  A operator +(A other) {
    this.value += other.value;
    return this;
  }
}

class Box {
  A value;
  Box(this.value);
  A operator [](int pos) => value;
  void operator []=(int pos, A a) {
    value = a;
  }

  A get x => value;
  void set x(A a) {
    value = a;
  }
}

// Subset of grammar being tested.
//
// expression:
//       assignableExpression assignmentOperator expression
//     | conditionalExpression cascadeSection*
//     ;
// expressionWithoutCascade:
//       assignableExpression assignmentOperator expressionWithoutCascade
//     | conditionalExpression
//     ;
// expressionList:
//       expression (',' expression)*
//     ;
// assignableExpression:
//       primary (arguments* assignableSelector)+
//     | super assignableSelector
//     | identifier
//     ;
// conditionalExpression:
//     logicalOrExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
//     ;
// primary:
//       thisExpression
//     | super assignableSelector
//     | functionExpression
//     | literal
//     | identifier
//     | newExpression
//     | constObjectExpression
//     | '(' expression ')'
//     ;
// assignableSelector:
//       '[' expression ']'
//     | '.' identifier
//     ;
//
// In words:
//  An assignableExpression is either a variable or something ending in
//  [expression] or .identifier.

main() {
  A a = new A(42);
  A original = a;
  A b = new A(87);
  fa() => a;
  Box box = new Box(a);
  // Different expressions on the left-hand side of '..'.
  //  conditionalExpression >> postfixExpression > primary selector*
  Expect.equals(
      a,
      a
        ..set(37)
        ..get());
  a.test(37);
  Expect.equals(
      a,
      fa()
        ..set(42)
        ..get());
  a.test(42);
  Expect.equals(
      a,
      box.x
        ..set(37)
        ..get());
  a.test(37);
  // '..' binds to 'b + a', i.e., to the 'b' object, not to 'a'.
  Expect.equals(
      b,
      b + a
        ..test(124)
        ..set(117)
        ..get());
  b.test(117);
  a.test(37);

  // expression :: conditionalExpression cascadeSection
  // and conditionalExpression ends in expressionWithoutCascade.
  // I.e., '..' binds to the entire condition expression, not to 'b'.
  (a.value == 37) ? a : b
    ..set(42);
  a.test(42);

  // This binds .. to 'a', not 'c=a', and performs assignment after reading
  // c.get().
  A c = new A(21);
  c = a..set(c.get()); // FAILING.
  Expect.equals(a, c);
  Expect.equals(original, a);
  a.test(21); // Fails as 42 if above is parsed as (c = a)..set(c.get()).

  // Should be parsed as (box..x = (c = a))..x.test(21).
  c = null;
  box
    ..x = c = a
    ..x.test(21);
  c.test(21);
  // Other variants
  c = null;
  box
    ..x = c = (a..test(21))
    ..x.test(21);
  c.test(21);

  c = null;
  box
    ..x = (c = a..test(21))
    ..x.test(21);
  c.test(21);

  // Should work the same:
  (a..set(42))..test(42);
  a
    ..set(21)
    ..test(21);

  c = null;
  Box originalBox = box;
  // Should parse as:
  // box = (box..x = (a.value == 21 ? b : c)..x.test(117));
  box = box
    ..x = a.value == 21 ? b : c
    ..x.test(117);
  Expect.equals(originalBox, box);
  Expect.equals(box.value, b);

  // New cascades are allowed inside an expressionWithoutCascade if properly
  // delimited.
  box
    ..x = (a
      ..set(42)
      ..test(42))
    ..x.test(42);
}
