blob: d4265461ea96717d5fd359ce0b415ee55e692052 [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:
//
// ( ) ] } : ; , . ? == != .. ?. ?? ?..
// & | ^ + * % / ~/
//
// Unless otherwise noted, these test cases should not result in a parse error,
// because they can be made into valid expressions through user-defined
// operators.
var typeArgs_ampersand = f<a, b> & 0;
var typeArgs_asterisk = f<a, b> * 0;
var typeArgs_bar = f<a, b> | 0;
var typeArgs_caret = f<a, b> ^ 0;
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>();
var typeArgs_percent = f<a, b> % 0;
// 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_period = f<a, b>..toString();
var typeArgs_period_propertyAccess = f<a, b>.hashCode;
var typeArgs_plus = f<a, b> + 0;
// Note: this could never be a valid expression because the thing to the left of
// `?` is required to have type `bool`, and `f<a, b>` can only have type `Type`
// or a function type. But it is not the responsibility of the parser to report
// an error here; that should be done by type analysis.
var typeArgs_question = f<a, b> ? null : null;
var typeArgs_question_period_methodInvocation = f<a, b>?.toString();
var typeArgs_question_period_methodInvocation_generic = f<a, b>?.foo<c>();
var typeArgs_question_period_period = f<a, b>?..toString();
var typeArgs_question_period_propertyAccess = f<a, b>?.hashCode;
var typeArgs_question_question = f<a, b> ?? 0;
var typeArgs_semicolon = f<a, b>;
var typeArgs_slash = f<a, b> / 1;
var typeArgs_tilde_slash = f<a, b> ~/ 1;
// The test cases called `operators_...` verify that `<` and `>` are treated as
// operators when the `>` is not followed by one of the tokens:
//
// ( ) ] } : ; , . ? == != .. ?. ?? ?..
// & | ^ + * % / ~/
//
// Unless otherwise noted, these test cases should not result in a parse error,
// because they can be made into valid expressions through user-defined
// operators.
// 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]);
var operators_bang_paren = f(a<b,c>!(d));
// 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>;
var operators_minus = f(a<b,c>-d);
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);
var operators_openBracket_unambiguous = f(a<b,c>[d, e]);