blob: 7d817eeecedeadd43c0a97f545e11f9af3dc691c [file] [log] [blame]
// 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<EXPR,b>(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);
}
class ThisTest extends C {
ThisTest() : super.syntax('this');
void test() {
checkSyntax(f(x < this, C > (x)), 'f((x < this), (C > x))');
// Note: SyntaxTracker can't see the parens around `this` in the line below
checkSyntax(f(x < (this), C > (x)), 'f((x < this), (C > x))');
}
}
main() {
SyntaxTracker.known[C] = 'C';
SyntaxTracker.known[#x] = '#x';
checkSyntax(
f(x < x.getter.getter, C > (x)), 'f((x < x.getter.getter), (C > x))');
checkSyntax(f(x < C(), C > (x)), 'f((x < new C()), (C > x))');
checkSyntax(f(x < new C(), C > (x)), 'f((x < new C()), (C > x))');
checkSyntax(f(x < f(), C > (x)), 'f((x < f()), (C > x))');
checkSyntax(f(x < x.method(), C > (x)), 'f((x < x.method()), (C > x))');
checkSyntax(f(x < x[0](), C > (x)), 'f((x < x[0]()), (C > x))');
checkSyntax(f(x < #x, C > (x)), 'f((x < #x), (C > x))');
checkSyntax(f(x < null, C > (x)), 'f((x < null), (C > x))');
checkSyntax(f(x < 0, C > (x)), 'f((x < 0), (C > x))');
checkSyntax(f(x < 0.5, C > (x)), 'f((x < 0.5), (C > x))');
checkSyntax(f(x < [], C > (x)), 'f((x < []), (C > x))');
checkSyntax(f(x < [0], C > (x)), 'f((x < [0]), (C > x))');
checkSyntax(f(x < {}, C > (x)), 'f((x < {}), (C > x))');
checkSyntax(f(x < {0}, C > (x)), 'f((x < {0}), (C > x))');
checkSyntax(f(x < {0: 0}, C > (x)), 'f((x < { 0: 0 }), (C > x))');
checkSyntax(f(x < true, C > (x)), 'f((x < true), (C > x))');
checkSyntax(f(x < "s", C > (x)), 'f((x < "s"), (C > x))');
checkSyntax(f(x < r"s", C > (x)), 'f((x < "s"), (C > x))');
checkSyntax(f(x < x[0], C > (x)), 'f((x < x[0]), (C > x))');
// Note: SyntaxTracker can't see the parens around `x` in the line below
checkSyntax(f(x < (x), C > (x)), 'f((x < x), (C > x))');
checkSyntax(f(x < -x, C > (x)), 'f((x < (-x)), (C > x))');
checkSyntax(f(x < !true, C > (x)), 'f((x < false), (C > x))');
checkSyntax(f(x < !(true), C > (x)), 'f((x < false), (C > x))');
checkSyntax(f(x < ~x, C > (x)), 'f((x < (~x)), (C > x))');
checkSyntax(f(x < x * x, C > (x)), 'f((x < (x * x)), (C > x))');
checkSyntax(f(x < x / x, C > (x)), 'f((x < (x / x)), (C > x))');
checkSyntax(f(x < x ~/ x, C > (x)), 'f((x < (x ~/ x)), (C > x))');
checkSyntax(f(x < x % x, C > (x)), 'f((x < (x % x)), (C > x))');
checkSyntax(f(x < x + x, C > (x)), 'f((x < (x + x)), (C > x))');
checkSyntax(f(x < x - x, C > (x)), 'f((x < (x - x)), (C > x))');
checkSyntax(f(x < x << x, C > (x)), 'f((x < (x << x)), (C > x))');
checkSyntax(f(x < x >> x, C > (x)), 'f((x < (x >> x)), (C > x))');
checkSyntax(f(x < x & x, C > (x)), 'f((x < (x & x)), (C > x))');
checkSyntax(f(x < x ^ x, C > (x)), 'f((x < (x ^ x)), (C > x))');
checkSyntax(f(x < x | x, C > (x)), 'f((x < (x | x)), (C > x))');
ThisTest().test();
}