blob: 2f3c136e22682e752f75d85bf78f2f7226722afd [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.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);