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

// @dart = 2.9

// This test verifies that `f<a,EXPR>(x)` is properly parsed as a pair of
// expressions separated by a `,`, for all types of expressions that may appear
// as EXPR that can't be parsed as types.

import '../syntax_helper.dart';

class C extends SyntaxTracker {
  C([Object x = absent, Object y = absent])
      : super('new C${SyntaxTracker.args(x, y)}');

  C.syntax(String s) : super(s);

  Object operator >(Object other) =>
      SyntaxTracker('(${syntax(this)} > ${syntax(other)})');
}

class ThisTest extends C {
  ThisTest() : super.syntax('this');

  void test() {
    checkSyntax(f(x < C, this > (x)), 'f((x < C), (this > x))');
    // Note: SyntaxTracker can't see the parens around `this` in the line below
    checkSyntax(f(x < C, (this) > (x)), 'f((x < C), (this > x))');
  }
}

class SuperTest extends C {
  SuperTest() : super.syntax('super');

  void test() {
    checkSyntax(f(x < C, super > (x)), 'f((x < C), (super > x))');
  }
}

main() {
  const y = 123;
  SyntaxTracker.known[C] = 'C';
  SyntaxTracker.known[#x] = '#x';
  SyntaxTracker.known[y] = 'y';
  checkSyntax(
      f(x < C, x.getter.getter > (x)), 'f((x < C), (x.getter.getter > x))');
  checkSyntax(f(x < C, C() > (x)), 'f((x < C), (new C() > x))');
  checkSyntax(f(x < C, new C() > (x)), 'f((x < C), (new C() > x))');
  checkSyntax(f(x < C, f() > (x)), 'f((x < C), (f() > x))');
  checkSyntax(f(x < C, x.method() > (x)), 'f((x < C), (x.method() > x))');
  checkSyntax(f(x < C, x[0]() > (x)), 'f((x < C), (x[0]() > x))');
  checkSyntax(f(x < C, #x > (x)), 'f((x < C), (#x > x))');
  checkSyntax(f(x < C, null > (x)), 'f((x < C), (null > x))');
  checkSyntax(f(x < C, 0 > (y)), 'f((x < C), false)');
  checkSyntax(f(x < C, 0.5 > (y)), 'f((x < C), false)');
  checkSyntax(f(x < C, [] > (x)), 'f((x < C), ([] > x))');
  checkSyntax(f(x < C, [0] > (x)), 'f((x < C), ([0] > x))');
  checkSyntax(f(x < C, {} > (x)), 'f((x < C), ({} > x))');
  checkSyntax(f(x < C, {0} > (x)), 'f((x < C), ({0} > x))');
  checkSyntax(f(x < C, {0: 0} > (x)), 'f((x < C), ({ 0: 0 } > x))');
  checkSyntax(f(x < C, true > (x)), 'f((x < C), (true > x))');
  checkSyntax(f(x < C, "s" > (x)), 'f((x < C), ("s" > x))');
  checkSyntax(f(x < C, r"s" > (x)), 'f((x < C), ("s" > x))');
  checkSyntax(f(x < C, x[0] > (x)), 'f((x < C), (x[0] > x))');
  // Note: SyntaxTracker can't see the parens around `x` in the line below
  checkSyntax(f(x < C, (x) > (x)), 'f((x < C), (x > x))');
  checkSyntax(f(x < C, -x > (x)), 'f((x < C), ((-x) > x))');
  checkSyntax(f(x < C, !true > (x)), 'f((x < C), (false > x))');
  checkSyntax(f(x < C, !(true) > (x)), 'f((x < C), (false > x))');
  checkSyntax(f(x < C, ~x > (x)), 'f((x < C), ((~x) > x))');
  checkSyntax(f(x < C, x * x > (x)), 'f((x < C), ((x * x) > x))');
  checkSyntax(f(x < C, x / x > (x)), 'f((x < C), ((x / x) > x))');
  checkSyntax(f(x < C, x ~/ x > (x)), 'f((x < C), ((x ~/ x) > x))');
  checkSyntax(f(x < C, x % x > (x)), 'f((x < C), ((x % x) > x))');
  checkSyntax(f(x < C, x + x > (x)), 'f((x < C), ((x + x) > x))');
  checkSyntax(f(x < C, x - x > (x)), 'f((x < C), ((x - x) > x))');
  checkSyntax(f(x < C, x << x > (x)), 'f((x < C), ((x << x) > x))');
  checkSyntax(f(x < C, x >> x > (x)), 'f((x < C), ((x >> x) > x))');
  checkSyntax(f(x < C, x & x > (x)), 'f((x < C), ((x & x) > x))');
  checkSyntax(f(x < C, x ^ x > (x)), 'f((x < C), ((x ^ x) > x))');
  checkSyntax(f(x < C, x | x > (x)), 'f((x < C), ((x | x) > x))');
  ThisTest().test();
  SuperTest().test();
}
