| // 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. |
| |
| // This test verifies that `EXPR<a,b>-x` is properly parsed as a pair of |
| // expressions separated by a `,`, for all types of expressions that may appear |
| // as EXPR. We try to pay extra attention to expressions that will become |
| // ambiguous when the "constructor tearoffs" feature is enabled (that is, where |
| // interpreting the `<` and `>` as delimiting a list of type arguments would |
| // also have led to a valid parse). |
| |
| 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(this < C, C > -x), 'f((this < C), (C > (-x)))'); |
| // Note: SyntaxTracker can't see the parens around `this` in the line below |
| checkSyntax(f((this) < C, C > -x), 'f((this < C), (C > (-x)))'); |
| } |
| } |
| |
| class SuperTest extends C { |
| SuperTest() : super.syntax('super'); |
| |
| void test() { |
| checkSyntax(f(super < C, C > -x), 'f((super < C), (C > (-x)))'); |
| } |
| } |
| |
| main() { |
| const y = 123; |
| SyntaxTracker.known[C] = 'C'; |
| SyntaxTracker.known[#x] = '#x'; |
| SyntaxTracker.known[y] = 'y'; |
| checkSyntax(f(x < C, C > -x), 'f((x < C), (C > (-x)))'); |
| checkSyntax(f(x.getter < C, C > -x), 'f((x.getter < C), (C > (-x)))'); |
| checkSyntax(f(C() < C, C > -x), 'f((new C() < C), (C > (-x)))'); |
| checkSyntax(f(new C() < C, C > -x), 'f((new C() < C), (C > (-x)))'); |
| checkSyntax(f(f() < C, C > -x), 'f((f() < C), (C > (-x)))'); |
| checkSyntax(f(x.method() < C, C > -x), 'f((x.method() < C), (C > (-x)))'); |
| checkSyntax(f(x[0]() < C, C > -x), 'f((x[0]() < C), (C > (-x)))'); |
| checkSyntax(f(#x < C, C > -x), 'f((#x < C), (C > (-x)))'); |
| checkSyntax(f(null < C, C > -x), 'f((null < C), (C > (-x)))'); |
| checkSyntax(f(0 < y, C > -x), 'f(true, (C > (-x)))'); |
| checkSyntax(f(0.5 < y, C > -x), 'f(true, (C > (-x)))'); |
| checkSyntax(f([] < C, C > -x), 'f(([] < C), (C > (-x)))'); |
| checkSyntax(f([0] < C, C > -x), 'f(([0] < C), (C > (-x)))'); |
| checkSyntax(f({} < C, C > -x), 'f(({} < C), (C > (-x)))'); |
| checkSyntax(f({0} < C, C > -x), 'f(({0} < C), (C > (-x)))'); |
| checkSyntax(f({0: 0} < C, C > -x), 'f(({ 0: 0 } < C), (C > (-x)))'); |
| checkSyntax(f(true < C, C > -x), 'f((true < C), (C > (-x)))'); |
| checkSyntax(f("s" < C, C > -x), 'f(("s" < C), (C > (-x)))'); |
| checkSyntax(f(r"s" < C, C > -x), 'f(("s" < C), (C > (-x)))'); |
| checkSyntax(f(x[0] < C, C > -x), 'f((x[0] < C), (C > (-x)))'); |
| // Note: SyntaxTracker can't see the `!` in the line below |
| checkSyntax(f(x! < C, C > -x), 'f((x < C), (C > (-x)))'); |
| // Note: SyntaxTracker can't see the parens around `x` in the line below |
| checkSyntax(f((x) < C, C > -x), 'f((x < C), (C > (-x)))'); |
| checkSyntax(f(-x < C, C > -x), 'f(((-x) < C), (C > (-x)))'); |
| checkSyntax(f(!true < C, C > -x), 'f((false < C), (C > (-x)))'); |
| checkSyntax(f(!(true) < C, C > -x), 'f((false < C), (C > (-x)))'); |
| checkSyntax(f(~x < C, C > -x), 'f(((~x) < C), (C > (-x)))'); |
| checkSyntax(f(x * x < C, C > -x), 'f(((x * x) < C), (C > (-x)))'); |
| checkSyntax(f(x / x < C, C > -x), 'f(((x / x) < C), (C > (-x)))'); |
| checkSyntax(f(x ~/ x < C, C > -x), 'f(((x ~/ x) < C), (C > (-x)))'); |
| checkSyntax(f(x % x < C, C > -x), 'f(((x % x) < C), (C > (-x)))'); |
| checkSyntax(f(x + x < C, C > -x), 'f(((x + x) < C), (C > (-x)))'); |
| checkSyntax(f(x - x < C, C > -x), 'f(((x - x) < C), (C > (-x)))'); |
| checkSyntax(f(x << x < C, C > -x), 'f(((x << x) < C), (C > (-x)))'); |
| checkSyntax(f(x >> x < C, C > -x), 'f(((x >> x) < C), (C > (-x)))'); |
| checkSyntax(f(x & x < C, C > -x), 'f(((x & x) < C), (C > (-x)))'); |
| checkSyntax(f(x ^ x < C, C > -x), 'f(((x ^ x) < C), (C > (-x)))'); |
| checkSyntax(f(x | x < C, C > -x), 'f(((x | x) < C), (C > (-x)))'); |
| ThisTest().test(); |
| SuperTest().test(); |
| } |