| // 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.md file. |
| |
| // The test cases called `typeArgs_...` verify that `<` and `>` are treated as |
| // delimiting type arguments when the `>` is followed by one of the tokens: |
| // |
| // ( . == != ) ] } ; : , |
| |
| var typeArgs_closeBrace = {f<a, b>}; |
| var typeArgs_closeBracket = [f<a, b>]; |
| var typeArgs_closeParen = g(f<a, b>); |
| var typeArgs_colon = {f<a, b>: null}; |
| var typeArgs_comma = [f<a, b>, null]; |
| var typeArgs_equals = f<a, b> == null; |
| var typeArgs_not_equals = f<a, b> != null; |
| |
| // This is a special case because when a `(` follows `<typeArguments>` it is |
| // parsed as a MethodInvocation rather than a GenericInstantiation. |
| var typeArgs_openParen = f<a, b>(); |
| |
| // This is a special case because `f<a, b>.methodName(...)` is parsed as an |
| // InstanceCreationExpression. |
| var typeArgs_period_methodInvocation = f<a, b>.toString(); |
| |
| var typeArgs_period_methodInvocation_generic = f<a, b>.foo<c>(); |
| var typeArgs_period_propertyAccess = f<a, b>.hashCode; |
| |
| var typeArgs_semicolon = f<a, b>; |
| |
| // The test cases called `operators_...` verify that `<` and `>` are treated as |
| // operators when the `>` is not followed by one of the tokens: |
| // |
| // ( . == != ) ] } ; : , |
| // |
| // Except as noted, these test cases should result in parse errors. |
| |
| var operators_ampersand = f(a<b,c>&d); |
| |
| // Note: this should not be a parse error since it is allowed to have an |
| // identifier called `as`. |
| var operators_as = f(a<b,c>as); |
| |
| var operators_asterisk = f(a<b,c>*d); |
| |
| // Note: this could never be a valid expression because the thing to the right |
| // of `!` is required to have type `bool`, and the type of `[d]` will always be |
| // a list type. But it is not the responsibility of the parser to report an |
| // error here; that should be done by type analysis. |
| var operators_bang_openBracket = f(a<b,c>![d]); |
| |
| // Note: this should not be a parse error since `c` could have a type that |
| // defines a `>` operator that accepts `bool`. |
| var operators_bang_paren = f(a<b,c>!(d)); |
| |
| var operators_bar = f(a<b,c>|d); |
| var operators_caret = f(a<b,c>^d); |
| var operators_is = f(a<b,c> is int); |
| |
| // Note: in principle we could parse this as a generic instantiation of a |
| // generic instantiation, but since `<` is not one of the tokens that signals |
| // `<` and `>` to be treated as type argument delimiters, the first pair of `<` |
| // and `>` is treated as operators, and this results in a parse error. |
| var operators_lessThan = f<a><b>; |
| |
| // Note: this should not be a parse error (indeed, this is valid if `a`, `b`, |
| // `c`, and `d` are all of type `num`). |
| var operators_minus = f(a<b,c>-d); |
| |
| // Note: this should not be a parse error since `c` could have a type that |
| // defines a `>` operator that accepts `List`. |
| var operators_openBracket = f(a<b,c>[d]); |
| |
| // Note: in principle we could parse `<b, c>` as type arguments, `[d]` as an |
| // index operation, and the final `>` as a greater-than operator, but since `[` |
| // is not one of the tokens that signals `<` and `>` to be treated as argument |
| // delimiters, the pair of `<` and `>` is treated as operators, and this results |
| // in a parse error. |
| var operators_openBracket_error = f(a<b,c>[d]>e); |
| |
| // Note: this should not be a parse error since `c` could have a type that |
| // defines a `>` operator that accepts `List`. |
| var operators_openBracket_unambiguous = f(a<b,c>[d, e]); |
| |
| var operators_percent = f(a<b,c>%d); |
| var operators_period_period = f(a<b,c>..toString()); |
| var operators_plus = f(a<b,c>+d); |
| var operators_question = f(a<b,c> ? null : null); |
| var operators_question_period_methodInvocation = f(a<b,c>?.toString()); |
| var operators_question_period_methodInvocation_generic = f(a<b,c>?.foo<c>()); |
| var operators_question_period_period = f(a<b,c>?..toString()); |
| var operators_question_period_propertyAccess = f(a<b,c>?.hashCode); |
| var operators_question_question = f(a<b,c> ?? d); |
| var operators_slash = f(a<b,c>/d); |
| var operators_tilde_slash = f(a<b,c>~/d); |