Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(606)

Unified Diff: pkg/analyzer/test/generated/parser_test.dart

Issue 2717233004: Extract ExpressionParserText from SimpleParserTest. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/test/generated/parser_fasta_test.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/test/generated/parser_test.dart
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index d6e5e3d4ee2b77e521398bc55582cc8c1643d69f..f6ad937d4c1173606d65d6bb7ca0bcba38462102 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -28,6 +28,7 @@ main() {
defineReflectiveTests(ClassMemberParserTest);
defineReflectiveTests(ComplexParserTest);
defineReflectiveTests(ErrorParserTest);
+ defineReflectiveTests(ExpressionParserText);
defineReflectiveTests(FormalParameterParserTest);
defineReflectiveTests(NonErrorParserTest);
defineReflectiveTests(RecoveryParserTest);
@@ -45,6 +46,8 @@ abstract class AbstractParserTestCase implements ParserTestHelpers {
void set enableGenericMethodComments(bool value);
+ void set enableLazyAssignmentOperators(bool value);
+
void set enableNnbd(bool value);
/**
@@ -3947,7732 +3950,7971 @@ void main() {
}
}
-/**
- * Tests of the analyzer parser based on [FormalParameterParserTestMixin].
- */
@reflectiveTest
-class FormalParameterParserTest extends ParserTestCase
- with FormalParameterParserTestMixin {}
+class ExpressionParserText extends ParserTestCase
Paul Berry 2017/02/27 20:39:39 I think you mean "ExpressionParserTest"
+ with ExpressionParserTextMixin {}
-/**
- * The class [FormalParameterParserTestMixin] defines parser tests that test
- * the parsing of formal parameters.
- */
-abstract class FormalParameterParserTestMixin
- implements AbstractParserTestCase {
- void test_parseFormalParameter_covariant_final_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter =
- parseFormalParameter('covariant final a : null', kind);
- expect(parameter, isNotNull);
+abstract class ExpressionParserTextMixin implements AbstractParserTestCase {
Paul Berry 2017/02/27 20:39:39 Similarly, this should be "ExpressionParserTestMix
+ void test_parseAdditiveExpression_normal() {
+ createParser('x + y');
+ Expression expression = parser.parseAdditiveExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.PLUS);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameter_covariant_final_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter = parseFormalParameter('covariant final a', kind);
- expect(parameter, isNotNull);
+ void test_parseAdditiveExpression_super() {
+ createParser('super + y');
+ Expression expression = parser.parseAdditiveExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.PLUS);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameter_covariant_final_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter =
- parseFormalParameter('covariant final a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_expression_args_dot() {
+ createParser('(x)(y).z');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ FunctionExpressionInvocation invocation =
+ propertyAccess.target as FunctionExpressionInvocation;
+ expect(invocation.function, isNotNull);
+ expect(invocation.typeArguments, isNull);
+ ArgumentList argumentList = invocation.argumentList;
+ expect(argumentList, isNotNull);
+ expect(argumentList.arguments, hasLength(1));
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_final_type_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter =
- parseFormalParameter('covariant final A a : null', kind);
- expect(parameter, isNotNull);
+ void
+ test_parseAssignableExpression_expression_args_dot_typeParameterComments() {
+ enableGenericMethodComments = true;
+ createParser('(x)/*<F>*/(y).z');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ FunctionExpressionInvocation invocation =
+ propertyAccess.target as FunctionExpressionInvocation;
+ expect(invocation.function, isNotNull);
+ expect(invocation.typeArguments, isNotNull);
+ ArgumentList argumentList = invocation.argumentList;
+ expect(argumentList, isNotNull);
+ expect(argumentList.arguments, hasLength(1));
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_final_type_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter =
- parseFormalParameter('covariant final A a', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_expression_args_dot_typeParameters() {
+ createParser('(x)<F>(y).z');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ FunctionExpressionInvocation invocation =
+ propertyAccess.target as FunctionExpressionInvocation;
+ expect(invocation.function, isNotNull);
+ expect(invocation.typeArguments, isNotNull);
+ ArgumentList argumentList = invocation.argumentList;
+ expect(argumentList, isNotNull);
+ expect(argumentList.arguments, hasLength(1));
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_final_type_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter =
- parseFormalParameter('covariant final A a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_expression_dot() {
+ createParser('(x).y');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ expect(propertyAccess.target, isNotNull);
+ expect(propertyAccess.operator.type, TokenType.PERIOD);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_type_function() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter =
- parseFormalParameter('covariant String Function(int) a', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_expression_index() {
+ createParser('(x)[y]');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, new isInstanceOf<GenericFunctionType>());
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<IndexExpression>());
+ IndexExpression indexExpression = expression;
+ expect(indexExpression.target, isNotNull);
+ expect(indexExpression.leftBracket, isNotNull);
+ expect(indexExpression.index, isNotNull);
+ expect(indexExpression.rightBracket, isNotNull);
}
- void test_parseFormalParameter_covariant_type_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter =
- parseFormalParameter('covariant A a : null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_expression_question_dot() {
+ createParser('(x)?.y');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ expect(propertyAccess.target, isNotNull);
+ expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_type_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter =
- parseFormalParameter('covariant A<B<C>> a', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_identifier() {
+ createParser('x');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = expression;
+ expect(identifier, isNotNull);
}
- void test_parseFormalParameter_covariant_type_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter =
- parseFormalParameter('covariant A a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_identifier_args_dot() {
+ createParser('x(y).z');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ MethodInvocation invocation = propertyAccess.target as MethodInvocation;
+ expect(invocation.methodName.name, "x");
+ expect(invocation.typeArguments, isNull);
+ ArgumentList argumentList = invocation.argumentList;
+ expect(argumentList, isNotNull);
+ expect(argumentList.arguments, hasLength(1));
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_var_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter =
- parseFormalParameter('covariant var a : null', kind);
- expect(parameter, isNotNull);
+ void
+ test_parseAssignableExpression_identifier_args_dot_typeParameterComments() {
+ enableGenericMethodComments = true;
+ createParser('x/*<E>*/(y).z');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ MethodInvocation invocation = propertyAccess.target as MethodInvocation;
+ expect(invocation.methodName.name, "x");
+ expect(invocation.typeArguments, isNotNull);
+ ArgumentList argumentList = invocation.argumentList;
+ expect(argumentList, isNotNull);
+ expect(argumentList.arguments, hasLength(1));
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_var_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter = parseFormalParameter('covariant var a', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_identifier_args_dot_typeParameters() {
+ createParser('x<E>(y).z');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ MethodInvocation invocation = propertyAccess.target as MethodInvocation;
+ expect(invocation.methodName.name, "x");
+ expect(invocation.typeArguments, isNotNull);
+ ArgumentList argumentList = invocation.argumentList;
+ expect(argumentList, isNotNull);
+ expect(argumentList.arguments, hasLength(1));
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_covariant_var_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter =
- parseFormalParameter('covariant var a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_identifier_dot() {
+ createParser('x.y');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ expect(propertyAccess.target, isNotNull);
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.operator.type, TokenType.PERIOD);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_final_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter = parseFormalParameter('final a : null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_identifier_index() {
+ createParser('x[y]');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<IndexExpression>());
+ IndexExpression indexExpression = expression;
+ expect(indexExpression.target, isNotNull);
+ expect(indexExpression.leftBracket, isNotNull);
+ expect(indexExpression.index, isNotNull);
+ expect(indexExpression.rightBracket, isNotNull);
}
- void test_parseFormalParameter_final_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter = parseFormalParameter('final a', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_identifier_question_dot() {
+ createParser('x?.y');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ expect(propertyAccess.target, isNotNull);
+ expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_final_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter = parseFormalParameter('final a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_super_dot() {
+ createParser('super.y');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+ SuperExpression, propertyAccess.target);
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_final_type_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter = parseFormalParameter('final A a : null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableExpression_super_index() {
+ createParser('super[y]');
+ Expression expression = parser.parseAssignableExpression(false);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<IndexExpression>());
+ IndexExpression indexExpression = expression;
+ expect(indexExpression.target, new isInstanceOf<SuperExpression>());
+ expect(indexExpression.leftBracket, isNotNull);
+ expect(indexExpression.index, isNotNull);
+ expect(indexExpression.rightBracket, isNotNull);
}
- void test_parseFormalParameter_final_type_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter = parseFormalParameter('final A a', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableSelector_dot() {
+ createParser('.x');
+ Expression expression = parser.parseAssignableSelector(null, true);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ expect(propertyAccess.operator.type, TokenType.PERIOD);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_final_type_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter = parseFormalParameter('final A a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableSelector_index() {
+ createParser('[x]');
+ Expression expression = parser.parseAssignableSelector(null, true);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<IndexExpression>());
+ IndexExpression indexExpression = expression;
+ expect(indexExpression.leftBracket, isNotNull);
+ expect(indexExpression.index, isNotNull);
+ expect(indexExpression.rightBracket, isNotNull);
}
- void test_parseFormalParameter_type_function() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter =
- parseFormalParameter('String Function(int) a', kind);
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, new isInstanceOf<GenericFunctionType>());
- expect(simpleParameter.kind, kind);
- }
-
- void test_parseFormalParameter_type_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter = parseFormalParameter('A a : null', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableSelector_none() {
+ createParser(';');
+ Expression expression =
+ parser.parseAssignableSelector(astFactory.simpleIdentifier(null), true);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = expression;
+ expect(identifier, isNotNull);
}
- void test_parseFormalParameter_type_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter = parseFormalParameter('A a', kind);
- expect(parameter, isNotNull);
+ void test_parseAssignableSelector_question_dot() {
+ createParser('?.x');
+ Expression expression = parser.parseAssignableSelector(null, true);
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_parseFormalParameter_type_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter = parseFormalParameter('A a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseAwaitExpression() {
+ createParser('await x;');
+ AwaitExpression expression = parser.parseAwaitExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression.awaitKeyword, isNotNull);
+ expect(expression.expression, isNotNull);
}
- void test_parseFormalParameter_var_named() {
- ParameterKind kind = ParameterKind.NAMED;
- FormalParameter parameter = parseFormalParameter('var a : null', kind);
- expect(parameter, isNotNull);
+ void test_parseBitwiseAndExpression_normal() {
+ createParser('x & y');
+ Expression expression = parser.parseBitwiseAndExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.AMPERSAND);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameter_var_normal() {
- ParameterKind kind = ParameterKind.REQUIRED;
- FormalParameter parameter = parseFormalParameter('var a', kind);
- expect(parameter, isNotNull);
+ void test_parseBitwiseAndExpression_super() {
+ createParser('super & y');
+ Expression expression = parser.parseBitwiseAndExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.AMPERSAND);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameter_var_positional() {
- ParameterKind kind = ParameterKind.POSITIONAL;
- FormalParameter parameter = parseFormalParameter('var a = null', kind);
- expect(parameter, isNotNull);
+ void test_parseBitwiseOrExpression_normal() {
+ createParser('x | y');
+ Expression expression = parser.parseBitwiseOrExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter defaultParameter = parameter;
- SimpleFormalParameter simpleParameter =
- defaultParameter.parameter as SimpleFormalParameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.identifier, isNotNull);
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.kind, kind);
- expect(defaultParameter.separator, isNotNull);
- expect(defaultParameter.defaultValue, isNotNull);
- expect(defaultParameter.kind, kind);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.BAR);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameterList_empty() {
- FormalParameterList list = parseFormalParameterList('()');
- expect(list, isNotNull);
+ void test_parseBitwiseOrExpression_super() {
+ createParser('super | y');
+ Expression expression = parser.parseBitwiseOrExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(0));
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.BAR);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameterList_named_multiple() {
- FormalParameterList list =
- parseFormalParameterList('({A a : 1, B b, C c : 3})');
- expect(list, isNotNull);
+ void test_parseBitwiseXorExpression_normal() {
+ createParser('x ^ y');
+ Expression expression = parser.parseBitwiseXorExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(3));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.CARET);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameterList_named_single() {
- FormalParameterList list = parseFormalParameterList('({A a})');
- expect(list, isNotNull);
+ void test_parseBitwiseXorExpression_super() {
+ createParser('super ^ y');
+ Expression expression = parser.parseBitwiseXorExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(1));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.CARET);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseFormalParameterList_named_trailing_comma() {
- FormalParameterList list = parseFormalParameterList('(A a, {B b,})');
- expect(list, isNotNull);
+ void test_parseCascadeSection_i() {
+ createParser('..[i]');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(2));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<IndexExpression>());
+ IndexExpression section = expression;
+ expect(section.target, isNull);
+ expect(section.leftBracket, isNotNull);
+ expect(section.index, isNotNull);
+ expect(section.rightBracket, isNotNull);
}
- void test_parseFormalParameterList_normal_multiple() {
- FormalParameterList list = parseFormalParameterList('(A a, B b, C c)');
- expect(list, isNotNull);
+ void test_parseCascadeSection_ia() {
+ createParser('..[i](b)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(3));
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<IndexExpression>());
+ expect(section.typeArguments, isNull);
+ expect(section.argumentList, isNotNull);
}
- void test_parseFormalParameterList_normal_named() {
- FormalParameterList list = parseFormalParameterList('(A a, {B b})');
- expect(list, isNotNull);
+ void test_parseCascadeSection_ia_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('..[i]/*<E>*/(b)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(2));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<IndexExpression>());
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
}
- void test_parseFormalParameterList_normal_named_inFunctionType() {
- FormalParameterList list =
- parseFormalParameterList('(A, {B b})', inFunctionType: true);
- expect(list, isNotNull);
+ void test_parseCascadeSection_ia_typeArguments() {
+ createParser('..[i]<E>(b)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
- NodeList<FormalParameter> parameters = list.parameters;
- expect(parameters, hasLength(2));
-
- expect(parameters[0], new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter required = parameters[0];
- expect(required.identifier, isNull);
- expect(required.type, new isInstanceOf<TypeName>());
- expect((required.type as TypeName).name.name, 'A');
-
- expect(parameters[1], new isInstanceOf<DefaultFormalParameter>());
- DefaultFormalParameter named = parameters[1];
- expect(named.identifier, isNotNull);
- expect(named.parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simple = named.parameter;
- expect(simple.type, new isInstanceOf<TypeName>());
- expect((simple.type as TypeName).name.name, 'B');
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<IndexExpression>());
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
}
- void test_parseFormalParameterList_normal_positional() {
- FormalParameterList list = parseFormalParameterList('(A a, [B b])');
- expect(list, isNotNull);
+ void test_parseCascadeSection_ii() {
+ createParser('..a(b).c(d)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(2));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation section = expression;
+ expect(section.target, new isInstanceOf<MethodInvocation>());
+ expect(section.operator, isNotNull);
+ expect(section.methodName, isNotNull);
+ expect(section.typeArguments, isNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseFormalParameterList_normal_single() {
- FormalParameterList list = parseFormalParameterList('(A a)');
- expect(list, isNotNull);
+ void test_parseCascadeSection_ii_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('..a/*<E>*/(b).c/*<F>*/(d)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(1));
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation section = expression;
+ expect(section.target, new isInstanceOf<MethodInvocation>());
+ expect(section.operator, isNotNull);
+ expect(section.methodName, isNotNull);
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseFormalParameterList_normal_single_Function() {
- FormalParameterList list = parseFormalParameterList('(Function f)');
- expect(list, isNotNull);
+ void test_parseCascadeSection_ii_typeArguments() {
+ createParser('..a<E>(b).c<F>(d)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(1));
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation section = expression;
+ expect(section.target, new isInstanceOf<MethodInvocation>());
+ expect(section.operator, isNotNull);
+ expect(section.methodName, isNotNull);
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseFormalParameterList_normal_single_trailing_comma() {
- FormalParameterList list = parseFormalParameterList('(A a,)');
- expect(list, isNotNull);
+ void test_parseCascadeSection_p() {
+ createParser('..a');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(1));
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess section = expression;
+ expect(section.target, isNull);
+ expect(section.operator, isNotNull);
+ expect(section.propertyName, isNotNull);
}
- void test_parseFormalParameterList_positional_multiple() {
- FormalParameterList list =
- parseFormalParameterList('([A a = null, B b, C c = null])');
- expect(list, isNotNull);
+ void test_parseCascadeSection_p_assign() {
+ createParser('..a = 3');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(3));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<AssignmentExpression>());
+ AssignmentExpression section = expression;
+ expect(section.leftHandSide, isNotNull);
+ expect(section.operator, isNotNull);
+ Expression rhs = section.rightHandSide;
+ expect(rhs, isNotNull);
}
- void test_parseFormalParameterList_positional_single() {
- FormalParameterList list = parseFormalParameterList('([A a = null])');
- expect(list, isNotNull);
+ void test_parseCascadeSection_p_assign_withCascade() {
+ createParser('..a = 3..m()');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(1));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<AssignmentExpression>());
+ AssignmentExpression section = expression;
+ expect(section.leftHandSide, isNotNull);
+ expect(section.operator, isNotNull);
+ Expression rhs = section.rightHandSide;
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
}
- void test_parseFormalParameterList_positional_trailing_comma() {
- FormalParameterList list = parseFormalParameterList('(A a, [B b,])');
- expect(list, isNotNull);
+ void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('..a = 3..m/*<E>*/()');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNotNull);
- expect(list.parameters, hasLength(2));
- expect(list.rightDelimiter, isNotNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<AssignmentExpression>());
+ AssignmentExpression section = expression;
+ expect(section.leftHandSide, isNotNull);
+ expect(section.operator, isNotNull);
+ Expression rhs = section.rightHandSide;
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
}
- void test_parseFormalParameterList_prefixedType() {
- FormalParameterList list = parseFormalParameterList('(io.File f)');
- expect(list, isNotNull);
+ void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
+ createParser('..a = 3..m<E>()');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(1));
- expect(list.parameters[0].toSource(), 'io.File f');
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
- }
-
- void test_parseFormalParameterList_prefixedType_partial() {
- FormalParameterList list = parseFormalParameterList('(io.)', errorCodes: [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- expect(list, isNotNull);
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(1));
- expect(list.parameters[0].toSource(), 'io. ');
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
- }
-
- void test_parseFormalParameterList_prefixedType_partial2() {
- FormalParameterList list = parseFormalParameterList('(io.,a)', errorCodes: [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- expect(list, isNotNull);
- expect(list.leftParenthesis, isNotNull);
- expect(list.leftDelimiter, isNull);
- expect(list.parameters, hasLength(2));
- expect(list.parameters[0].toSource(), 'io. ');
- expect(list.parameters[1].toSource(), 'a');
- expect(list.rightDelimiter, isNull);
- expect(list.rightParenthesis, isNotNull);
+ expect(expression, new isInstanceOf<AssignmentExpression>());
+ AssignmentExpression section = expression;
+ expect(section.leftHandSide, isNotNull);
+ expect(section.operator, isNotNull);
+ Expression rhs = section.rightHandSide;
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
}
- void test_parseNormalFormalParameter_field_const_noType() {
- NormalFormalParameter parameter =
- parseNormalFormalParameter('const this.a');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_p_builtIn() {
+ createParser('..as');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNotNull);
- expect(fieldParameter.type, isNull);
- expect(fieldParameter.identifier, isNotNull);
- expect(fieldParameter.parameters, isNull);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess section = expression;
+ expect(section.target, isNull);
+ expect(section.operator, isNotNull);
+ expect(section.propertyName, isNotNull);
}
- void test_parseNormalFormalParameter_field_const_type() {
- NormalFormalParameter parameter =
- parseNormalFormalParameter('const A this.a');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_pa() {
+ createParser('..a(b)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNotNull);
- expect(fieldParameter.type, isNotNull);
- expect(fieldParameter.identifier, isNotNull);
- expect(fieldParameter.parameters, isNull);
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation section = expression;
+ expect(section.target, isNull);
+ expect(section.operator, isNotNull);
+ expect(section.methodName, isNotNull);
+ expect(section.typeArguments, isNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_field_final_noType() {
- NormalFormalParameter parameter =
- parseNormalFormalParameter('final this.a');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_pa_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('..a/*<E>*/(b)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNotNull);
- expect(fieldParameter.type, isNull);
- expect(fieldParameter.identifier, isNotNull);
- expect(fieldParameter.parameters, isNull);
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation section = expression;
+ expect(section.target, isNull);
+ expect(section.operator, isNotNull);
+ expect(section.methodName, isNotNull);
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_field_final_type() {
- NormalFormalParameter parameter =
- parseNormalFormalParameter('final A this.a');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_pa_typeArguments() {
+ createParser('..a<E>(b)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNotNull);
- expect(fieldParameter.type, isNotNull);
- expect(fieldParameter.identifier, isNotNull);
- expect(fieldParameter.parameters, isNull);
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation section = expression;
+ expect(section.target, isNull);
+ expect(section.operator, isNotNull);
+ expect(section.methodName, isNotNull);
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_field_function_nested() {
- NormalFormalParameter parameter = parseNormalFormalParameter('this.a(B b)');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_paa() {
+ createParser('..a(b)(c)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNull);
- expect(fieldParameter.type, isNull);
- expect(fieldParameter.identifier, isNotNull);
- FormalParameterList parameterList = fieldParameter.parameters;
- expect(parameterList, isNotNull);
- expect(parameterList.parameters, hasLength(1));
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<MethodInvocation>());
+ expect(section.typeArguments, isNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_field_function_noNested() {
- NormalFormalParameter parameter = parseNormalFormalParameter('this.a()');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_paa_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('..a/*<E>*/(b)/*<F>*/(c)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNull);
- expect(fieldParameter.type, isNull);
- expect(fieldParameter.identifier, isNotNull);
- FormalParameterList parameterList = fieldParameter.parameters;
- expect(parameterList, isNotNull);
- expect(parameterList.parameters, hasLength(0));
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<MethodInvocation>());
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_field_noType() {
- NormalFormalParameter parameter = parseNormalFormalParameter('this.a');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_paa_typeArguments() {
+ createParser('..a<E>(b)<F>(c)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNull);
- expect(fieldParameter.type, isNull);
- expect(fieldParameter.identifier, isNotNull);
- expect(fieldParameter.parameters, isNull);
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<MethodInvocation>());
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_field_type() {
- NormalFormalParameter parameter = parseNormalFormalParameter('A this.a');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_paapaa() {
+ createParser('..a(b)(c).d(e)(f)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNull);
- expect(fieldParameter.type, isNotNull);
- expect(fieldParameter.identifier, isNotNull);
- expect(fieldParameter.parameters, isNull);
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<MethodInvocation>());
+ expect(section.typeArguments, isNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_field_var() {
- NormalFormalParameter parameter = parseNormalFormalParameter('var this.a');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_paapaa_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('..a/*<E>*/(b)/*<F>*/(c).d/*<G>*/(e)/*<H>*/(f)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FieldFormalParameter>());
- FieldFormalParameter fieldParameter = parameter;
- expect(fieldParameter.keyword, isNotNull);
- expect(fieldParameter.type, isNull);
- expect(fieldParameter.identifier, isNotNull);
- expect(fieldParameter.parameters, isNull);
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<MethodInvocation>());
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_function_noType() {
- NormalFormalParameter parameter = parseNormalFormalParameter('a()');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_paapaa_typeArguments() {
+ createParser('..a<E>(b)<F>(c).d<G>(e)<H>(f)');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNull);
- expect(functionParameter.parameters, isNotNull);
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation section = expression;
+ expect(section.function, new isInstanceOf<MethodInvocation>());
+ expect(section.typeArguments, isNotNull);
+ expect(section.argumentList, isNotNull);
+ expect(section.argumentList.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_function_noType_nullable() {
- enableNnbd = true;
- NormalFormalParameter parameter = parseNormalFormalParameter('a()?');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_pap() {
+ createParser('..a(b).c');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNotNull);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess section = expression;
+ expect(section.target, isNotNull);
+ expect(section.operator, isNotNull);
+ expect(section.propertyName, isNotNull);
}
- void test_parseNormalFormalParameter_function_noType_typeParameterComments() {
+ void test_parseCascadeSection_pap_typeArgumentComments() {
enableGenericMethodComments = true;
- NormalFormalParameter parameter = parseNormalFormalParameter('a/*<E>*/()');
- expect(parameter, isNotNull);
+ createParser('..a/*<E>*/(b).c');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess section = expression;
+ expect(section.target, isNotNull);
+ expect(section.operator, isNotNull);
+ expect(section.propertyName, isNotNull);
}
- void test_parseNormalFormalParameter_function_noType_typeParameters() {
- NormalFormalParameter parameter = parseNormalFormalParameter('a<E>()');
- expect(parameter, isNotNull);
+ void test_parseCascadeSection_pap_typeArguments() {
+ createParser('..a<E>(b).c');
+ Expression expression = parser.parseCascadeSection();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNull);
- expect(functionParameter.question, isNull);
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess section = expression;
+ expect(section.target, isNotNull);
+ expect(section.operator, isNotNull);
+ expect(section.propertyName, isNotNull);
}
- void
- test_parseNormalFormalParameter_function_noType_typeParameters_nullable() {
- enableNnbd = true;
- NormalFormalParameter parameter = parseNormalFormalParameter('a<E>()?');
- expect(parameter, isNotNull);
+ void test_parseConditionalExpression() {
+ createParser('x ? y : z');
+ ConditionalExpression expression = parser.parseConditionalExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNotNull);
+ expect(expression.condition, isNotNull);
+ expect(expression.question, isNotNull);
+ expect(expression.thenExpression, isNotNull);
+ expect(expression.colon, isNotNull);
+ expect(expression.elseExpression, isNotNull);
}
- void test_parseNormalFormalParameter_function_type() {
- NormalFormalParameter parameter = parseNormalFormalParameter('A a()');
- expect(parameter, isNotNull);
+ void test_parseConstExpression_instanceCreation() {
+ createParser('const A()');
+ Expression expression = parser.parseConstExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNull);
+ expect(expression, new isInstanceOf<InstanceCreationExpression>());
+ InstanceCreationExpression instanceCreation = expression;
+ expect(instanceCreation.keyword, isNotNull);
+ ConstructorName name = instanceCreation.constructorName;
+ expect(name, isNotNull);
+ expect(name.type, isNotNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(instanceCreation.argumentList, isNotNull);
}
- void test_parseNormalFormalParameter_function_type_nullable() {
- enableNnbd = true;
- NormalFormalParameter parameter = parseNormalFormalParameter('A a()?');
- expect(parameter, isNotNull);
+ void test_parseConstExpression_listLiteral_typed() {
+ createParser('const <A> []');
+ Expression expression = parser.parseConstExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNotNull);
+ expect(expression, new isInstanceOf<ListLiteral>());
+ ListLiteral literal = expression;
+ expect(literal.constKeyword, isNotNull);
+ expect(literal.typeArguments, isNotNull);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.elements, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
}
- void test_parseNormalFormalParameter_function_type_typeParameterComments() {
+ void test_parseConstExpression_listLiteral_typed_genericComment() {
enableGenericMethodComments = true;
- NormalFormalParameter parameter =
- parseNormalFormalParameter('A a/*<E>*/()');
- expect(parameter, isNotNull);
+ createParser('const /*<A>*/ []');
+ Expression expression = parser.parseConstExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNull);
+ expect(expression, new isInstanceOf<ListLiteral>());
+ ListLiteral literal = expression;
+ expect(literal.constKeyword, isNotNull);
+ expect(literal.typeArguments, isNotNull);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.elements, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
}
- void test_parseNormalFormalParameter_function_type_typeParameters() {
- NormalFormalParameter parameter = parseNormalFormalParameter('A a<E>()');
- expect(parameter, isNotNull);
+ void test_parseConstExpression_listLiteral_untyped() {
+ createParser('const []');
+ Expression expression = parser.parseConstExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNull);
+ expect(expression, new isInstanceOf<ListLiteral>());
+ ListLiteral literal = expression;
+ expect(literal.constKeyword, isNotNull);
+ expect(literal.typeArguments, isNull);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.elements, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
}
- void test_parseNormalFormalParameter_function_type_typeParameters_nullable() {
- enableNnbd = true;
- NormalFormalParameter parameter = parseNormalFormalParameter('A a<E>()?');
- expect(parameter, isNotNull);
+ void test_parseConstExpression_mapLiteral_typed() {
+ createParser('const <A, B> {}');
+ Expression expression = parser.parseConstExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNotNull);
+ expect(expression, new isInstanceOf<MapLiteral>());
+ MapLiteral literal = expression;
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.entries, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
+ expect(literal.typeArguments, isNotNull);
}
- void test_parseNormalFormalParameter_function_void() {
- NormalFormalParameter parameter = parseNormalFormalParameter('void a()');
- expect(parameter, isNotNull);
+ void test_parseConstExpression_mapLiteral_typed_genericComment() {
+ enableGenericMethodComments = true;
+ createParser('const /*<A, B>*/ {}');
+ Expression expression = parser.parseConstExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNull);
+ expect(expression, new isInstanceOf<MapLiteral>());
+ MapLiteral literal = expression;
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.entries, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
+ expect(literal.typeArguments, isNotNull);
}
- void test_parseNormalFormalParameter_function_void_nullable() {
- enableNnbd = true;
- NormalFormalParameter parameter = parseNormalFormalParameter('void a()?');
- expect(parameter, isNotNull);
+ void test_parseConstExpression_mapLiteral_untyped() {
+ createParser('const {}');
+ Expression expression = parser.parseConstExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNotNull);
+ expect(expression, new isInstanceOf<MapLiteral>());
+ MapLiteral literal = expression;
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.entries, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
+ expect(literal.typeArguments, isNull);
}
- void test_parseNormalFormalParameter_function_void_typeParameterComments() {
- enableGenericMethodComments = true;
- NormalFormalParameter parameter =
- parseNormalFormalParameter('void a/*<E>*/()');
- expect(parameter, isNotNull);
+ void test_parseEqualityExpression_normal() {
+ createParser('x == y');
+ BinaryExpression expression = parser.parseEqualityExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNull);
+ expect(expression.leftOperand, isNotNull);
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.EQ_EQ);
+ expect(expression.rightOperand, isNotNull);
}
- void test_parseNormalFormalParameter_function_void_typeParameters() {
- NormalFormalParameter parameter = parseNormalFormalParameter('void a<E>()');
- expect(parameter, isNotNull);
+ void test_parseEqualityExpression_super() {
+ createParser('super == y');
+ BinaryExpression expression = parser.parseEqualityExpression();
+ expect(expression, isNotNull);
assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNull);
+ expect(expression.leftOperand, new isInstanceOf<SuperExpression>());
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.EQ_EQ);
+ expect(expression.rightOperand, isNotNull);
}
- void test_parseNormalFormalParameter_function_void_typeParameters_nullable() {
- enableNnbd = true;
- NormalFormalParameter parameter =
- parseNormalFormalParameter('void a<E>()?');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
- FunctionTypedFormalParameter functionParameter = parameter;
- expect(functionParameter.returnType, isNotNull);
- expect(functionParameter.identifier, isNotNull);
- expect(functionParameter.typeParameters, isNotNull);
- expect(functionParameter.parameters, isNotNull);
- expect(functionParameter.question, isNotNull);
+ void test_parseExpression_assign() {
+ // TODO(brianwilkerson) Implement more tests for this method.
+ Expression expression = parseExpression('x = y');
+ expect(expression, new isInstanceOf<AssignmentExpression>());
+ AssignmentExpression assignmentExpression = expression;
+ expect(assignmentExpression.leftHandSide, isNotNull);
+ expect(assignmentExpression.operator, isNotNull);
+ expect(assignmentExpression.operator.type, TokenType.EQ);
+ expect(assignmentExpression.rightHandSide, isNotNull);
}
- void test_parseNormalFormalParameter_simple_const_noType() {
- NormalFormalParameter parameter = parseNormalFormalParameter('const a');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.identifier, isNotNull);
+ void test_parseExpression_assign_compound() {
+ enableLazyAssignmentOperators = true;
+ Expression expression = parseExpression('x ||= y');
+ expect(expression, new isInstanceOf<AssignmentExpression>());
+ AssignmentExpression assignmentExpression = expression;
+ expect(assignmentExpression.leftHandSide, isNotNull);
+ expect(assignmentExpression.operator, isNotNull);
+ expect(assignmentExpression.operator.type, TokenType.BAR_BAR_EQ);
+ expect(assignmentExpression.rightHandSide, isNotNull);
}
- void test_parseNormalFormalParameter_simple_const_type() {
- NormalFormalParameter parameter = parseNormalFormalParameter('const A a');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
+ void test_parseExpression_comparison() {
+ Expression expression = parseExpression('--a.b == c');
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.EQ_EQ);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_parseNormalFormalParameter_simple_final_noType() {
- NormalFormalParameter parameter = parseNormalFormalParameter('final a');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.identifier, isNotNull);
+ void test_parseExpression_function_async() {
+ Expression expression = parseExpression('() async {}');
+ expect(expression, new isInstanceOf<FunctionExpression>());
+ FunctionExpression functionExpression = expression;
+ expect(functionExpression.body, isNotNull);
+ expect(functionExpression.body.isAsynchronous, isTrue);
+ expect(functionExpression.body.isGenerator, isFalse);
+ expect(functionExpression.parameters, isNotNull);
}
- void test_parseNormalFormalParameter_simple_final_type() {
- NormalFormalParameter parameter = parseNormalFormalParameter('final A a');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.keyword, isNotNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
+ void test_parseExpression_function_asyncStar() {
+ Expression expression = parseExpression('() async* {}');
+ expect(expression, new isInstanceOf<FunctionExpression>());
+ FunctionExpression functionExpression = expression;
+ expect(functionExpression.body, isNotNull);
+ expect(functionExpression.body.isAsynchronous, isTrue);
+ expect(functionExpression.body.isGenerator, isTrue);
+ expect(functionExpression.parameters, isNotNull);
}
- void test_parseNormalFormalParameter_simple_noName() {
- NormalFormalParameter parameter =
- parseNormalFormalParameter('a', inFunctionType: true);
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.identifier, isNull);
+ void test_parseExpression_function_sync() {
+ Expression expression = parseExpression('() {}');
+ expect(expression, new isInstanceOf<FunctionExpression>());
+ FunctionExpression functionExpression = expression;
+ expect(functionExpression.body, isNotNull);
+ expect(functionExpression.body.isAsynchronous, isFalse);
+ expect(functionExpression.body.isGenerator, isFalse);
+ expect(functionExpression.parameters, isNotNull);
}
- void test_parseNormalFormalParameter_simple_noType() {
- NormalFormalParameter parameter = parseNormalFormalParameter('a');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.identifier, isNotNull);
+ void test_parseExpression_function_syncStar() {
+ Expression expression = parseExpression('() sync* {}');
+ expect(expression, new isInstanceOf<FunctionExpression>());
+ FunctionExpression functionExpression = expression;
+ expect(functionExpression.body, isNotNull);
+ expect(functionExpression.body.isAsynchronous, isFalse);
+ expect(functionExpression.body.isGenerator, isTrue);
+ expect(functionExpression.parameters, isNotNull);
}
- void test_parseNormalFormalParameter_simple_noType_namedCovariant() {
- NormalFormalParameter parameter = parseNormalFormalParameter('covariant');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.covariantKeyword, isNull);
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNull);
- expect(simpleParameter.identifier, isNotNull);
+ void test_parseExpression_invokeFunctionExpression() {
+ Expression expression = parseExpression('(a) {return a + a;} (3)');
+ expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
+ FunctionExpressionInvocation invocation = expression;
+ expect(invocation.function, new isInstanceOf<FunctionExpression>());
+ FunctionExpression functionExpression =
+ invocation.function as FunctionExpression;
+ expect(functionExpression.parameters, isNotNull);
+ expect(functionExpression.body, isNotNull);
+ expect(invocation.typeArguments, isNull);
+ ArgumentList list = invocation.argumentList;
+ expect(list, isNotNull);
+ expect(list.arguments, hasLength(1));
}
- void test_parseNormalFormalParameter_simple_type() {
- NormalFormalParameter parameter = parseNormalFormalParameter('A a');
- expect(parameter, isNotNull);
- assertNoErrors();
- expect(parameter, new isInstanceOf<SimpleFormalParameter>());
- SimpleFormalParameter simpleParameter = parameter;
- expect(simpleParameter.keyword, isNull);
- expect(simpleParameter.type, isNotNull);
- expect(simpleParameter.identifier, isNotNull);
+ void test_parseExpression_nonAwait() {
+ Expression expression = parseExpression('await()');
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation invocation = expression;
+ expect(invocation.methodName.name, 'await');
+ expect(invocation.typeArguments, isNull);
+ expect(invocation.argumentList, isNotNull);
}
-}
-@reflectiveTest
-class NonErrorParserTest extends ParserTestCase {
- void test_constFactory_external() {
- createParser('external const factory C();');
- ClassMember member = parser.parseClassMember('C');
- expectNotNullIfNoErrors(member);
- listener.assertNoErrors();
+ void test_parseExpression_superMethodInvocation() {
+ Expression expression = parseExpression('super.m()');
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation invocation = expression;
+ expect(invocation.target, isNotNull);
+ expect(invocation.methodName, isNotNull);
+ expect(invocation.typeArguments, isNull);
+ expect(invocation.argumentList, isNotNull);
}
- void test_staticMethod_notParsingFunctionBodies() {
- ParserTestCase.parseFunctionBodies = false;
- try {
- createParser('class C { static void m() {} }');
- CompilationUnit unit = parser.parseCompilationUnit2();
- expectNotNullIfNoErrors(unit);
- listener.assertNoErrors();
- } finally {
- ParserTestCase.parseFunctionBodies = true;
- }
+ void test_parseExpression_superMethodInvocation_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ Expression expression = parseExpression('super.m/*<E>*/()');
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation invocation = expression;
+ expect(invocation.target, isNotNull);
+ expect(invocation.methodName, isNotNull);
+ expect(invocation.typeArguments, isNotNull);
+ expect(invocation.argumentList, isNotNull);
}
-}
-
-/**
- * Implementation of [AbstractParserTestCase] specialized for testing the
- * analyzer parser.
- */
-class ParserTestCase extends EngineTestCase
- with ParserTestHelpers
- implements AbstractParserTestCase {
- /**
- * A flag indicating whether parser is to parse function bodies.
- */
- static bool parseFunctionBodies = true;
-
- /**
- * A flag indicating whether the parser is to parse asserts in the initializer
- * list of a constructor.
- */
- bool enableAssertInitializer = false;
-
- /**
- * A flag indicating whether parser is to parse async.
- */
- bool parseAsync = true;
-
- /**
- * Whether generic method comments should be enabled for the test.
- */
- bool enableGenericMethodComments = false;
- /**
- * A flag indicating whether lazy assignment operators should be enabled for
- * the test.
- */
- bool enableLazyAssignmentOperators = false;
+ void test_parseExpression_superMethodInvocation_typeArguments() {
+ Expression expression = parseExpression('super.m<E>()');
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation invocation = expression;
+ expect(invocation.target, isNotNull);
+ expect(invocation.methodName, isNotNull);
+ expect(invocation.typeArguments, isNotNull);
+ expect(invocation.argumentList, isNotNull);
+ }
- /**
- * A flag indicating whether the parser is to parse the non-nullable modifier
- * in type names.
- */
- bool enableNnbd = false;
+ void test_parseExpressionList_multiple() {
+ createParser('1, 2, 3');
+ List<Expression> result = parser.parseExpressionList();
+ expect(result, isNotNull);
+ assertNoErrors();
+ expect(result, hasLength(3));
+ }
- /**
- * A flag indicating whether the parser is to parse part-of directives that
- * specify a URI rather than a library name.
- */
- bool enableUriInPartOf = false;
+ void test_parseExpressionList_single() {
+ createParser('1');
+ List<Expression> result = parser.parseExpressionList();
+ expect(result, isNotNull);
+ assertNoErrors();
+ expect(result, hasLength(1));
+ }
- /**
- * The error listener to which scanner and parser errors will be reported.
- *
- * This field is typically initialized by invoking [createParser].
- */
- GatheringErrorListener listener;
+ void test_parseExpressionWithoutCascade_assign() {
+ // TODO(brianwilkerson) Implement more tests for this method.
+ createParser('x = y');
+ Expression expression = parser.parseExpressionWithoutCascade();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AssignmentExpression>());
+ AssignmentExpression assignmentExpression = expression;
+ expect(assignmentExpression.leftHandSide, isNotNull);
+ expect(assignmentExpression.operator, isNotNull);
+ expect(assignmentExpression.operator.type, TokenType.EQ);
+ expect(assignmentExpression.rightHandSide, isNotNull);
+ }
- /**
- * The parser used by the test.
- *
- * This field is typically initialized by invoking [createParser].
- */
- Parser parser;
+ void test_parseExpressionWithoutCascade_comparison() {
+ createParser('--a.b == c');
+ Expression expression = parser.parseExpressionWithoutCascade();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.EQ_EQ);
+ expect(binaryExpression.rightOperand, isNotNull);
+ }
- @override
- void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
- listener.assertErrorsWithCodes(expectedErrorCodes);
+ void test_parseExpressionWithoutCascade_superMethodInvocation() {
+ createParser('super.m()');
+ Expression expression = parser.parseExpressionWithoutCascade();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation invocation = expression;
+ expect(invocation.target, isNotNull);
+ expect(invocation.methodName, isNotNull);
+ expect(invocation.typeArguments, isNull);
+ expect(invocation.argumentList, isNotNull);
}
- @override
- void assertNoErrors() {
- listener.assertNoErrors();
+ void
+ test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('super.m/*<E>*/()');
+ Expression expression = parser.parseExpressionWithoutCascade();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation invocation = expression;
+ expect(invocation.target, isNotNull);
+ expect(invocation.methodName, isNotNull);
+ expect(invocation.typeArguments, isNotNull);
+ expect(invocation.argumentList, isNotNull);
}
- /**
- * Create the [parser] and [listener] used by a test. The [parser] will be
- * prepared to parse the tokens scanned from the given [content].
- */
- void createParser(String content) {
- listener = new GatheringErrorListener();
- //
- // Scan the source.
- //
- TestSource source = new TestSource();
- CharacterReader reader = new CharSequenceReader(content);
- Scanner scanner = new Scanner(source, reader, listener);
- scanner.scanGenericMethodComments = enableGenericMethodComments;
- scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators;
- Token tokenStream = scanner.tokenize();
- listener.setLineInfo(source, scanner.lineStarts);
- //
- // Create and initialize the parser.
- //
- parser = new Parser(source, listener);
- parser.enableAssertInitializer = enableAssertInitializer;
- parser.parseGenericMethodComments = enableGenericMethodComments;
- parser.parseFunctionBodies = parseFunctionBodies;
- parser.enableNnbd = enableNnbd;
- parser.enableUriInPartOf = enableUriInPartOf;
- parser.currentToken = tokenStream;
+ void
+ test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() {
+ createParser('super.m<E>()');
+ Expression expression = parser.parseExpressionWithoutCascade();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation invocation = expression;
+ expect(invocation.target, isNotNull);
+ expect(invocation.methodName, isNotNull);
+ expect(invocation.typeArguments, isNotNull);
+ expect(invocation.argumentList, isNotNull);
}
- void expectNotNullIfNoErrors(Object result) {
- if (!listener.hasErrors) {
- expect(result, isNotNull);
- }
+ void test_parseFunctionExpression_body_inExpression() {
+ createParser('(int i) => i++');
+ FunctionExpression expression = parser.parseFunctionExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.body, isNotNull);
+ expect(expression.typeParameters, isNull);
+ expect(expression.parameters, isNotNull);
+ expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
}
- /**
- * Parse the given source as a compilation unit.
- *
- * @param source the source to be parsed
- * @param errorCodes the error codes of the errors that are expected to be found
- * @return the compilation unit that was parsed
- * @throws Exception if the source could not be parsed, if the compilation errors in the source do
- * not match those that are expected, or if the result would have been `null`
- */
- CompilationUnit parseCompilationUnit(String source,
- [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
- GatheringErrorListener listener = new GatheringErrorListener();
- Scanner scanner =
- new Scanner(null, new CharSequenceReader(source), listener);
- listener.setLineInfo(new TestSource(), scanner.lineStarts);
- Token token = scanner.tokenize();
- Parser parser = new Parser(null, listener);
- CompilationUnit unit = parser.parseCompilationUnit(token);
- expect(unit, isNotNull);
- listener.assertErrorsWithCodes(errorCodes);
- return unit;
+ void test_parseFunctionExpression_typeParameterComments() {
+ enableGenericMethodComments = true;
+ createParser('/*<E>*/(/*=E*/ i) => i++');
+ FunctionExpression expression = parser.parseFunctionExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.body, isNotNull);
+ expect(expression.typeParameters, isNotNull);
+ expect(expression.parameters, isNotNull);
+ expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
+ SimpleFormalParameter p = expression.parameters.parameters[0];
+ expect(p.type, isNotNull);
}
- /**
- * Parse the given [code] as a compilation unit.
- */
- CompilationUnit parseCompilationUnit2(String code,
- {AnalysisErrorListener listener}) {
- listener ??= AnalysisErrorListener.NULL_LISTENER;
- Scanner scanner = new Scanner(null, new CharSequenceReader(code), listener);
- Token token = scanner.tokenize();
- Parser parser = new Parser(null, listener);
- CompilationUnit unit = parser.parseCompilationUnit(token);
- unit.lineInfo = new LineInfo(scanner.lineStarts);
- return unit;
+ void test_parseFunctionExpression_typeParameters() {
+ createParser('<E>(E i) => i++');
+ FunctionExpression expression = parser.parseFunctionExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.body, isNotNull);
+ expect(expression.typeParameters, isNotNull);
+ expect(expression.parameters, isNotNull);
+ expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
}
- /**
- * Parse the given [source] as a compilation unit. Throw an exception if the
- * source could not be parsed, if the compilation errors in the source do not
- * match those that are expected, or if the result would have been `null`.
- */
- CompilationUnit parseCompilationUnitWithOptions(String source,
- [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
- createParser(source);
- CompilationUnit unit = parser.parseCompilationUnit2();
- expect(unit, isNotNull);
- listener.assertErrorsWithCodes(errorCodes);
- return unit;
+ void test_parseInstanceCreationExpression_qualifiedType() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A.B()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
}
- @override
- CompilationUnit parseDirectives(String source,
- [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
- createParser(source);
- CompilationUnit unit = parser.parseDirectives2();
- expect(unit, isNotNull);
- expect(unit.declarations, hasLength(0));
- listener.assertErrorsWithCodes(errorCodes);
- return unit;
+ void test_parseInstanceCreationExpression_qualifiedType_named() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A.B.c()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
}
- /**
- * Parse the given source as an expression.
- *
- * @param source the source to be parsed
- * @param errorCodes the error codes of the errors that are expected to be found
- * @return the expression that was parsed
- * @throws Exception if the source could not be parsed, if the compilation errors in the source do
- * not match those that are expected, or if the result would have been `null`
- */
- Expression parseExpression(String source,
- [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
- createParser(source);
- Expression expression = parser.parseExpression2();
- expectNotNullIfNoErrors(expression);
- listener.assertErrorsWithCodes(errorCodes);
- return expression;
+ void
+ test_parseInstanceCreationExpression_qualifiedType_named_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A.B/*<E>*/.c()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
}
- @override
- FormalParameter parseFormalParameter(String code, ParameterKind kind,
- {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
- createParser(code);
- FormalParameter parameter = parser.parseFormalParameter(kind);
- assertErrorsWithCodes(errorCodes);
- return parameter;
+ void
+ test_parseInstanceCreationExpression_qualifiedType_named_typeParameters() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A.B<E>.c()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
}
- @override
- FormalParameterList parseFormalParameterList(String code,
- {bool inFunctionType: false,
- List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
- createParser(code);
- FormalParameterList list =
- parser.parseFormalParameterList(inFunctionType: inFunctionType);
- assertErrorsWithCodes(errorCodes);
- return list;
+ void
+ test_parseInstanceCreationExpression_qualifiedType_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A.B/*<E>*/()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
}
- /**
- * Parses a single top level member of a compilation unit (other than a
- * directive), including any comment and/or metadata that precedes it.
- */
- CompilationUnitMember parseFullCompilationUnitMember() =>
- parser.parseCompilationUnitMember(parser.parseCommentAndMetadata());
+ void test_parseInstanceCreationExpression_qualifiedType_typeParameters() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A.B<E>()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
- @override
- Directive parseFullDirective() =>
- parser.parseDirective(parser.parseCommentAndMetadata());
+ void test_parseInstanceCreationExpression_type() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
- /**
- * Parses a variable declaration list (equivalent to a variable declaration
- * statement, but without the final comma).
- */
- VariableDeclarationList parseFullVariableDeclarationList() =>
- parser.parseVariableDeclarationListAfterMetadata(
- parser.parseCommentAndMetadata());
+ void test_parseInstanceCreationExpression_type_named() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A.c()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
- @override
- NormalFormalParameter parseNormalFormalParameter(String code,
- {bool inFunctionType: false,
- List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
- createParser(code);
- FormalParameter parameter =
- parser.parseNormalFormalParameter(inFunctionType: inFunctionType);
- assertErrorsWithCodes(errorCodes);
- return parameter;
+ void test_parseInstanceCreationExpression_type_named_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A/*<B>*/.c()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
}
- /**
- * Parse the given [source] as a statement. The [errorCodes] are the error
- * codes of the errors that are expected to be found. If
- * [enableLazyAssignmentOperators] is `true`, then lazy assignment operators
- * should be enabled.
- */
- Statement parseStatement(String source,
- [List<ErrorCode> errorCodes = const <ErrorCode>[],
- bool enableLazyAssignmentOperators]) {
- GatheringErrorListener listener = new GatheringErrorListener();
- Scanner scanner =
- new Scanner(null, new CharSequenceReader(source), listener);
- scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators;
- listener.setLineInfo(new TestSource(), scanner.lineStarts);
- Token token = scanner.tokenize();
- Parser parser = new Parser(null, listener);
- Statement statement = parser.parseStatement(token);
- expect(statement, isNotNull);
- listener.assertErrorsWithCodes(errorCodes);
- return statement;
+ void test_parseInstanceCreationExpression_type_named_typeParameters() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A<B>.c()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
}
- /**
- * Parse the given source as a sequence of statements.
- *
- * @param source the source to be parsed
- * @param expectedCount the number of statements that are expected
- * @param errorCodes the error codes of the errors that are expected to be found
- * @return the statements that were parsed
- * @throws Exception if the source could not be parsed, if the number of statements does not match
- * the expected count, if the compilation errors in the source do not match those that
- * are expected, or if the result would have been `null`
- */
- List<Statement> parseStatements(String source, int expectedCount,
- [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
- GatheringErrorListener listener = new GatheringErrorListener();
- Scanner scanner =
- new Scanner(null, new CharSequenceReader(source), listener);
- listener.setLineInfo(new TestSource(), scanner.lineStarts);
- Token token = scanner.tokenize();
- Parser parser = new Parser(null, listener);
- List<Statement> statements = parser.parseStatements(token);
- expect(statements, hasLength(expectedCount));
- listener.assertErrorsWithCodes(errorCodes);
- return statements;
+ void test_parseInstanceCreationExpression_type_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A/*<B>*/()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
}
- @override
- void setUp() {
- super.setUp();
- parseFunctionBodies = true;
+ void test_parseInstanceCreationExpression_type_typeParameters() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A<B>()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
}
-}
-/**
- * Helper methods that aid in parser tests.
- *
- * Intended to be mixed in to parser test case classes.
- */
-class ParserTestHelpers {
- void expectCommentText(Comment comment, String expectedText) {
- expect(comment.beginToken, same(comment.endToken));
- expect(comment.beginToken.lexeme, expectedText);
+ void test_parseInstanceCreationExpression_type_typeParameters_nullable() {
+ enableNnbd = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ createParser('A<B?>()');
+ InstanceCreationExpression expression =
+ parser.parseInstanceCreationExpression(token);
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ NodeList<TypeAnnotation> arguments = type.typeArguments.arguments;
+ expect(arguments, hasLength(1));
+ expect((arguments[0] as TypeName).question, isNotNull);
}
- void expectDottedName(DottedName name, List<String> expectedComponents) {
- int count = expectedComponents.length;
- NodeList<SimpleIdentifier> components = name.components;
- expect(components, hasLength(count));
- for (int i = 0; i < count; i++) {
- SimpleIdentifier component = components[i];
- expect(component, isNotNull);
- expect(component.name, expectedComponents[i]);
- }
+ void test_parseListLiteral_empty_oneToken() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
+ TypeArgumentList typeArguments = null;
+ createParser('[]');
+ ListLiteral literal = parser.parseListLiteral(token, typeArguments);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.constKeyword, token);
+ expect(literal.typeArguments, typeArguments);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.elements, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
}
-}
-/**
- * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
- * sequences to ensure that the correct recovery steps are taken in the parser.
- */
-@reflectiveTest
-class RecoveryParserTest extends ParserTestCase {
- void test_additiveExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parseListLiteral_empty_oneToken_withComment() {
+ Token token = null;
+ TypeArgumentList typeArguments = null;
+ createParser('/* 0 */ []');
+ ListLiteral literal = parser.parseListLiteral(token, typeArguments);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.constKeyword, token);
+ expect(literal.typeArguments, typeArguments);
+ Token leftBracket = literal.leftBracket;
+ expect(leftBracket, isNotNull);
+ expect(leftBracket.precedingComments, isNotNull);
+ expect(literal.elements, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
}
- void test_additiveExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("+", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseListLiteral_empty_twoTokens() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
+ TypeArgumentList typeArguments = null;
+ createParser('[ ]');
+ ListLiteral literal = parser.parseListLiteral(token, typeArguments);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.constKeyword, token);
+ expect(literal.typeArguments, typeArguments);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.elements, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
}
- void test_additiveExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseListLiteral_multiple() {
+ createParser('[1, 2, 3]');
+ ListLiteral literal = parser.parseListLiteral(null, null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.constKeyword, isNull);
+ expect(literal.typeArguments, isNull);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.elements, hasLength(3));
+ expect(literal.rightBracket, isNotNull);
}
- void test_additiveExpression_missing_RHS_super() {
- BinaryExpression expression =
- parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseListLiteral_single() {
+ createParser('[1]');
+ ListLiteral literal = parser.parseListLiteral(null, null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.constKeyword, isNull);
+ expect(literal.typeArguments, isNull);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.elements, hasLength(1));
+ expect(literal.rightBracket, isNotNull);
}
- void test_additiveExpression_precedence_multiplicative_left() {
- BinaryExpression expression = parseExpression("* +", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseListOrMapLiteral_list_noType() {
+ createParser('[1]');
+ TypedLiteral literal = parser.parseListOrMapLiteral(null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal, new isInstanceOf<ListLiteral>());
+ ListLiteral listLiteral = literal;
+ expect(listLiteral.constKeyword, isNull);
+ expect(listLiteral.typeArguments, isNull);
+ expect(listLiteral.leftBracket, isNotNull);
+ expect(listLiteral.elements, hasLength(1));
+ expect(listLiteral.rightBracket, isNotNull);
}
- void test_additiveExpression_precedence_multiplicative_right() {
- BinaryExpression expression = parseExpression("+ *", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.rightOperand);
+ void test_parseListOrMapLiteral_list_type() {
+ createParser('<int> [1]');
+ TypedLiteral literal = parser.parseListOrMapLiteral(null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal, new isInstanceOf<ListLiteral>());
+ ListLiteral listLiteral = literal;
+ expect(listLiteral.constKeyword, isNull);
+ expect(listLiteral.typeArguments, isNotNull);
+ expect(listLiteral.leftBracket, isNotNull);
+ expect(listLiteral.elements, hasLength(1));
+ expect(listLiteral.rightBracket, isNotNull);
}
- void test_additiveExpression_super() {
- BinaryExpression expression = parseExpression("super + +", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseListOrMapLiteral_map_noType() {
+ createParser("{'1' : 1}");
+ TypedLiteral literal = parser.parseListOrMapLiteral(null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal, new isInstanceOf<MapLiteral>());
+ MapLiteral mapLiteral = literal;
+ expect(mapLiteral.constKeyword, isNull);
+ expect(mapLiteral.typeArguments, isNull);
+ expect(mapLiteral.leftBracket, isNotNull);
+ expect(mapLiteral.entries, hasLength(1));
+ expect(mapLiteral.rightBracket, isNotNull);
}
- void test_assignableSelector() {
- IndexExpression expression =
- parseExpression("a.b[]", [ParserErrorCode.MISSING_IDENTIFIER]);
- Expression index = expression.index;
- expect(index, new isInstanceOf<SimpleIdentifier>());
- expect(index.isSynthetic, isTrue);
+ void test_parseListOrMapLiteral_map_type() {
+ createParser("<String, int> {'1' : 1}");
+ TypedLiteral literal = parser.parseListOrMapLiteral(null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal, new isInstanceOf<MapLiteral>());
+ MapLiteral mapLiteral = literal;
+ expect(mapLiteral.constKeyword, isNull);
+ expect(mapLiteral.typeArguments, isNotNull);
+ expect(mapLiteral.leftBracket, isNotNull);
+ expect(mapLiteral.entries, hasLength(1));
+ expect(mapLiteral.rightBracket, isNotNull);
}
- void test_assignmentExpression_missing_compound1() {
- AssignmentExpression expression =
- parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
- Expression syntheticExpression = expression.leftHandSide;
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, syntheticExpression);
- expect(syntheticExpression.isSynthetic, isTrue);
+ void test_parseLogicalAndExpression() {
+ createParser('x && y');
+ Expression expression = parser.parseLogicalAndExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.AMPERSAND_AMPERSAND);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_assignmentExpression_missing_compound2() {
- AssignmentExpression expression =
- parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
- Expression syntheticExpression =
- (expression.rightHandSide as AssignmentExpression).leftHandSide;
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, syntheticExpression);
- expect(syntheticExpression.isSynthetic, isTrue);
+ void test_parseLogicalOrExpression() {
+ createParser('x || y');
+ Expression expression = parser.parseLogicalOrExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.BAR_BAR);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_assignmentExpression_missing_compound3() {
- AssignmentExpression expression =
- parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
- Expression syntheticExpression =
- (expression.rightHandSide as AssignmentExpression).rightHandSide;
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, syntheticExpression);
- expect(syntheticExpression.isSynthetic, isTrue);
+ void test_parseMapLiteral_empty() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
+ TypeArgumentList typeArguments = AstTestFactory.typeArgumentList(
+ [AstTestFactory.typeName4("String"), AstTestFactory.typeName4("int")]);
+ createParser('{}');
+ MapLiteral literal = parser.parseMapLiteral(token, typeArguments);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.constKeyword, token);
+ expect(literal.typeArguments, typeArguments);
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.entries, hasLength(0));
+ expect(literal.rightBracket, isNotNull);
}
- void test_assignmentExpression_missing_LHS() {
- AssignmentExpression expression =
- parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftHandSide);
- expect(expression.leftHandSide.isSynthetic, isTrue);
+ void test_parseMapLiteral_multiple() {
+ createParser("{'a' : b, 'x' : y}");
+ MapLiteral literal = parser.parseMapLiteral(null, null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.entries, hasLength(2));
+ expect(literal.rightBracket, isNotNull);
}
- void test_assignmentExpression_missing_RHS() {
- AssignmentExpression expression =
- parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftHandSide);
- expect(expression.rightHandSide.isSynthetic, isTrue);
+ void test_parseMapLiteral_single() {
+ createParser("{'x' : y}");
+ MapLiteral literal = parser.parseMapLiteral(null, null);
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.leftBracket, isNotNull);
+ expect(literal.entries, hasLength(1));
+ expect(literal.rightBracket, isNotNull);
}
- void test_bitwiseAndExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parseMapLiteralEntry_complex() {
+ createParser('2 + 2 : y');
+ MapLiteralEntry entry = parser.parseMapLiteralEntry();
+ expect(entry, isNotNull);
+ assertNoErrors();
+ expect(entry.key, isNotNull);
+ expect(entry.separator, isNotNull);
+ expect(entry.value, isNotNull);
}
- void test_bitwiseAndExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("&", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseMapLiteralEntry_int() {
+ createParser('0 : y');
+ MapLiteralEntry entry = parser.parseMapLiteralEntry();
+ expect(entry, isNotNull);
+ assertNoErrors();
+ expect(entry.key, isNotNull);
+ expect(entry.separator, isNotNull);
+ expect(entry.value, isNotNull);
}
- void test_bitwiseAndExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseMapLiteralEntry_string() {
+ createParser("'x' : y");
+ MapLiteralEntry entry = parser.parseMapLiteralEntry();
+ expect(entry, isNotNull);
+ assertNoErrors();
+ expect(entry.key, isNotNull);
+ expect(entry.separator, isNotNull);
+ expect(entry.value, isNotNull);
}
- void test_bitwiseAndExpression_missing_RHS_super() {
- BinaryExpression expression =
- parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseMultiplicativeExpression_normal() {
+ createParser('x * y');
+ Expression expression = parser.parseMultiplicativeExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.STAR);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_bitwiseAndExpression_precedence_equality_left() {
- BinaryExpression expression = parseExpression("== &&", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseMultiplicativeExpression_super() {
+ createParser('super * y');
+ Expression expression = parser.parseMultiplicativeExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.STAR);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_bitwiseAndExpression_precedence_equality_right() {
- BinaryExpression expression = parseExpression("&& ==", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.rightOperand);
+ void test_parseNewExpression() {
+ createParser('new A()');
+ InstanceCreationExpression expression = parser.parseNewExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.keyword, isNotNull);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ expect(name.type, isNotNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
}
- void test_bitwiseAndExpression_super() {
- BinaryExpression expression = parseExpression("super & &", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parsePostfixExpression_decrement() {
+ createParser('i--');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<PostfixExpression>());
+ PostfixExpression postfixExpression = expression;
+ expect(postfixExpression.operand, isNotNull);
+ expect(postfixExpression.operator, isNotNull);
+ expect(postfixExpression.operator.type, TokenType.MINUS_MINUS);
}
- void test_bitwiseOrExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parsePostfixExpression_increment() {
+ createParser('i++');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<PostfixExpression>());
+ PostfixExpression postfixExpression = expression;
+ expect(postfixExpression.operand, isNotNull);
+ expect(postfixExpression.operator, isNotNull);
+ expect(postfixExpression.operator.type, TokenType.PLUS_PLUS);
}
- void test_bitwiseOrExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("|", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePostfixExpression_none_indexExpression() {
+ createParser('a[0]');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<IndexExpression>());
+ IndexExpression indexExpression = expression;
+ expect(indexExpression.target, isNotNull);
+ expect(indexExpression.index, isNotNull);
}
- void test_bitwiseOrExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePostfixExpression_none_methodInvocation() {
+ createParser('a.m()');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation methodInvocation = expression;
+ expect(methodInvocation.target, isNotNull);
+ expect(methodInvocation.operator.type, TokenType.PERIOD);
+ expect(methodInvocation.methodName, isNotNull);
+ expect(methodInvocation.typeArguments, isNull);
+ expect(methodInvocation.argumentList, isNotNull);
}
- void test_bitwiseOrExpression_missing_RHS_super() {
- BinaryExpression expression =
- parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePostfixExpression_none_methodInvocation_question_dot() {
+ createParser('a?.m()');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation methodInvocation = expression;
+ expect(methodInvocation.target, isNotNull);
+ expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
+ expect(methodInvocation.methodName, isNotNull);
+ expect(methodInvocation.typeArguments, isNull);
+ expect(methodInvocation.argumentList, isNotNull);
}
- void test_bitwiseOrExpression_precedence_xor_left() {
- BinaryExpression expression = parseExpression("^ |", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void
+ test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('a?.m/*<E>*/()');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation methodInvocation = expression;
+ expect(methodInvocation.target, isNotNull);
+ expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
+ expect(methodInvocation.methodName, isNotNull);
+ expect(methodInvocation.typeArguments, isNotNull);
+ expect(methodInvocation.argumentList, isNotNull);
}
- void test_bitwiseOrExpression_precedence_xor_right() {
- BinaryExpression expression = parseExpression("| ^", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.rightOperand);
+ void
+ test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() {
+ createParser('a?.m<E>()');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation methodInvocation = expression;
+ expect(methodInvocation.target, isNotNull);
+ expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
+ expect(methodInvocation.methodName, isNotNull);
+ expect(methodInvocation.typeArguments, isNotNull);
+ expect(methodInvocation.argumentList, isNotNull);
}
- void test_bitwiseOrExpression_super() {
- BinaryExpression expression = parseExpression("super | |", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void
+ test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
+ enableGenericMethodComments = true;
+ createParser('a.m/*<E>*/()');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation methodInvocation = expression;
+ expect(methodInvocation.target, isNotNull);
+ expect(methodInvocation.operator.type, TokenType.PERIOD);
+ expect(methodInvocation.methodName, isNotNull);
+ expect(methodInvocation.typeArguments, isNotNull);
+ expect(methodInvocation.argumentList, isNotNull);
+ }
+
+ void test_parsePostfixExpression_none_methodInvocation_typeArguments() {
+ createParser('a.m<E>()');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MethodInvocation>());
+ MethodInvocation methodInvocation = expression;
+ expect(methodInvocation.target, isNotNull);
+ expect(methodInvocation.operator.type, TokenType.PERIOD);
+ expect(methodInvocation.methodName, isNotNull);
+ expect(methodInvocation.typeArguments, isNotNull);
+ expect(methodInvocation.argumentList, isNotNull);
}
- void test_bitwiseXorExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parsePostfixExpression_none_propertyAccess() {
+ createParser('a.b');
+ Expression expression = parser.parsePostfixExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<PrefixedIdentifier>());
+ PrefixedIdentifier identifier = expression;
+ expect(identifier.prefix, isNotNull);
+ expect(identifier.identifier, isNotNull);
}
- void test_bitwiseXorExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("^", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePrefixedIdentifier_noPrefix() {
+ String lexeme = "bar";
+ createParser(lexeme);
+ Identifier identifier = parser.parsePrefixedIdentifier();
+ expect(identifier, isNotNull);
+ assertNoErrors();
+ expect(identifier, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier simpleIdentifier = identifier;
+ expect(simpleIdentifier.token, isNotNull);
+ expect(simpleIdentifier.name, lexeme);
}
- void test_bitwiseXorExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePrefixedIdentifier_prefix() {
+ String lexeme = "foo.bar";
+ createParser(lexeme);
+ Identifier identifier = parser.parsePrefixedIdentifier();
+ expect(identifier, isNotNull);
+ assertNoErrors();
+ expect(identifier, new isInstanceOf<PrefixedIdentifier>());
+ PrefixedIdentifier prefixedIdentifier = identifier;
+ expect(prefixedIdentifier.prefix.name, "foo");
+ expect(prefixedIdentifier.period, isNotNull);
+ expect(prefixedIdentifier.identifier.name, "bar");
}
- void test_bitwiseXorExpression_missing_RHS_super() {
- BinaryExpression expression =
- parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_const() {
+ createParser('const A()');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, isNotNull);
}
- void test_bitwiseXorExpression_precedence_and_left() {
- BinaryExpression expression = parseExpression("& ^", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parsePrimaryExpression_double() {
+ String doubleLiteral = "3.2e4";
+ createParser(doubleLiteral);
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<DoubleLiteral>());
+ DoubleLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, double.parse(doubleLiteral));
}
- void test_bitwiseXorExpression_precedence_and_right() {
- BinaryExpression expression = parseExpression("^ &", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.rightOperand);
+ void test_parsePrimaryExpression_false() {
+ createParser('false');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BooleanLiteral>());
+ BooleanLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, isFalse);
}
- void test_bitwiseXorExpression_super() {
- BinaryExpression expression = parseExpression("super ^ ^", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parsePrimaryExpression_function_arguments() {
+ createParser('(int i) => i + 1');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<FunctionExpression>());
+ FunctionExpression functionExpression = expression;
+ expect(functionExpression.parameters, isNotNull);
+ expect(functionExpression.body, isNotNull);
}
- void test_classTypeAlias_withBody() {
- parseCompilationUnit(
- r'''
-class A {}
-class B = Object with A {}''',
- [ParserErrorCode.EXPECTED_TOKEN]);
+ void test_parsePrimaryExpression_function_noArguments() {
+ createParser('() => 42');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<FunctionExpression>());
+ FunctionExpression functionExpression = expression;
+ expect(functionExpression.parameters, isNotNull);
+ expect(functionExpression.body, isNotNull);
}
- void test_conditionalExpression_missingElse() {
- createParser('x ? y :');
- Expression expression = parser.parseConditionalExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
- expect(expression, new isInstanceOf<ConditionalExpression>());
- ConditionalExpression conditionalExpression = expression;
- expect(conditionalExpression.elseExpression,
- new isInstanceOf<SimpleIdentifier>());
- expect(conditionalExpression.elseExpression.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_genericFunctionExpression() {
+ createParser('<X, Y>(Map<X, Y> m, X x) => m[x]');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<FunctionExpression>());
+ FunctionExpression function = expression;
+ expect(function.typeParameters, isNotNull);
}
- void test_conditionalExpression_missingThen() {
- createParser('x ? : z');
- Expression expression = parser.parseConditionalExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
- expect(expression, new isInstanceOf<ConditionalExpression>());
- ConditionalExpression conditionalExpression = expression;
- expect(conditionalExpression.thenExpression,
- new isInstanceOf<SimpleIdentifier>());
- expect(conditionalExpression.thenExpression.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_hex() {
+ String hexLiteral = "3F";
+ createParser('0x$hexLiteral');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<IntegerLiteral>());
+ IntegerLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, int.parse(hexLiteral, radix: 16));
}
- void test_declarationBeforeDirective() {
- CompilationUnit unit = parseCompilationUnit(
- "class foo { } import 'bar.dart';",
- [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(1));
- ClassDeclaration classDecl = unit.childEntities.first;
- expect(classDecl, isNotNull);
- expect(classDecl.name.name, 'foo');
+ void test_parsePrimaryExpression_identifier() {
+ createParser('a');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = expression;
+ expect(identifier, isNotNull);
}
- void test_equalityExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_int() {
+ String intLiteral = "472";
+ createParser(intLiteral);
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<IntegerLiteral>());
+ IntegerLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, int.parse(intLiteral));
}
- void test_equalityExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("==", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_listLiteral() {
+ createParser('[ ]');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ListLiteral>());
+ ListLiteral literal = expression;
+ expect(literal, isNotNull);
}
- void test_equalityExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_listLiteral_index() {
+ createParser('[]');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ListLiteral>());
+ ListLiteral literal = expression;
+ expect(literal, isNotNull);
}
- void test_equalityExpression_missing_RHS_super() {
- BinaryExpression expression =
- parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_listLiteral_typed() {
+ createParser('<A>[ ]');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ListLiteral>());
+ ListLiteral literal = expression;
+ expect(literal.typeArguments, isNotNull);
+ expect(literal.typeArguments.arguments, hasLength(1));
+ }
+
+ void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
+ enableGenericMethodComments = true;
+ createParser('/*<A>*/[ ]');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ListLiteral>());
+ ListLiteral literal = expression;
+ expect(literal.typeArguments, isNotNull);
+ expect(literal.typeArguments.arguments, hasLength(1));
}
- void test_equalityExpression_precedence_relational_left() {
- BinaryExpression expression = parseExpression("is ==", [
- ParserErrorCode.EXPECTED_TYPE_NAME,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf(
- (obj) => obj is IsExpression, IsExpression, expression.leftOperand);
+ void test_parsePrimaryExpression_mapLiteral() {
+ createParser('{}');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MapLiteral>());
+ MapLiteral literal = expression;
+ expect(literal.typeArguments, isNull);
+ expect(literal, isNotNull);
}
- void test_equalityExpression_precedence_relational_right() {
- BinaryExpression expression = parseExpression("== is", [
- ParserErrorCode.EXPECTED_TYPE_NAME,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf(
- (obj) => obj is IsExpression, IsExpression, expression.rightOperand);
+ void test_parsePrimaryExpression_mapLiteral_typed() {
+ createParser('<A, B>{}');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MapLiteral>());
+ MapLiteral literal = expression;
+ expect(literal.typeArguments, isNotNull);
+ expect(literal.typeArguments.arguments, hasLength(2));
}
- void test_equalityExpression_super() {
- BinaryExpression expression = parseExpression("super == ==", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
+ enableGenericMethodComments = true;
+ createParser('/*<A, B>*/{}');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<MapLiteral>());
+ MapLiteral literal = expression;
+ expect(literal.typeArguments, isNotNull);
+ expect(literal.typeArguments.arguments, hasLength(2));
}
- void test_expressionList_multiple_end() {
- createParser(', 2, 3, 4');
- List<Expression> result = parser.parseExpressionList();
- expectNotNullIfNoErrors(result);
- listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
- expect(result, hasLength(4));
- Expression syntheticExpression = result[0];
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, syntheticExpression);
- expect(syntheticExpression.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_new() {
+ createParser('new A()');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<InstanceCreationExpression>());
+ InstanceCreationExpression creation = expression;
+ expect(creation, isNotNull);
}
- void test_expressionList_multiple_middle() {
- createParser('1, 2, , 4');
- List<Expression> result = parser.parseExpressionList();
- expectNotNullIfNoErrors(result);
- listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
- expect(result, hasLength(4));
- Expression syntheticExpression = result[2];
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, syntheticExpression);
- expect(syntheticExpression.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_null() {
+ createParser('null');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<NullLiteral>());
+ NullLiteral literal = expression;
+ expect(literal.literal, isNotNull);
}
- void test_expressionList_multiple_start() {
- createParser('1, 2, 3,');
- List<Expression> result = parser.parseExpressionList();
- expectNotNullIfNoErrors(result);
- listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
- expect(result, hasLength(4));
- Expression syntheticExpression = result[3];
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, syntheticExpression);
- expect(syntheticExpression.isSynthetic, isTrue);
+ void test_parsePrimaryExpression_parenthesized() {
+ createParser('(x)');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ParenthesizedExpression>());
+ ParenthesizedExpression parens = expression;
+ expect(parens, isNotNull);
}
- void test_functionExpression_in_ConstructorFieldInitializer() {
- CompilationUnit unit = parseCompilationUnit(
- "class A { A() : a = (){}; var v; }",
- [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.UNEXPECTED_TOKEN]);
- // Make sure we recovered and parsed "var v" correctly
- ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
- NodeList<ClassMember> members = declaration.members;
- ClassMember fieldDecl = members[1];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is FieldDeclaration, FieldDeclaration, fieldDecl);
- NodeList<VariableDeclaration> vars =
- (fieldDecl as FieldDeclaration).fields.variables;
- expect(vars, hasLength(1));
- expect(vars[0].name.name, "v");
+ void test_parsePrimaryExpression_string() {
+ createParser('"string"');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.isMultiline, isFalse);
+ expect(literal.isRaw, isFalse);
+ expect(literal.value, "string");
}
- void test_functionExpression_named() {
- parseExpression("m(f() => 0);", [ParserErrorCode.EXPECTED_TOKEN]);
+ void test_parsePrimaryExpression_string_multiline() {
+ createParser("'''string'''");
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.isMultiline, isTrue);
+ expect(literal.isRaw, isFalse);
+ expect(literal.value, "string");
}
- void test_importDirectivePartial_as() {
- CompilationUnit unit = parseCompilationUnit(
- "import 'b.dart' d as b;", [ParserErrorCode.UNEXPECTED_TOKEN]);
- ImportDirective importDirective = unit.childEntities.first;
- expect(importDirective.asKeyword, isNotNull);
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(0));
+ void test_parsePrimaryExpression_string_raw() {
+ createParser("r'string'");
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.isMultiline, isFalse);
+ expect(literal.isRaw, isTrue);
+ expect(literal.value, "string");
}
- void test_importDirectivePartial_hide() {
- CompilationUnit unit = parseCompilationUnit(
- "import 'b.dart' d hide foo;", [ParserErrorCode.UNEXPECTED_TOKEN]);
- ImportDirective importDirective = unit.childEntities.first;
- expect(importDirective.combinators, hasLength(1));
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(0));
+ void test_parsePrimaryExpression_super() {
+ createParser('super.x');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<PropertyAccess>());
+ PropertyAccess propertyAccess = expression;
+ expect(propertyAccess.target is SuperExpression, isTrue);
+ expect(propertyAccess.operator, isNotNull);
+ expect(propertyAccess.operator.type, TokenType.PERIOD);
+ expect(propertyAccess.propertyName, isNotNull);
}
- void test_importDirectivePartial_show() {
- CompilationUnit unit = parseCompilationUnit(
- "import 'b.dart' d show foo;", [ParserErrorCode.UNEXPECTED_TOKEN]);
- ImportDirective importDirective = unit.childEntities.first;
- expect(importDirective.combinators, hasLength(1));
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(0));
+ void test_parsePrimaryExpression_this() {
+ createParser('this');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ThisExpression>());
+ ThisExpression thisExpression = expression;
+ expect(thisExpression.thisKeyword, isNotNull);
}
- void test_incomplete_conditionalExpression() {
- parseExpression("x ? 0",
- [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.MISSING_IDENTIFIER]);
+ void test_parsePrimaryExpression_true() {
+ createParser('true');
+ Expression expression = parser.parsePrimaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BooleanLiteral>());
+ BooleanLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, isTrue);
}
- void test_incomplete_constructorInitializers_empty() {
- createParser('C() : {}');
- ClassMember member = parser.parseClassMember('C');
- expectNotNullIfNoErrors(member);
- listener.assertErrorsWithCodes([ParserErrorCode.MISSING_INITIALIZER]);
+ void test_parseRelationalExpression_as_functionType_noReturnType() {
+ createParser('x as Function(int)');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AsExpression>());
+ AsExpression asExpression = expression;
+ expect(asExpression.expression, isNotNull);
+ expect(asExpression.asOperator, isNotNull);
+ expect(asExpression.type, new isInstanceOf<GenericFunctionType>());
}
- void test_incomplete_constructorInitializers_missingEquals() {
- createParser('C() : x(3) {}');
- ClassMember member = parser.parseClassMember('C');
- expectNotNullIfNoErrors(member);
- listener.assertErrorsWithCodes(
- [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]);
- expect(member, new isInstanceOf<ConstructorDeclaration>());
- NodeList<ConstructorInitializer> initializers =
- (member as ConstructorDeclaration).initializers;
- expect(initializers, hasLength(1));
- ConstructorInitializer initializer = initializers[0];
- expect(initializer, new isInstanceOf<ConstructorFieldInitializer>());
- Expression expression =
- (initializer as ConstructorFieldInitializer).expression;
+ void test_parseRelationalExpression_as_functionType_returnType() {
+ createParser('x as String Function(int)');
+ Expression expression = parser.parseRelationalExpression();
expect(expression, isNotNull);
- expect(expression, new isInstanceOf<ParenthesizedExpression>());
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AsExpression>());
+ AsExpression asExpression = expression;
+ expect(asExpression.expression, isNotNull);
+ expect(asExpression.asOperator, isNotNull);
+ expect(asExpression.type, new isInstanceOf<GenericFunctionType>());
}
- void test_incomplete_constructorInitializers_variable() {
- createParser('C() : x {}');
- ClassMember member = parser.parseClassMember('C');
- expectNotNullIfNoErrors(member);
- listener.assertErrorsWithCodes(
- [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]);
+ void test_parseRelationalExpression_as_generic() {
+ createParser('x as C<D>');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AsExpression>());
+ AsExpression asExpression = expression;
+ expect(asExpression.expression, isNotNull);
+ expect(asExpression.asOperator, isNotNull);
+ expect(asExpression.type, new isInstanceOf<TypeName>());
}
- @failingTest
- void test_incomplete_returnType() {
- parseCompilationUnit(r'''
-Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {
- if (map == null) return null;
- Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();
- map.forEach((name, value) {
- result[new Symbol(name)] = value;
- });
- return result;
-}''');
+ void test_parseRelationalExpression_as_nullable() {
+ enableNnbd = true;
+ createParser('x as Y?)');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AsExpression>());
+ AsExpression asExpression = expression;
+ expect(asExpression.expression, isNotNull);
+ expect(asExpression.asOperator, isNotNull);
+ expect(asExpression.type, new isInstanceOf<TypeName>());
}
- void test_incomplete_topLevelFunction() {
- parseCompilationUnit("foo();", [ParserErrorCode.MISSING_FUNCTION_BODY]);
+ void test_parseRelationalExpression_as_simple() {
+ createParser('x as Y');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AsExpression>());
+ AsExpression asExpression = expression;
+ expect(asExpression.expression, isNotNull);
+ expect(asExpression.asOperator, isNotNull);
+ expect(asExpression.type, new isInstanceOf<TypeName>());
}
- void test_incomplete_topLevelVariable() {
- CompilationUnit unit =
- parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember member = declarations[0];
- EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
- TopLevelVariableDeclaration, member);
- NodeList<VariableDeclaration> variables =
- (member as TopLevelVariableDeclaration).variables.variables;
- expect(variables, hasLength(1));
- SimpleIdentifier name = variables[0].name;
- expect(name.isSynthetic, isTrue);
+ void test_parseRelationalExpression_as_simple_function() {
+ createParser('x as Function');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AsExpression>());
+ AsExpression asExpression = expression;
+ expect(asExpression.expression, isNotNull);
+ expect(asExpression.asOperator, isNotNull);
+ expect(asExpression.type, new isInstanceOf<TypeName>());
}
- void test_incomplete_topLevelVariable_const() {
- CompilationUnit unit = parseCompilationUnit("const ",
- [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember member = declarations[0];
- EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
- TopLevelVariableDeclaration, member);
- NodeList<VariableDeclaration> variables =
- (member as TopLevelVariableDeclaration).variables.variables;
- expect(variables, hasLength(1));
- SimpleIdentifier name = variables[0].name;
- expect(name.isSynthetic, isTrue);
+ void test_parseRelationalExpression_is() {
+ createParser('x is y');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<IsExpression>());
+ IsExpression isExpression = expression;
+ expect(isExpression.expression, isNotNull);
+ expect(isExpression.isOperator, isNotNull);
+ expect(isExpression.notOperator, isNull);
+ expect(isExpression.type, isNotNull);
}
- void test_incomplete_topLevelVariable_final() {
- CompilationUnit unit = parseCompilationUnit("final ",
- [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember member = declarations[0];
- EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
- TopLevelVariableDeclaration, member);
- NodeList<VariableDeclaration> variables =
- (member as TopLevelVariableDeclaration).variables.variables;
- expect(variables, hasLength(1));
- SimpleIdentifier name = variables[0].name;
- expect(name.isSynthetic, isTrue);
+ void test_parseRelationalExpression_is_nullable() {
+ enableNnbd = true;
+ createParser('x is y?)');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<IsExpression>());
+ IsExpression isExpression = expression;
+ expect(isExpression.expression, isNotNull);
+ expect(isExpression.isOperator, isNotNull);
+ expect(isExpression.notOperator, isNull);
+ expect(isExpression.type, isNotNull);
}
- void test_incomplete_topLevelVariable_var() {
- CompilationUnit unit = parseCompilationUnit("var ",
- [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember member = declarations[0];
- EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
- TopLevelVariableDeclaration, member);
- NodeList<VariableDeclaration> variables =
- (member as TopLevelVariableDeclaration).variables.variables;
- expect(variables, hasLength(1));
- SimpleIdentifier name = variables[0].name;
- expect(name.isSynthetic, isTrue);
+ void test_parseRelationalExpression_isNot() {
+ createParser('x is! y');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<IsExpression>());
+ IsExpression isExpression = expression;
+ expect(isExpression.expression, isNotNull);
+ expect(isExpression.isOperator, isNotNull);
+ expect(isExpression.notOperator, isNotNull);
+ expect(isExpression.type, isNotNull);
}
- void test_incompleteField_const() {
- CompilationUnit unit = parseCompilationUnit(
- r'''
-class C {
- const
-}''',
- [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember unitMember = declarations[0];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
- NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
- expect(members, hasLength(1));
- ClassMember classMember = members[0];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
- VariableDeclarationList fieldList =
- (classMember as FieldDeclaration).fields;
- expect(fieldList.keyword.keyword, Keyword.CONST);
- NodeList<VariableDeclaration> fields = fieldList.variables;
- expect(fields, hasLength(1));
- VariableDeclaration field = fields[0];
- expect(field.name.isSynthetic, isTrue);
+ void test_parseRelationalExpression_normal() {
+ createParser('x < y');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.LT);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_incompleteField_final() {
- CompilationUnit unit = parseCompilationUnit(
- r'''
-class C {
- final
-}''',
- [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember unitMember = declarations[0];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
- NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
- expect(members, hasLength(1));
- ClassMember classMember = members[0];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
- VariableDeclarationList fieldList =
- (classMember as FieldDeclaration).fields;
- expect(fieldList.keyword.keyword, Keyword.FINAL);
- NodeList<VariableDeclaration> fields = fieldList.variables;
- expect(fields, hasLength(1));
- VariableDeclaration field = fields[0];
- expect(field.name.isSynthetic, isTrue);
+ void test_parseRelationalExpression_super() {
+ createParser('super < y');
+ Expression expression = parser.parseRelationalExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<BinaryExpression>());
+ BinaryExpression binaryExpression = expression;
+ expect(binaryExpression.leftOperand, isNotNull);
+ expect(binaryExpression.operator, isNotNull);
+ expect(binaryExpression.operator.type, TokenType.LT);
+ expect(binaryExpression.rightOperand, isNotNull);
}
- void test_incompleteField_var() {
- CompilationUnit unit = parseCompilationUnit(
- r'''
-class C {
- var
-}''',
- [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember unitMember = declarations[0];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
- NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
- expect(members, hasLength(1));
- ClassMember classMember = members[0];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
- VariableDeclarationList fieldList =
- (classMember as FieldDeclaration).fields;
- expect(fieldList.keyword.keyword, Keyword.VAR);
- NodeList<VariableDeclaration> fields = fieldList.variables;
- expect(fields, hasLength(1));
- VariableDeclaration field = fields[0];
- expect(field.name.isSynthetic, isTrue);
+ void test_parseRethrowExpression() {
+ createParser('rethrow;');
+ RethrowExpression expression = parser.parseRethrowExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.rethrowKeyword, isNotNull);
}
- void test_incompleteForEach() {
- ForStatement statement = parseStatement('for (String item i) {}',
- [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN]);
- expect(statement, new isInstanceOf<ForStatement>());
- expect(statement.toSource(), 'for (String item; i;) {}');
- expect(statement.leftSeparator, isNotNull);
- expect(statement.leftSeparator.type, TokenType.SEMICOLON);
- expect(statement.rightSeparator, isNotNull);
- expect(statement.rightSeparator.type, TokenType.SEMICOLON);
+ void test_parseShiftExpression_normal() {
+ createParser('x << y');
+ BinaryExpression expression = parser.parseShiftExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.leftOperand, isNotNull);
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.LT_LT);
+ expect(expression.rightOperand, isNotNull);
}
- void test_incompleteLocalVariable_atTheEndOfBlock() {
- Statement statement =
- parseStatement('String v }', [ParserErrorCode.EXPECTED_TOKEN]);
- expect(statement, new isInstanceOf<VariableDeclarationStatement>());
- expect(statement.toSource(), 'String v;');
+ void test_parseShiftExpression_super() {
+ createParser('super << y');
+ BinaryExpression expression = parser.parseShiftExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.leftOperand, isNotNull);
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.LT_LT);
+ expect(expression.rightOperand, isNotNull);
}
- void test_incompleteLocalVariable_beforeIdentifier() {
- Statement statement =
- parseStatement('String v String v2;', [ParserErrorCode.EXPECTED_TOKEN]);
- expect(statement, new isInstanceOf<VariableDeclarationStatement>());
- expect(statement.toSource(), 'String v;');
+ void test_parseSimpleIdentifier1_normalIdentifier() {
+ // TODO(brianwilkerson) Implement tests for this method.
}
- void test_incompleteLocalVariable_beforeKeyword() {
- Statement statement = parseStatement(
- 'String v if (true) {}', [ParserErrorCode.EXPECTED_TOKEN]);
- expect(statement, new isInstanceOf<VariableDeclarationStatement>());
- expect(statement.toSource(), 'String v;');
+ void test_parseSimpleIdentifier_builtInIdentifier() {
+ String lexeme = "as";
+ createParser(lexeme);
+ SimpleIdentifier identifier = parser.parseSimpleIdentifier();
+ expect(identifier, isNotNull);
+ assertNoErrors();
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, lexeme);
}
- void test_incompleteLocalVariable_beforeNextBlock() {
- Statement statement =
- parseStatement('String v {}', [ParserErrorCode.EXPECTED_TOKEN]);
- expect(statement, new isInstanceOf<VariableDeclarationStatement>());
- expect(statement.toSource(), 'String v;');
+ void test_parseSimpleIdentifier_normalIdentifier() {
+ String lexeme = "foo";
+ createParser(lexeme);
+ SimpleIdentifier identifier = parser.parseSimpleIdentifier();
+ expect(identifier, isNotNull);
+ assertNoErrors();
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, lexeme);
}
- void test_incompleteLocalVariable_parameterizedType() {
- Statement statement =
- parseStatement('List<String> v {}', [ParserErrorCode.EXPECTED_TOKEN]);
- expect(statement, new isInstanceOf<VariableDeclarationStatement>());
- expect(statement.toSource(), 'List<String> v;');
+ void test_parseStringLiteral_adjacent() {
+ createParser("'a' 'b'");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<AdjacentStrings>());
+ AdjacentStrings literal = expression;
+ NodeList<StringLiteral> strings = literal.strings;
+ expect(strings, hasLength(2));
+ StringLiteral firstString = strings[0];
+ StringLiteral secondString = strings[1];
+ expect((firstString as SimpleStringLiteral).value, "a");
+ expect((secondString as SimpleStringLiteral).value, "b");
}
- void test_incompleteTypeArguments_field() {
- CompilationUnit unit = parseCompilationUnit(
- r'''
-class C {
- final List<int f;
-}''',
- [ParserErrorCode.EXPECTED_TOKEN]);
- // one class
- List<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
- // one field declaration
- List<ClassMember> members = classDecl.members;
- expect(members, hasLength(1));
- FieldDeclaration fieldDecl = members[0] as FieldDeclaration;
- // one field
- VariableDeclarationList fieldList = fieldDecl.fields;
- List<VariableDeclaration> fields = fieldList.variables;
- expect(fields, hasLength(1));
- VariableDeclaration field = fields[0];
- expect(field.name.name, 'f');
- // validate the type
- TypeArgumentList typeArguments = (fieldList.type as TypeName).typeArguments;
- expect(typeArguments.arguments, hasLength(1));
- // synthetic '>'
- Token token = typeArguments.endToken;
- expect(token.type, TokenType.GT);
- expect(token.isSynthetic, isTrue);
+ void test_parseStringLiteral_endsWithInterpolation() {
+ createParser(r"'x$y'");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<StringInterpolation>());
+ StringInterpolation interpolation = expression;
+ expect(interpolation.elements, hasLength(3));
+ expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+ InterpolationString element0 = interpolation.elements[0];
+ expect(element0.value, 'x');
+ expect(
+ interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+ InterpolationExpression element1 = interpolation.elements[1];
+ expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+ expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+ InterpolationString element2 = interpolation.elements[2];
+ expect(element2.value, '');
}
- void test_incompleteTypeParameters() {
- CompilationUnit unit = parseCompilationUnit(
- r'''
-class C<K {
-}''',
- [ParserErrorCode.EXPECTED_TOKEN]);
- // one class
- List<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
- // validate the type parameters
- TypeParameterList typeParameters = classDecl.typeParameters;
- expect(typeParameters.typeParameters, hasLength(1));
- // synthetic '>'
- Token token = typeParameters.endToken;
- expect(token.type, TokenType.GT);
- expect(token.isSynthetic, isTrue);
+ void test_parseStringLiteral_interpolated() {
+ createParser("'a \${b} c \$this d'");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<StringInterpolation>());
+ StringInterpolation literal = expression;
+ NodeList<InterpolationElement> elements = literal.elements;
+ expect(elements, hasLength(5));
+ expect(elements[0] is InterpolationString, isTrue);
+ expect(elements[1] is InterpolationExpression, isTrue);
+ expect(elements[2] is InterpolationString, isTrue);
+ expect(elements[3] is InterpolationExpression, isTrue);
+ expect(elements[4] is InterpolationString, isTrue);
}
- void test_invalidFunctionBodyModifier() {
- parseCompilationUnit(
- "f() sync {}", [ParserErrorCode.MISSING_STAR_AFTER_SYNC]);
+ void test_parseStringLiteral_multiline_encodedSpace() {
+ createParser("'''\\x20\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, " \na");
}
- void test_isExpression_noType() {
- CompilationUnit unit = parseCompilationUnit(
- "class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [
- ParserErrorCode.EXPECTED_TYPE_NAME,
- ParserErrorCode.EXPECTED_TYPE_NAME,
- ParserErrorCode.MISSING_STATEMENT
- ]);
- ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
- MethodDeclaration method = declaration.members[0] as MethodDeclaration;
- BlockFunctionBody body = method.body as BlockFunctionBody;
- IfStatement ifStatement = body.block.statements[1] as IfStatement;
- IsExpression expression = ifStatement.condition as IsExpression;
- expect(expression.expression, isNotNull);
- expect(expression.isOperator, isNotNull);
- expect(expression.notOperator, isNotNull);
- TypeAnnotation type = expression.type;
- expect(type, isNotNull);
- expect(type is TypeName && type.name.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is EmptyStatement,
- EmptyStatement, ifStatement.thenStatement);
+ void test_parseStringLiteral_multiline_endsWithInterpolation() {
+ createParser(r"'''x$y'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<StringInterpolation>());
+ StringInterpolation interpolation = expression;
+ expect(interpolation.elements, hasLength(3));
+ expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+ InterpolationString element0 = interpolation.elements[0];
+ expect(element0.value, 'x');
+ expect(
+ interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+ InterpolationExpression element1 = interpolation.elements[1];
+ expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+ expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+ InterpolationString element2 = interpolation.elements[2];
+ expect(element2.value, '');
}
- void test_keywordInPlaceOfIdentifier() {
- // TODO(brianwilkerson) We could do better with this.
- parseCompilationUnit("do() {}", [
- ParserErrorCode.EXPECTED_EXECUTABLE,
- ParserErrorCode.UNEXPECTED_TOKEN
- ]);
+ void test_parseStringLiteral_multiline_escapedBackslash() {
+ createParser("'''\\\\\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "\\\na");
}
- void test_logicalAndExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parseStringLiteral_multiline_escapedBackslash_raw() {
+ createParser("r'''\\\\\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "\\\\\na");
}
- void test_logicalAndExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("&&", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseStringLiteral_multiline_escapedEolMarker() {
+ createParser("'''\\\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "a");
}
- void test_logicalAndExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseStringLiteral_multiline_escapedEolMarker_raw() {
+ createParser("r'''\\\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "a");
}
- void test_logicalAndExpression_precedence_bitwiseOr_left() {
- BinaryExpression expression = parseExpression("| &&", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker() {
+ createParser("'''\\ \\\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "a");
}
- void test_logicalAndExpression_precedence_bitwiseOr_right() {
- BinaryExpression expression = parseExpression("&& |", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.rightOperand);
+ void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw() {
+ createParser("r'''\\ \\\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "a");
}
- void test_logicalOrExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parseStringLiteral_multiline_escapedTab() {
+ createParser("'''\\t\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "\t\na");
}
- void test_logicalOrExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("||", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseStringLiteral_multiline_escapedTab_raw() {
+ createParser("r'''\\t\na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "\\t\na");
}
- void test_logicalOrExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseStringLiteral_multiline_quoteAfterInterpolation() {
+ createParser(r"""'''$x'y'''""");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<StringInterpolation>());
+ StringInterpolation interpolation = expression;
+ expect(interpolation.elements, hasLength(3));
+ expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+ InterpolationString element0 = interpolation.elements[0];
+ expect(element0.value, '');
+ expect(
+ interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+ InterpolationExpression element1 = interpolation.elements[1];
+ expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+ expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+ InterpolationString element2 = interpolation.elements[2];
+ expect(element2.value, "'y");
}
- void test_logicalOrExpression_precedence_logicalAnd_left() {
- BinaryExpression expression = parseExpression("&& ||", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseStringLiteral_multiline_startsWithInterpolation() {
+ createParser(r"'''${x}y'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<StringInterpolation>());
+ StringInterpolation interpolation = expression;
+ expect(interpolation.elements, hasLength(3));
+ expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+ InterpolationString element0 = interpolation.elements[0];
+ expect(element0.value, '');
+ expect(
+ interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+ InterpolationExpression element1 = interpolation.elements[1];
+ expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+ expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+ InterpolationString element2 = interpolation.elements[2];
+ expect(element2.value, 'y');
}
- void test_logicalOrExpression_precedence_logicalAnd_right() {
- BinaryExpression expression = parseExpression("|| &&", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.rightOperand);
+ void test_parseStringLiteral_multiline_twoSpaces() {
+ createParser("''' \na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "a");
}
- void test_missing_commaInArgumentList() {
- parseExpression("f(x: 1 y: 2)", [ParserErrorCode.EXPECTED_TOKEN]);
+ void test_parseStringLiteral_multiline_twoSpaces_raw() {
+ createParser("r''' \na'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "a");
}
- void test_missingGet() {
- CompilationUnit unit = parseCompilationUnit(
- r'''
-class C {
- int length {}
- void foo() {}
-}''',
- [ParserErrorCode.MISSING_GET]);
- expect(unit, isNotNull);
- ClassDeclaration classDeclaration =
- unit.declarations[0] as ClassDeclaration;
- NodeList<ClassMember> members = classDeclaration.members;
- expect(members, hasLength(2));
- EngineTestCase.assertInstanceOf(
- (obj) => obj is MethodDeclaration, MethodDeclaration, members[0]);
- ClassMember member = members[1];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is MethodDeclaration, MethodDeclaration, member);
- expect((member as MethodDeclaration).name.name, "foo");
+ void test_parseStringLiteral_multiline_untrimmed() {
+ createParser("''' a\nb'''");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, " a\nb");
}
- void test_missingIdentifier_afterAnnotation() {
- createParser('@override }');
- ClassMember member = parser.parseClassMember('C');
- expectNotNullIfNoErrors(member);
- listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CLASS_MEMBER]);
- expect(member, new isInstanceOf<MethodDeclaration>());
- MethodDeclaration method = member;
- expect(method.documentationComment, isNull);
- NodeList<Annotation> metadata = method.metadata;
- expect(metadata, hasLength(1));
- expect(metadata[0].name.name, "override");
+ void test_parseStringLiteral_quoteAfterInterpolation() {
+ createParser(r"""'$x"'""");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<StringInterpolation>());
+ StringInterpolation interpolation = expression;
+ expect(interpolation.elements, hasLength(3));
+ expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+ InterpolationString element0 = interpolation.elements[0];
+ expect(element0.value, '');
+ expect(
+ interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+ InterpolationExpression element1 = interpolation.elements[1];
+ expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+ expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+ InterpolationString element2 = interpolation.elements[2];
+ expect(element2.value, '"');
}
- void test_missingSemicolon_varialeDeclarationList() {
- void verify(CompilationUnitMember member, String expectedTypeName,
- String expectedName, String expectedSemicolon) {
- expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
- TopLevelVariableDeclaration declaration = member;
- VariableDeclarationList variableList = declaration.variables;
- expect(variableList, isNotNull);
- NodeList<VariableDeclaration> variables = variableList.variables;
- expect(variables, hasLength(1));
- VariableDeclaration variable = variables[0];
- expect(variableList.type.toString(), expectedTypeName);
- expect(variable.name.name, expectedName);
- expect(declaration.semicolon.lexeme, expectedSemicolon);
- }
-
- CompilationUnit unit = parseCompilationUnit('String n x = "";', [
- ParserErrorCode.EXPECTED_TOKEN,
- ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
- ]);
- expect(unit, isNotNull);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(2));
- verify(declarations[0], 'String', 'n', '');
- verify(declarations[1], 'null', 'x', ';');
+ void test_parseStringLiteral_single() {
+ createParser("'a'");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<SimpleStringLiteral>());
+ SimpleStringLiteral literal = expression;
+ expect(literal.literal, isNotNull);
+ expect(literal.value, "a");
}
- void test_multiplicativeExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parseStringLiteral_startsWithInterpolation() {
+ createParser(r"'${x}y'");
+ Expression expression = parser.parseStringLiteral();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<StringInterpolation>());
+ StringInterpolation interpolation = expression;
+ expect(interpolation.elements, hasLength(3));
+ expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+ InterpolationString element0 = interpolation.elements[0];
+ expect(element0.value, '');
+ expect(
+ interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+ InterpolationExpression element1 = interpolation.elements[1];
+ expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+ expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+ InterpolationString element2 = interpolation.elements[2];
+ expect(element2.value, 'y');
}
- void test_multiplicativeExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("*", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseSuperConstructorInvocation_named() {
+ createParser('super.a()');
+ SuperConstructorInvocation invocation =
+ parser.parseSuperConstructorInvocation();
+ expect(invocation, isNotNull);
+ assertNoErrors();
+ expect(invocation.argumentList, isNotNull);
+ expect(invocation.constructorName, isNotNull);
+ expect(invocation.superKeyword, isNotNull);
+ expect(invocation.period, isNotNull);
}
- void test_multiplicativeExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseSuperConstructorInvocation_unnamed() {
+ createParser('super()');
+ SuperConstructorInvocation invocation =
+ parser.parseSuperConstructorInvocation();
+ expect(invocation, isNotNull);
+ assertNoErrors();
+ expect(invocation.argumentList, isNotNull);
+ expect(invocation.constructorName, isNull);
+ expect(invocation.superKeyword, isNotNull);
+ expect(invocation.period, isNull);
}
- void test_multiplicativeExpression_missing_RHS_super() {
- BinaryExpression expression =
- parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseSymbolLiteral_builtInIdentifier() {
+ createParser('#dynamic.static.abstract');
+ SymbolLiteral literal = parser.parseSymbolLiteral();
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.poundSign, isNotNull);
+ List<Token> components = literal.components;
+ expect(components, hasLength(3));
+ expect(components[0].lexeme, "dynamic");
+ expect(components[1].lexeme, "static");
+ expect(components[2].lexeme, "abstract");
}
- void test_multiplicativeExpression_precedence_unary_left() {
- BinaryExpression expression =
- parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
- PrefixExpression, expression.leftOperand);
+ void test_parseSymbolLiteral_multiple() {
+ createParser('#a.b.c');
+ SymbolLiteral literal = parser.parseSymbolLiteral();
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.poundSign, isNotNull);
+ List<Token> components = literal.components;
+ expect(components, hasLength(3));
+ expect(components[0].lexeme, "a");
+ expect(components[1].lexeme, "b");
+ expect(components[2].lexeme, "c");
}
- void test_multiplicativeExpression_precedence_unary_right() {
- BinaryExpression expression =
- parseExpression("* -y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
- PrefixExpression, expression.rightOperand);
+ void test_parseSymbolLiteral_operator() {
+ createParser('#==');
+ SymbolLiteral literal = parser.parseSymbolLiteral();
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.poundSign, isNotNull);
+ List<Token> components = literal.components;
+ expect(components, hasLength(1));
+ expect(components[0].lexeme, "==");
}
- void test_multiplicativeExpression_super() {
- BinaryExpression expression = parseExpression("super == ==", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseSymbolLiteral_single() {
+ createParser('#a');
+ SymbolLiteral literal = parser.parseSymbolLiteral();
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.poundSign, isNotNull);
+ List<Token> components = literal.components;
+ expect(components, hasLength(1));
+ expect(components[0].lexeme, "a");
}
- void test_nonStringLiteralUri_import() {
- parseCompilationUnit("import dart:io; class C {}",
- [ParserErrorCode.NON_STRING_LITERAL_AS_URI]);
+ void test_parseSymbolLiteral_void() {
+ createParser('#void');
+ SymbolLiteral literal = parser.parseSymbolLiteral();
+ expect(literal, isNotNull);
+ assertNoErrors();
+ expect(literal.poundSign, isNotNull);
+ List<Token> components = literal.components;
+ expect(components, hasLength(1));
+ expect(components[0].lexeme, "void");
}
- void test_prefixExpression_missing_operand_minus() {
- PrefixExpression expression =
- parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf(
- (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.operand);
- expect(expression.operand.isSynthetic, isTrue);
- expect(expression.operator.type, TokenType.MINUS);
+ void test_parseThrowExpression() {
+ createParser('throw x;');
+ Expression expression = parser.parseThrowExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ThrowExpression>());
+ ThrowExpression throwExpression = expression;
+ expect(throwExpression.throwKeyword, isNotNull);
+ expect(throwExpression.expression, isNotNull);
}
- void test_primaryExpression_argumentDefinitionTest() {
- createParser('?a');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertErrorsWithCodes([ParserErrorCode.UNEXPECTED_TOKEN]);
- expect(expression, new isInstanceOf<SimpleIdentifier>());
+ void test_parseThrowExpressionWithoutCascade() {
+ createParser('throw x;');
+ Expression expression = parser.parseThrowExpressionWithoutCascade();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression, new isInstanceOf<ThrowExpression>());
+ ThrowExpression throwExpression = expression;
+ expect(throwExpression.throwKeyword, isNotNull);
+ expect(throwExpression.expression, isNotNull);
}
- void test_relationalExpression_missing_LHS() {
- IsExpression expression =
- parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.expression);
- expect(expression.expression.isSynthetic, isTrue);
+ void test_parseUnaryExpression_decrement_normal() {
+ createParser('--x');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.MINUS_MINUS);
+ expect(expression.operand, isNotNull);
}
- void test_relationalExpression_missing_LHS_RHS() {
- IsExpression expression = parseExpression("is", [
- ParserErrorCode.EXPECTED_TYPE_NAME,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.expression);
- expect(expression.expression.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf(
- (obj) => obj is TypeName, TypeName, expression.type);
- expect(expression.type.isSynthetic, isTrue);
+ void test_parseUnaryExpression_decrement_super() {
+ createParser('--super');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.MINUS);
+ Expression innerExpression = expression.operand;
+ expect(innerExpression, isNotNull);
+ expect(innerExpression is PrefixExpression, isTrue);
+ PrefixExpression operand = innerExpression as PrefixExpression;
+ expect(operand.operator, isNotNull);
+ expect(operand.operator.type, TokenType.MINUS);
+ expect(operand.operand, isNotNull);
}
- void test_relationalExpression_missing_RHS() {
- IsExpression expression =
- parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
- EngineTestCase.assertInstanceOf(
- (obj) => obj is TypeName, TypeName, expression.type);
- expect(expression.type.isSynthetic, isTrue);
+ void test_parseUnaryExpression_decrement_super_propertyAccess() {
+ createParser('--super.x');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.MINUS_MINUS);
+ expect(expression.operand, isNotNull);
+ PropertyAccess operand = expression.operand as PropertyAccess;
+ expect(operand.target is SuperExpression, isTrue);
+ expect(operand.propertyName.name, "x");
}
- void test_relationalExpression_precedence_shift_right() {
- IsExpression expression = parseExpression("<< is", [
- ParserErrorCode.EXPECTED_TYPE_NAME,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.expression);
+ void test_parseUnaryExpression_decrement_super_withComment() {
+ createParser('/* 0 */ --super');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.MINUS);
+ expect(expression.operator.precedingComments, isNotNull);
+ Expression innerExpression = expression.operand;
+ expect(innerExpression, isNotNull);
+ expect(innerExpression is PrefixExpression, isTrue);
+ PrefixExpression operand = innerExpression as PrefixExpression;
+ expect(operand.operator, isNotNull);
+ expect(operand.operator.type, TokenType.MINUS);
+ expect(operand.operand, isNotNull);
}
- void test_shiftExpression_missing_LHS() {
- BinaryExpression expression =
- parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
+ void test_parseUnaryExpression_increment_normal() {
+ createParser('++x');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.PLUS_PLUS);
+ expect(expression.operand, isNotNull);
}
- void test_shiftExpression_missing_LHS_RHS() {
- BinaryExpression expression = parseExpression("<<", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.leftOperand);
- expect(expression.leftOperand.isSynthetic, isTrue);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseUnaryExpression_increment_super_index() {
+ createParser('++super[0]');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.PLUS_PLUS);
+ expect(expression.operand, isNotNull);
+ IndexExpression operand = expression.operand as IndexExpression;
+ expect(operand.realTarget is SuperExpression, isTrue);
+ expect(operand.index is IntegerLiteral, isTrue);
}
- void test_shiftExpression_missing_RHS() {
- BinaryExpression expression =
- parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseUnaryExpression_increment_super_propertyAccess() {
+ createParser('++super.x');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.PLUS_PLUS);
+ expect(expression.operand, isNotNull);
+ PropertyAccess operand = expression.operand as PropertyAccess;
+ expect(operand.target is SuperExpression, isTrue);
+ expect(operand.propertyName.name, "x");
}
- void test_shiftExpression_missing_RHS_super() {
- BinaryExpression expression =
- parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
- EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
- SimpleIdentifier, expression.rightOperand);
- expect(expression.rightOperand.isSynthetic, isTrue);
+ void test_parseUnaryExpression_minus_normal() {
+ createParser('-x');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.MINUS);
+ expect(expression.operand, isNotNull);
}
- void test_shiftExpression_precedence_unary_left() {
- BinaryExpression expression = parseExpression("+ <<", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseUnaryExpression_minus_super() {
+ createParser('-super');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.MINUS);
+ expect(expression.operand, isNotNull);
}
- void test_shiftExpression_precedence_unary_right() {
- BinaryExpression expression = parseExpression("<< +", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.rightOperand);
+ void test_parseUnaryExpression_not_normal() {
+ createParser('!x');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.BANG);
+ expect(expression.operand, isNotNull);
}
- void test_shiftExpression_super() {
- BinaryExpression expression = parseExpression("super << <<", [
- ParserErrorCode.MISSING_IDENTIFIER,
- ParserErrorCode.MISSING_IDENTIFIER
- ]);
- EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
- BinaryExpression, expression.leftOperand);
+ void test_parseUnaryExpression_not_super() {
+ createParser('!super');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.BANG);
+ expect(expression.operand, isNotNull);
}
- void test_typedef_eof() {
- CompilationUnit unit = parseCompilationUnit("typedef n", [
- ParserErrorCode.EXPECTED_TOKEN,
- ParserErrorCode.MISSING_TYPEDEF_PARAMETERS
- ]);
- NodeList<CompilationUnitMember> declarations = unit.declarations;
- expect(declarations, hasLength(1));
- CompilationUnitMember member = declarations[0];
- EngineTestCase.assertInstanceOf(
- (obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
+ void test_parseUnaryExpression_tilda_normal() {
+ createParser('~x');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.TILDE);
+ expect(expression.operand, isNotNull);
}
- void test_unaryPlus() {
- parseExpression("+2", [ParserErrorCode.MISSING_IDENTIFIER]);
+ void test_parseUnaryExpression_tilda_super() {
+ createParser('~super');
+ PrefixExpression expression = parser.parseUnaryExpression();
+ expect(expression, isNotNull);
+ assertNoErrors();
+ expect(expression.operator, isNotNull);
+ expect(expression.operator.type, TokenType.TILDE);
+ expect(expression.operand, isNotNull);
}
}
/**
- * The class `SimpleParserTest` defines parser tests that test individual parsing method. The
- * code fragments should be as minimal as possible in order to test the method, but should not test
- * the interactions between the method under test and other methods.
- *
- * More complex tests should be defined in the class [ComplexParserTest].
+ * Tests of the analyzer parser based on [FormalParameterParserTestMixin].
*/
@reflectiveTest
-class SimpleParserTest extends ParserTestCase {
- void test_computeStringValue_emptyInterpolationPrefix() {
- expect(_computeStringValue("'''", true, false), "");
+class FormalParameterParserTest extends ParserTestCase
+ with FormalParameterParserTestMixin {}
+
+/**
+ * The class [FormalParameterParserTestMixin] defines parser tests that test
+ * the parsing of formal parameters.
+ */
+abstract class FormalParameterParserTestMixin
+ implements AbstractParserTestCase {
+ void test_parseFormalParameter_covariant_final_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter =
+ parseFormalParameter('covariant final a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_escape_b() {
- expect(_computeStringValue("'\\b'", true, true), "\b");
+ void test_parseFormalParameter_covariant_final_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter = parseFormalParameter('covariant final a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
}
- void test_computeStringValue_escape_f() {
- expect(_computeStringValue("'\\f'", true, true), "\f");
+ void test_parseFormalParameter_covariant_final_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter =
+ parseFormalParameter('covariant final a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_escape_n() {
- expect(_computeStringValue("'\\n'", true, true), "\n");
+ void test_parseFormalParameter_covariant_final_type_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter =
+ parseFormalParameter('covariant final A a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_escape_notSpecial() {
- expect(_computeStringValue("'\\:'", true, true), ":");
+ void test_parseFormalParameter_covariant_final_type_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter =
+ parseFormalParameter('covariant final A a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
}
- void test_computeStringValue_escape_r() {
- expect(_computeStringValue("'\\r'", true, true), "\r");
+ void test_parseFormalParameter_covariant_final_type_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter =
+ parseFormalParameter('covariant final A a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_escape_t() {
- expect(_computeStringValue("'\\t'", true, true), "\t");
+ void test_parseFormalParameter_covariant_type_function() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter =
+ parseFormalParameter('covariant String Function(int) a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, new isInstanceOf<GenericFunctionType>());
+ expect(simpleParameter.kind, kind);
+ }
+
+ void test_parseFormalParameter_covariant_type_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter =
+ parseFormalParameter('covariant A a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_escape_u_fixed() {
- expect(_computeStringValue("'\\u4321'", true, true), "\u4321");
+ void test_parseFormalParameter_covariant_type_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter =
+ parseFormalParameter('covariant A<B<C>> a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
}
- void test_computeStringValue_escape_u_variable() {
- expect(_computeStringValue("'\\u{123}'", true, true), "\u0123");
+ void test_parseFormalParameter_covariant_type_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter =
+ parseFormalParameter('covariant A a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_escape_v() {
- expect(_computeStringValue("'\\v'", true, true), "\u000B");
+ void test_parseFormalParameter_covariant_var_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter =
+ parseFormalParameter('covariant var a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_escape_x() {
- expect(_computeStringValue("'\\xFF'", true, true), "\u00FF");
+ void test_parseFormalParameter_covariant_var_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter = parseFormalParameter('covariant var a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
}
- void test_computeStringValue_noEscape_single() {
- expect(_computeStringValue("'text'", true, true), "text");
+ void test_parseFormalParameter_covariant_var_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter =
+ parseFormalParameter('covariant var a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_noEscape_triple() {
- expect(_computeStringValue("'''text'''", true, true), "text");
+ void test_parseFormalParameter_final_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter = parseFormalParameter('final a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_raw_single() {
- expect(_computeStringValue("r'text'", true, true), "text");
+ void test_parseFormalParameter_final_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter = parseFormalParameter('final a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
}
- void test_computeStringValue_raw_triple() {
- expect(_computeStringValue("r'''text'''", true, true), "text");
+ void test_parseFormalParameter_final_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter = parseFormalParameter('final a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_raw_withEscape() {
- expect(_computeStringValue("r'two\\nlines'", true, true), "two\\nlines");
+ void test_parseFormalParameter_final_type_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter = parseFormalParameter('final A a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_triple_internalQuote_first_empty() {
- expect(_computeStringValue("''''", true, false), "'");
+ void test_parseFormalParameter_final_type_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter = parseFormalParameter('final A a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
}
- void test_computeStringValue_triple_internalQuote_first_nonEmpty() {
- expect(_computeStringValue("''''text", true, false), "'text");
+ void test_parseFormalParameter_final_type_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter = parseFormalParameter('final A a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_computeStringValue_triple_internalQuote_last_empty() {
- expect(_computeStringValue("'''", false, true), "");
+ void test_parseFormalParameter_type_function() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter =
+ parseFormalParameter('String Function(int) a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, new isInstanceOf<GenericFunctionType>());
+ expect(simpleParameter.kind, kind);
}
- void test_computeStringValue_triple_internalQuote_last_nonEmpty() {
- expect(_computeStringValue("text'''", false, true), "text");
+ void test_parseFormalParameter_type_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter = parseFormalParameter('A a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_createSyntheticIdentifier() {
- createParser('');
- SimpleIdentifier identifier = parser.createSyntheticIdentifier();
- expectNotNullIfNoErrors(identifier);
- expect(identifier.isSynthetic, isTrue);
+ void test_parseFormalParameter_type_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter = parseFormalParameter('A a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
}
- void test_createSyntheticStringLiteral() {
- createParser('');
- SimpleStringLiteral literal = parser.createSyntheticStringLiteral();
- expectNotNullIfNoErrors(literal);
- expect(literal.isSynthetic, isTrue);
+ void test_parseFormalParameter_type_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter = parseFormalParameter('A a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_isFunctionDeclaration_nameButNoReturn_block() {
- expect(_isFunctionDeclaration("f() {}"), isTrue);
+ void test_parseFormalParameter_var_named() {
+ ParameterKind kind = ParameterKind.NAMED;
+ FormalParameter parameter = parseFormalParameter('var a : null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_isFunctionDeclaration_nameButNoReturn_expression() {
- expect(_isFunctionDeclaration("f() => e"), isTrue);
+ void test_parseFormalParameter_var_normal() {
+ ParameterKind kind = ParameterKind.REQUIRED;
+ FormalParameter parameter = parseFormalParameter('var a', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
}
- void test_isFunctionDeclaration_nameButNoReturn_typeParameters_block() {
- expect(_isFunctionDeclaration("f<E>() {}"), isTrue);
+ void test_parseFormalParameter_var_positional() {
+ ParameterKind kind = ParameterKind.POSITIONAL;
+ FormalParameter parameter = parseFormalParameter('var a = null', kind);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter defaultParameter = parameter;
+ SimpleFormalParameter simpleParameter =
+ defaultParameter.parameter as SimpleFormalParameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.identifier, isNotNull);
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.kind, kind);
+ expect(defaultParameter.separator, isNotNull);
+ expect(defaultParameter.defaultValue, isNotNull);
+ expect(defaultParameter.kind, kind);
}
- void test_isFunctionDeclaration_nameButNoReturn_typeParameters_expression() {
- expect(_isFunctionDeclaration("f<E>() => e"), isTrue);
+ void test_parseFormalParameterList_empty() {
+ FormalParameterList list = parseFormalParameterList('()');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(0));
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionDeclaration_normalReturn_block() {
- expect(_isFunctionDeclaration("C f() {}"), isTrue);
+ void test_parseFormalParameterList_named_multiple() {
+ FormalParameterList list =
+ parseFormalParameterList('({A a : 1, B b, C c : 3})');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(3));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionDeclaration_normalReturn_expression() {
- expect(_isFunctionDeclaration("C f() => e"), isTrue);
+ void test_parseFormalParameterList_named_single() {
+ FormalParameterList list = parseFormalParameterList('({A a})');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(1));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionDeclaration_normalReturn_typeParameters_block() {
- expect(_isFunctionDeclaration("C f<E>() {}"), isTrue);
+ void test_parseFormalParameterList_named_trailing_comma() {
+ FormalParameterList list = parseFormalParameterList('(A a, {B b,})');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(2));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionDeclaration_normalReturn_typeParameters_expression() {
- expect(_isFunctionDeclaration("C f<E>() => e"), isTrue);
+ void test_parseFormalParameterList_normal_multiple() {
+ FormalParameterList list = parseFormalParameterList('(A a, B b, C c)');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(3));
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionDeclaration_voidReturn_block() {
- expect(_isFunctionDeclaration("void f() {}"), isTrue);
+ void test_parseFormalParameterList_normal_named() {
+ FormalParameterList list = parseFormalParameterList('(A a, {B b})');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(2));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionDeclaration_voidReturn_expression() {
- expect(_isFunctionDeclaration("void f() => e"), isTrue);
- }
+ void test_parseFormalParameterList_normal_named_inFunctionType() {
+ FormalParameterList list =
+ parseFormalParameterList('(A, {B b})', inFunctionType: true);
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
+ NodeList<FormalParameter> parameters = list.parameters;
+ expect(parameters, hasLength(2));
- void test_isFunctionDeclaration_voidReturn_typeParameters_block() {
- expect(_isFunctionDeclaration("void f<E>() {}"), isTrue);
- }
+ expect(parameters[0], new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter required = parameters[0];
+ expect(required.identifier, isNull);
+ expect(required.type, new isInstanceOf<TypeName>());
+ expect((required.type as TypeName).name.name, 'A');
- void test_isFunctionDeclaration_voidReturn_typeParameters_expression() {
- expect(_isFunctionDeclaration("void f<E>() => e"), isTrue);
+ expect(parameters[1], new isInstanceOf<DefaultFormalParameter>());
+ DefaultFormalParameter named = parameters[1];
+ expect(named.identifier, isNotNull);
+ expect(named.parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simple = named.parameter;
+ expect(simple.type, new isInstanceOf<TypeName>());
+ expect((simple.type as TypeName).name.name, 'B');
}
- void test_isFunctionExpression_false_noBody() {
- expect(_isFunctionExpression("f();"), isFalse);
+ void test_parseFormalParameterList_normal_positional() {
+ FormalParameterList list = parseFormalParameterList('(A a, [B b])');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(2));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_false_notParameters() {
- expect(_isFunctionExpression("(a + b) {"), isFalse);
+ void test_parseFormalParameterList_normal_single() {
+ FormalParameterList list = parseFormalParameterList('(A a)');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(1));
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_noParameters_block() {
- expect(_isFunctionExpression("() {}"), isTrue);
+ void test_parseFormalParameterList_normal_single_Function() {
+ FormalParameterList list = parseFormalParameterList('(Function f)');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(1));
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_noParameters_expression() {
- expect(_isFunctionExpression("() => e"), isTrue);
+ void test_parseFormalParameterList_normal_single_trailing_comma() {
+ FormalParameterList list = parseFormalParameterList('(A a,)');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(1));
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_noParameters_typeParameters_block() {
- expect(_isFunctionExpression("<E>() {}"), isTrue);
+ void test_parseFormalParameterList_positional_multiple() {
+ FormalParameterList list =
+ parseFormalParameterList('([A a = null, B b, C c = null])');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(3));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_noParameters_typeParameters_expression() {
- expect(_isFunctionExpression("<E>() => e"), isTrue);
+ void test_parseFormalParameterList_positional_single() {
+ FormalParameterList list = parseFormalParameterList('([A a = null])');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(1));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_parameter_final() {
- expect(_isFunctionExpression("(final a) {}"), isTrue);
- expect(_isFunctionExpression("(final a, b) {}"), isTrue);
- expect(_isFunctionExpression("(final a, final b) {}"), isTrue);
+ void test_parseFormalParameterList_positional_trailing_comma() {
+ FormalParameterList list = parseFormalParameterList('(A a, [B b,])');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNotNull);
+ expect(list.parameters, hasLength(2));
+ expect(list.rightDelimiter, isNotNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_parameter_final_typed() {
- expect(_isFunctionExpression("(final int a) {}"), isTrue);
- expect(_isFunctionExpression("(final prefix.List a) {}"), isTrue);
- expect(_isFunctionExpression("(final List<int> a) {}"), isTrue);
- expect(_isFunctionExpression("(final prefix.List<int> a) {}"), isTrue);
+ void test_parseFormalParameterList_prefixedType() {
+ FormalParameterList list = parseFormalParameterList('(io.File f)');
+ expect(list, isNotNull);
+ assertNoErrors();
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(1));
+ expect(list.parameters[0].toSource(), 'io.File f');
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_parameter_multiple() {
- expect(_isFunctionExpression("(a, b) {}"), isTrue);
+ void test_parseFormalParameterList_prefixedType_partial() {
+ FormalParameterList list = parseFormalParameterList('(io.)', errorCodes: [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ expect(list, isNotNull);
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(1));
+ expect(list.parameters[0].toSource(), 'io. ');
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_parameter_named() {
- expect(_isFunctionExpression("({a}) {}"), isTrue);
+ void test_parseFormalParameterList_prefixedType_partial2() {
+ FormalParameterList list = parseFormalParameterList('(io.,a)', errorCodes: [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ expect(list, isNotNull);
+ expect(list.leftParenthesis, isNotNull);
+ expect(list.leftDelimiter, isNull);
+ expect(list.parameters, hasLength(2));
+ expect(list.parameters[0].toSource(), 'io. ');
+ expect(list.parameters[1].toSource(), 'a');
+ expect(list.rightDelimiter, isNull);
+ expect(list.rightParenthesis, isNotNull);
}
- void test_isFunctionExpression_parameter_optional() {
- expect(_isFunctionExpression("([a]) {}"), isTrue);
+ void test_parseNormalFormalParameter_field_const_noType() {
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('const this.a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNotNull);
+ expect(fieldParameter.type, isNull);
+ expect(fieldParameter.identifier, isNotNull);
+ expect(fieldParameter.parameters, isNull);
}
- void test_isFunctionExpression_parameter_single() {
- expect(_isFunctionExpression("(a) {}"), isTrue);
+ void test_parseNormalFormalParameter_field_const_type() {
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('const A this.a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNotNull);
+ expect(fieldParameter.type, isNotNull);
+ expect(fieldParameter.identifier, isNotNull);
+ expect(fieldParameter.parameters, isNull);
}
- void test_isFunctionExpression_parameter_typed() {
- expect(_isFunctionExpression("(int a, int b) {}"), isTrue);
+ void test_parseNormalFormalParameter_field_final_noType() {
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('final this.a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNotNull);
+ expect(fieldParameter.type, isNull);
+ expect(fieldParameter.identifier, isNotNull);
+ expect(fieldParameter.parameters, isNull);
}
- void test_isInitializedVariableDeclaration_assignment() {
- expect(_isInitializedVariableDeclaration("a = null;"), isFalse);
+ void test_parseNormalFormalParameter_field_final_type() {
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('final A this.a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNotNull);
+ expect(fieldParameter.type, isNotNull);
+ expect(fieldParameter.identifier, isNotNull);
+ expect(fieldParameter.parameters, isNull);
}
- void test_isInitializedVariableDeclaration_comparison() {
- expect(_isInitializedVariableDeclaration("a < 0;"), isFalse);
+ void test_parseNormalFormalParameter_field_function_nested() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('this.a(B b)');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNull);
+ expect(fieldParameter.type, isNull);
+ expect(fieldParameter.identifier, isNotNull);
+ FormalParameterList parameterList = fieldParameter.parameters;
+ expect(parameterList, isNotNull);
+ expect(parameterList.parameters, hasLength(1));
}
- void test_isInitializedVariableDeclaration_conditional() {
- expect(_isInitializedVariableDeclaration("a == null ? init() : update();"),
- isFalse);
+ void test_parseNormalFormalParameter_field_function_noNested() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('this.a()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNull);
+ expect(fieldParameter.type, isNull);
+ expect(fieldParameter.identifier, isNotNull);
+ FormalParameterList parameterList = fieldParameter.parameters;
+ expect(parameterList, isNotNull);
+ expect(parameterList.parameters, hasLength(0));
}
- void test_isInitializedVariableDeclaration_const_noType_initialized() {
- expect(_isInitializedVariableDeclaration("const a = 0;"), isTrue);
+ void test_parseNormalFormalParameter_field_noType() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('this.a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNull);
+ expect(fieldParameter.type, isNull);
+ expect(fieldParameter.identifier, isNotNull);
+ expect(fieldParameter.parameters, isNull);
}
- void test_isInitializedVariableDeclaration_const_noType_uninitialized() {
- expect(_isInitializedVariableDeclaration("const a;"), isTrue);
+ void test_parseNormalFormalParameter_field_type() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('A this.a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNull);
+ expect(fieldParameter.type, isNotNull);
+ expect(fieldParameter.identifier, isNotNull);
+ expect(fieldParameter.parameters, isNull);
}
- void test_isInitializedVariableDeclaration_const_simpleType_uninitialized() {
- expect(_isInitializedVariableDeclaration("const A a;"), isTrue);
+ void test_parseNormalFormalParameter_field_var() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('var this.a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FieldFormalParameter>());
+ FieldFormalParameter fieldParameter = parameter;
+ expect(fieldParameter.keyword, isNotNull);
+ expect(fieldParameter.type, isNull);
+ expect(fieldParameter.identifier, isNotNull);
+ expect(fieldParameter.parameters, isNull);
}
- void test_isInitializedVariableDeclaration_final_noType_initialized() {
- expect(_isInitializedVariableDeclaration("final a = 0;"), isTrue);
+ void test_parseNormalFormalParameter_function_noType() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('a()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNull);
+ expect(functionParameter.parameters, isNotNull);
}
- void test_isInitializedVariableDeclaration_final_noType_uninitialized() {
- expect(_isInitializedVariableDeclaration("final a;"), isTrue);
+ void test_parseNormalFormalParameter_function_noType_nullable() {
+ enableNnbd = true;
+ NormalFormalParameter parameter = parseNormalFormalParameter('a()?');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNotNull);
}
- void test_isInitializedVariableDeclaration_final_simpleType_initialized() {
- expect(_isInitializedVariableDeclaration("final A a = 0;"), isTrue);
+ void test_parseNormalFormalParameter_function_noType_typeParameterComments() {
+ enableGenericMethodComments = true;
+ NormalFormalParameter parameter = parseNormalFormalParameter('a/*<E>*/()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
}
- void test_isInitializedVariableDeclaration_functionDeclaration_typed() {
- expect(_isInitializedVariableDeclaration("A f() {};"), isFalse);
+ void test_parseNormalFormalParameter_function_noType_typeParameters() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('a<E>()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNull);
+ expect(functionParameter.question, isNull);
}
- void test_isInitializedVariableDeclaration_functionDeclaration_untyped() {
- expect(_isInitializedVariableDeclaration("f() {};"), isFalse);
+ void
+ test_parseNormalFormalParameter_function_noType_typeParameters_nullable() {
+ enableNnbd = true;
+ NormalFormalParameter parameter = parseNormalFormalParameter('a<E>()?');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNotNull);
}
- void test_isInitializedVariableDeclaration_noType_initialized() {
- expect(_isInitializedVariableDeclaration("var a = 0;"), isTrue);
+ void test_parseNormalFormalParameter_function_type() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('A a()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNull);
}
- void test_isInitializedVariableDeclaration_noType_uninitialized() {
- expect(_isInitializedVariableDeclaration("var a;"), isTrue);
+ void test_parseNormalFormalParameter_function_type_nullable() {
+ enableNnbd = true;
+ NormalFormalParameter parameter = parseNormalFormalParameter('A a()?');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNotNull);
}
- void test_isInitializedVariableDeclaration_parameterizedType_initialized() {
- expect(_isInitializedVariableDeclaration("List<int> a = null;"), isTrue);
+ void test_parseNormalFormalParameter_function_type_typeParameterComments() {
+ enableGenericMethodComments = true;
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('A a/*<E>*/()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNull);
}
- void test_isInitializedVariableDeclaration_parameterizedType_uninitialized() {
- expect(_isInitializedVariableDeclaration("List<int> a;"), isTrue);
+ void test_parseNormalFormalParameter_function_type_typeParameters() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('A a<E>()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNull);
}
- void test_isInitializedVariableDeclaration_simpleType_initialized() {
- expect(_isInitializedVariableDeclaration("A a = 0;"), isTrue);
+ void test_parseNormalFormalParameter_function_type_typeParameters_nullable() {
+ enableNnbd = true;
+ NormalFormalParameter parameter = parseNormalFormalParameter('A a<E>()?');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNotNull);
}
- void test_isInitializedVariableDeclaration_simpleType_uninitialized() {
- expect(_isInitializedVariableDeclaration("A a;"), isTrue);
+ void test_parseNormalFormalParameter_function_void() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('void a()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNull);
}
- void test_isSwitchMember_case_labeled() {
- expect(_isSwitchMember("l1: l2: case"), isTrue);
+ void test_parseNormalFormalParameter_function_void_nullable() {
+ enableNnbd = true;
+ NormalFormalParameter parameter = parseNormalFormalParameter('void a()?');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNotNull);
}
- void test_isSwitchMember_case_unlabeled() {
- expect(_isSwitchMember("case"), isTrue);
+ void test_parseNormalFormalParameter_function_void_typeParameterComments() {
+ enableGenericMethodComments = true;
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('void a/*<E>*/()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNull);
}
- void test_isSwitchMember_default_labeled() {
- expect(_isSwitchMember("l1: l2: default"), isTrue);
+ void test_parseNormalFormalParameter_function_void_typeParameters() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('void a<E>()');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNull);
}
- void test_isSwitchMember_default_unlabeled() {
- expect(_isSwitchMember("default"), isTrue);
+ void test_parseNormalFormalParameter_function_void_typeParameters_nullable() {
+ enableNnbd = true;
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('void a<E>()?');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<FunctionTypedFormalParameter>());
+ FunctionTypedFormalParameter functionParameter = parameter;
+ expect(functionParameter.returnType, isNotNull);
+ expect(functionParameter.identifier, isNotNull);
+ expect(functionParameter.typeParameters, isNotNull);
+ expect(functionParameter.parameters, isNotNull);
+ expect(functionParameter.question, isNotNull);
}
- void test_isSwitchMember_false() {
- expect(_isSwitchMember("break;"), isFalse);
+ void test_parseNormalFormalParameter_simple_const_noType() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('const a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.identifier, isNotNull);
}
- void test_parseAdditiveExpression_normal() {
- createParser('x + y');
- Expression expression = parser.parseAdditiveExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.PLUS);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_parseNormalFormalParameter_simple_const_type() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('const A a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
}
- void test_parseAdditiveExpression_super() {
- createParser('super + y');
- Expression expression = parser.parseAdditiveExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.PLUS);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_parseNormalFormalParameter_simple_final_noType() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('final a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.identifier, isNotNull);
}
- void test_parseAnnotation_n1() {
- createParser('@A');
- Annotation annotation = parser.parseAnnotation();
- expectNotNullIfNoErrors(annotation);
- listener.assertNoErrors();
- expect(annotation.atSign, isNotNull);
- expect(annotation.name, isNotNull);
- expect(annotation.period, isNull);
- expect(annotation.constructorName, isNull);
- expect(annotation.arguments, isNull);
+ void test_parseNormalFormalParameter_simple_final_type() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('final A a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.keyword, isNotNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
}
- void test_parseAnnotation_n1_a() {
- createParser('@A(x,y)');
- Annotation annotation = parser.parseAnnotation();
- expectNotNullIfNoErrors(annotation);
- listener.assertNoErrors();
- expect(annotation.atSign, isNotNull);
- expect(annotation.name, isNotNull);
- expect(annotation.period, isNull);
- expect(annotation.constructorName, isNull);
- expect(annotation.arguments, isNotNull);
+ void test_parseNormalFormalParameter_simple_noName() {
+ NormalFormalParameter parameter =
+ parseNormalFormalParameter('a', inFunctionType: true);
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.identifier, isNull);
}
- void test_parseAnnotation_n2() {
- createParser('@A.B');
- Annotation annotation = parser.parseAnnotation();
- expectNotNullIfNoErrors(annotation);
- listener.assertNoErrors();
- expect(annotation.atSign, isNotNull);
- expect(annotation.name, isNotNull);
- expect(annotation.period, isNull);
- expect(annotation.constructorName, isNull);
- expect(annotation.arguments, isNull);
+ void test_parseNormalFormalParameter_simple_noType() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.identifier, isNotNull);
}
- void test_parseAnnotation_n2_a() {
- createParser('@A.B(x,y)');
- Annotation annotation = parser.parseAnnotation();
- expectNotNullIfNoErrors(annotation);
- listener.assertNoErrors();
- expect(annotation.atSign, isNotNull);
- expect(annotation.name, isNotNull);
- expect(annotation.period, isNull);
- expect(annotation.constructorName, isNull);
- expect(annotation.arguments, isNotNull);
+ void test_parseNormalFormalParameter_simple_noType_namedCovariant() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('covariant');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.covariantKeyword, isNull);
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNull);
+ expect(simpleParameter.identifier, isNotNull);
}
- void test_parseAnnotation_n3() {
- createParser('@A.B.C');
- Annotation annotation = parser.parseAnnotation();
- expectNotNullIfNoErrors(annotation);
- listener.assertNoErrors();
- expect(annotation.atSign, isNotNull);
- expect(annotation.name, isNotNull);
- expect(annotation.period, isNotNull);
- expect(annotation.constructorName, isNotNull);
- expect(annotation.arguments, isNull);
+ void test_parseNormalFormalParameter_simple_type() {
+ NormalFormalParameter parameter = parseNormalFormalParameter('A a');
+ expect(parameter, isNotNull);
+ assertNoErrors();
+ expect(parameter, new isInstanceOf<SimpleFormalParameter>());
+ SimpleFormalParameter simpleParameter = parameter;
+ expect(simpleParameter.keyword, isNull);
+ expect(simpleParameter.type, isNotNull);
+ expect(simpleParameter.identifier, isNotNull);
}
+}
- void test_parseAnnotation_n3_a() {
- createParser('@A.B.C(x,y)');
- Annotation annotation = parser.parseAnnotation();
- expectNotNullIfNoErrors(annotation);
+@reflectiveTest
+class NonErrorParserTest extends ParserTestCase {
+ void test_constFactory_external() {
+ createParser('external const factory C();');
+ ClassMember member = parser.parseClassMember('C');
+ expectNotNullIfNoErrors(member);
listener.assertNoErrors();
- expect(annotation.atSign, isNotNull);
- expect(annotation.name, isNotNull);
- expect(annotation.period, isNotNull);
- expect(annotation.constructorName, isNotNull);
- expect(annotation.arguments, isNotNull);
}
- void test_parseArgument_named() {
- createParser('n: x');
- Expression expression = parser.parseArgument();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<NamedExpression>());
- NamedExpression namedExpression = expression;
- Label name = namedExpression.name;
- expect(name, isNotNull);
- expect(name.label, isNotNull);
- expect(name.colon, isNotNull);
- expect(namedExpression.expression, isNotNull);
+ void test_staticMethod_notParsingFunctionBodies() {
+ ParserTestCase.parseFunctionBodies = false;
+ try {
+ createParser('class C { static void m() {} }');
+ CompilationUnit unit = parser.parseCompilationUnit2();
+ expectNotNullIfNoErrors(unit);
+ listener.assertNoErrors();
+ } finally {
+ ParserTestCase.parseFunctionBodies = true;
+ }
}
+}
- void test_parseArgument_unnamed() {
- String lexeme = "x";
- createParser(lexeme);
- Expression expression = parser.parseArgument();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = expression;
- expect(identifier.name, lexeme);
- }
+/**
+ * Implementation of [AbstractParserTestCase] specialized for testing the
+ * analyzer parser.
+ */
+class ParserTestCase extends EngineTestCase
+ with ParserTestHelpers
+ implements AbstractParserTestCase {
+ /**
+ * A flag indicating whether parser is to parse function bodies.
+ */
+ static bool parseFunctionBodies = true;
- void test_parseArgumentList_empty() {
- createParser('()');
- ArgumentList argumentList = parser.parseArgumentList();
- expectNotNullIfNoErrors(argumentList);
- listener.assertNoErrors();
- NodeList<Expression> arguments = argumentList.arguments;
- expect(arguments, hasLength(0));
+ /**
+ * A flag indicating whether the parser is to parse asserts in the initializer
+ * list of a constructor.
+ */
+ bool enableAssertInitializer = false;
+
+ /**
+ * A flag indicating whether parser is to parse async.
+ */
+ bool parseAsync = true;
+
+ /**
+ * Whether generic method comments should be enabled for the test.
+ */
+ bool enableGenericMethodComments = false;
+
+ /**
+ * A flag indicating whether lazy assignment operators should be enabled for
+ * the test.
+ */
+ bool enableLazyAssignmentOperators = false;
+
+ /**
+ * A flag indicating whether the parser is to parse the non-nullable modifier
+ * in type names.
+ */
+ bool enableNnbd = false;
+
+ /**
+ * A flag indicating whether the parser is to parse part-of directives that
+ * specify a URI rather than a library name.
+ */
+ bool enableUriInPartOf = false;
+
+ /**
+ * The error listener to which scanner and parser errors will be reported.
+ *
+ * This field is typically initialized by invoking [createParser].
+ */
+ GatheringErrorListener listener;
+
+ /**
+ * The parser used by the test.
+ *
+ * This field is typically initialized by invoking [createParser].
+ */
+ Parser parser;
+
+ @override
+ void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
+ listener.assertErrorsWithCodes(expectedErrorCodes);
}
- void test_parseArgumentList_mixed() {
- createParser('(w, x, y: y, z: z)');
- ArgumentList argumentList = parser.parseArgumentList();
- expectNotNullIfNoErrors(argumentList);
+ @override
+ void assertNoErrors() {
listener.assertNoErrors();
- NodeList<Expression> arguments = argumentList.arguments;
- expect(arguments, hasLength(4));
}
- void test_parseArgumentList_noNamed() {
- createParser('(x, y, z)');
- ArgumentList argumentList = parser.parseArgumentList();
- expectNotNullIfNoErrors(argumentList);
- listener.assertNoErrors();
- NodeList<Expression> arguments = argumentList.arguments;
- expect(arguments, hasLength(3));
+ /**
+ * Create the [parser] and [listener] used by a test. The [parser] will be
+ * prepared to parse the tokens scanned from the given [content].
+ */
+ void createParser(String content) {
+ listener = new GatheringErrorListener();
+ //
+ // Scan the source.
+ //
+ TestSource source = new TestSource();
+ CharacterReader reader = new CharSequenceReader(content);
+ Scanner scanner = new Scanner(source, reader, listener);
+ scanner.scanGenericMethodComments = enableGenericMethodComments;
+ scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators;
+ Token tokenStream = scanner.tokenize();
+ listener.setLineInfo(source, scanner.lineStarts);
+ //
+ // Create and initialize the parser.
+ //
+ parser = new Parser(source, listener);
+ parser.enableAssertInitializer = enableAssertInitializer;
+ parser.parseGenericMethodComments = enableGenericMethodComments;
+ parser.parseFunctionBodies = parseFunctionBodies;
+ parser.enableNnbd = enableNnbd;
+ parser.enableUriInPartOf = enableUriInPartOf;
+ parser.currentToken = tokenStream;
}
- void test_parseArgumentList_onlyNamed() {
- createParser('(x: x, y: y)');
- ArgumentList argumentList = parser.parseArgumentList();
- expectNotNullIfNoErrors(argumentList);
- listener.assertNoErrors();
- NodeList<Expression> arguments = argumentList.arguments;
- expect(arguments, hasLength(2));
+ void expectNotNullIfNoErrors(Object result) {
+ if (!listener.hasErrors) {
+ expect(result, isNotNull);
+ }
}
- void test_parseArgumentList_trailing_comma() {
- createParser('(x, y, z,)');
- ArgumentList argumentList = parser.parseArgumentList();
- expectNotNullIfNoErrors(argumentList);
- listener.assertNoErrors();
- NodeList<Expression> arguments = argumentList.arguments;
- expect(arguments, hasLength(3));
+ /**
+ * Parse the given source as a compilation unit.
+ *
+ * @param source the source to be parsed
+ * @param errorCodes the error codes of the errors that are expected to be found
+ * @return the compilation unit that was parsed
+ * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+ * not match those that are expected, or if the result would have been `null`
+ */
+ CompilationUnit parseCompilationUnit(String source,
+ [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+ GatheringErrorListener listener = new GatheringErrorListener();
+ Scanner scanner =
+ new Scanner(null, new CharSequenceReader(source), listener);
+ listener.setLineInfo(new TestSource(), scanner.lineStarts);
+ Token token = scanner.tokenize();
+ Parser parser = new Parser(null, listener);
+ CompilationUnit unit = parser.parseCompilationUnit(token);
+ expect(unit, isNotNull);
+ listener.assertErrorsWithCodes(errorCodes);
+ return unit;
}
- void test_parseAssertStatement() {
- createParser('assert (x);');
- AssertStatement statement = parser.parseAssertStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement.assertKeyword, isNotNull);
- expect(statement.leftParenthesis, isNotNull);
- expect(statement.condition, isNotNull);
- expect(statement.comma, isNull);
- expect(statement.message, isNull);
- expect(statement.rightParenthesis, isNotNull);
- expect(statement.semicolon, isNotNull);
+ /**
+ * Parse the given [code] as a compilation unit.
+ */
+ CompilationUnit parseCompilationUnit2(String code,
+ {AnalysisErrorListener listener}) {
+ listener ??= AnalysisErrorListener.NULL_LISTENER;
+ Scanner scanner = new Scanner(null, new CharSequenceReader(code), listener);
+ Token token = scanner.tokenize();
+ Parser parser = new Parser(null, listener);
+ CompilationUnit unit = parser.parseCompilationUnit(token);
+ unit.lineInfo = new LineInfo(scanner.lineStarts);
+ return unit;
}
- void test_parseAssertStatement_messageLowPrecedence() {
- // Using a throw expression as an assert message would be silly in
- // practice, but it's the lowest precedence expression type, so verifying
- // that it works should give us high confidence that other expression types
- // will work as well.
- createParser('assert (x, throw "foo");');
- AssertStatement statement = parser.parseAssertStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement.assertKeyword, isNotNull);
- expect(statement.leftParenthesis, isNotNull);
- expect(statement.condition, isNotNull);
- expect(statement.comma, isNotNull);
- expect(statement.message, isNotNull);
- expect(statement.rightParenthesis, isNotNull);
- expect(statement.semicolon, isNotNull);
+ /**
+ * Parse the given [source] as a compilation unit. Throw an exception if the
+ * source could not be parsed, if the compilation errors in the source do not
+ * match those that are expected, or if the result would have been `null`.
+ */
+ CompilationUnit parseCompilationUnitWithOptions(String source,
+ [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+ createParser(source);
+ CompilationUnit unit = parser.parseCompilationUnit2();
+ expect(unit, isNotNull);
+ listener.assertErrorsWithCodes(errorCodes);
+ return unit;
}
- void test_parseAssertStatement_messageString() {
- createParser('assert (x, "foo");');
- AssertStatement statement = parser.parseAssertStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement.assertKeyword, isNotNull);
- expect(statement.leftParenthesis, isNotNull);
- expect(statement.condition, isNotNull);
- expect(statement.comma, isNotNull);
- expect(statement.message, isNotNull);
- expect(statement.rightParenthesis, isNotNull);
- expect(statement.semicolon, isNotNull);
+ @override
+ CompilationUnit parseDirectives(String source,
+ [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+ createParser(source);
+ CompilationUnit unit = parser.parseDirectives2();
+ expect(unit, isNotNull);
+ expect(unit.declarations, hasLength(0));
+ listener.assertErrorsWithCodes(errorCodes);
+ return unit;
}
- void test_parseAssignableExpression_expression_args_dot() {
- createParser('(x)(y).z');
- Expression expression = parser.parseAssignableExpression(false);
+ /**
+ * Parse the given source as an expression.
+ *
+ * @param source the source to be parsed
+ * @param errorCodes the error codes of the errors that are expected to be found
+ * @return the expression that was parsed
+ * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+ * not match those that are expected, or if the result would have been `null`
+ */
+ Expression parseExpression(String source,
+ [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+ createParser(source);
+ Expression expression = parser.parseExpression2();
expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- FunctionExpressionInvocation invocation =
- propertyAccess.target as FunctionExpressionInvocation;
- expect(invocation.function, isNotNull);
- expect(invocation.typeArguments, isNull);
- ArgumentList argumentList = invocation.argumentList;
- expect(argumentList, isNotNull);
- expect(argumentList.arguments, hasLength(1));
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.propertyName, isNotNull);
+ listener.assertErrorsWithCodes(errorCodes);
+ return expression;
}
- void
- test_parseAssignableExpression_expression_args_dot_typeParameterComments() {
- enableGenericMethodComments = true;
- createParser('(x)/*<F>*/(y).z');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- FunctionExpressionInvocation invocation =
- propertyAccess.target as FunctionExpressionInvocation;
- expect(invocation.function, isNotNull);
- expect(invocation.typeArguments, isNotNull);
- ArgumentList argumentList = invocation.argumentList;
- expect(argumentList, isNotNull);
- expect(argumentList.arguments, hasLength(1));
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.propertyName, isNotNull);
+ @override
+ FormalParameter parseFormalParameter(String code, ParameterKind kind,
+ {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
+ createParser(code);
+ FormalParameter parameter = parser.parseFormalParameter(kind);
+ assertErrorsWithCodes(errorCodes);
+ return parameter;
}
- void test_parseAssignableExpression_expression_args_dot_typeParameters() {
- createParser('(x)<F>(y).z');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- FunctionExpressionInvocation invocation =
- propertyAccess.target as FunctionExpressionInvocation;
- expect(invocation.function, isNotNull);
- expect(invocation.typeArguments, isNotNull);
- ArgumentList argumentList = invocation.argumentList;
- expect(argumentList, isNotNull);
- expect(argumentList.arguments, hasLength(1));
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.propertyName, isNotNull);
+ @override
+ FormalParameterList parseFormalParameterList(String code,
+ {bool inFunctionType: false,
+ List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
+ createParser(code);
+ FormalParameterList list =
+ parser.parseFormalParameterList(inFunctionType: inFunctionType);
+ assertErrorsWithCodes(errorCodes);
+ return list;
}
- void test_parseAssignableExpression_expression_dot() {
- createParser('(x).y');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- expect(propertyAccess.target, isNotNull);
- expect(propertyAccess.operator.type, TokenType.PERIOD);
- expect(propertyAccess.propertyName, isNotNull);
+ /**
+ * Parses a single top level member of a compilation unit (other than a
+ * directive), including any comment and/or metadata that precedes it.
+ */
+ CompilationUnitMember parseFullCompilationUnitMember() =>
+ parser.parseCompilationUnitMember(parser.parseCommentAndMetadata());
+
+ @override
+ Directive parseFullDirective() =>
+ parser.parseDirective(parser.parseCommentAndMetadata());
+
+ /**
+ * Parses a variable declaration list (equivalent to a variable declaration
+ * statement, but without the final comma).
+ */
+ VariableDeclarationList parseFullVariableDeclarationList() =>
+ parser.parseVariableDeclarationListAfterMetadata(
+ parser.parseCommentAndMetadata());
+
+ @override
+ NormalFormalParameter parseNormalFormalParameter(String code,
+ {bool inFunctionType: false,
+ List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
+ createParser(code);
+ FormalParameter parameter =
+ parser.parseNormalFormalParameter(inFunctionType: inFunctionType);
+ assertErrorsWithCodes(errorCodes);
+ return parameter;
}
- void test_parseAssignableExpression_expression_index() {
- createParser('(x)[y]');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<IndexExpression>());
- IndexExpression indexExpression = expression;
- expect(indexExpression.target, isNotNull);
- expect(indexExpression.leftBracket, isNotNull);
- expect(indexExpression.index, isNotNull);
- expect(indexExpression.rightBracket, isNotNull);
+ /**
+ * Parse the given [source] as a statement. The [errorCodes] are the error
+ * codes of the errors that are expected to be found. If
+ * [enableLazyAssignmentOperators] is `true`, then lazy assignment operators
+ * should be enabled.
+ */
+ Statement parseStatement(String source,
+ [List<ErrorCode> errorCodes = const <ErrorCode>[],
+ bool enableLazyAssignmentOperators]) {
+ GatheringErrorListener listener = new GatheringErrorListener();
+ Scanner scanner =
+ new Scanner(null, new CharSequenceReader(source), listener);
+ scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators;
+ listener.setLineInfo(new TestSource(), scanner.lineStarts);
+ Token token = scanner.tokenize();
+ Parser parser = new Parser(null, listener);
+ Statement statement = parser.parseStatement(token);
+ expect(statement, isNotNull);
+ listener.assertErrorsWithCodes(errorCodes);
+ return statement;
}
- void test_parseAssignableExpression_expression_question_dot() {
- createParser('(x)?.y');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- expect(propertyAccess.target, isNotNull);
- expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
- expect(propertyAccess.propertyName, isNotNull);
+ /**
+ * Parse the given source as a sequence of statements.
+ *
+ * @param source the source to be parsed
+ * @param expectedCount the number of statements that are expected
+ * @param errorCodes the error codes of the errors that are expected to be found
+ * @return the statements that were parsed
+ * @throws Exception if the source could not be parsed, if the number of statements does not match
+ * the expected count, if the compilation errors in the source do not match those that
+ * are expected, or if the result would have been `null`
+ */
+ List<Statement> parseStatements(String source, int expectedCount,
+ [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+ GatheringErrorListener listener = new GatheringErrorListener();
+ Scanner scanner =
+ new Scanner(null, new CharSequenceReader(source), listener);
+ listener.setLineInfo(new TestSource(), scanner.lineStarts);
+ Token token = scanner.tokenize();
+ Parser parser = new Parser(null, listener);
+ List<Statement> statements = parser.parseStatements(token);
+ expect(statements, hasLength(expectedCount));
+ listener.assertErrorsWithCodes(errorCodes);
+ return statements;
}
- void test_parseAssignableExpression_identifier() {
- createParser('x');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = expression;
- expect(identifier, isNotNull);
+ @override
+ void setUp() {
+ super.setUp();
+ parseFunctionBodies = true;
}
+}
- void test_parseAssignableExpression_identifier_args_dot() {
- createParser('x(y).z');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- MethodInvocation invocation = propertyAccess.target as MethodInvocation;
- expect(invocation.methodName.name, "x");
- expect(invocation.typeArguments, isNull);
- ArgumentList argumentList = invocation.argumentList;
- expect(argumentList, isNotNull);
- expect(argumentList.arguments, hasLength(1));
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.propertyName, isNotNull);
+/**
+ * Helper methods that aid in parser tests.
+ *
+ * Intended to be mixed in to parser test case classes.
+ */
+class ParserTestHelpers {
+ void expectCommentText(Comment comment, String expectedText) {
+ expect(comment.beginToken, same(comment.endToken));
+ expect(comment.beginToken.lexeme, expectedText);
+ }
+
+ void expectDottedName(DottedName name, List<String> expectedComponents) {
+ int count = expectedComponents.length;
+ NodeList<SimpleIdentifier> components = name.components;
+ expect(components, hasLength(count));
+ for (int i = 0; i < count; i++) {
+ SimpleIdentifier component = components[i];
+ expect(component, isNotNull);
+ expect(component.name, expectedComponents[i]);
+ }
+ }
+}
+
+/**
+ * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
+ * sequences to ensure that the correct recovery steps are taken in the parser.
+ */
+@reflectiveTest
+class RecoveryParserTest extends ParserTestCase {
+ void test_additiveExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void
- test_parseAssignableExpression_identifier_args_dot_typeParameterComments() {
- enableGenericMethodComments = true;
- createParser('x/*<E>*/(y).z');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- MethodInvocation invocation = propertyAccess.target as MethodInvocation;
- expect(invocation.methodName.name, "x");
- expect(invocation.typeArguments, isNotNull);
- ArgumentList argumentList = invocation.argumentList;
- expect(argumentList, isNotNull);
- expect(argumentList.arguments, hasLength(1));
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.propertyName, isNotNull);
+ void test_additiveExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("+", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseAssignableExpression_identifier_args_dot_typeParameters() {
- createParser('x<E>(y).z');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- MethodInvocation invocation = propertyAccess.target as MethodInvocation;
- expect(invocation.methodName.name, "x");
- expect(invocation.typeArguments, isNotNull);
- ArgumentList argumentList = invocation.argumentList;
- expect(argumentList, isNotNull);
- expect(argumentList.arguments, hasLength(1));
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.propertyName, isNotNull);
+ void test_additiveExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseAssignableExpression_identifier_dot() {
- createParser('x.y');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- expect(propertyAccess.target, isNotNull);
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.operator.type, TokenType.PERIOD);
- expect(propertyAccess.propertyName, isNotNull);
+ void test_additiveExpression_missing_RHS_super() {
+ BinaryExpression expression =
+ parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseAssignableExpression_identifier_index() {
- createParser('x[y]');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<IndexExpression>());
- IndexExpression indexExpression = expression;
- expect(indexExpression.target, isNotNull);
- expect(indexExpression.leftBracket, isNotNull);
- expect(indexExpression.index, isNotNull);
- expect(indexExpression.rightBracket, isNotNull);
+ void test_additiveExpression_precedence_multiplicative_left() {
+ BinaryExpression expression = parseExpression("* +", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseAssignableExpression_identifier_question_dot() {
- createParser('x?.y');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- expect(propertyAccess.target, isNotNull);
- expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
- expect(propertyAccess.propertyName, isNotNull);
+ void test_additiveExpression_precedence_multiplicative_right() {
+ BinaryExpression expression = parseExpression("+ *", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.rightOperand);
}
- void test_parseAssignableExpression_super_dot() {
- createParser('super.y');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
- SuperExpression, propertyAccess.target);
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.propertyName, isNotNull);
+ void test_additiveExpression_super() {
+ BinaryExpression expression = parseExpression("super + +", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseAssignableExpression_super_index() {
- createParser('super[y]');
- Expression expression = parser.parseAssignableExpression(false);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<IndexExpression>());
- IndexExpression indexExpression = expression;
- expect(indexExpression.target, new isInstanceOf<SuperExpression>());
- expect(indexExpression.leftBracket, isNotNull);
- expect(indexExpression.index, isNotNull);
- expect(indexExpression.rightBracket, isNotNull);
+ void test_assignableSelector() {
+ IndexExpression expression =
+ parseExpression("a.b[]", [ParserErrorCode.MISSING_IDENTIFIER]);
+ Expression index = expression.index;
+ expect(index, new isInstanceOf<SimpleIdentifier>());
+ expect(index.isSynthetic, isTrue);
}
- void test_parseAssignableSelector_dot() {
- createParser('.x');
- Expression expression = parser.parseAssignableSelector(null, true);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- expect(propertyAccess.operator.type, TokenType.PERIOD);
- expect(propertyAccess.propertyName, isNotNull);
+ void test_assignmentExpression_missing_compound1() {
+ AssignmentExpression expression =
+ parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+ Expression syntheticExpression = expression.leftHandSide;
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, syntheticExpression);
+ expect(syntheticExpression.isSynthetic, isTrue);
}
- void test_parseAssignableSelector_index() {
- createParser('[x]');
- Expression expression = parser.parseAssignableSelector(null, true);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<IndexExpression>());
- IndexExpression indexExpression = expression;
- expect(indexExpression.leftBracket, isNotNull);
- expect(indexExpression.index, isNotNull);
- expect(indexExpression.rightBracket, isNotNull);
+ void test_assignmentExpression_missing_compound2() {
+ AssignmentExpression expression =
+ parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+ Expression syntheticExpression =
+ (expression.rightHandSide as AssignmentExpression).leftHandSide;
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, syntheticExpression);
+ expect(syntheticExpression.isSynthetic, isTrue);
}
- void test_parseAssignableSelector_none() {
- createParser(';');
- Expression expression =
- parser.parseAssignableSelector(astFactory.simpleIdentifier(null), true);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = expression;
- expect(identifier, isNotNull);
+ void test_assignmentExpression_missing_compound3() {
+ AssignmentExpression expression =
+ parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
+ Expression syntheticExpression =
+ (expression.rightHandSide as AssignmentExpression).rightHandSide;
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, syntheticExpression);
+ expect(syntheticExpression.isSynthetic, isTrue);
}
- void test_parseAssignableSelector_question_dot() {
- createParser('?.x');
- Expression expression = parser.parseAssignableSelector(null, true);
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
- expect(propertyAccess.propertyName, isNotNull);
+ void test_assignmentExpression_missing_LHS() {
+ AssignmentExpression expression =
+ parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftHandSide);
+ expect(expression.leftHandSide.isSynthetic, isTrue);
}
- void test_parseAwaitExpression() {
- createParser('await x;');
- AwaitExpression expression = parser.parseAwaitExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.awaitKeyword, isNotNull);
- expect(expression.expression, isNotNull);
+ void test_assignmentExpression_missing_RHS() {
+ AssignmentExpression expression =
+ parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftHandSide);
+ expect(expression.rightHandSide.isSynthetic, isTrue);
}
- void test_parseBitwiseAndExpression_normal() {
- createParser('x & y');
- Expression expression = parser.parseBitwiseAndExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.AMPERSAND);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_bitwiseAndExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ }
+
+ void test_bitwiseAndExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("&", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseBitwiseAndExpression_super() {
- createParser('super & y');
- Expression expression = parser.parseBitwiseAndExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.AMPERSAND);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_bitwiseAndExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseBitwiseOrExpression_normal() {
- createParser('x | y');
- Expression expression = parser.parseBitwiseOrExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.BAR);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_bitwiseAndExpression_missing_RHS_super() {
+ BinaryExpression expression =
+ parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseBitwiseOrExpression_super() {
- createParser('super | y');
- Expression expression = parser.parseBitwiseOrExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.BAR);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_bitwiseAndExpression_precedence_equality_left() {
+ BinaryExpression expression = parseExpression("== &&", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseBitwiseXorExpression_normal() {
- createParser('x ^ y');
- Expression expression = parser.parseBitwiseXorExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.CARET);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_bitwiseAndExpression_precedence_equality_right() {
+ BinaryExpression expression = parseExpression("&& ==", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.rightOperand);
}
- void test_parseBitwiseXorExpression_super() {
- createParser('super ^ y');
- Expression expression = parser.parseBitwiseXorExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.CARET);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_bitwiseAndExpression_super() {
+ BinaryExpression expression = parseExpression("super & &", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseBlock_empty() {
- createParser('{}');
- Block block = parser.parseBlock();
- expectNotNullIfNoErrors(block);
- listener.assertNoErrors();
- expect(block.leftBracket, isNotNull);
- expect(block.statements, hasLength(0));
- expect(block.rightBracket, isNotNull);
+ void test_bitwiseOrExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void test_parseBlock_nonEmpty() {
- createParser('{;}');
- Block block = parser.parseBlock();
- expectNotNullIfNoErrors(block);
- listener.assertNoErrors();
- expect(block.leftBracket, isNotNull);
- expect(block.statements, hasLength(1));
- expect(block.rightBracket, isNotNull);
+ void test_bitwiseOrExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("|", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseBreakStatement_label() {
- createParser('break foo;');
- BreakStatement statement = parser.parseBreakStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement.breakKeyword, isNotNull);
- expect(statement.label, isNotNull);
- expect(statement.semicolon, isNotNull);
+ void test_bitwiseOrExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseBreakStatement_noLabel() {
- createParser('break;');
- BreakStatement statement = parser.parseBreakStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertErrorsWithCodes([ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
- expect(statement.breakKeyword, isNotNull);
- expect(statement.label, isNull);
- expect(statement.semicolon, isNotNull);
+ void test_bitwiseOrExpression_missing_RHS_super() {
+ BinaryExpression expression =
+ parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCascadeSection_i() {
- createParser('..[i]');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<IndexExpression>());
- IndexExpression section = expression;
- expect(section.target, isNull);
- expect(section.leftBracket, isNotNull);
- expect(section.index, isNotNull);
- expect(section.rightBracket, isNotNull);
+ void test_bitwiseOrExpression_precedence_xor_left() {
+ BinaryExpression expression = parseExpression("^ |", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseCascadeSection_ia() {
- createParser('..[i](b)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<IndexExpression>());
- expect(section.typeArguments, isNull);
- expect(section.argumentList, isNotNull);
+ void test_bitwiseOrExpression_precedence_xor_right() {
+ BinaryExpression expression = parseExpression("| ^", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.rightOperand);
}
- void test_parseCascadeSection_ia_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('..[i]/*<E>*/(b)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<IndexExpression>());
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
+ void test_bitwiseOrExpression_super() {
+ BinaryExpression expression = parseExpression("super | |", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseCascadeSection_ia_typeArguments() {
- createParser('..[i]<E>(b)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<IndexExpression>());
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
+ void test_bitwiseXorExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void test_parseCascadeSection_ii() {
- createParser('..a(b).c(d)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation section = expression;
- expect(section.target, new isInstanceOf<MethodInvocation>());
- expect(section.operator, isNotNull);
- expect(section.methodName, isNotNull);
- expect(section.typeArguments, isNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_bitwiseXorExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("^", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
+ }
+
+ void test_bitwiseXorExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
+ }
+
+ void test_bitwiseXorExpression_missing_RHS_super() {
+ BinaryExpression expression =
+ parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCascadeSection_ii_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('..a/*<E>*/(b).c/*<F>*/(d)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation section = expression;
- expect(section.target, new isInstanceOf<MethodInvocation>());
- expect(section.operator, isNotNull);
- expect(section.methodName, isNotNull);
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_bitwiseXorExpression_precedence_and_left() {
+ BinaryExpression expression = parseExpression("& ^", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseCascadeSection_ii_typeArguments() {
- createParser('..a<E>(b).c<F>(d)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation section = expression;
- expect(section.target, new isInstanceOf<MethodInvocation>());
- expect(section.operator, isNotNull);
- expect(section.methodName, isNotNull);
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_bitwiseXorExpression_precedence_and_right() {
+ BinaryExpression expression = parseExpression("^ &", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.rightOperand);
}
- void test_parseCascadeSection_p() {
- createParser('..a');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess section = expression;
- expect(section.target, isNull);
- expect(section.operator, isNotNull);
- expect(section.propertyName, isNotNull);
+ void test_bitwiseXorExpression_super() {
+ BinaryExpression expression = parseExpression("super ^ ^", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseCascadeSection_p_assign() {
- createParser('..a = 3');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<AssignmentExpression>());
- AssignmentExpression section = expression;
- expect(section.leftHandSide, isNotNull);
- expect(section.operator, isNotNull);
- Expression rhs = section.rightHandSide;
- expect(rhs, isNotNull);
+ void test_classTypeAlias_withBody() {
+ parseCompilationUnit(
+ r'''
+class A {}
+class B = Object with A {}''',
+ [ParserErrorCode.EXPECTED_TOKEN]);
}
- void test_parseCascadeSection_p_assign_withCascade() {
- createParser('..a = 3..m()');
- Expression expression = parser.parseCascadeSection();
+ void test_conditionalExpression_missingElse() {
+ createParser('x ? y :');
+ Expression expression = parser.parseConditionalExpression();
expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<AssignmentExpression>());
- AssignmentExpression section = expression;
- expect(section.leftHandSide, isNotNull);
- expect(section.operator, isNotNull);
- Expression rhs = section.rightHandSide;
- EngineTestCase.assertInstanceOf(
- (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
+ listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
+ expect(expression, new isInstanceOf<ConditionalExpression>());
+ ConditionalExpression conditionalExpression = expression;
+ expect(conditionalExpression.elseExpression,
+ new isInstanceOf<SimpleIdentifier>());
+ expect(conditionalExpression.elseExpression.isSynthetic, isTrue);
}
- void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('..a = 3..m/*<E>*/()');
- Expression expression = parser.parseCascadeSection();
+ void test_conditionalExpression_missingThen() {
+ createParser('x ? : z');
+ Expression expression = parser.parseConditionalExpression();
expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<AssignmentExpression>());
- AssignmentExpression section = expression;
- expect(section.leftHandSide, isNotNull);
- expect(section.operator, isNotNull);
- Expression rhs = section.rightHandSide;
- EngineTestCase.assertInstanceOf(
- (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
+ listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
+ expect(expression, new isInstanceOf<ConditionalExpression>());
+ ConditionalExpression conditionalExpression = expression;
+ expect(conditionalExpression.thenExpression,
+ new isInstanceOf<SimpleIdentifier>());
+ expect(conditionalExpression.thenExpression.isSynthetic, isTrue);
}
- void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
- createParser('..a = 3..m<E>()');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<AssignmentExpression>());
- AssignmentExpression section = expression;
- expect(section.leftHandSide, isNotNull);
- expect(section.operator, isNotNull);
- Expression rhs = section.rightHandSide;
- EngineTestCase.assertInstanceOf(
- (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
+ void test_declarationBeforeDirective() {
+ CompilationUnit unit = parseCompilationUnit(
+ "class foo { } import 'bar.dart';",
+ [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+ expect(unit.directives, hasLength(1));
+ expect(unit.declarations, hasLength(1));
+ ClassDeclaration classDecl = unit.childEntities.first;
+ expect(classDecl, isNotNull);
+ expect(classDecl.name.name, 'foo');
}
- void test_parseCascadeSection_p_builtIn() {
- createParser('..as');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess section = expression;
- expect(section.target, isNull);
- expect(section.operator, isNotNull);
- expect(section.propertyName, isNotNull);
+ void test_equalityExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void test_parseCascadeSection_pa() {
- createParser('..a(b)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation section = expression;
- expect(section.target, isNull);
- expect(section.operator, isNotNull);
- expect(section.methodName, isNotNull);
- expect(section.typeArguments, isNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_equalityExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("==", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCascadeSection_pa_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('..a/*<E>*/(b)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation section = expression;
- expect(section.target, isNull);
- expect(section.operator, isNotNull);
- expect(section.methodName, isNotNull);
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_equalityExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCascadeSection_pa_typeArguments() {
- createParser('..a<E>(b)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation section = expression;
- expect(section.target, isNull);
- expect(section.operator, isNotNull);
- expect(section.methodName, isNotNull);
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_equalityExpression_missing_RHS_super() {
+ BinaryExpression expression =
+ parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCascadeSection_paa() {
- createParser('..a(b)(c)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<MethodInvocation>());
- expect(section.typeArguments, isNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_equalityExpression_precedence_relational_left() {
+ BinaryExpression expression = parseExpression("is ==", [
+ ParserErrorCode.EXPECTED_TYPE_NAME,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is IsExpression, IsExpression, expression.leftOperand);
}
- void test_parseCascadeSection_paa_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('..a/*<E>*/(b)/*<F>*/(c)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<MethodInvocation>());
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_equalityExpression_precedence_relational_right() {
+ BinaryExpression expression = parseExpression("== is", [
+ ParserErrorCode.EXPECTED_TYPE_NAME,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is IsExpression, IsExpression, expression.rightOperand);
}
- void test_parseCascadeSection_paa_typeArguments() {
- createParser('..a<E>(b)<F>(c)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<MethodInvocation>());
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_equalityExpression_super() {
+ BinaryExpression expression = parseExpression("super == ==", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseCascadeSection_paapaa() {
- createParser('..a(b)(c).d(e)(f)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<MethodInvocation>());
- expect(section.typeArguments, isNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_expressionList_multiple_end() {
+ createParser(', 2, 3, 4');
+ List<Expression> result = parser.parseExpressionList();
+ expectNotNullIfNoErrors(result);
+ listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
+ expect(result, hasLength(4));
+ Expression syntheticExpression = result[0];
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, syntheticExpression);
+ expect(syntheticExpression.isSynthetic, isTrue);
}
- void test_parseCascadeSection_paapaa_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('..a/*<E>*/(b)/*<F>*/(c).d/*<G>*/(e)/*<H>*/(f)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<MethodInvocation>());
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_expressionList_multiple_middle() {
+ createParser('1, 2, , 4');
+ List<Expression> result = parser.parseExpressionList();
+ expectNotNullIfNoErrors(result);
+ listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
+ expect(result, hasLength(4));
+ Expression syntheticExpression = result[2];
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, syntheticExpression);
+ expect(syntheticExpression.isSynthetic, isTrue);
}
- void test_parseCascadeSection_paapaa_typeArguments() {
- createParser('..a<E>(b)<F>(c).d<G>(e)<H>(f)');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation section = expression;
- expect(section.function, new isInstanceOf<MethodInvocation>());
- expect(section.typeArguments, isNotNull);
- expect(section.argumentList, isNotNull);
- expect(section.argumentList.arguments, hasLength(1));
+ void test_expressionList_multiple_start() {
+ createParser('1, 2, 3,');
+ List<Expression> result = parser.parseExpressionList();
+ expectNotNullIfNoErrors(result);
+ listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
+ expect(result, hasLength(4));
+ Expression syntheticExpression = result[3];
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, syntheticExpression);
+ expect(syntheticExpression.isSynthetic, isTrue);
}
- void test_parseCascadeSection_pap() {
- createParser('..a(b).c');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess section = expression;
- expect(section.target, isNotNull);
- expect(section.operator, isNotNull);
- expect(section.propertyName, isNotNull);
+ void test_functionExpression_in_ConstructorFieldInitializer() {
+ CompilationUnit unit = parseCompilationUnit(
+ "class A { A() : a = (){}; var v; }",
+ [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.UNEXPECTED_TOKEN]);
+ // Make sure we recovered and parsed "var v" correctly
+ ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
+ NodeList<ClassMember> members = declaration.members;
+ ClassMember fieldDecl = members[1];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is FieldDeclaration, FieldDeclaration, fieldDecl);
+ NodeList<VariableDeclaration> vars =
+ (fieldDecl as FieldDeclaration).fields.variables;
+ expect(vars, hasLength(1));
+ expect(vars[0].name.name, "v");
}
- void test_parseCascadeSection_pap_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('..a/*<E>*/(b).c');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess section = expression;
- expect(section.target, isNotNull);
- expect(section.operator, isNotNull);
- expect(section.propertyName, isNotNull);
+ void test_functionExpression_named() {
+ parseExpression("m(f() => 0);", [ParserErrorCode.EXPECTED_TOKEN]);
}
- void test_parseCascadeSection_pap_typeArguments() {
- createParser('..a<E>(b).c');
- Expression expression = parser.parseCascadeSection();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess section = expression;
- expect(section.target, isNotNull);
- expect(section.operator, isNotNull);
- expect(section.propertyName, isNotNull);
+ void test_importDirectivePartial_as() {
+ CompilationUnit unit = parseCompilationUnit(
+ "import 'b.dart' d as b;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+ ImportDirective importDirective = unit.childEntities.first;
+ expect(importDirective.asKeyword, isNotNull);
+ expect(unit.directives, hasLength(1));
+ expect(unit.declarations, hasLength(0));
}
- void test_parseCombinator_hide() {
- createParser('hide a;');
- Combinator combinator = parser.parseCombinator();
- expectNotNullIfNoErrors(combinator);
- listener.assertNoErrors();
- expect(combinator, new isInstanceOf<HideCombinator>());
- HideCombinator hideCombinator = combinator;
- expect(hideCombinator.keyword, isNotNull);
- expect(hideCombinator.hiddenNames, hasLength(1));
+ void test_importDirectivePartial_hide() {
+ CompilationUnit unit = parseCompilationUnit(
+ "import 'b.dart' d hide foo;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+ ImportDirective importDirective = unit.childEntities.first;
+ expect(importDirective.combinators, hasLength(1));
+ expect(unit.directives, hasLength(1));
+ expect(unit.declarations, hasLength(0));
}
- void test_parseCombinator_show() {
- createParser('show a;');
- Combinator combinator = parser.parseCombinator();
- expectNotNullIfNoErrors(combinator);
- listener.assertNoErrors();
- expect(combinator, new isInstanceOf<ShowCombinator>());
- ShowCombinator showCombinator = combinator;
- expect(showCombinator.keyword, isNotNull);
- expect(showCombinator.shownNames, hasLength(1));
+ void test_importDirectivePartial_show() {
+ CompilationUnit unit = parseCompilationUnit(
+ "import 'b.dart' d show foo;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+ ImportDirective importDirective = unit.childEntities.first;
+ expect(importDirective.combinators, hasLength(1));
+ expect(unit.directives, hasLength(1));
+ expect(unit.declarations, hasLength(0));
}
- void test_parseCombinators_h() {
- createParser('hide a;');
- List<Combinator> combinators = parser.parseCombinators();
- expectNotNullIfNoErrors(combinators);
- listener.assertNoErrors();
- expect(combinators, hasLength(1));
- HideCombinator combinator = combinators[0] as HideCombinator;
- expect(combinator, isNotNull);
- expect(combinator.keyword, isNotNull);
- expect(combinator.hiddenNames, hasLength(1));
+ void test_incomplete_conditionalExpression() {
+ parseExpression("x ? 0",
+ [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.MISSING_IDENTIFIER]);
}
- void test_parseCombinators_hs() {
- createParser('hide a show b;');
- List<Combinator> combinators = parser.parseCombinators();
- expectNotNullIfNoErrors(combinators);
- listener.assertNoErrors();
- expect(combinators, hasLength(2));
- HideCombinator hideCombinator = combinators[0] as HideCombinator;
- expect(hideCombinator, isNotNull);
- expect(hideCombinator.keyword, isNotNull);
- expect(hideCombinator.hiddenNames, hasLength(1));
- ShowCombinator showCombinator = combinators[1] as ShowCombinator;
- expect(showCombinator, isNotNull);
- expect(showCombinator.keyword, isNotNull);
- expect(showCombinator.shownNames, hasLength(1));
+ void test_incomplete_constructorInitializers_empty() {
+ createParser('C() : {}');
+ ClassMember member = parser.parseClassMember('C');
+ expectNotNullIfNoErrors(member);
+ listener.assertErrorsWithCodes([ParserErrorCode.MISSING_INITIALIZER]);
}
- void test_parseCombinators_hshs() {
- createParser('hide a show b hide c show d;');
- List<Combinator> combinators = parser.parseCombinators();
- expectNotNullIfNoErrors(combinators);
- listener.assertNoErrors();
- expect(combinators, hasLength(4));
+ void test_incomplete_constructorInitializers_missingEquals() {
+ createParser('C() : x(3) {}');
+ ClassMember member = parser.parseClassMember('C');
+ expectNotNullIfNoErrors(member);
+ listener.assertErrorsWithCodes(
+ [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]);
+ expect(member, new isInstanceOf<ConstructorDeclaration>());
+ NodeList<ConstructorInitializer> initializers =
+ (member as ConstructorDeclaration).initializers;
+ expect(initializers, hasLength(1));
+ ConstructorInitializer initializer = initializers[0];
+ expect(initializer, new isInstanceOf<ConstructorFieldInitializer>());
+ Expression expression =
+ (initializer as ConstructorFieldInitializer).expression;
+ expect(expression, isNotNull);
+ expect(expression, new isInstanceOf<ParenthesizedExpression>());
}
- void test_parseCombinators_s() {
- createParser('show a;');
- List<Combinator> combinators = parser.parseCombinators();
- expectNotNullIfNoErrors(combinators);
- listener.assertNoErrors();
- expect(combinators, hasLength(1));
- ShowCombinator combinator = combinators[0] as ShowCombinator;
- expect(combinator, isNotNull);
- expect(combinator.keyword, isNotNull);
- expect(combinator.shownNames, hasLength(1));
+ void test_incomplete_constructorInitializers_variable() {
+ createParser('C() : x {}');
+ ClassMember member = parser.parseClassMember('C');
+ expectNotNullIfNoErrors(member);
+ listener.assertErrorsWithCodes(
+ [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]);
}
- void test_parseCommentAndMetadata_c() {
- createParser('/** 1 */ void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNotNull);
- expect(commentAndMetadata.metadata, isNull);
+ @failingTest
+ void test_incomplete_returnType() {
+ parseCompilationUnit(r'''
+Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {
+ if (map == null) return null;
+ Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();
+ map.forEach((name, value) {
+ result[new Symbol(name)] = value;
+ });
+ return result;
+}''');
}
- void test_parseCommentAndMetadata_cmc() {
- createParser('/** 1 */ @A /** 2 */ void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNotNull);
- expect(commentAndMetadata.metadata, hasLength(1));
+ void test_incomplete_topLevelFunction() {
+ parseCompilationUnit("foo();", [ParserErrorCode.MISSING_FUNCTION_BODY]);
}
- void test_parseCommentAndMetadata_cmcm() {
- createParser('/** 1 */ @A /** 2 */ @B void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNotNull);
- expect(commentAndMetadata.metadata, hasLength(2));
+ void test_incomplete_topLevelVariable() {
+ CompilationUnit unit =
+ parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember member = declarations[0];
+ EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+ TopLevelVariableDeclaration, member);
+ NodeList<VariableDeclaration> variables =
+ (member as TopLevelVariableDeclaration).variables.variables;
+ expect(variables, hasLength(1));
+ SimpleIdentifier name = variables[0].name;
+ expect(name.isSynthetic, isTrue);
}
- void test_parseCommentAndMetadata_cmm() {
- createParser('/** 1 */ @A @B void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNotNull);
- expect(commentAndMetadata.metadata, hasLength(2));
+ void test_incomplete_topLevelVariable_const() {
+ CompilationUnit unit = parseCompilationUnit("const ",
+ [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember member = declarations[0];
+ EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+ TopLevelVariableDeclaration, member);
+ NodeList<VariableDeclaration> variables =
+ (member as TopLevelVariableDeclaration).variables.variables;
+ expect(variables, hasLength(1));
+ SimpleIdentifier name = variables[0].name;
+ expect(name.isSynthetic, isTrue);
}
- void test_parseCommentAndMetadata_m() {
- createParser('@A void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNull);
- expect(commentAndMetadata.metadata, hasLength(1));
+ void test_incomplete_topLevelVariable_final() {
+ CompilationUnit unit = parseCompilationUnit("final ",
+ [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember member = declarations[0];
+ EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+ TopLevelVariableDeclaration, member);
+ NodeList<VariableDeclaration> variables =
+ (member as TopLevelVariableDeclaration).variables.variables;
+ expect(variables, hasLength(1));
+ SimpleIdentifier name = variables[0].name;
+ expect(name.isSynthetic, isTrue);
}
- void test_parseCommentAndMetadata_mcm() {
- createParser('@A /** 1 */ @B void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNotNull);
- expect(commentAndMetadata.metadata, hasLength(2));
+ void test_incomplete_topLevelVariable_var() {
+ CompilationUnit unit = parseCompilationUnit("var ",
+ [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember member = declarations[0];
+ EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+ TopLevelVariableDeclaration, member);
+ NodeList<VariableDeclaration> variables =
+ (member as TopLevelVariableDeclaration).variables.variables;
+ expect(variables, hasLength(1));
+ SimpleIdentifier name = variables[0].name;
+ expect(name.isSynthetic, isTrue);
}
- void test_parseCommentAndMetadata_mcmc() {
- createParser('@A /** 1 */ @B /** 2 */ void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNotNull);
- expect(commentAndMetadata.metadata, hasLength(2));
+ void test_incompleteField_const() {
+ CompilationUnit unit = parseCompilationUnit(
+ r'''
+class C {
+ const
+}''',
+ [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember unitMember = declarations[0];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+ NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+ expect(members, hasLength(1));
+ ClassMember classMember = members[0];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+ VariableDeclarationList fieldList =
+ (classMember as FieldDeclaration).fields;
+ expect(fieldList.keyword.keyword, Keyword.CONST);
+ NodeList<VariableDeclaration> fields = fieldList.variables;
+ expect(fields, hasLength(1));
+ VariableDeclaration field = fields[0];
+ expect(field.name.isSynthetic, isTrue);
}
- void test_parseCommentAndMetadata_mm() {
- createParser('@A @B(x) void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNull);
- expect(commentAndMetadata.metadata, hasLength(2));
+ void test_incompleteField_final() {
+ CompilationUnit unit = parseCompilationUnit(
+ r'''
+class C {
+ final
+}''',
+ [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember unitMember = declarations[0];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+ NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+ expect(members, hasLength(1));
+ ClassMember classMember = members[0];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+ VariableDeclarationList fieldList =
+ (classMember as FieldDeclaration).fields;
+ expect(fieldList.keyword.keyword, Keyword.FINAL);
+ NodeList<VariableDeclaration> fields = fieldList.variables;
+ expect(fields, hasLength(1));
+ VariableDeclaration field = fields[0];
+ expect(field.name.isSynthetic, isTrue);
}
- void test_parseCommentAndMetadata_none() {
- createParser('void');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNull);
- expect(commentAndMetadata.metadata, isNull);
+ void test_incompleteField_var() {
+ CompilationUnit unit = parseCompilationUnit(
+ r'''
+class C {
+ var
+}''',
+ [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember unitMember = declarations[0];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+ NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+ expect(members, hasLength(1));
+ ClassMember classMember = members[0];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+ VariableDeclarationList fieldList =
+ (classMember as FieldDeclaration).fields;
+ expect(fieldList.keyword.keyword, Keyword.VAR);
+ NodeList<VariableDeclaration> fields = fieldList.variables;
+ expect(fields, hasLength(1));
+ VariableDeclaration field = fields[0];
+ expect(field.name.isSynthetic, isTrue);
}
- void test_parseCommentAndMetadata_singleLine() {
- createParser(r'''
-/// 1
-/// 2
-void''');
- CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
- expectNotNullIfNoErrors(commentAndMetadata);
- listener.assertNoErrors();
- expect(commentAndMetadata.comment, isNotNull);
- expect(commentAndMetadata.metadata, isNull);
+ void test_incompleteForEach() {
+ ForStatement statement = parseStatement('for (String item i) {}',
+ [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN]);
+ expect(statement, new isInstanceOf<ForStatement>());
+ expect(statement.toSource(), 'for (String item; i;) {}');
+ expect(statement.leftSeparator, isNotNull);
+ expect(statement.leftSeparator.type, TokenType.SEMICOLON);
+ expect(statement.rightSeparator, isNotNull);
+ expect(statement.rightSeparator.type, TokenType.SEMICOLON);
}
- void test_parseCommentReference_new_prefixed() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('new a.b', 7);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
- PrefixedIdentifier prefixedIdentifier = reference.identifier;
- SimpleIdentifier prefix = prefixedIdentifier.prefix;
- expect(prefix.token, isNotNull);
- expect(prefix.name, "a");
- expect(prefix.offset, 11);
- expect(prefixedIdentifier.period, isNotNull);
- SimpleIdentifier identifier = prefixedIdentifier.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "b");
- expect(identifier.offset, 13);
+ void test_incompleteLocalVariable_atTheEndOfBlock() {
+ Statement statement =
+ parseStatement('String v }', [ParserErrorCode.EXPECTED_TOKEN]);
+ expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+ expect(statement.toSource(), 'String v;');
}
- void test_parseCommentReference_new_simple() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('new a', 5);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = reference.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "a");
- expect(identifier.offset, 9);
+ void test_incompleteLocalVariable_beforeIdentifier() {
+ Statement statement =
+ parseStatement('String v String v2;', [ParserErrorCode.EXPECTED_TOKEN]);
+ expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+ expect(statement.toSource(), 'String v;');
}
- void test_parseCommentReference_operator_withKeyword_notPrefixed() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('operator ==', 5);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = reference.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "==");
- expect(identifier.offset, 14);
+ void test_incompleteLocalVariable_beforeKeyword() {
+ Statement statement = parseStatement(
+ 'String v if (true) {}', [ParserErrorCode.EXPECTED_TOKEN]);
+ expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+ expect(statement.toSource(), 'String v;');
}
- void test_parseCommentReference_operator_withKeyword_prefixed() {
- createParser('');
- CommentReference reference =
- parser.parseCommentReference('Object.operator==', 7);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
- PrefixedIdentifier prefixedIdentifier = reference.identifier;
- SimpleIdentifier prefix = prefixedIdentifier.prefix;
- expect(prefix.token, isNotNull);
- expect(prefix.name, "Object");
- expect(prefix.offset, 7);
- expect(prefixedIdentifier.period, isNotNull);
- SimpleIdentifier identifier = prefixedIdentifier.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "==");
- expect(identifier.offset, 22);
+ void test_incompleteLocalVariable_beforeNextBlock() {
+ Statement statement =
+ parseStatement('String v {}', [ParserErrorCode.EXPECTED_TOKEN]);
+ expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+ expect(statement.toSource(), 'String v;');
}
- void test_parseCommentReference_operator_withoutKeyword_notPrefixed() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('==', 5);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = reference.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "==");
- expect(identifier.offset, 5);
+ void test_incompleteLocalVariable_parameterizedType() {
+ Statement statement =
+ parseStatement('List<String> v {}', [ParserErrorCode.EXPECTED_TOKEN]);
+ expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+ expect(statement.toSource(), 'List<String> v;');
}
- void test_parseCommentReference_operator_withoutKeyword_prefixed() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('Object.==', 7);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
- PrefixedIdentifier prefixedIdentifier = reference.identifier;
- SimpleIdentifier prefix = prefixedIdentifier.prefix;
- expect(prefix.token, isNotNull);
- expect(prefix.name, "Object");
- expect(prefix.offset, 7);
- expect(prefixedIdentifier.period, isNotNull);
- SimpleIdentifier identifier = prefixedIdentifier.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "==");
- expect(identifier.offset, 14);
+ void test_incompleteTypeArguments_field() {
+ CompilationUnit unit = parseCompilationUnit(
+ r'''
+class C {
+ final List<int f;
+}''',
+ [ParserErrorCode.EXPECTED_TOKEN]);
+ // one class
+ List<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
+ // one field declaration
+ List<ClassMember> members = classDecl.members;
+ expect(members, hasLength(1));
+ FieldDeclaration fieldDecl = members[0] as FieldDeclaration;
+ // one field
+ VariableDeclarationList fieldList = fieldDecl.fields;
+ List<VariableDeclaration> fields = fieldList.variables;
+ expect(fields, hasLength(1));
+ VariableDeclaration field = fields[0];
+ expect(field.name.name, 'f');
+ // validate the type
+ TypeArgumentList typeArguments = (fieldList.type as TypeName).typeArguments;
+ expect(typeArguments.arguments, hasLength(1));
+ // synthetic '>'
+ Token token = typeArguments.endToken;
+ expect(token.type, TokenType.GT);
+ expect(token.isSynthetic, isTrue);
}
- void test_parseCommentReference_prefixed() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('a.b', 7);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
- PrefixedIdentifier prefixedIdentifier = reference.identifier;
- SimpleIdentifier prefix = prefixedIdentifier.prefix;
- expect(prefix.token, isNotNull);
- expect(prefix.name, "a");
- expect(prefix.offset, 7);
- expect(prefixedIdentifier.period, isNotNull);
- SimpleIdentifier identifier = prefixedIdentifier.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "b");
- expect(identifier.offset, 9);
+ void test_incompleteTypeParameters() {
+ CompilationUnit unit = parseCompilationUnit(
+ r'''
+class C<K {
+}''',
+ [ParserErrorCode.EXPECTED_TOKEN]);
+ // one class
+ List<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
+ // validate the type parameters
+ TypeParameterList typeParameters = classDecl.typeParameters;
+ expect(typeParameters.typeParameters, hasLength(1));
+ // synthetic '>'
+ Token token = typeParameters.endToken;
+ expect(token.type, TokenType.GT);
+ expect(token.isSynthetic, isTrue);
}
- void test_parseCommentReference_simple() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('a', 5);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = reference.identifier;
- expect(identifier.token, isNotNull);
- expect(identifier.name, "a");
- expect(identifier.offset, 5);
+ void test_invalidFunctionBodyModifier() {
+ parseCompilationUnit(
+ "f() sync {}", [ParserErrorCode.MISSING_STAR_AFTER_SYNC]);
}
- void test_parseCommentReference_synthetic() {
- createParser('');
- CommentReference reference = parser.parseCommentReference('', 5);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = reference.identifier;
- expect(identifier, isNotNull);
- expect(identifier.isSynthetic, isTrue);
- expect(identifier.token, isNotNull);
- expect(identifier.name, "");
- expect(identifier.offset, 5);
- // Should end with EOF token.
- Token nextToken = identifier.token.next;
- expect(nextToken, isNotNull);
- expect(nextToken.type, TokenType.EOF);
+ void test_isExpression_noType() {
+ CompilationUnit unit = parseCompilationUnit(
+ "class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [
+ ParserErrorCode.EXPECTED_TYPE_NAME,
+ ParserErrorCode.EXPECTED_TYPE_NAME,
+ ParserErrorCode.MISSING_STATEMENT
+ ]);
+ ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
+ MethodDeclaration method = declaration.members[0] as MethodDeclaration;
+ BlockFunctionBody body = method.body as BlockFunctionBody;
+ IfStatement ifStatement = body.block.statements[1] as IfStatement;
+ IsExpression expression = ifStatement.condition as IsExpression;
+ expect(expression.expression, isNotNull);
+ expect(expression.isOperator, isNotNull);
+ expect(expression.notOperator, isNotNull);
+ TypeAnnotation type = expression.type;
+ expect(type, isNotNull);
+ expect(type is TypeName && type.name.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is EmptyStatement,
+ EmptyStatement, ifStatement.thenStatement);
}
- @failingTest
- void test_parseCommentReference_this() {
- // This fails because we are returning null from the method and asserting
- // that the return value is not null.
- createParser('');
- CommentReference reference = parser.parseCommentReference('this', 5);
- expectNotNullIfNoErrors(reference);
- listener.assertNoErrors();
- SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
- (obj) => obj is SimpleIdentifier,
- SimpleIdentifier,
- reference.identifier);
- expect(identifier.token, isNotNull);
- expect(identifier.name, "a");
- expect(identifier.offset, 5);
+ void test_keywordInPlaceOfIdentifier() {
+ // TODO(brianwilkerson) We could do better with this.
+ parseCompilationUnit("do() {}", [
+ ParserErrorCode.EXPECTED_EXECUTABLE,
+ ParserErrorCode.UNEXPECTED_TOKEN
+ ]);
}
- void test_parseCommentReferences_multiLine() {
- DocumentationCommentToken token = new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [bb] zzz */", 3);
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[token];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- List<Token> tokenReferences = token.references;
- expect(references, hasLength(2));
- expect(tokenReferences, hasLength(2));
- {
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 12);
- // the reference is recorded in the comment token
- Token referenceToken = tokenReferences[0];
- expect(referenceToken.offset, 12);
- expect(referenceToken.lexeme, 'a');
- }
- {
- CommentReference reference = references[1];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 20);
- // the reference is recorded in the comment token
- Token referenceToken = tokenReferences[1];
- expect(referenceToken.offset, 20);
- expect(referenceToken.lexeme, 'bb');
- }
+ void test_logicalAndExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void test_parseCommentReferences_notClosed_noIdentifier() {
- DocumentationCommentToken docToken = new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT, "/** [ some text", 5);
- createParser('');
- List<CommentReference> references =
- parser.parseCommentReferences(<DocumentationCommentToken>[docToken]);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(docToken.references, hasLength(1));
- expect(references, hasLength(1));
- Token referenceToken = docToken.references[0];
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(docToken.references[0], same(reference.beginToken));
- expect(reference.identifier, isNotNull);
- expect(reference.identifier.isSynthetic, isTrue);
- expect(reference.identifier.name, "");
- // Should end with EOF token.
- Token nextToken = referenceToken.next;
- expect(nextToken, isNotNull);
- expect(nextToken.type, TokenType.EOF);
+ void test_logicalAndExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("&&", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCommentReferences_notClosed_withIdentifier() {
- DocumentationCommentToken docToken = new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT, "/** [namePrefix some text", 5);
- createParser('');
- List<CommentReference> references =
- parser.parseCommentReferences(<DocumentationCommentToken>[docToken]);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(docToken.references, hasLength(1));
- expect(references, hasLength(1));
- Token referenceToken = docToken.references[0];
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(referenceToken, same(reference.beginToken));
- expect(reference.identifier, isNotNull);
- expect(reference.identifier.isSynthetic, isFalse);
- expect(reference.identifier.name, "namePrefix");
- // Should end with EOF token.
- Token nextToken = referenceToken.next;
- expect(nextToken, isNotNull);
- expect(nextToken.type, TokenType.EOF);
+ void test_logicalAndExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCommentReferences_singleLine() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(
- TokenType.SINGLE_LINE_COMMENT, "/// xxx [a] yyy [b] zzz", 3),
- new DocumentationCommentToken(
- TokenType.SINGLE_LINE_COMMENT, "/// x [c]", 28)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(3));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 12);
- reference = references[1];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 20);
- reference = references[2];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 35);
+ void test_logicalAndExpression_precedence_bitwiseOr_left() {
+ BinaryExpression expression = parseExpression("| &&", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseCommentReferences_skipCodeBlock_4spaces_block() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
- "/**\n * a[i]\n * non-code line\n */", 3)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, isEmpty);
+ void test_logicalAndExpression_precedence_bitwiseOr_right() {
+ BinaryExpression expression = parseExpression("&& |", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.rightOperand);
}
- void test_parseCommentReferences_skipCodeBlock_4spaces_lines() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(
- TokenType.SINGLE_LINE_COMMENT, "/// Code block:", 0),
- new DocumentationCommentToken(
- TokenType.SINGLE_LINE_COMMENT, "/// a[i] == b[i]", 0)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, isEmpty);
+ void test_logicalOrExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void test_parseCommentReferences_skipCodeBlock_bracketed() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT, "/** [:xxx [a] yyy:] [b] zzz */", 3)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(1));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 24);
+ void test_logicalOrExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("||", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCommentReferences_skipCodeBlock_gitHub() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT, "/** `a[i]` and [b] */", 0)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(1));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 16);
+ void test_logicalOrExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseCommentReferences_skipCodeBlock_gitHub_multiLine() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT,
- r'''
-/**
- * First.
- * ```dart
- * Some [int] reference.
- * ```
- * Last.
- */
-''',
- 3)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, isEmpty);
+ void test_logicalOrExpression_precedence_logicalAnd_left() {
+ BinaryExpression expression = parseExpression("&& ||", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseCommentReferences_skipCodeBlock_gitHub_multiLine_lines() {
- String commentText = r'''
-/// First.
-/// ```dart
-/// Some [int] reference.
-/// ```
-/// Last.
-''';
- List<DocumentationCommentToken> tokens = commentText
- .split('\n')
- .map((line) => new DocumentationCommentToken(
- TokenType.SINGLE_LINE_COMMENT, line, 0))
- .toList();
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, isEmpty);
+ void test_logicalOrExpression_precedence_logicalAnd_right() {
+ BinaryExpression expression = parseExpression("|| &&", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.rightOperand);
}
- void test_parseCommentReferences_skipCodeBlock_gitHub_notTerminated() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT, "/** `a[i] and [b] */", 0)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(2));
+ void test_missing_commaInArgumentList() {
+ parseExpression("f(x: 1 y: 2)", [ParserErrorCode.EXPECTED_TOKEN]);
}
- void test_parseCommentReferences_skipCodeBlock_spaces() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
- "/**\n * a[i]\n * xxx [i] zzz\n */", 3)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(1));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 27);
+ void test_missingGet() {
+ CompilationUnit unit = parseCompilationUnit(
+ r'''
+class C {
+ int length {}
+ void foo() {}
+}''',
+ [ParserErrorCode.MISSING_GET]);
+ expect(unit, isNotNull);
+ ClassDeclaration classDeclaration =
+ unit.declarations[0] as ClassDeclaration;
+ NodeList<ClassMember> members = classDeclaration.members;
+ expect(members, hasLength(2));
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is MethodDeclaration, MethodDeclaration, members[0]);
+ ClassMember member = members[1];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is MethodDeclaration, MethodDeclaration, member);
+ expect((member as MethodDeclaration).name.name, "foo");
}
- void test_parseCommentReferences_skipLinkDefinition() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
- "/** [a]: http://www.google.com (Google) [b] zzz */", 3)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(1));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 44);
+ void test_missingIdentifier_afterAnnotation() {
+ createParser('@override }');
+ ClassMember member = parser.parseClassMember('C');
+ expectNotNullIfNoErrors(member);
+ listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CLASS_MEMBER]);
+ expect(member, new isInstanceOf<MethodDeclaration>());
+ MethodDeclaration method = member;
+ expect(method.documentationComment, isNull);
+ NodeList<Annotation> metadata = method.metadata;
+ expect(metadata, hasLength(1));
+ expect(metadata[0].name.name, "override");
}
- void test_parseCommentReferences_skipLinked() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
- "/** [a](http://www.google.com) [b] zzz */", 3)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(1));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 35);
- }
+ void test_missingSemicolon_varialeDeclarationList() {
+ void verify(CompilationUnitMember member, String expectedTypeName,
+ String expectedName, String expectedSemicolon) {
+ expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
+ TopLevelVariableDeclaration declaration = member;
+ VariableDeclarationList variableList = declaration.variables;
+ expect(variableList, isNotNull);
+ NodeList<VariableDeclaration> variables = variableList.variables;
+ expect(variables, hasLength(1));
+ VariableDeclaration variable = variables[0];
+ expect(variableList.type.toString(), expectedTypeName);
+ expect(variable.name.name, expectedName);
+ expect(declaration.semicolon.lexeme, expectedSemicolon);
+ }
- void test_parseCommentReferences_skipReferenceLink() {
- List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
- new DocumentationCommentToken(
- TokenType.MULTI_LINE_COMMENT, "/** [a][c] [b] zzz */", 3)
- ];
- createParser('');
- List<CommentReference> references = parser.parseCommentReferences(tokens);
- expectNotNullIfNoErrors(references);
- listener.assertNoErrors();
- expect(references, hasLength(1));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.identifier, isNotNull);
- expect(reference.offset, 15);
+ CompilationUnit unit = parseCompilationUnit('String n x = "";', [
+ ParserErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+ ]);
+ expect(unit, isNotNull);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(2));
+ verify(declarations[0], 'String', 'n', '');
+ verify(declarations[1], 'null', 'x', ';');
}
- void test_parseConditionalExpression() {
- createParser('x ? y : z');
- ConditionalExpression expression = parser.parseConditionalExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.condition, isNotNull);
- expect(expression.question, isNotNull);
- expect(expression.thenExpression, isNotNull);
- expect(expression.colon, isNotNull);
- expect(expression.elseExpression, isNotNull);
+ void test_multiplicativeExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void test_parseConfiguration_noOperator_dottedIdentifier() {
- createParser("if (a.b) 'c.dart'");
- Configuration configuration = parser.parseConfiguration();
- expectNotNullIfNoErrors(configuration);
- listener.assertNoErrors();
- expect(configuration.ifKeyword, isNotNull);
- expect(configuration.leftParenthesis, isNotNull);
- expectDottedName(configuration.name, ["a", "b"]);
- expect(configuration.equalToken, isNull);
- expect(configuration.value, isNull);
- expect(configuration.rightParenthesis, isNotNull);
- expect(configuration.uri, isNotNull);
+ void test_multiplicativeExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("*", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseConfiguration_noOperator_simpleIdentifier() {
- createParser("if (a) 'b.dart'");
- Configuration configuration = parser.parseConfiguration();
- expectNotNullIfNoErrors(configuration);
- listener.assertNoErrors();
- expect(configuration.ifKeyword, isNotNull);
- expect(configuration.leftParenthesis, isNotNull);
- expectDottedName(configuration.name, ["a"]);
- expect(configuration.equalToken, isNull);
- expect(configuration.value, isNull);
- expect(configuration.rightParenthesis, isNotNull);
- expect(configuration.uri, isNotNull);
+ void test_multiplicativeExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseConfiguration_operator_dottedIdentifier() {
- createParser("if (a.b == 'c') 'd.dart'");
- Configuration configuration = parser.parseConfiguration();
- expectNotNullIfNoErrors(configuration);
- listener.assertNoErrors();
- expect(configuration.ifKeyword, isNotNull);
- expect(configuration.leftParenthesis, isNotNull);
- expectDottedName(configuration.name, ["a", "b"]);
- expect(configuration.equalToken, isNotNull);
- expect(configuration.value, isNotNull);
- expect(configuration.rightParenthesis, isNotNull);
- expect(configuration.uri, isNotNull);
+ void test_multiplicativeExpression_missing_RHS_super() {
+ BinaryExpression expression =
+ parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseConfiguration_operator_simpleIdentifier() {
- createParser("if (a == 'b') 'c.dart'");
- Configuration configuration = parser.parseConfiguration();
- expectNotNullIfNoErrors(configuration);
- listener.assertNoErrors();
- expect(configuration.ifKeyword, isNotNull);
- expect(configuration.leftParenthesis, isNotNull);
- expectDottedName(configuration.name, ["a"]);
- expect(configuration.equalToken, isNotNull);
- expect(configuration.value, isNotNull);
- expect(configuration.rightParenthesis, isNotNull);
- expect(configuration.uri, isNotNull);
+ void test_multiplicativeExpression_precedence_unary_left() {
+ BinaryExpression expression =
+ parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
+ PrefixExpression, expression.leftOperand);
}
- void test_parseConstExpression_instanceCreation() {
- createParser('const A()');
- Expression expression = parser.parseConstExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<InstanceCreationExpression>());
- InstanceCreationExpression instanceCreation = expression;
- expect(instanceCreation.keyword, isNotNull);
- ConstructorName name = instanceCreation.constructorName;
- expect(name, isNotNull);
- expect(name.type, isNotNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(instanceCreation.argumentList, isNotNull);
+ void test_multiplicativeExpression_precedence_unary_right() {
+ BinaryExpression expression =
+ parseExpression("* -y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
+ PrefixExpression, expression.rightOperand);
}
- void test_parseConstExpression_listLiteral_typed() {
- createParser('const <A> []');
- Expression expression = parser.parseConstExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<ListLiteral>());
- ListLiteral literal = expression;
- expect(literal.constKeyword, isNotNull);
- expect(literal.typeArguments, isNotNull);
- expect(literal.leftBracket, isNotNull);
- expect(literal.elements, hasLength(0));
- expect(literal.rightBracket, isNotNull);
+ void test_multiplicativeExpression_super() {
+ BinaryExpression expression = parseExpression("super == ==", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseConstExpression_listLiteral_typed_genericComment() {
- enableGenericMethodComments = true;
- createParser('const /*<A>*/ []');
- Expression expression = parser.parseConstExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<ListLiteral>());
- ListLiteral literal = expression;
- expect(literal.constKeyword, isNotNull);
- expect(literal.typeArguments, isNotNull);
- expect(literal.leftBracket, isNotNull);
- expect(literal.elements, hasLength(0));
- expect(literal.rightBracket, isNotNull);
+ void test_nonStringLiteralUri_import() {
+ parseCompilationUnit("import dart:io; class C {}",
+ [ParserErrorCode.NON_STRING_LITERAL_AS_URI]);
}
- void test_parseConstExpression_listLiteral_untyped() {
- createParser('const []');
- Expression expression = parser.parseConstExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<ListLiteral>());
- ListLiteral literal = expression;
- expect(literal.constKeyword, isNotNull);
- expect(literal.typeArguments, isNull);
- expect(literal.leftBracket, isNotNull);
- expect(literal.elements, hasLength(0));
- expect(literal.rightBracket, isNotNull);
+ void test_prefixExpression_missing_operand_minus() {
+ PrefixExpression expression =
+ parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.operand);
+ expect(expression.operand.isSynthetic, isTrue);
+ expect(expression.operator.type, TokenType.MINUS);
}
- void test_parseConstExpression_mapLiteral_typed() {
- createParser('const <A, B> {}');
- Expression expression = parser.parseConstExpression();
+ void test_primaryExpression_argumentDefinitionTest() {
+ createParser('?a');
+ Expression expression = parser.parsePrimaryExpression();
expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MapLiteral>());
- MapLiteral literal = expression;
- expect(literal.leftBracket, isNotNull);
- expect(literal.entries, hasLength(0));
- expect(literal.rightBracket, isNotNull);
- expect(literal.typeArguments, isNotNull);
+ listener.assertErrorsWithCodes([ParserErrorCode.UNEXPECTED_TOKEN]);
+ expect(expression, new isInstanceOf<SimpleIdentifier>());
}
- void test_parseConstExpression_mapLiteral_typed_genericComment() {
- enableGenericMethodComments = true;
- createParser('const /*<A, B>*/ {}');
- Expression expression = parser.parseConstExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MapLiteral>());
- MapLiteral literal = expression;
- expect(literal.leftBracket, isNotNull);
- expect(literal.entries, hasLength(0));
- expect(literal.rightBracket, isNotNull);
- expect(literal.typeArguments, isNotNull);
+ void test_relationalExpression_missing_LHS() {
+ IsExpression expression =
+ parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.expression);
+ expect(expression.expression.isSynthetic, isTrue);
}
- void test_parseConstExpression_mapLiteral_untyped() {
- createParser('const {}');
- Expression expression = parser.parseConstExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MapLiteral>());
- MapLiteral literal = expression;
- expect(literal.leftBracket, isNotNull);
- expect(literal.entries, hasLength(0));
- expect(literal.rightBracket, isNotNull);
- expect(literal.typeArguments, isNull);
+ void test_relationalExpression_missing_LHS_RHS() {
+ IsExpression expression = parseExpression("is", [
+ ParserErrorCode.EXPECTED_TYPE_NAME,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.expression);
+ expect(expression.expression.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is TypeName, TypeName, expression.type);
+ expect(expression.type.isSynthetic, isTrue);
}
- void test_parseConstructor() {
- // TODO(brianwilkerson) Implement tests for this method.
+ void test_relationalExpression_missing_RHS() {
+ IsExpression expression =
+ parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is TypeName, TypeName, expression.type);
+ expect(expression.type.isSynthetic, isTrue);
}
- void test_parseConstructorName_named_noPrefix() {
- createParser('A.n;');
- ConstructorName name = parser.parseConstructorName();
- expectNotNullIfNoErrors(name);
- listener.assertNoErrors();
- expect(name.type, isNotNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
+ void test_relationalExpression_precedence_shift_right() {
+ IsExpression expression = parseExpression("<< is", [
+ ParserErrorCode.EXPECTED_TYPE_NAME,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.expression);
}
- void test_parseConstructorName_named_prefixed() {
- createParser('p.A.n;');
- ConstructorName name = parser.parseConstructorName();
- expectNotNullIfNoErrors(name);
- listener.assertNoErrors();
- expect(name.type, isNotNull);
- expect(name.period, isNotNull);
- expect(name.name, isNotNull);
+ void test_shiftExpression_missing_LHS() {
+ BinaryExpression expression =
+ parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
}
- void test_parseConstructorName_unnamed_noPrefix() {
- createParser('A;');
- ConstructorName name = parser.parseConstructorName();
- expectNotNullIfNoErrors(name);
- listener.assertNoErrors();
- expect(name.type, isNotNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
+ void test_shiftExpression_missing_LHS_RHS() {
+ BinaryExpression expression = parseExpression("<<", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.leftOperand);
+ expect(expression.leftOperand.isSynthetic, isTrue);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseConstructorName_unnamed_prefixed() {
- createParser('p.A;');
- ConstructorName name = parser.parseConstructorName();
- expectNotNullIfNoErrors(name);
- listener.assertNoErrors();
- expect(name.type, isNotNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
+ void test_shiftExpression_missing_RHS() {
+ BinaryExpression expression =
+ parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseContinueStatement_label() {
- createParser('continue foo;');
- ContinueStatement statement = parser.parseContinueStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
- expect(statement.continueKeyword, isNotNull);
- expect(statement.label, isNotNull);
- expect(statement.semicolon, isNotNull);
+ void test_shiftExpression_missing_RHS_super() {
+ BinaryExpression expression =
+ parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+ SimpleIdentifier, expression.rightOperand);
+ expect(expression.rightOperand.isSynthetic, isTrue);
}
- void test_parseContinueStatement_noLabel() {
- createParser('continue;');
- ContinueStatement statement = parser.parseContinueStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
- expect(statement.continueKeyword, isNotNull);
- expect(statement.label, isNull);
- expect(statement.semicolon, isNotNull);
+ void test_shiftExpression_precedence_unary_left() {
+ BinaryExpression expression = parseExpression("+ <<", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseDocumentationComment_block() {
- createParser('/** */ class');
- Comment comment = parser
- .parseDocumentationComment(parser.parseDocumentationCommentTokens());
- expectNotNullIfNoErrors(comment);
- listener.assertNoErrors();
- expect(comment.isBlock, isFalse);
- expect(comment.isDocumentation, isTrue);
- expect(comment.isEndOfLine, isFalse);
+ void test_shiftExpression_precedence_unary_right() {
+ BinaryExpression expression = parseExpression("<< +", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.rightOperand);
}
- void test_parseDocumentationComment_block_withReference() {
- createParser('/** [a] */ class');
- Comment comment = parser
- .parseDocumentationComment(parser.parseDocumentationCommentTokens());
- expectNotNullIfNoErrors(comment);
- listener.assertNoErrors();
- expect(comment.isBlock, isFalse);
- expect(comment.isDocumentation, isTrue);
- expect(comment.isEndOfLine, isFalse);
- NodeList<CommentReference> references = comment.references;
- expect(references, hasLength(1));
- CommentReference reference = references[0];
- expect(reference, isNotNull);
- expect(reference.offset, 5);
+ void test_shiftExpression_super() {
+ BinaryExpression expression = parseExpression("super << <<", [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ]);
+ EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+ BinaryExpression, expression.leftOperand);
}
- void test_parseDocumentationComment_endOfLine() {
- createParser('/// \n/// \n class');
- Comment comment = parser
- .parseDocumentationComment(parser.parseDocumentationCommentTokens());
- expectNotNullIfNoErrors(comment);
- listener.assertNoErrors();
- expect(comment.isBlock, isFalse);
- expect(comment.isDocumentation, isTrue);
- expect(comment.isEndOfLine, isFalse);
+ void test_typedef_eof() {
+ CompilationUnit unit = parseCompilationUnit("typedef n", [
+ ParserErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.MISSING_TYPEDEF_PARAMETERS
+ ]);
+ NodeList<CompilationUnitMember> declarations = unit.declarations;
+ expect(declarations, hasLength(1));
+ CompilationUnitMember member = declarations[0];
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
}
- void test_parseDoStatement() {
- createParser('do {} while (x);');
- DoStatement statement = parser.parseDoStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement.doKeyword, isNotNull);
- expect(statement.body, isNotNull);
- expect(statement.whileKeyword, isNotNull);
- expect(statement.leftParenthesis, isNotNull);
- expect(statement.condition, isNotNull);
- expect(statement.rightParenthesis, isNotNull);
- expect(statement.semicolon, isNotNull);
+ void test_unaryPlus() {
+ parseExpression("+2", [ParserErrorCode.MISSING_IDENTIFIER]);
}
+}
- void test_parseDottedName_multiple() {
- createParser('a.b.c');
- DottedName name = parser.parseDottedName();
- expectNotNullIfNoErrors(name);
- listener.assertNoErrors();
- expectDottedName(name, ["a", "b", "c"]);
+/**
+ * The class `SimpleParserTest` defines parser tests that test individual parsing method. The
+ * code fragments should be as minimal as possible in order to test the method, but should not test
+ * the interactions between the method under test and other methods.
+ *
+ * More complex tests should be defined in the class [ComplexParserTest].
+ */
+@reflectiveTest
+class SimpleParserTest extends ParserTestCase {
+ void test_computeStringValue_emptyInterpolationPrefix() {
+ expect(_computeStringValue("'''", true, false), "");
}
- void test_parseDottedName_single() {
- createParser('a');
- DottedName name = parser.parseDottedName();
- expectNotNullIfNoErrors(name);
- listener.assertNoErrors();
- expectDottedName(name, ["a"]);
+ void test_computeStringValue_escape_b() {
+ expect(_computeStringValue("'\\b'", true, true), "\b");
}
- void test_parseEmptyStatement() {
- createParser(';');
- EmptyStatement statement = parser.parseEmptyStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement.semicolon, isNotNull);
+ void test_computeStringValue_escape_f() {
+ expect(_computeStringValue("'\\f'", true, true), "\f");
}
- void test_parseEqualityExpression_normal() {
- createParser('x == y');
- BinaryExpression expression = parser.parseEqualityExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.leftOperand, isNotNull);
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.EQ_EQ);
- expect(expression.rightOperand, isNotNull);
+ void test_computeStringValue_escape_n() {
+ expect(_computeStringValue("'\\n'", true, true), "\n");
}
- void test_parseEqualityExpression_super() {
- createParser('super == y');
- BinaryExpression expression = parser.parseEqualityExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.leftOperand, new isInstanceOf<SuperExpression>());
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.EQ_EQ);
- expect(expression.rightOperand, isNotNull);
+ void test_computeStringValue_escape_notSpecial() {
+ expect(_computeStringValue("'\\:'", true, true), ":");
+ }
+
+ void test_computeStringValue_escape_r() {
+ expect(_computeStringValue("'\\r'", true, true), "\r");
}
- void test_parseExpression_assign() {
- // TODO(brianwilkerson) Implement more tests for this method.
- Expression expression = parseExpression('x = y');
- expect(expression, new isInstanceOf<AssignmentExpression>());
- AssignmentExpression assignmentExpression = expression;
- expect(assignmentExpression.leftHandSide, isNotNull);
- expect(assignmentExpression.operator, isNotNull);
- expect(assignmentExpression.operator.type, TokenType.EQ);
- expect(assignmentExpression.rightHandSide, isNotNull);
+ void test_computeStringValue_escape_t() {
+ expect(_computeStringValue("'\\t'", true, true), "\t");
}
- void test_parseExpression_assign_compound() {
- enableLazyAssignmentOperators = true;
- Expression expression = parseExpression('x ||= y');
- expect(expression, new isInstanceOf<AssignmentExpression>());
- AssignmentExpression assignmentExpression = expression;
- expect(assignmentExpression.leftHandSide, isNotNull);
- expect(assignmentExpression.operator, isNotNull);
- expect(assignmentExpression.operator.type, TokenType.BAR_BAR_EQ);
- expect(assignmentExpression.rightHandSide, isNotNull);
+ void test_computeStringValue_escape_u_fixed() {
+ expect(_computeStringValue("'\\u4321'", true, true), "\u4321");
}
- void test_parseExpression_comparison() {
- Expression expression = parseExpression('--a.b == c');
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.EQ_EQ);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_computeStringValue_escape_u_variable() {
+ expect(_computeStringValue("'\\u{123}'", true, true), "\u0123");
}
- void test_parseExpression_function_async() {
- Expression expression = parseExpression('() async {}');
- expect(expression, new isInstanceOf<FunctionExpression>());
- FunctionExpression functionExpression = expression;
- expect(functionExpression.body, isNotNull);
- expect(functionExpression.body.isAsynchronous, isTrue);
- expect(functionExpression.body.isGenerator, isFalse);
- expect(functionExpression.parameters, isNotNull);
+ void test_computeStringValue_escape_v() {
+ expect(_computeStringValue("'\\v'", true, true), "\u000B");
}
- void test_parseExpression_function_asyncStar() {
- Expression expression = parseExpression('() async* {}');
- expect(expression, new isInstanceOf<FunctionExpression>());
- FunctionExpression functionExpression = expression;
- expect(functionExpression.body, isNotNull);
- expect(functionExpression.body.isAsynchronous, isTrue);
- expect(functionExpression.body.isGenerator, isTrue);
- expect(functionExpression.parameters, isNotNull);
+ void test_computeStringValue_escape_x() {
+ expect(_computeStringValue("'\\xFF'", true, true), "\u00FF");
}
- void test_parseExpression_function_sync() {
- Expression expression = parseExpression('() {}');
- expect(expression, new isInstanceOf<FunctionExpression>());
- FunctionExpression functionExpression = expression;
- expect(functionExpression.body, isNotNull);
- expect(functionExpression.body.isAsynchronous, isFalse);
- expect(functionExpression.body.isGenerator, isFalse);
- expect(functionExpression.parameters, isNotNull);
+ void test_computeStringValue_noEscape_single() {
+ expect(_computeStringValue("'text'", true, true), "text");
}
- void test_parseExpression_function_syncStar() {
- Expression expression = parseExpression('() sync* {}');
- expect(expression, new isInstanceOf<FunctionExpression>());
- FunctionExpression functionExpression = expression;
- expect(functionExpression.body, isNotNull);
- expect(functionExpression.body.isAsynchronous, isFalse);
- expect(functionExpression.body.isGenerator, isTrue);
- expect(functionExpression.parameters, isNotNull);
+ void test_computeStringValue_noEscape_triple() {
+ expect(_computeStringValue("'''text'''", true, true), "text");
}
- void test_parseExpression_invokeFunctionExpression() {
- Expression expression = parseExpression('(a) {return a + a;} (3)');
- expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
- FunctionExpressionInvocation invocation = expression;
- expect(invocation.function, new isInstanceOf<FunctionExpression>());
- FunctionExpression functionExpression =
- invocation.function as FunctionExpression;
- expect(functionExpression.parameters, isNotNull);
- expect(functionExpression.body, isNotNull);
- expect(invocation.typeArguments, isNull);
- ArgumentList list = invocation.argumentList;
- expect(list, isNotNull);
- expect(list.arguments, hasLength(1));
+ void test_computeStringValue_raw_single() {
+ expect(_computeStringValue("r'text'", true, true), "text");
}
- void test_parseExpression_nonAwait() {
- Expression expression = parseExpression('await()');
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- expect(invocation.methodName.name, 'await');
- expect(invocation.typeArguments, isNull);
- expect(invocation.argumentList, isNotNull);
+ void test_computeStringValue_raw_triple() {
+ expect(_computeStringValue("r'''text'''", true, true), "text");
}
- void test_parseExpression_superMethodInvocation() {
- Expression expression = parseExpression('super.m()');
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- expect(invocation.target, isNotNull);
- expect(invocation.methodName, isNotNull);
- expect(invocation.typeArguments, isNull);
- expect(invocation.argumentList, isNotNull);
+ void test_computeStringValue_raw_withEscape() {
+ expect(_computeStringValue("r'two\\nlines'", true, true), "two\\nlines");
}
- void test_parseExpression_superMethodInvocation_typeArgumentComments() {
- enableGenericMethodComments = true;
- Expression expression = parseExpression('super.m/*<E>*/()');
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- expect(invocation.target, isNotNull);
- expect(invocation.methodName, isNotNull);
- expect(invocation.typeArguments, isNotNull);
- expect(invocation.argumentList, isNotNull);
+ void test_computeStringValue_triple_internalQuote_first_empty() {
+ expect(_computeStringValue("''''", true, false), "'");
}
- void test_parseExpression_superMethodInvocation_typeArguments() {
- Expression expression = parseExpression('super.m<E>()');
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- expect(invocation.target, isNotNull);
- expect(invocation.methodName, isNotNull);
- expect(invocation.typeArguments, isNotNull);
- expect(invocation.argumentList, isNotNull);
+ void test_computeStringValue_triple_internalQuote_first_nonEmpty() {
+ expect(_computeStringValue("''''text", true, false), "'text");
}
- void test_parseExpressionList_multiple() {
- createParser('1, 2, 3');
- List<Expression> result = parser.parseExpressionList();
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result, hasLength(3));
+ void test_computeStringValue_triple_internalQuote_last_empty() {
+ expect(_computeStringValue("'''", false, true), "");
}
- void test_parseExpressionList_single() {
- createParser('1');
- List<Expression> result = parser.parseExpressionList();
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result, hasLength(1));
+ void test_computeStringValue_triple_internalQuote_last_nonEmpty() {
+ expect(_computeStringValue("text'''", false, true), "text");
}
- void test_parseExpressionWithoutCascade_assign() {
- // TODO(brianwilkerson) Implement more tests for this method.
- createParser('x = y');
- Expression expression = parser.parseExpressionWithoutCascade();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<AssignmentExpression>());
- AssignmentExpression assignmentExpression = expression;
- expect(assignmentExpression.leftHandSide, isNotNull);
- expect(assignmentExpression.operator, isNotNull);
- expect(assignmentExpression.operator.type, TokenType.EQ);
- expect(assignmentExpression.rightHandSide, isNotNull);
+ void test_createSyntheticIdentifier() {
+ createParser('');
+ SimpleIdentifier identifier = parser.createSyntheticIdentifier();
+ expectNotNullIfNoErrors(identifier);
+ expect(identifier.isSynthetic, isTrue);
}
- void test_parseExpressionWithoutCascade_comparison() {
- createParser('--a.b == c');
- Expression expression = parser.parseExpressionWithoutCascade();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.EQ_EQ);
- expect(binaryExpression.rightOperand, isNotNull);
+ void test_createSyntheticStringLiteral() {
+ createParser('');
+ SimpleStringLiteral literal = parser.createSyntheticStringLiteral();
+ expectNotNullIfNoErrors(literal);
+ expect(literal.isSynthetic, isTrue);
}
- void test_parseExpressionWithoutCascade_superMethodInvocation() {
- createParser('super.m()');
- Expression expression = parser.parseExpressionWithoutCascade();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- expect(invocation.target, isNotNull);
- expect(invocation.methodName, isNotNull);
- expect(invocation.typeArguments, isNull);
- expect(invocation.argumentList, isNotNull);
+ void test_isFunctionDeclaration_nameButNoReturn_block() {
+ expect(_isFunctionDeclaration("f() {}"), isTrue);
}
- void
- test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('super.m/*<E>*/()');
- Expression expression = parser.parseExpressionWithoutCascade();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- expect(invocation.target, isNotNull);
- expect(invocation.methodName, isNotNull);
- expect(invocation.typeArguments, isNotNull);
- expect(invocation.argumentList, isNotNull);
+ void test_isFunctionDeclaration_nameButNoReturn_expression() {
+ expect(_isFunctionDeclaration("f() => e"), isTrue);
}
- void
- test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() {
- createParser('super.m<E>()');
- Expression expression = parser.parseExpressionWithoutCascade();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- expect(invocation.target, isNotNull);
- expect(invocation.methodName, isNotNull);
- expect(invocation.typeArguments, isNotNull);
- expect(invocation.argumentList, isNotNull);
+ void test_isFunctionDeclaration_nameButNoReturn_typeParameters_block() {
+ expect(_isFunctionDeclaration("f<E>() {}"), isTrue);
}
- void test_parseExtendsClause() {
- createParser('extends B');
- ExtendsClause clause = parser.parseExtendsClause();
- expectNotNullIfNoErrors(clause);
- listener.assertNoErrors();
- expect(clause.extendsKeyword, isNotNull);
- expect(clause.superclass, isNotNull);
- expect(clause.superclass, new isInstanceOf<TypeName>());
+ void test_isFunctionDeclaration_nameButNoReturn_typeParameters_expression() {
+ expect(_isFunctionDeclaration("f<E>() => e"), isTrue);
}
- void test_parseFinalConstVarOrType_const_functionType() {
- createParser('const int Function(int) f');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.CONST);
- expect(result.type, isNotNull);
+ void test_isFunctionDeclaration_normalReturn_block() {
+ expect(_isFunctionDeclaration("C f() {}"), isTrue);
}
- void test_parseFinalConstVarOrType_const_namedType() {
- createParser('const A a');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.CONST);
- expect(result.type, isNotNull);
+ void test_isFunctionDeclaration_normalReturn_expression() {
+ expect(_isFunctionDeclaration("C f() => e"), isTrue);
+ }
+
+ void test_isFunctionDeclaration_normalReturn_typeParameters_block() {
+ expect(_isFunctionDeclaration("C f<E>() {}"), isTrue);
}
- void test_parseFinalConstVarOrType_const_noType() {
- createParser('const');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.CONST);
- expect(result.type, isNull);
+ void test_isFunctionDeclaration_normalReturn_typeParameters_expression() {
+ expect(_isFunctionDeclaration("C f<E>() => e"), isTrue);
}
- void test_parseFinalConstVarOrType_final_functionType() {
- createParser('final int Function(int) f');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.FINAL);
- expect(result.type, isNotNull);
+ void test_isFunctionDeclaration_voidReturn_block() {
+ expect(_isFunctionDeclaration("void f() {}"), isTrue);
}
- void test_parseFinalConstVarOrType_final_namedType() {
- createParser('final A a');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.FINAL);
- expect(result.type, isNotNull);
+ void test_isFunctionDeclaration_voidReturn_expression() {
+ expect(_isFunctionDeclaration("void f() => e"), isTrue);
}
- void test_parseFinalConstVarOrType_final_noType() {
- createParser('final');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.FINAL);
- expect(result.type, isNull);
+ void test_isFunctionDeclaration_voidReturn_typeParameters_block() {
+ expect(_isFunctionDeclaration("void f<E>() {}"), isTrue);
}
- void test_parseFinalConstVarOrType_final_prefixedType() {
- createParser('final p.A a');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.FINAL);
- expect(result.type, isNotNull);
+ void test_isFunctionDeclaration_voidReturn_typeParameters_expression() {
+ expect(_isFunctionDeclaration("void f<E>() => e"), isTrue);
}
- void test_parseFinalConstVarOrType_type_function() {
- createParser('int Function(int) f');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_false_noBody() {
+ expect(_isFunctionExpression("f();"), isFalse);
}
- void test_parseFinalConstVarOrType_type_parameterized() {
- createParser('A<B> a');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_false_notParameters() {
+ expect(_isFunctionExpression("(a + b) {"), isFalse);
}
- void test_parseFinalConstVarOrType_type_prefixed() {
- createParser('p.A a');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_noParameters_block() {
+ expect(_isFunctionExpression("() {}"), isTrue);
}
- void test_parseFinalConstVarOrType_type_prefixed_noIdentifier() {
- createParser('p.A,');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_noParameters_expression() {
+ expect(_isFunctionExpression("() => e"), isTrue);
}
- void test_parseFinalConstVarOrType_type_prefixedAndParameterized() {
- createParser('p.A<B> a');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_noParameters_typeParameters_block() {
+ expect(_isFunctionExpression("<E>() {}"), isTrue);
}
- void test_parseFinalConstVarOrType_type_simple() {
- createParser('A a');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_noParameters_typeParameters_expression() {
+ expect(_isFunctionExpression("<E>() => e"), isTrue);
}
- void test_parseFinalConstVarOrType_type_simple_noIdentifier_inFunctionType() {
- createParser('A,');
- FinalConstVarOrType result =
- parser.parseFinalConstVarOrType(false, inFunctionType: true);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_parameter_final() {
+ expect(_isFunctionExpression("(final a) {}"), isTrue);
+ expect(_isFunctionExpression("(final a, b) {}"), isTrue);
+ expect(_isFunctionExpression("(final a, final b) {}"), isTrue);
}
- void test_parseFinalConstVarOrType_var() {
- createParser('var');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- Token keyword = result.keyword;
- expect(keyword, isNotNull);
- expect(keyword.type, TokenType.KEYWORD);
- expect(keyword.keyword, Keyword.VAR);
- expect(result.type, isNull);
+ void test_isFunctionExpression_parameter_final_typed() {
+ expect(_isFunctionExpression("(final int a) {}"), isTrue);
+ expect(_isFunctionExpression("(final prefix.List a) {}"), isTrue);
+ expect(_isFunctionExpression("(final List<int> a) {}"), isTrue);
+ expect(_isFunctionExpression("(final prefix.List<int> a) {}"), isTrue);
}
- void test_parseFinalConstVarOrType_void() {
- createParser('void f()');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_parameter_multiple() {
+ expect(_isFunctionExpression("(a, b) {}"), isTrue);
}
- void test_parseFinalConstVarOrType_void_noIdentifier() {
- createParser('void,');
- FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
- expectNotNullIfNoErrors(result);
- listener.assertNoErrors();
- expect(result.keyword, isNull);
- expect(result.type, isNotNull);
+ void test_isFunctionExpression_parameter_named() {
+ expect(_isFunctionExpression("({a}) {}"), isTrue);
}
- void test_parseForStatement_each_await() {
- createParser('await for (element in list) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForEachStatement>());
- ForEachStatement forStatement = statement;
- expect(forStatement.awaitKeyword, isNotNull);
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.loopVariable, isNull);
- expect(forStatement.identifier, isNotNull);
- expect(forStatement.inKeyword, isNotNull);
- expect(forStatement.iterable, isNotNull);
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isFunctionExpression_parameter_optional() {
+ expect(_isFunctionExpression("([a]) {}"), isTrue);
}
- void test_parseForStatement_each_identifier() {
- createParser('for (element in list) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForEachStatement>());
- ForEachStatement forStatement = statement;
- expect(forStatement.awaitKeyword, isNull);
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.loopVariable, isNull);
- expect(forStatement.identifier, isNotNull);
- expect(forStatement.inKeyword, isNotNull);
- expect(forStatement.iterable, isNotNull);
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isFunctionExpression_parameter_single() {
+ expect(_isFunctionExpression("(a) {}"), isTrue);
}
- void test_parseForStatement_each_noType_metadata() {
- createParser('for (@A var element in list) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForEachStatement>());
- ForEachStatement forStatement = statement;
- expect(forStatement.awaitKeyword, isNull);
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.loopVariable, isNotNull);
- expect(forStatement.loopVariable.metadata, hasLength(1));
- expect(forStatement.identifier, isNull);
- expect(forStatement.inKeyword, isNotNull);
- expect(forStatement.iterable, isNotNull);
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isFunctionExpression_parameter_typed() {
+ expect(_isFunctionExpression("(int a, int b) {}"), isTrue);
}
- void test_parseForStatement_each_type() {
- createParser('for (A element in list) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForEachStatement>());
- ForEachStatement forStatement = statement;
- expect(forStatement.awaitKeyword, isNull);
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.loopVariable, isNotNull);
- expect(forStatement.identifier, isNull);
- expect(forStatement.inKeyword, isNotNull);
- expect(forStatement.iterable, isNotNull);
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_assignment() {
+ expect(_isInitializedVariableDeclaration("a = null;"), isFalse);
}
- void test_parseForStatement_each_var() {
- createParser('for (var element in list) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForEachStatement>());
- ForEachStatement forStatement = statement;
- expect(forStatement.awaitKeyword, isNull);
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.loopVariable, isNotNull);
- expect(forStatement.identifier, isNull);
- expect(forStatement.inKeyword, isNotNull);
- expect(forStatement.iterable, isNotNull);
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_comparison() {
+ expect(_isInitializedVariableDeclaration("a < 0;"), isFalse);
+ }
+
+ void test_isInitializedVariableDeclaration_conditional() {
+ expect(_isInitializedVariableDeclaration("a == null ? init() : update();"),
+ isFalse);
}
- void test_parseForStatement_loop_c() {
- createParser('for (; i < count;) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.variables, isNull);
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNotNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(0));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_const_noType_initialized() {
+ expect(_isInitializedVariableDeclaration("const a = 0;"), isTrue);
}
- void test_parseForStatement_loop_cu() {
- createParser('for (; i < count; i++) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.variables, isNull);
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNotNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(1));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_const_noType_uninitialized() {
+ expect(_isInitializedVariableDeclaration("const a;"), isTrue);
}
- void test_parseForStatement_loop_ecu() {
- createParser('for (i--; i < count; i++) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.variables, isNull);
- expect(forStatement.initialization, isNotNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNotNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(1));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_const_simpleType_uninitialized() {
+ expect(_isInitializedVariableDeclaration("const A a;"), isTrue);
}
- void test_parseForStatement_loop_i() {
- createParser('for (var i = 0;;) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- VariableDeclarationList variables = forStatement.variables;
- expect(variables, isNotNull);
- expect(variables.metadata, hasLength(0));
- expect(variables.variables, hasLength(1));
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(0));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_final_noType_initialized() {
+ expect(_isInitializedVariableDeclaration("final a = 0;"), isTrue);
}
- void test_parseForStatement_loop_i_withMetadata() {
- createParser('for (@A var i = 0;;) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- VariableDeclarationList variables = forStatement.variables;
- expect(variables, isNotNull);
- expect(variables.metadata, hasLength(1));
- expect(variables.variables, hasLength(1));
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(0));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_final_noType_uninitialized() {
+ expect(_isInitializedVariableDeclaration("final a;"), isTrue);
}
- void test_parseForStatement_loop_ic() {
- createParser('for (var i = 0; i < count;) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- VariableDeclarationList variables = forStatement.variables;
- expect(variables, isNotNull);
- expect(variables.variables, hasLength(1));
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNotNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(0));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_final_simpleType_initialized() {
+ expect(_isInitializedVariableDeclaration("final A a = 0;"), isTrue);
}
- void test_parseForStatement_loop_icu() {
- createParser('for (var i = 0; i < count; i++) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- VariableDeclarationList variables = forStatement.variables;
- expect(variables, isNotNull);
- expect(variables.variables, hasLength(1));
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNotNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(1));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_functionDeclaration_typed() {
+ expect(_isInitializedVariableDeclaration("A f() {};"), isFalse);
}
- void test_parseForStatement_loop_iicuu() {
- createParser('for (int i = 0, j = count; i < j; i++, j--) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- VariableDeclarationList variables = forStatement.variables;
- expect(variables, isNotNull);
- expect(variables.variables, hasLength(2));
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNotNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(2));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_functionDeclaration_untyped() {
+ expect(_isInitializedVariableDeclaration("f() {};"), isFalse);
}
- void test_parseForStatement_loop_iu() {
- createParser('for (var i = 0;; i++) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- VariableDeclarationList variables = forStatement.variables;
- expect(variables, isNotNull);
- expect(variables.variables, hasLength(1));
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(1));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_noType_initialized() {
+ expect(_isInitializedVariableDeclaration("var a = 0;"), isTrue);
}
- void test_parseForStatement_loop_u() {
- createParser('for (;; i++) {}');
- Statement statement = parser.parseForStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ForStatement>());
- ForStatement forStatement = statement;
- expect(forStatement.forKeyword, isNotNull);
- expect(forStatement.leftParenthesis, isNotNull);
- expect(forStatement.variables, isNull);
- expect(forStatement.initialization, isNull);
- expect(forStatement.leftSeparator, isNotNull);
- expect(forStatement.condition, isNull);
- expect(forStatement.rightSeparator, isNotNull);
- expect(forStatement.updaters, hasLength(1));
- expect(forStatement.rightParenthesis, isNotNull);
- expect(forStatement.body, isNotNull);
+ void test_isInitializedVariableDeclaration_noType_uninitialized() {
+ expect(_isInitializedVariableDeclaration("var a;"), isTrue);
}
- void test_parseFunctionBody_block() {
- createParser('{}');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<BlockFunctionBody>());
- BlockFunctionBody body = functionBody;
- expect(body.keyword, isNull);
- expect(body.star, isNull);
- expect(body.block, isNotNull);
- expect(body.isAsynchronous, isFalse);
- expect(body.isGenerator, isFalse);
- expect(body.isSynchronous, isTrue);
+ void test_isInitializedVariableDeclaration_parameterizedType_initialized() {
+ expect(_isInitializedVariableDeclaration("List<int> a = null;"), isTrue);
}
- void test_parseFunctionBody_block_async() {
- createParser('async {}');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<BlockFunctionBody>());
- BlockFunctionBody body = functionBody;
- expect(body.keyword, isNotNull);
- expect(body.keyword.lexeme, Parser.ASYNC);
- expect(body.star, isNull);
- expect(body.block, isNotNull);
- expect(body.isAsynchronous, isTrue);
- expect(body.isGenerator, isFalse);
- expect(body.isSynchronous, isFalse);
+ void test_isInitializedVariableDeclaration_parameterizedType_uninitialized() {
+ expect(_isInitializedVariableDeclaration("List<int> a;"), isTrue);
}
- void test_parseFunctionBody_block_asyncGenerator() {
- createParser('async* {}');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<BlockFunctionBody>());
- BlockFunctionBody body = functionBody;
- expect(body.keyword, isNotNull);
- expect(body.keyword.lexeme, Parser.ASYNC);
- expect(body.star, isNotNull);
- expect(body.block, isNotNull);
- expect(body.isAsynchronous, isTrue);
- expect(body.isGenerator, isTrue);
- expect(body.isSynchronous, isFalse);
+ void test_isInitializedVariableDeclaration_simpleType_initialized() {
+ expect(_isInitializedVariableDeclaration("A a = 0;"), isTrue);
+ }
+
+ void test_isInitializedVariableDeclaration_simpleType_uninitialized() {
+ expect(_isInitializedVariableDeclaration("A a;"), isTrue);
}
- void test_parseFunctionBody_block_syncGenerator() {
- createParser('sync* {}');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<BlockFunctionBody>());
- BlockFunctionBody body = functionBody;
- expect(body.keyword, isNotNull);
- expect(body.keyword.lexeme, Parser.SYNC);
- expect(body.star, isNotNull);
- expect(body.block, isNotNull);
- expect(body.isAsynchronous, isFalse);
- expect(body.isGenerator, isTrue);
- expect(body.isSynchronous, isTrue);
+ void test_isSwitchMember_case_labeled() {
+ expect(_isSwitchMember("l1: l2: case"), isTrue);
}
- void test_parseFunctionBody_empty() {
- createParser(';');
- FunctionBody functionBody = parser.parseFunctionBody(true, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
- EmptyFunctionBody body = functionBody;
- expect(body.semicolon, isNotNull);
+ void test_isSwitchMember_case_unlabeled() {
+ expect(_isSwitchMember("case"), isTrue);
}
- void test_parseFunctionBody_expression() {
- createParser('=> y;');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<ExpressionFunctionBody>());
- ExpressionFunctionBody body = functionBody;
- expect(body.keyword, isNull);
- expect(body.functionDefinition, isNotNull);
- expect(body.expression, isNotNull);
- expect(body.semicolon, isNotNull);
- expect(body.isAsynchronous, isFalse);
- expect(body.isGenerator, isFalse);
- expect(body.isSynchronous, isTrue);
+ void test_isSwitchMember_default_labeled() {
+ expect(_isSwitchMember("l1: l2: default"), isTrue);
}
- void test_parseFunctionBody_expression_async() {
- createParser('async => y;');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<ExpressionFunctionBody>());
- ExpressionFunctionBody body = functionBody;
- expect(body.keyword, isNotNull);
- expect(body.keyword.lexeme, Parser.ASYNC);
- expect(body.functionDefinition, isNotNull);
- expect(body.expression, isNotNull);
- expect(body.semicolon, isNotNull);
- expect(body.isAsynchronous, isTrue);
- expect(body.isGenerator, isFalse);
- expect(body.isSynchronous, isFalse);
+ void test_isSwitchMember_default_unlabeled() {
+ expect(_isSwitchMember("default"), isTrue);
}
- void test_parseFunctionBody_nativeFunctionBody() {
- createParser('native "str";');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<NativeFunctionBody>());
- NativeFunctionBody body = functionBody;
- expect(body.nativeKeyword, isNotNull);
- expect(body.stringLiteral, isNotNull);
- expect(body.semicolon, isNotNull);
+ void test_isSwitchMember_false() {
+ expect(_isSwitchMember("break;"), isFalse);
}
- void test_parseFunctionBody_skip_block() {
- ParserTestCase.parseFunctionBodies = false;
- createParser('{}');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
+ void test_parseAnnotation_n1() {
+ createParser('@A');
+ Annotation annotation = parser.parseAnnotation();
+ expectNotNullIfNoErrors(annotation);
listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
+ expect(annotation.atSign, isNotNull);
+ expect(annotation.name, isNotNull);
+ expect(annotation.period, isNull);
+ expect(annotation.constructorName, isNull);
+ expect(annotation.arguments, isNull);
}
- void test_parseFunctionBody_skip_block_invalid() {
- ParserTestCase.parseFunctionBodies = false;
- createParser('{');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
- listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]);
- expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
+ void test_parseAnnotation_n1_a() {
+ createParser('@A(x,y)');
+ Annotation annotation = parser.parseAnnotation();
+ expectNotNullIfNoErrors(annotation);
+ listener.assertNoErrors();
+ expect(annotation.atSign, isNotNull);
+ expect(annotation.name, isNotNull);
+ expect(annotation.period, isNull);
+ expect(annotation.constructorName, isNull);
+ expect(annotation.arguments, isNotNull);
}
- void test_parseFunctionBody_skip_blocks() {
- ParserTestCase.parseFunctionBodies = false;
- createParser('{ {} }');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
+ void test_parseAnnotation_n2() {
+ createParser('@A.B');
+ Annotation annotation = parser.parseAnnotation();
+ expectNotNullIfNoErrors(annotation);
listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
+ expect(annotation.atSign, isNotNull);
+ expect(annotation.name, isNotNull);
+ expect(annotation.period, isNull);
+ expect(annotation.constructorName, isNull);
+ expect(annotation.arguments, isNull);
}
- void test_parseFunctionBody_skip_expression() {
- ParserTestCase.parseFunctionBodies = false;
- createParser('=> y;');
- FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
- expectNotNullIfNoErrors(functionBody);
+ void test_parseAnnotation_n2_a() {
+ createParser('@A.B(x,y)');
+ Annotation annotation = parser.parseAnnotation();
+ expectNotNullIfNoErrors(annotation);
listener.assertNoErrors();
- expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
+ expect(annotation.atSign, isNotNull);
+ expect(annotation.name, isNotNull);
+ expect(annotation.period, isNull);
+ expect(annotation.constructorName, isNull);
+ expect(annotation.arguments, isNotNull);
}
- void test_parseFunctionDeclarationStatement() {
- createParser('void f(int p) => p * 2;');
- FunctionDeclarationStatement statement =
- parser.parseFunctionDeclarationStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseAnnotation_n3() {
+ createParser('@A.B.C');
+ Annotation annotation = parser.parseAnnotation();
+ expectNotNullIfNoErrors(annotation);
listener.assertNoErrors();
- expect(statement.functionDeclaration, isNotNull);
+ expect(annotation.atSign, isNotNull);
+ expect(annotation.name, isNotNull);
+ expect(annotation.period, isNotNull);
+ expect(annotation.constructorName, isNotNull);
+ expect(annotation.arguments, isNull);
}
- void test_parseFunctionDeclarationStatement_typeParameterComments() {
- enableGenericMethodComments = true;
- createParser('/*=E*/ f/*<E>*/(/*=E*/ p) => p * 2;');
- FunctionDeclarationStatement statement =
- parser.parseFunctionDeclarationStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseAnnotation_n3_a() {
+ createParser('@A.B.C(x,y)');
+ Annotation annotation = parser.parseAnnotation();
+ expectNotNullIfNoErrors(annotation);
listener.assertNoErrors();
- FunctionDeclaration f = statement.functionDeclaration;
- expect(f, isNotNull);
- expect(f.functionExpression.typeParameters, isNotNull);
- expect(f.returnType, isNotNull);
- SimpleFormalParameter p = f.functionExpression.parameters.parameters[0];
- expect(p.type, isNotNull);
+ expect(annotation.atSign, isNotNull);
+ expect(annotation.name, isNotNull);
+ expect(annotation.period, isNotNull);
+ expect(annotation.constructorName, isNotNull);
+ expect(annotation.arguments, isNotNull);
}
- void test_parseFunctionDeclarationStatement_typeParameters() {
- createParser('E f<E>(E p) => p * 2;');
- FunctionDeclarationStatement statement =
- parser.parseFunctionDeclarationStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseArgument_named() {
+ createParser('n: x');
+ Expression expression = parser.parseArgument();
+ expectNotNullIfNoErrors(expression);
listener.assertNoErrors();
- expect(statement.functionDeclaration, isNotNull);
- expect(statement.functionDeclaration.functionExpression.typeParameters,
- isNotNull);
+ expect(expression, new isInstanceOf<NamedExpression>());
+ NamedExpression namedExpression = expression;
+ Label name = namedExpression.name;
+ expect(name, isNotNull);
+ expect(name.label, isNotNull);
+ expect(name.colon, isNotNull);
+ expect(namedExpression.expression, isNotNull);
}
- void test_parseFunctionDeclarationStatement_typeParameters_noReturnType() {
- createParser('f<E>(E p) => p * 2;');
- FunctionDeclarationStatement statement =
- parser.parseFunctionDeclarationStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseArgument_unnamed() {
+ String lexeme = "x";
+ createParser(lexeme);
+ Expression expression = parser.parseArgument();
+ expectNotNullIfNoErrors(expression);
listener.assertNoErrors();
- expect(statement.functionDeclaration, isNotNull);
- expect(statement.functionDeclaration.functionExpression.typeParameters,
- isNotNull);
+ expect(expression, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = expression;
+ expect(identifier.name, lexeme);
}
- void test_parseFunctionExpression_body_inExpression() {
- createParser('(int i) => i++');
- FunctionExpression expression = parser.parseFunctionExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseArgumentList_empty() {
+ createParser('()');
+ ArgumentList argumentList = parser.parseArgumentList();
+ expectNotNullIfNoErrors(argumentList);
listener.assertNoErrors();
- expect(expression.body, isNotNull);
- expect(expression.typeParameters, isNull);
- expect(expression.parameters, isNotNull);
- expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
+ NodeList<Expression> arguments = argumentList.arguments;
+ expect(arguments, hasLength(0));
}
- void test_parseFunctionExpression_typeParameterComments() {
- enableGenericMethodComments = true;
- createParser('/*<E>*/(/*=E*/ i) => i++');
- FunctionExpression expression = parser.parseFunctionExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseArgumentList_mixed() {
+ createParser('(w, x, y: y, z: z)');
+ ArgumentList argumentList = parser.parseArgumentList();
+ expectNotNullIfNoErrors(argumentList);
listener.assertNoErrors();
- expect(expression.body, isNotNull);
- expect(expression.typeParameters, isNotNull);
- expect(expression.parameters, isNotNull);
- expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
- SimpleFormalParameter p = expression.parameters.parameters[0];
- expect(p.type, isNotNull);
+ NodeList<Expression> arguments = argumentList.arguments;
+ expect(arguments, hasLength(4));
}
- void test_parseFunctionExpression_typeParameters() {
- createParser('<E>(E i) => i++');
- FunctionExpression expression = parser.parseFunctionExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseArgumentList_noNamed() {
+ createParser('(x, y, z)');
+ ArgumentList argumentList = parser.parseArgumentList();
+ expectNotNullIfNoErrors(argumentList);
listener.assertNoErrors();
- expect(expression.body, isNotNull);
- expect(expression.typeParameters, isNotNull);
- expect(expression.parameters, isNotNull);
- expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
+ NodeList<Expression> arguments = argumentList.arguments;
+ expect(arguments, hasLength(3));
}
- void test_parseIdentifierList_multiple() {
- createParser('a, b, c');
- List<SimpleIdentifier> list = parser.parseIdentifierList();
- expectNotNullIfNoErrors(list);
+ void test_parseArgumentList_onlyNamed() {
+ createParser('(x: x, y: y)');
+ ArgumentList argumentList = parser.parseArgumentList();
+ expectNotNullIfNoErrors(argumentList);
listener.assertNoErrors();
- expect(list, hasLength(3));
+ NodeList<Expression> arguments = argumentList.arguments;
+ expect(arguments, hasLength(2));
}
- void test_parseIdentifierList_single() {
- createParser('a');
- List<SimpleIdentifier> list = parser.parseIdentifierList();
- expectNotNullIfNoErrors(list);
+ void test_parseArgumentList_trailing_comma() {
+ createParser('(x, y, z,)');
+ ArgumentList argumentList = parser.parseArgumentList();
+ expectNotNullIfNoErrors(argumentList);
listener.assertNoErrors();
- expect(list, hasLength(1));
+ NodeList<Expression> arguments = argumentList.arguments;
+ expect(arguments, hasLength(3));
}
- void test_parseIfStatement_else_block() {
- createParser('if (x) {} else {}');
- IfStatement statement = parser.parseIfStatement();
+ void test_parseAssertStatement() {
+ createParser('assert (x);');
+ AssertStatement statement = parser.parseAssertStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement.ifKeyword, isNotNull);
+ expect(statement.assertKeyword, isNotNull);
expect(statement.leftParenthesis, isNotNull);
expect(statement.condition, isNotNull);
+ expect(statement.comma, isNull);
+ expect(statement.message, isNull);
expect(statement.rightParenthesis, isNotNull);
- expect(statement.thenStatement, isNotNull);
- expect(statement.elseKeyword, isNotNull);
- expect(statement.elseStatement, isNotNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseIfStatement_else_statement() {
- createParser('if (x) f(x); else f(y);');
- IfStatement statement = parser.parseIfStatement();
+ void test_parseAssertStatement_messageLowPrecedence() {
+ // Using a throw expression as an assert message would be silly in
+ // practice, but it's the lowest precedence expression type, so verifying
+ // that it works should give us high confidence that other expression types
+ // will work as well.
+ createParser('assert (x, throw "foo");');
+ AssertStatement statement = parser.parseAssertStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement.ifKeyword, isNotNull);
+ expect(statement.assertKeyword, isNotNull);
expect(statement.leftParenthesis, isNotNull);
expect(statement.condition, isNotNull);
+ expect(statement.comma, isNotNull);
+ expect(statement.message, isNotNull);
expect(statement.rightParenthesis, isNotNull);
- expect(statement.thenStatement, isNotNull);
- expect(statement.elseKeyword, isNotNull);
- expect(statement.elseStatement, isNotNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseIfStatement_noElse_block() {
- createParser('if (x) {}');
- IfStatement statement = parser.parseIfStatement();
+ void test_parseAssertStatement_messageString() {
+ createParser('assert (x, "foo");');
+ AssertStatement statement = parser.parseAssertStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement.ifKeyword, isNotNull);
+ expect(statement.assertKeyword, isNotNull);
expect(statement.leftParenthesis, isNotNull);
expect(statement.condition, isNotNull);
+ expect(statement.comma, isNotNull);
+ expect(statement.message, isNotNull);
expect(statement.rightParenthesis, isNotNull);
- expect(statement.thenStatement, isNotNull);
- expect(statement.elseKeyword, isNull);
- expect(statement.elseStatement, isNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseIfStatement_noElse_statement() {
- createParser('if (x) f(x);');
- IfStatement statement = parser.parseIfStatement();
+ void test_parseBlock_empty() {
+ createParser('{}');
+ Block block = parser.parseBlock();
+ expectNotNullIfNoErrors(block);
+ listener.assertNoErrors();
+ expect(block.leftBracket, isNotNull);
+ expect(block.statements, hasLength(0));
+ expect(block.rightBracket, isNotNull);
+ }
+
+ void test_parseBlock_nonEmpty() {
+ createParser('{;}');
+ Block block = parser.parseBlock();
+ expectNotNullIfNoErrors(block);
+ listener.assertNoErrors();
+ expect(block.leftBracket, isNotNull);
+ expect(block.statements, hasLength(1));
+ expect(block.rightBracket, isNotNull);
+ }
+
+ void test_parseBreakStatement_label() {
+ createParser('break foo;');
+ BreakStatement statement = parser.parseBreakStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement.ifKeyword, isNotNull);
- expect(statement.leftParenthesis, isNotNull);
- expect(statement.condition, isNotNull);
- expect(statement.rightParenthesis, isNotNull);
- expect(statement.thenStatement, isNotNull);
- expect(statement.elseKeyword, isNull);
- expect(statement.elseStatement, isNull);
+ expect(statement.breakKeyword, isNotNull);
+ expect(statement.label, isNotNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseImplementsClause_multiple() {
- createParser('implements A, B, C');
- ImplementsClause clause = parser.parseImplementsClause();
- expectNotNullIfNoErrors(clause);
+ void test_parseBreakStatement_noLabel() {
+ createParser('break;');
+ BreakStatement statement = parser.parseBreakStatement();
+ expectNotNullIfNoErrors(statement);
+ listener.assertErrorsWithCodes([ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+ expect(statement.breakKeyword, isNotNull);
+ expect(statement.label, isNull);
+ expect(statement.semicolon, isNotNull);
+ }
+
+ void test_parseCombinator_hide() {
+ createParser('hide a;');
+ Combinator combinator = parser.parseCombinator();
+ expectNotNullIfNoErrors(combinator);
listener.assertNoErrors();
- expect(clause.interfaces, hasLength(3));
- expect(clause.implementsKeyword, isNotNull);
+ expect(combinator, new isInstanceOf<HideCombinator>());
+ HideCombinator hideCombinator = combinator;
+ expect(hideCombinator.keyword, isNotNull);
+ expect(hideCombinator.hiddenNames, hasLength(1));
}
- void test_parseImplementsClause_single() {
- createParser('implements A');
- ImplementsClause clause = parser.parseImplementsClause();
- expectNotNullIfNoErrors(clause);
+ void test_parseCombinator_show() {
+ createParser('show a;');
+ Combinator combinator = parser.parseCombinator();
+ expectNotNullIfNoErrors(combinator);
listener.assertNoErrors();
- expect(clause.interfaces, hasLength(1));
- expect(clause.implementsKeyword, isNotNull);
+ expect(combinator, new isInstanceOf<ShowCombinator>());
+ ShowCombinator showCombinator = combinator;
+ expect(showCombinator.keyword, isNotNull);
+ expect(showCombinator.shownNames, hasLength(1));
}
- void test_parseInstanceCreationExpression_qualifiedType() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A.B()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCombinators_h() {
+ createParser('hide a;');
+ List<Combinator> combinators = parser.parseCombinators();
+ expectNotNullIfNoErrors(combinators);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments, isNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
+ expect(combinators, hasLength(1));
+ HideCombinator combinator = combinators[0] as HideCombinator;
+ expect(combinator, isNotNull);
+ expect(combinator.keyword, isNotNull);
+ expect(combinator.hiddenNames, hasLength(1));
}
- void test_parseInstanceCreationExpression_qualifiedType_named() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A.B.c()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCombinators_hs() {
+ createParser('hide a show b;');
+ List<Combinator> combinators = parser.parseCombinators();
+ expectNotNullIfNoErrors(combinators);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments, isNull);
- expect(name.period, isNotNull);
- expect(name.name, isNotNull);
- expect(expression.argumentList, isNotNull);
+ expect(combinators, hasLength(2));
+ HideCombinator hideCombinator = combinators[0] as HideCombinator;
+ expect(hideCombinator, isNotNull);
+ expect(hideCombinator.keyword, isNotNull);
+ expect(hideCombinator.hiddenNames, hasLength(1));
+ ShowCombinator showCombinator = combinators[1] as ShowCombinator;
+ expect(showCombinator, isNotNull);
+ expect(showCombinator.keyword, isNotNull);
+ expect(showCombinator.shownNames, hasLength(1));
}
- void
- test_parseInstanceCreationExpression_qualifiedType_named_typeParameterComment() {
- enableGenericMethodComments = true;
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A.B/*<E>*/.c()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCombinators_hshs() {
+ createParser('hide a show b hide c show d;');
+ List<Combinator> combinators = parser.parseCombinators();
+ expectNotNullIfNoErrors(combinators);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNotNull);
- expect(name.name, isNotNull);
- expect(expression.argumentList, isNotNull);
+ expect(combinators, hasLength(4));
}
- void
- test_parseInstanceCreationExpression_qualifiedType_named_typeParameters() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A.B<E>.c()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCombinators_s() {
+ createParser('show a;');
+ List<Combinator> combinators = parser.parseCombinators();
+ expectNotNullIfNoErrors(combinators);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNotNull);
- expect(name.name, isNotNull);
- expect(expression.argumentList, isNotNull);
+ expect(combinators, hasLength(1));
+ ShowCombinator combinator = combinators[0] as ShowCombinator;
+ expect(combinator, isNotNull);
+ expect(combinator.keyword, isNotNull);
+ expect(combinator.shownNames, hasLength(1));
+ }
+
+ void test_parseCommentAndMetadata_c() {
+ createParser('/** 1 */ void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
+ listener.assertNoErrors();
+ expect(commentAndMetadata.comment, isNotNull);
+ expect(commentAndMetadata.metadata, isNull);
+ }
+
+ void test_parseCommentAndMetadata_cmc() {
+ createParser('/** 1 */ @A /** 2 */ void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
+ listener.assertNoErrors();
+ expect(commentAndMetadata.comment, isNotNull);
+ expect(commentAndMetadata.metadata, hasLength(1));
+ }
+
+ void test_parseCommentAndMetadata_cmcm() {
+ createParser('/** 1 */ @A /** 2 */ @B void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
+ listener.assertNoErrors();
+ expect(commentAndMetadata.comment, isNotNull);
+ expect(commentAndMetadata.metadata, hasLength(2));
}
- void
- test_parseInstanceCreationExpression_qualifiedType_typeParameterComment() {
- enableGenericMethodComments = true;
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A.B/*<E>*/()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentAndMetadata_cmm() {
+ createParser('/** 1 */ @A @B void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
+ expect(commentAndMetadata.comment, isNotNull);
+ expect(commentAndMetadata.metadata, hasLength(2));
}
- void test_parseInstanceCreationExpression_qualifiedType_typeParameters() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A.B<E>()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentAndMetadata_m() {
+ createParser('@A void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
+ expect(commentAndMetadata.comment, isNull);
+ expect(commentAndMetadata.metadata, hasLength(1));
}
- void test_parseInstanceCreationExpression_type() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentAndMetadata_mcm() {
+ createParser('@A /** 1 */ @B void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments, isNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
+ expect(commentAndMetadata.comment, isNotNull);
+ expect(commentAndMetadata.metadata, hasLength(2));
}
- void test_parseInstanceCreationExpression_type_named() {
- enableGenericMethodComments = true;
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A.c()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentAndMetadata_mcmc() {
+ createParser('@A /** 1 */ @B /** 2 */ void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments, isNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
+ expect(commentAndMetadata.comment, isNotNull);
+ expect(commentAndMetadata.metadata, hasLength(2));
}
- void test_parseInstanceCreationExpression_type_named_typeParameterComment() {
- enableGenericMethodComments = true;
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A/*<B>*/.c()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentAndMetadata_mm() {
+ createParser('@A @B(x) void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNotNull);
- expect(name.name, isNotNull);
- expect(expression.argumentList, isNotNull);
+ expect(commentAndMetadata.comment, isNull);
+ expect(commentAndMetadata.metadata, hasLength(2));
}
- void test_parseInstanceCreationExpression_type_named_typeParameters() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A<B>.c()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentAndMetadata_none() {
+ createParser('void');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNotNull);
- expect(name.name, isNotNull);
- expect(expression.argumentList, isNotNull);
+ expect(commentAndMetadata.comment, isNull);
+ expect(commentAndMetadata.metadata, isNull);
}
- void test_parseInstanceCreationExpression_type_typeParameterComment() {
- enableGenericMethodComments = true;
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A/*<B>*/()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentAndMetadata_singleLine() {
+ createParser(r'''
+/// 1
+/// 2
+void''');
+ CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
+ expectNotNullIfNoErrors(commentAndMetadata);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
+ expect(commentAndMetadata.comment, isNotNull);
+ expect(commentAndMetadata.metadata, isNull);
}
- void test_parseInstanceCreationExpression_type_typeParameters() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A<B>()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentReference_new_prefixed() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('new a.b', 7);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(type.typeArguments.arguments, hasLength(1));
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
+ expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
+ PrefixedIdentifier prefixedIdentifier = reference.identifier;
+ SimpleIdentifier prefix = prefixedIdentifier.prefix;
+ expect(prefix.token, isNotNull);
+ expect(prefix.name, "a");
+ expect(prefix.offset, 11);
+ expect(prefixedIdentifier.period, isNotNull);
+ SimpleIdentifier identifier = prefixedIdentifier.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "b");
+ expect(identifier.offset, 13);
}
- void test_parseInstanceCreationExpression_type_typeParameters_nullable() {
- enableNnbd = true;
- Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
- createParser('A<B?>()');
- InstanceCreationExpression expression =
- parser.parseInstanceCreationExpression(token);
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentReference_new_simple() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('new a', 5);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(expression.keyword, token);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
- TypeName type = name.type;
- expect(type, isNotNull);
- expect(name.period, isNull);
- expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
- NodeList<TypeAnnotation> arguments = type.typeArguments.arguments;
- expect(arguments, hasLength(1));
- expect((arguments[0] as TypeName).question, isNotNull);
+ expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = reference.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "a");
+ expect(identifier.offset, 9);
}
- void test_parseLibraryIdentifier_multiple() {
- String name = "a.b.c";
- createParser(name);
- LibraryIdentifier identifier = parser.parseLibraryIdentifier();
- expectNotNullIfNoErrors(identifier);
+ void test_parseCommentReference_operator_withKeyword_notPrefixed() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('operator ==', 5);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(identifier.name, name);
+ expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = reference.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "==");
+ expect(identifier.offset, 14);
}
- void test_parseLibraryIdentifier_single() {
- String name = "a";
- createParser(name);
- LibraryIdentifier identifier = parser.parseLibraryIdentifier();
- expectNotNullIfNoErrors(identifier);
+ void test_parseCommentReference_operator_withKeyword_prefixed() {
+ createParser('');
+ CommentReference reference =
+ parser.parseCommentReference('Object.operator==', 7);
+ expectNotNullIfNoErrors(reference);
+ listener.assertNoErrors();
+ expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
+ PrefixedIdentifier prefixedIdentifier = reference.identifier;
+ SimpleIdentifier prefix = prefixedIdentifier.prefix;
+ expect(prefix.token, isNotNull);
+ expect(prefix.name, "Object");
+ expect(prefix.offset, 7);
+ expect(prefixedIdentifier.period, isNotNull);
+ SimpleIdentifier identifier = prefixedIdentifier.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "==");
+ expect(identifier.offset, 22);
+ }
+
+ void test_parseCommentReference_operator_withoutKeyword_notPrefixed() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('==', 5);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(identifier.name, name);
+ expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = reference.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "==");
+ expect(identifier.offset, 5);
}
- void test_parseListLiteral_empty_oneToken() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
- TypeArgumentList typeArguments = null;
- createParser('[]');
- ListLiteral literal = parser.parseListLiteral(token, typeArguments);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReference_operator_withoutKeyword_prefixed() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('Object.==', 7);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(literal.constKeyword, token);
- expect(literal.typeArguments, typeArguments);
- expect(literal.leftBracket, isNotNull);
- expect(literal.elements, hasLength(0));
- expect(literal.rightBracket, isNotNull);
+ expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
+ PrefixedIdentifier prefixedIdentifier = reference.identifier;
+ SimpleIdentifier prefix = prefixedIdentifier.prefix;
+ expect(prefix.token, isNotNull);
+ expect(prefix.name, "Object");
+ expect(prefix.offset, 7);
+ expect(prefixedIdentifier.period, isNotNull);
+ SimpleIdentifier identifier = prefixedIdentifier.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "==");
+ expect(identifier.offset, 14);
}
- void test_parseListLiteral_empty_oneToken_withComment() {
- Token token = null;
- TypeArgumentList typeArguments = null;
- createParser('/* 0 */ []');
- ListLiteral literal = parser.parseListLiteral(token, typeArguments);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReference_prefixed() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('a.b', 7);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(literal.constKeyword, token);
- expect(literal.typeArguments, typeArguments);
- Token leftBracket = literal.leftBracket;
- expect(leftBracket, isNotNull);
- expect(leftBracket.precedingComments, isNotNull);
- expect(literal.elements, hasLength(0));
- expect(literal.rightBracket, isNotNull);
+ expect(reference.identifier, new isInstanceOf<PrefixedIdentifier>());
+ PrefixedIdentifier prefixedIdentifier = reference.identifier;
+ SimpleIdentifier prefix = prefixedIdentifier.prefix;
+ expect(prefix.token, isNotNull);
+ expect(prefix.name, "a");
+ expect(prefix.offset, 7);
+ expect(prefixedIdentifier.period, isNotNull);
+ SimpleIdentifier identifier = prefixedIdentifier.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "b");
+ expect(identifier.offset, 9);
}
- void test_parseListLiteral_empty_twoTokens() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
- TypeArgumentList typeArguments = null;
- createParser('[ ]');
- ListLiteral literal = parser.parseListLiteral(token, typeArguments);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReference_simple() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('a', 5);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(literal.constKeyword, token);
- expect(literal.typeArguments, typeArguments);
- expect(literal.leftBracket, isNotNull);
- expect(literal.elements, hasLength(0));
- expect(literal.rightBracket, isNotNull);
+ expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = reference.identifier;
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "a");
+ expect(identifier.offset, 5);
}
- void test_parseListLiteral_multiple() {
- createParser('[1, 2, 3]');
- ListLiteral literal = parser.parseListLiteral(null, null);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReference_synthetic() {
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('', 5);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(literal.constKeyword, isNull);
- expect(literal.typeArguments, isNull);
- expect(literal.leftBracket, isNotNull);
- expect(literal.elements, hasLength(3));
- expect(literal.rightBracket, isNotNull);
+ expect(reference.identifier, new isInstanceOf<SimpleIdentifier>());
+ SimpleIdentifier identifier = reference.identifier;
+ expect(identifier, isNotNull);
+ expect(identifier.isSynthetic, isTrue);
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "");
+ expect(identifier.offset, 5);
+ // Should end with EOF token.
+ Token nextToken = identifier.token.next;
+ expect(nextToken, isNotNull);
+ expect(nextToken.type, TokenType.EOF);
}
- void test_parseListLiteral_single() {
- createParser('[1]');
- ListLiteral literal = parser.parseListLiteral(null, null);
- expectNotNullIfNoErrors(literal);
+ @failingTest
+ void test_parseCommentReference_this() {
+ // This fails because we are returning null from the method and asserting
+ // that the return value is not null.
+ createParser('');
+ CommentReference reference = parser.parseCommentReference('this', 5);
+ expectNotNullIfNoErrors(reference);
listener.assertNoErrors();
- expect(literal.constKeyword, isNull);
- expect(literal.typeArguments, isNull);
- expect(literal.leftBracket, isNotNull);
- expect(literal.elements, hasLength(1));
- expect(literal.rightBracket, isNotNull);
+ SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
+ (obj) => obj is SimpleIdentifier,
+ SimpleIdentifier,
+ reference.identifier);
+ expect(identifier.token, isNotNull);
+ expect(identifier.name, "a");
+ expect(identifier.offset, 5);
}
- void test_parseListOrMapLiteral_list_noType() {
- createParser('[1]');
- TypedLiteral literal = parser.parseListOrMapLiteral(null);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReferences_multiLine() {
+ DocumentationCommentToken token = new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [bb] zzz */", 3);
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[token];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(literal, new isInstanceOf<ListLiteral>());
- ListLiteral listLiteral = literal;
- expect(listLiteral.constKeyword, isNull);
- expect(listLiteral.typeArguments, isNull);
- expect(listLiteral.leftBracket, isNotNull);
- expect(listLiteral.elements, hasLength(1));
- expect(listLiteral.rightBracket, isNotNull);
+ List<Token> tokenReferences = token.references;
+ expect(references, hasLength(2));
+ expect(tokenReferences, hasLength(2));
+ {
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 12);
+ // the reference is recorded in the comment token
+ Token referenceToken = tokenReferences[0];
+ expect(referenceToken.offset, 12);
+ expect(referenceToken.lexeme, 'a');
+ }
+ {
+ CommentReference reference = references[1];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 20);
+ // the reference is recorded in the comment token
+ Token referenceToken = tokenReferences[1];
+ expect(referenceToken.offset, 20);
+ expect(referenceToken.lexeme, 'bb');
+ }
}
- void test_parseListOrMapLiteral_list_type() {
- createParser('<int> [1]');
- TypedLiteral literal = parser.parseListOrMapLiteral(null);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReferences_notClosed_noIdentifier() {
+ DocumentationCommentToken docToken = new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT, "/** [ some text", 5);
+ createParser('');
+ List<CommentReference> references =
+ parser.parseCommentReferences(<DocumentationCommentToken>[docToken]);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(literal, new isInstanceOf<ListLiteral>());
- ListLiteral listLiteral = literal;
- expect(listLiteral.constKeyword, isNull);
- expect(listLiteral.typeArguments, isNotNull);
- expect(listLiteral.leftBracket, isNotNull);
- expect(listLiteral.elements, hasLength(1));
- expect(listLiteral.rightBracket, isNotNull);
+ expect(docToken.references, hasLength(1));
+ expect(references, hasLength(1));
+ Token referenceToken = docToken.references[0];
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(docToken.references[0], same(reference.beginToken));
+ expect(reference.identifier, isNotNull);
+ expect(reference.identifier.isSynthetic, isTrue);
+ expect(reference.identifier.name, "");
+ // Should end with EOF token.
+ Token nextToken = referenceToken.next;
+ expect(nextToken, isNotNull);
+ expect(nextToken.type, TokenType.EOF);
}
- void test_parseListOrMapLiteral_map_noType() {
- createParser("{'1' : 1}");
- TypedLiteral literal = parser.parseListOrMapLiteral(null);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReferences_notClosed_withIdentifier() {
+ DocumentationCommentToken docToken = new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT, "/** [namePrefix some text", 5);
+ createParser('');
+ List<CommentReference> references =
+ parser.parseCommentReferences(<DocumentationCommentToken>[docToken]);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(literal, new isInstanceOf<MapLiteral>());
- MapLiteral mapLiteral = literal;
- expect(mapLiteral.constKeyword, isNull);
- expect(mapLiteral.typeArguments, isNull);
- expect(mapLiteral.leftBracket, isNotNull);
- expect(mapLiteral.entries, hasLength(1));
- expect(mapLiteral.rightBracket, isNotNull);
+ expect(docToken.references, hasLength(1));
+ expect(references, hasLength(1));
+ Token referenceToken = docToken.references[0];
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(referenceToken, same(reference.beginToken));
+ expect(reference.identifier, isNotNull);
+ expect(reference.identifier.isSynthetic, isFalse);
+ expect(reference.identifier.name, "namePrefix");
+ // Should end with EOF token.
+ Token nextToken = referenceToken.next;
+ expect(nextToken, isNotNull);
+ expect(nextToken.type, TokenType.EOF);
}
- void test_parseListOrMapLiteral_map_type() {
- createParser("<String, int> {'1' : 1}");
- TypedLiteral literal = parser.parseListOrMapLiteral(null);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReferences_singleLine() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(
+ TokenType.SINGLE_LINE_COMMENT, "/// xxx [a] yyy [b] zzz", 3),
+ new DocumentationCommentToken(
+ TokenType.SINGLE_LINE_COMMENT, "/// x [c]", 28)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(literal, new isInstanceOf<MapLiteral>());
- MapLiteral mapLiteral = literal;
- expect(mapLiteral.constKeyword, isNull);
- expect(mapLiteral.typeArguments, isNotNull);
- expect(mapLiteral.leftBracket, isNotNull);
- expect(mapLiteral.entries, hasLength(1));
- expect(mapLiteral.rightBracket, isNotNull);
+ expect(references, hasLength(3));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 12);
+ reference = references[1];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 20);
+ reference = references[2];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 35);
}
- void test_parseLogicalAndExpression() {
- createParser('x && y');
- Expression expression = parser.parseLogicalAndExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentReferences_skipCodeBlock_4spaces_block() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
+ "/**\n * a[i]\n * non-code line\n */", 3)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.AMPERSAND_AMPERSAND);
- expect(binaryExpression.rightOperand, isNotNull);
+ expect(references, isEmpty);
}
- void test_parseLogicalOrExpression() {
- createParser('x || y');
- Expression expression = parser.parseLogicalOrExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseCommentReferences_skipCodeBlock_4spaces_lines() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(
+ TokenType.SINGLE_LINE_COMMENT, "/// Code block:", 0),
+ new DocumentationCommentToken(
+ TokenType.SINGLE_LINE_COMMENT, "/// a[i] == b[i]", 0)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.BAR_BAR);
- expect(binaryExpression.rightOperand, isNotNull);
+ expect(references, isEmpty);
}
- void test_parseMapLiteral_empty() {
- Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
- TypeArgumentList typeArguments = AstTestFactory.typeArgumentList(
- [AstTestFactory.typeName4("String"), AstTestFactory.typeName4("int")]);
- createParser('{}');
- MapLiteral literal = parser.parseMapLiteral(token, typeArguments);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReferences_skipCodeBlock_bracketed() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT, "/** [:xxx [a] yyy:] [b] zzz */", 3)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(literal.constKeyword, token);
- expect(literal.typeArguments, typeArguments);
- expect(literal.leftBracket, isNotNull);
- expect(literal.entries, hasLength(0));
- expect(literal.rightBracket, isNotNull);
+ expect(references, hasLength(1));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 24);
}
- void test_parseMapLiteral_multiple() {
- createParser("{'a' : b, 'x' : y}");
- MapLiteral literal = parser.parseMapLiteral(null, null);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReferences_skipCodeBlock_gitHub() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT, "/** `a[i]` and [b] */", 0)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(literal.leftBracket, isNotNull);
- expect(literal.entries, hasLength(2));
- expect(literal.rightBracket, isNotNull);
+ expect(references, hasLength(1));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 16);
}
- void test_parseMapLiteral_single() {
- createParser("{'x' : y}");
- MapLiteral literal = parser.parseMapLiteral(null, null);
- expectNotNullIfNoErrors(literal);
+ void test_parseCommentReferences_skipCodeBlock_gitHub_multiLine() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT,
+ r'''
+/**
+ * First.
+ * ```dart
+ * Some [int] reference.
+ * ```
+ * Last.
+ */
+''',
+ 3)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(literal.leftBracket, isNotNull);
- expect(literal.entries, hasLength(1));
- expect(literal.rightBracket, isNotNull);
+ expect(references, isEmpty);
}
- void test_parseMapLiteralEntry_complex() {
- createParser('2 + 2 : y');
- MapLiteralEntry entry = parser.parseMapLiteralEntry();
- expectNotNullIfNoErrors(entry);
+ void test_parseCommentReferences_skipCodeBlock_gitHub_multiLine_lines() {
+ String commentText = r'''
+/// First.
+/// ```dart
+/// Some [int] reference.
+/// ```
+/// Last.
+''';
+ List<DocumentationCommentToken> tokens = commentText
+ .split('\n')
+ .map((line) => new DocumentationCommentToken(
+ TokenType.SINGLE_LINE_COMMENT, line, 0))
+ .toList();
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(entry.key, isNotNull);
- expect(entry.separator, isNotNull);
- expect(entry.value, isNotNull);
+ expect(references, isEmpty);
}
- void test_parseMapLiteralEntry_int() {
- createParser('0 : y');
- MapLiteralEntry entry = parser.parseMapLiteralEntry();
- expectNotNullIfNoErrors(entry);
+ void test_parseCommentReferences_skipCodeBlock_gitHub_notTerminated() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT, "/** `a[i] and [b] */", 0)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(entry.key, isNotNull);
- expect(entry.separator, isNotNull);
- expect(entry.value, isNotNull);
+ expect(references, hasLength(2));
}
- void test_parseMapLiteralEntry_string() {
- createParser("'x' : y");
- MapLiteralEntry entry = parser.parseMapLiteralEntry();
- expectNotNullIfNoErrors(entry);
+ void test_parseCommentReferences_skipCodeBlock_spaces() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
+ "/**\n * a[i]\n * xxx [i] zzz\n */", 3)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(entry.key, isNotNull);
- expect(entry.separator, isNotNull);
- expect(entry.value, isNotNull);
+ expect(references, hasLength(1));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 27);
}
- void test_parseModifiers_abstract() {
- createParser('abstract A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
+ void test_parseCommentReferences_skipLinkDefinition() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
+ "/** [a]: http://www.google.com (Google) [b] zzz */", 3)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(modifiers.abstractKeyword, isNotNull);
+ expect(references, hasLength(1));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 44);
}
- void test_parseModifiers_const() {
- createParser('const A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
+ void test_parseCommentReferences_skipLinked() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
+ "/** [a](http://www.google.com) [b] zzz */", 3)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(modifiers.constKeyword, isNotNull);
+ expect(references, hasLength(1));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 35);
}
- void test_parseModifiers_covariant() {
- createParser('covariant A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
+ void test_parseCommentReferences_skipReferenceLink() {
+ List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+ new DocumentationCommentToken(
+ TokenType.MULTI_LINE_COMMENT, "/** [a][c] [b] zzz */", 3)
+ ];
+ createParser('');
+ List<CommentReference> references = parser.parseCommentReferences(tokens);
+ expectNotNullIfNoErrors(references);
listener.assertNoErrors();
- expect(modifiers.covariantKeyword, isNotNull);
+ expect(references, hasLength(1));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.identifier, isNotNull);
+ expect(reference.offset, 15);
}
- void test_parseModifiers_external() {
- createParser('external A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
+ void test_parseConfiguration_noOperator_dottedIdentifier() {
+ createParser("if (a.b) 'c.dart'");
+ Configuration configuration = parser.parseConfiguration();
+ expectNotNullIfNoErrors(configuration);
listener.assertNoErrors();
- expect(modifiers.externalKeyword, isNotNull);
+ expect(configuration.ifKeyword, isNotNull);
+ expect(configuration.leftParenthesis, isNotNull);
+ expectDottedName(configuration.name, ["a", "b"]);
+ expect(configuration.equalToken, isNull);
+ expect(configuration.value, isNull);
+ expect(configuration.rightParenthesis, isNotNull);
+ expect(configuration.uri, isNotNull);
}
- void test_parseModifiers_factory() {
- createParser('factory A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
+ void test_parseConfiguration_noOperator_simpleIdentifier() {
+ createParser("if (a) 'b.dart'");
+ Configuration configuration = parser.parseConfiguration();
+ expectNotNullIfNoErrors(configuration);
listener.assertNoErrors();
- expect(modifiers.factoryKeyword, isNotNull);
+ expect(configuration.ifKeyword, isNotNull);
+ expect(configuration.leftParenthesis, isNotNull);
+ expectDottedName(configuration.name, ["a"]);
+ expect(configuration.equalToken, isNull);
+ expect(configuration.value, isNull);
+ expect(configuration.rightParenthesis, isNotNull);
+ expect(configuration.uri, isNotNull);
}
- void test_parseModifiers_final() {
- createParser('final A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
+ void test_parseConfiguration_operator_dottedIdentifier() {
+ createParser("if (a.b == 'c') 'd.dart'");
+ Configuration configuration = parser.parseConfiguration();
+ expectNotNullIfNoErrors(configuration);
listener.assertNoErrors();
- expect(modifiers.finalKeyword, isNotNull);
+ expect(configuration.ifKeyword, isNotNull);
+ expect(configuration.leftParenthesis, isNotNull);
+ expectDottedName(configuration.name, ["a", "b"]);
+ expect(configuration.equalToken, isNotNull);
+ expect(configuration.value, isNotNull);
+ expect(configuration.rightParenthesis, isNotNull);
+ expect(configuration.uri, isNotNull);
}
- void test_parseModifiers_static() {
- createParser('static A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
+ void test_parseConfiguration_operator_simpleIdentifier() {
+ createParser("if (a == 'b') 'c.dart'");
+ Configuration configuration = parser.parseConfiguration();
+ expectNotNullIfNoErrors(configuration);
listener.assertNoErrors();
- expect(modifiers.staticKeyword, isNotNull);
+ expect(configuration.ifKeyword, isNotNull);
+ expect(configuration.leftParenthesis, isNotNull);
+ expectDottedName(configuration.name, ["a"]);
+ expect(configuration.equalToken, isNotNull);
+ expect(configuration.value, isNotNull);
+ expect(configuration.rightParenthesis, isNotNull);
+ expect(configuration.uri, isNotNull);
}
- void test_parseModifiers_var() {
- createParser('var A');
- Modifiers modifiers = parser.parseModifiers();
- expectNotNullIfNoErrors(modifiers);
- listener.assertNoErrors();
- expect(modifiers.varKeyword, isNotNull);
+ void test_parseConstructor() {
+ // TODO(brianwilkerson) Implement tests for this method.
}
- void test_parseMultiplicativeExpression_normal() {
- createParser('x * y');
- Expression expression = parser.parseMultiplicativeExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseConstructorName_named_noPrefix() {
+ createParser('A.n;');
+ ConstructorName name = parser.parseConstructorName();
+ expectNotNullIfNoErrors(name);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.STAR);
- expect(binaryExpression.rightOperand, isNotNull);
+ expect(name.type, isNotNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
}
- void test_parseMultiplicativeExpression_super() {
- createParser('super * y');
- Expression expression = parser.parseMultiplicativeExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseConstructorName_named_prefixed() {
+ createParser('p.A.n;');
+ ConstructorName name = parser.parseConstructorName();
+ expectNotNullIfNoErrors(name);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.STAR);
- expect(binaryExpression.rightOperand, isNotNull);
+ expect(name.type, isNotNull);
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
}
- void test_parseNewExpression() {
- createParser('new A()');
- InstanceCreationExpression expression = parser.parseNewExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseConstructorName_unnamed_noPrefix() {
+ createParser('A;');
+ ConstructorName name = parser.parseConstructorName();
+ expectNotNullIfNoErrors(name);
listener.assertNoErrors();
- expect(expression.keyword, isNotNull);
- ConstructorName name = expression.constructorName;
- expect(name, isNotNull);
expect(name.type, isNotNull);
expect(name.period, isNull);
expect(name.name, isNull);
- expect(expression.argumentList, isNotNull);
}
- void test_parseNonLabeledStatement_const_list_empty() {
- createParser('const [];');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseConstructorName_unnamed_prefixed() {
+ createParser('p.A;');
+ ConstructorName name = parser.parseConstructorName();
+ expectNotNullIfNoErrors(name);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ expect(name.type, isNotNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
}
- void test_parseNonLabeledStatement_const_list_nonEmpty() {
- createParser('const [1, 2];');
- Statement statement = parser.parseNonLabeledStatement();
+ void test_parseContinueStatement_label() {
+ createParser('continue foo;');
+ ContinueStatement statement = parser.parseContinueStatement();
expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ listener.assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+ expect(statement.continueKeyword, isNotNull);
+ expect(statement.label, isNotNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseNonLabeledStatement_const_map_empty() {
- createParser('const {};');
- Statement statement = parser.parseNonLabeledStatement();
+ void test_parseContinueStatement_noLabel() {
+ createParser('continue;');
+ ContinueStatement statement = parser.parseContinueStatement();
expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ listener.assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+ expect(statement.continueKeyword, isNotNull);
+ expect(statement.label, isNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseNonLabeledStatement_const_map_nonEmpty() {
- // TODO(brianwilkerson) Implement more tests for this method.
- createParser("const {'a' : 1};");
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseDocumentationComment_block() {
+ createParser('/** */ class');
+ Comment comment = parser
+ .parseDocumentationComment(parser.parseDocumentationCommentTokens());
+ expectNotNullIfNoErrors(comment);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ expect(comment.isBlock, isFalse);
+ expect(comment.isDocumentation, isTrue);
+ expect(comment.isEndOfLine, isFalse);
}
- void test_parseNonLabeledStatement_const_object() {
- createParser('const A();');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseDocumentationComment_block_withReference() {
+ createParser('/** [a] */ class');
+ Comment comment = parser
+ .parseDocumentationComment(parser.parseDocumentationCommentTokens());
+ expectNotNullIfNoErrors(comment);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ expect(comment.isBlock, isFalse);
+ expect(comment.isDocumentation, isTrue);
+ expect(comment.isEndOfLine, isFalse);
+ NodeList<CommentReference> references = comment.references;
+ expect(references, hasLength(1));
+ CommentReference reference = references[0];
+ expect(reference, isNotNull);
+ expect(reference.offset, 5);
}
- void test_parseNonLabeledStatement_const_object_named_typeParameters() {
- createParser('const A<B>.c();');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseDocumentationComment_endOfLine() {
+ createParser('/// \n/// \n class');
+ Comment comment = parser
+ .parseDocumentationComment(parser.parseDocumentationCommentTokens());
+ expectNotNullIfNoErrors(comment);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ expect(comment.isBlock, isFalse);
+ expect(comment.isDocumentation, isTrue);
+ expect(comment.isEndOfLine, isFalse);
}
- void test_parseNonLabeledStatement_constructorInvocation() {
- createParser('new C().m();');
- Statement statement = parser.parseNonLabeledStatement();
+ void test_parseDoStatement() {
+ createParser('do {} while (x);');
+ DoStatement statement = parser.parseDoStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ expect(statement.doKeyword, isNotNull);
+ expect(statement.body, isNotNull);
+ expect(statement.whileKeyword, isNotNull);
+ expect(statement.leftParenthesis, isNotNull);
+ expect(statement.condition, isNotNull);
+ expect(statement.rightParenthesis, isNotNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseNonLabeledStatement_false() {
- createParser('false;');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseDottedName_multiple() {
+ createParser('a.b.c');
+ DottedName name = parser.parseDottedName();
+ expectNotNullIfNoErrors(name);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ expectDottedName(name, ["a", "b", "c"]);
}
- void test_parseNonLabeledStatement_functionDeclaration() {
- createParser('f() {};');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseDottedName_single() {
+ createParser('a');
+ DottedName name = parser.parseDottedName();
+ expectNotNullIfNoErrors(name);
listener.assertNoErrors();
+ expectDottedName(name, ["a"]);
}
- void test_parseNonLabeledStatement_functionDeclaration_arguments() {
- createParser('f(void g()) {};');
- Statement statement = parser.parseNonLabeledStatement();
+ void test_parseEmptyStatement() {
+ createParser(';');
+ EmptyStatement statement = parser.parseEmptyStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
+ expect(statement.semicolon, isNotNull);
}
- void test_parseNonLabeledStatement_functionExpressionIndex() {
- createParser('() {}[0] = null;');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseExtendsClause() {
+ createParser('extends B');
+ ExtendsClause clause = parser.parseExtendsClause();
+ expectNotNullIfNoErrors(clause);
listener.assertNoErrors();
+ expect(clause.extendsKeyword, isNotNull);
+ expect(clause.superclass, isNotNull);
+ expect(clause.superclass, new isInstanceOf<TypeName>());
}
- void test_parseNonLabeledStatement_functionInvocation() {
- createParser('f();');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
- listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ void test_parseFinalConstVarOrType_const_functionType() {
+ createParser('const int Function(int) f');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
+ listener.assertNoErrors();
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.CONST);
+ expect(result.type, isNotNull);
}
- void test_parseNonLabeledStatement_invokeFunctionExpression() {
- createParser('(a) {return a + a;} (3);');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseFinalConstVarOrType_const_namedType() {
+ createParser('const A a');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- EngineTestCase.assertInstanceOf(
- (obj) => obj is FunctionExpressionInvocation,
- FunctionExpressionInvocation,
- expressionStatement.expression);
- FunctionExpressionInvocation invocation =
- expressionStatement.expression as FunctionExpressionInvocation;
- EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression,
- FunctionExpression, invocation.function);
- FunctionExpression expression = invocation.function as FunctionExpression;
- expect(expression.parameters, isNotNull);
- expect(expression.body, isNotNull);
- expect(invocation.typeArguments, isNull);
- ArgumentList list = invocation.argumentList;
- expect(list, isNotNull);
- expect(list.arguments, hasLength(1));
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.CONST);
+ expect(result.type, isNotNull);
}
- void test_parseNonLabeledStatement_null() {
- createParser('null;');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseFinalConstVarOrType_const_noType() {
+ createParser('const');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.CONST);
+ expect(result.type, isNull);
}
- void test_parseNonLabeledStatement_startingWithBuiltInIdentifier() {
- createParser('library.getName();');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseFinalConstVarOrType_final_functionType() {
+ createParser('final int Function(int) f');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.FINAL);
+ expect(result.type, isNotNull);
}
- void test_parseNonLabeledStatement_true() {
- createParser('true;');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseFinalConstVarOrType_final_namedType() {
+ createParser('final A a');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.FINAL);
+ expect(result.type, isNotNull);
}
- void test_parseNonLabeledStatement_typeCast() {
- createParser('double.NAN as num;');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseFinalConstVarOrType_final_noType() {
+ createParser('final');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<ExpressionStatement>());
- ExpressionStatement expressionStatement = statement;
- expect(expressionStatement.expression, isNotNull);
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.FINAL);
+ expect(result.type, isNull);
}
- void test_parseNonLabeledStatement_variableDeclaration_final_namedFunction() {
- createParser('final int Function = 0;');
- Statement statement = parser.parseNonLabeledStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseFinalConstVarOrType_final_prefixedType() {
+ createParser('final p.A a');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.FINAL);
+ expect(result.type, isNotNull);
}
- void test_parseOptionalReturnType() {
- // TODO(brianwilkerson) Implement tests for this method.
+ void test_parseFinalConstVarOrType_type_function() {
+ createParser('int Function(int) f');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
+ listener.assertNoErrors();
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void test_parsePostfixExpression_decrement() {
- createParser('i--');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_type_parameterized() {
+ createParser('A<B> a');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<PostfixExpression>());
- PostfixExpression postfixExpression = expression;
- expect(postfixExpression.operand, isNotNull);
- expect(postfixExpression.operator, isNotNull);
- expect(postfixExpression.operator.type, TokenType.MINUS_MINUS);
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void test_parsePostfixExpression_increment() {
- createParser('i++');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_type_prefixed() {
+ createParser('p.A a');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<PostfixExpression>());
- PostfixExpression postfixExpression = expression;
- expect(postfixExpression.operand, isNotNull);
- expect(postfixExpression.operator, isNotNull);
- expect(postfixExpression.operator.type, TokenType.PLUS_PLUS);
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void test_parsePostfixExpression_none_indexExpression() {
- createParser('a[0]');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_type_prefixed_noIdentifier() {
+ createParser('p.A,');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<IndexExpression>());
- IndexExpression indexExpression = expression;
- expect(indexExpression.target, isNotNull);
- expect(indexExpression.index, isNotNull);
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void test_parsePostfixExpression_none_methodInvocation() {
- createParser('a.m()');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_type_prefixedAndParameterized() {
+ createParser('p.A<B> a');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation methodInvocation = expression;
- expect(methodInvocation.target, isNotNull);
- expect(methodInvocation.operator.type, TokenType.PERIOD);
- expect(methodInvocation.methodName, isNotNull);
- expect(methodInvocation.typeArguments, isNull);
- expect(methodInvocation.argumentList, isNotNull);
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void test_parsePostfixExpression_none_methodInvocation_question_dot() {
- createParser('a?.m()');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_type_simple() {
+ createParser('A a');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation methodInvocation = expression;
- expect(methodInvocation.target, isNotNull);
- expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
- expect(methodInvocation.methodName, isNotNull);
- expect(methodInvocation.typeArguments, isNull);
- expect(methodInvocation.argumentList, isNotNull);
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void
- test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('a?.m/*<E>*/()');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_type_simple_noIdentifier_inFunctionType() {
+ createParser('A,');
+ FinalConstVarOrType result =
+ parser.parseFinalConstVarOrType(false, inFunctionType: true);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation methodInvocation = expression;
- expect(methodInvocation.target, isNotNull);
- expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
- expect(methodInvocation.methodName, isNotNull);
- expect(methodInvocation.typeArguments, isNotNull);
- expect(methodInvocation.argumentList, isNotNull);
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void
- test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() {
- createParser('a?.m<E>()');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_var() {
+ createParser('var');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation methodInvocation = expression;
- expect(methodInvocation.target, isNotNull);
- expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
- expect(methodInvocation.methodName, isNotNull);
- expect(methodInvocation.typeArguments, isNotNull);
- expect(methodInvocation.argumentList, isNotNull);
+ Token keyword = result.keyword;
+ expect(keyword, isNotNull);
+ expect(keyword.type, TokenType.KEYWORD);
+ expect(keyword.keyword, Keyword.VAR);
+ expect(result.type, isNull);
}
- void
- test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
- enableGenericMethodComments = true;
- createParser('a.m/*<E>*/()');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation methodInvocation = expression;
- expect(methodInvocation.target, isNotNull);
- expect(methodInvocation.operator.type, TokenType.PERIOD);
- expect(methodInvocation.methodName, isNotNull);
- expect(methodInvocation.typeArguments, isNotNull);
- expect(methodInvocation.argumentList, isNotNull);
+ void test_parseFinalConstVarOrType_void() {
+ createParser('void f()');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
+ listener.assertNoErrors();
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void test_parsePostfixExpression_none_methodInvocation_typeArguments() {
- createParser('a.m<E>()');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFinalConstVarOrType_void_noIdentifier() {
+ createParser('void,');
+ FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
+ expectNotNullIfNoErrors(result);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation methodInvocation = expression;
- expect(methodInvocation.target, isNotNull);
- expect(methodInvocation.operator.type, TokenType.PERIOD);
- expect(methodInvocation.methodName, isNotNull);
- expect(methodInvocation.typeArguments, isNotNull);
- expect(methodInvocation.argumentList, isNotNull);
+ expect(result.keyword, isNull);
+ expect(result.type, isNotNull);
}
- void test_parsePostfixExpression_none_propertyAccess() {
- createParser('a.b');
- Expression expression = parser.parsePostfixExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_each_await() {
+ createParser('await for (element in list) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<PrefixedIdentifier>());
- PrefixedIdentifier identifier = expression;
- expect(identifier.prefix, isNotNull);
- expect(identifier.identifier, isNotNull);
+ expect(statement, new isInstanceOf<ForEachStatement>());
+ ForEachStatement forStatement = statement;
+ expect(forStatement.awaitKeyword, isNotNull);
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.loopVariable, isNull);
+ expect(forStatement.identifier, isNotNull);
+ expect(forStatement.inKeyword, isNotNull);
+ expect(forStatement.iterable, isNotNull);
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrefixedIdentifier_noPrefix() {
- String lexeme = "bar";
- createParser(lexeme);
- Identifier identifier = parser.parsePrefixedIdentifier();
- expectNotNullIfNoErrors(identifier);
+ void test_parseForStatement_each_identifier() {
+ createParser('for (element in list) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(identifier, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier simpleIdentifier = identifier;
- expect(simpleIdentifier.token, isNotNull);
- expect(simpleIdentifier.name, lexeme);
+ expect(statement, new isInstanceOf<ForEachStatement>());
+ ForEachStatement forStatement = statement;
+ expect(forStatement.awaitKeyword, isNull);
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.loopVariable, isNull);
+ expect(forStatement.identifier, isNotNull);
+ expect(forStatement.inKeyword, isNotNull);
+ expect(forStatement.iterable, isNotNull);
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrefixedIdentifier_prefix() {
- String lexeme = "foo.bar";
- createParser(lexeme);
- Identifier identifier = parser.parsePrefixedIdentifier();
- expectNotNullIfNoErrors(identifier);
+ void test_parseForStatement_each_noType_metadata() {
+ createParser('for (@A var element in list) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(identifier, new isInstanceOf<PrefixedIdentifier>());
- PrefixedIdentifier prefixedIdentifier = identifier;
- expect(prefixedIdentifier.prefix.name, "foo");
- expect(prefixedIdentifier.period, isNotNull);
- expect(prefixedIdentifier.identifier.name, "bar");
+ expect(statement, new isInstanceOf<ForEachStatement>());
+ ForEachStatement forStatement = statement;
+ expect(forStatement.awaitKeyword, isNull);
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.loopVariable, isNotNull);
+ expect(forStatement.loopVariable.metadata, hasLength(1));
+ expect(forStatement.identifier, isNull);
+ expect(forStatement.inKeyword, isNotNull);
+ expect(forStatement.iterable, isNotNull);
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_const() {
- createParser('const A()');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_each_type() {
+ createParser('for (A element in list) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, isNotNull);
+ expect(statement, new isInstanceOf<ForEachStatement>());
+ ForEachStatement forStatement = statement;
+ expect(forStatement.awaitKeyword, isNull);
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.loopVariable, isNotNull);
+ expect(forStatement.identifier, isNull);
+ expect(forStatement.inKeyword, isNotNull);
+ expect(forStatement.iterable, isNotNull);
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_double() {
- String doubleLiteral = "3.2e4";
- createParser(doubleLiteral);
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_each_var() {
+ createParser('for (var element in list) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<DoubleLiteral>());
- DoubleLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, double.parse(doubleLiteral));
+ expect(statement, new isInstanceOf<ForEachStatement>());
+ ForEachStatement forStatement = statement;
+ expect(forStatement.awaitKeyword, isNull);
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.loopVariable, isNotNull);
+ expect(forStatement.identifier, isNull);
+ expect(forStatement.inKeyword, isNotNull);
+ expect(forStatement.iterable, isNotNull);
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_false() {
- createParser('false');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_c() {
+ createParser('for (; i < count;) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BooleanLiteral>());
- BooleanLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, isFalse);
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.variables, isNull);
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNotNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(0));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_function_arguments() {
- createParser('(int i) => i + 1');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_cu() {
+ createParser('for (; i < count; i++) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpression>());
- FunctionExpression functionExpression = expression;
- expect(functionExpression.parameters, isNotNull);
- expect(functionExpression.body, isNotNull);
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.variables, isNull);
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNotNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(1));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_function_noArguments() {
- createParser('() => 42');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_ecu() {
+ createParser('for (i--; i < count; i++) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpression>());
- FunctionExpression functionExpression = expression;
- expect(functionExpression.parameters, isNotNull);
- expect(functionExpression.body, isNotNull);
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.variables, isNull);
+ expect(forStatement.initialization, isNotNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNotNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(1));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_genericFunctionExpression() {
- createParser('<X, Y>(Map<X, Y> m, X x) => m[x]');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_i() {
+ createParser('for (var i = 0;;) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<FunctionExpression>());
- FunctionExpression function = expression;
- expect(function.typeParameters, isNotNull);
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ VariableDeclarationList variables = forStatement.variables;
+ expect(variables, isNotNull);
+ expect(variables.metadata, hasLength(0));
+ expect(variables.variables, hasLength(1));
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(0));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_hex() {
- String hexLiteral = "3F";
- createParser('0x$hexLiteral');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_i_withMetadata() {
+ createParser('for (@A var i = 0;;) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<IntegerLiteral>());
- IntegerLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, int.parse(hexLiteral, radix: 16));
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ VariableDeclarationList variables = forStatement.variables;
+ expect(variables, isNotNull);
+ expect(variables.metadata, hasLength(1));
+ expect(variables.variables, hasLength(1));
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(0));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_identifier() {
- createParser('a');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_ic() {
+ createParser('for (var i = 0; i < count;) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleIdentifier>());
- SimpleIdentifier identifier = expression;
- expect(identifier, isNotNull);
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ VariableDeclarationList variables = forStatement.variables;
+ expect(variables, isNotNull);
+ expect(variables.variables, hasLength(1));
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNotNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(0));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_int() {
- String intLiteral = "472";
- createParser(intLiteral);
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_icu() {
+ createParser('for (var i = 0; i < count; i++) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<IntegerLiteral>());
- IntegerLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, int.parse(intLiteral));
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ VariableDeclarationList variables = forStatement.variables;
+ expect(variables, isNotNull);
+ expect(variables.variables, hasLength(1));
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNotNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(1));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_listLiteral() {
- createParser('[ ]');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_iicuu() {
+ createParser('for (int i = 0, j = count; i < j; i++, j--) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<ListLiteral>());
- ListLiteral literal = expression;
- expect(literal, isNotNull);
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ VariableDeclarationList variables = forStatement.variables;
+ expect(variables, isNotNull);
+ expect(variables.variables, hasLength(2));
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNotNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(2));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_listLiteral_index() {
- createParser('[]');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_iu() {
+ createParser('for (var i = 0;; i++) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<ListLiteral>());
- ListLiteral literal = expression;
- expect(literal, isNotNull);
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ VariableDeclarationList variables = forStatement.variables;
+ expect(variables, isNotNull);
+ expect(variables.variables, hasLength(1));
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(1));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_listLiteral_typed() {
- createParser('<A>[ ]');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseForStatement_loop_u() {
+ createParser('for (;; i++) {}');
+ Statement statement = parser.parseForStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<ListLiteral>());
- ListLiteral literal = expression;
- expect(literal.typeArguments, isNotNull);
- expect(literal.typeArguments.arguments, hasLength(1));
+ expect(statement, new isInstanceOf<ForStatement>());
+ ForStatement forStatement = statement;
+ expect(forStatement.forKeyword, isNotNull);
+ expect(forStatement.leftParenthesis, isNotNull);
+ expect(forStatement.variables, isNull);
+ expect(forStatement.initialization, isNull);
+ expect(forStatement.leftSeparator, isNotNull);
+ expect(forStatement.condition, isNull);
+ expect(forStatement.rightSeparator, isNotNull);
+ expect(forStatement.updaters, hasLength(1));
+ expect(forStatement.rightParenthesis, isNotNull);
+ expect(forStatement.body, isNotNull);
}
- void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
- enableGenericMethodComments = true;
- createParser('/*<A>*/[ ]');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_block() {
+ createParser('{}');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<ListLiteral>());
- ListLiteral literal = expression;
- expect(literal.typeArguments, isNotNull);
- expect(literal.typeArguments.arguments, hasLength(1));
+ expect(functionBody, new isInstanceOf<BlockFunctionBody>());
+ BlockFunctionBody body = functionBody;
+ expect(body.keyword, isNull);
+ expect(body.star, isNull);
+ expect(body.block, isNotNull);
+ expect(body.isAsynchronous, isFalse);
+ expect(body.isGenerator, isFalse);
+ expect(body.isSynchronous, isTrue);
}
- void test_parsePrimaryExpression_mapLiteral() {
- createParser('{}');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_block_async() {
+ createParser('async {}');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MapLiteral>());
- MapLiteral literal = expression;
- expect(literal.typeArguments, isNull);
- expect(literal, isNotNull);
+ expect(functionBody, new isInstanceOf<BlockFunctionBody>());
+ BlockFunctionBody body = functionBody;
+ expect(body.keyword, isNotNull);
+ expect(body.keyword.lexeme, Parser.ASYNC);
+ expect(body.star, isNull);
+ expect(body.block, isNotNull);
+ expect(body.isAsynchronous, isTrue);
+ expect(body.isGenerator, isFalse);
+ expect(body.isSynchronous, isFalse);
}
- void test_parsePrimaryExpression_mapLiteral_typed() {
- createParser('<A, B>{}');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_block_asyncGenerator() {
+ createParser('async* {}');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MapLiteral>());
- MapLiteral literal = expression;
- expect(literal.typeArguments, isNotNull);
- expect(literal.typeArguments.arguments, hasLength(2));
+ expect(functionBody, new isInstanceOf<BlockFunctionBody>());
+ BlockFunctionBody body = functionBody;
+ expect(body.keyword, isNotNull);
+ expect(body.keyword.lexeme, Parser.ASYNC);
+ expect(body.star, isNotNull);
+ expect(body.block, isNotNull);
+ expect(body.isAsynchronous, isTrue);
+ expect(body.isGenerator, isTrue);
+ expect(body.isSynchronous, isFalse);
}
- void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
- enableGenericMethodComments = true;
- createParser('/*<A, B>*/{}');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_block_syncGenerator() {
+ createParser('sync* {}');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<MapLiteral>());
- MapLiteral literal = expression;
- expect(literal.typeArguments, isNotNull);
- expect(literal.typeArguments.arguments, hasLength(2));
+ expect(functionBody, new isInstanceOf<BlockFunctionBody>());
+ BlockFunctionBody body = functionBody;
+ expect(body.keyword, isNotNull);
+ expect(body.keyword.lexeme, Parser.SYNC);
+ expect(body.star, isNotNull);
+ expect(body.block, isNotNull);
+ expect(body.isAsynchronous, isFalse);
+ expect(body.isGenerator, isTrue);
+ expect(body.isSynchronous, isTrue);
}
- void test_parsePrimaryExpression_new() {
- createParser('new A()');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_empty() {
+ createParser(';');
+ FunctionBody functionBody = parser.parseFunctionBody(true, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<InstanceCreationExpression>());
- InstanceCreationExpression creation = expression;
- expect(creation, isNotNull);
+ expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
+ EmptyFunctionBody body = functionBody;
+ expect(body.semicolon, isNotNull);
}
- void test_parsePrimaryExpression_null() {
- createParser('null');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_expression() {
+ createParser('=> y;');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<NullLiteral>());
- NullLiteral literal = expression;
- expect(literal.literal, isNotNull);
+ expect(functionBody, new isInstanceOf<ExpressionFunctionBody>());
+ ExpressionFunctionBody body = functionBody;
+ expect(body.keyword, isNull);
+ expect(body.functionDefinition, isNotNull);
+ expect(body.expression, isNotNull);
+ expect(body.semicolon, isNotNull);
+ expect(body.isAsynchronous, isFalse);
+ expect(body.isGenerator, isFalse);
+ expect(body.isSynchronous, isTrue);
}
- void test_parsePrimaryExpression_parenthesized() {
- createParser('(x)');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_expression_async() {
+ createParser('async => y;');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<ParenthesizedExpression>());
- ParenthesizedExpression parens = expression;
- expect(parens, isNotNull);
+ expect(functionBody, new isInstanceOf<ExpressionFunctionBody>());
+ ExpressionFunctionBody body = functionBody;
+ expect(body.keyword, isNotNull);
+ expect(body.keyword.lexeme, Parser.ASYNC);
+ expect(body.functionDefinition, isNotNull);
+ expect(body.expression, isNotNull);
+ expect(body.semicolon, isNotNull);
+ expect(body.isAsynchronous, isTrue);
+ expect(body.isGenerator, isFalse);
+ expect(body.isSynchronous, isFalse);
}
- void test_parsePrimaryExpression_string() {
- createParser('"string"');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_nativeFunctionBody() {
+ createParser('native "str";');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.isMultiline, isFalse);
- expect(literal.isRaw, isFalse);
- expect(literal.value, "string");
+ expect(functionBody, new isInstanceOf<NativeFunctionBody>());
+ NativeFunctionBody body = functionBody;
+ expect(body.nativeKeyword, isNotNull);
+ expect(body.stringLiteral, isNotNull);
+ expect(body.semicolon, isNotNull);
}
- void test_parsePrimaryExpression_string_multiline() {
- createParser("'''string'''");
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_skip_block() {
+ ParserTestCase.parseFunctionBodies = false;
+ createParser('{}');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.isMultiline, isTrue);
- expect(literal.isRaw, isFalse);
- expect(literal.value, "string");
+ expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
}
- void test_parsePrimaryExpression_string_raw() {
- createParser("r'string'");
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.isMultiline, isFalse);
- expect(literal.isRaw, isTrue);
- expect(literal.value, "string");
+ void test_parseFunctionBody_skip_block_invalid() {
+ ParserTestCase.parseFunctionBodies = false;
+ createParser('{');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
+ listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]);
+ expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
}
- void test_parsePrimaryExpression_super() {
- createParser('super.x');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_skip_blocks() {
+ ParserTestCase.parseFunctionBodies = false;
+ createParser('{ {} }');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<PropertyAccess>());
- PropertyAccess propertyAccess = expression;
- expect(propertyAccess.target is SuperExpression, isTrue);
- expect(propertyAccess.operator, isNotNull);
- expect(propertyAccess.operator.type, TokenType.PERIOD);
- expect(propertyAccess.propertyName, isNotNull);
+ expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
}
- void test_parsePrimaryExpression_this() {
- createParser('this');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionBody_skip_expression() {
+ ParserTestCase.parseFunctionBodies = false;
+ createParser('=> y;');
+ FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
+ expectNotNullIfNoErrors(functionBody);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<ThisExpression>());
- ThisExpression thisExpression = expression;
- expect(thisExpression.thisKeyword, isNotNull);
+ expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
}
- void test_parsePrimaryExpression_true() {
- createParser('true');
- Expression expression = parser.parsePrimaryExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionDeclarationStatement() {
+ createParser('void f(int p) => p * 2;');
+ FunctionDeclarationStatement statement =
+ parser.parseFunctionDeclarationStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BooleanLiteral>());
- BooleanLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, isTrue);
- }
-
- void test_Parser() {
- expect(new Parser(null, null), isNotNull);
+ expect(statement.functionDeclaration, isNotNull);
}
- void test_parseRedirectingConstructorInvocation_named() {
- createParser('this.a()');
- RedirectingConstructorInvocation invocation =
- parser.parseRedirectingConstructorInvocation(true);
- expectNotNullIfNoErrors(invocation);
+ void test_parseFunctionDeclarationStatement_typeParameterComments() {
+ enableGenericMethodComments = true;
+ createParser('/*=E*/ f/*<E>*/(/*=E*/ p) => p * 2;');
+ FunctionDeclarationStatement statement =
+ parser.parseFunctionDeclarationStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(invocation.argumentList, isNotNull);
- expect(invocation.constructorName, isNotNull);
- expect(invocation.thisKeyword, isNotNull);
- expect(invocation.period, isNotNull);
+ FunctionDeclaration f = statement.functionDeclaration;
+ expect(f, isNotNull);
+ expect(f.functionExpression.typeParameters, isNotNull);
+ expect(f.returnType, isNotNull);
+ SimpleFormalParameter p = f.functionExpression.parameters.parameters[0];
+ expect(p.type, isNotNull);
}
- void test_parseRedirectingConstructorInvocation_unnamed() {
- createParser('this()');
- RedirectingConstructorInvocation invocation =
- parser.parseRedirectingConstructorInvocation(false);
- expectNotNullIfNoErrors(invocation);
+ void test_parseFunctionDeclarationStatement_typeParameters() {
+ createParser('E f<E>(E p) => p * 2;');
+ FunctionDeclarationStatement statement =
+ parser.parseFunctionDeclarationStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(invocation.argumentList, isNotNull);
- expect(invocation.constructorName, isNull);
- expect(invocation.thisKeyword, isNotNull);
- expect(invocation.period, isNull);
+ expect(statement.functionDeclaration, isNotNull);
+ expect(statement.functionDeclaration.functionExpression.typeParameters,
+ isNotNull);
}
- void test_parseRelationalExpression_as_functionType_noReturnType() {
- createParser('x as Function(int)');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseFunctionDeclarationStatement_typeParameters_noReturnType() {
+ createParser('f<E>(E p) => p * 2;');
+ FunctionDeclarationStatement statement =
+ parser.parseFunctionDeclarationStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<AsExpression>());
- AsExpression asExpression = expression;
- expect(asExpression.expression, isNotNull);
- expect(asExpression.asOperator, isNotNull);
- expect(asExpression.type, new isInstanceOf<GenericFunctionType>());
+ expect(statement.functionDeclaration, isNotNull);
+ expect(statement.functionDeclaration.functionExpression.typeParameters,
+ isNotNull);
}
- void test_parseRelationalExpression_as_functionType_returnType() {
- createParser('x as String Function(int)');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseIdentifierList_multiple() {
+ createParser('a, b, c');
+ List<SimpleIdentifier> list = parser.parseIdentifierList();
+ expectNotNullIfNoErrors(list);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<AsExpression>());
- AsExpression asExpression = expression;
- expect(asExpression.expression, isNotNull);
- expect(asExpression.asOperator, isNotNull);
- expect(asExpression.type, new isInstanceOf<GenericFunctionType>());
+ expect(list, hasLength(3));
}
- void test_parseRelationalExpression_as_generic() {
- createParser('x as C<D>');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseIdentifierList_single() {
+ createParser('a');
+ List<SimpleIdentifier> list = parser.parseIdentifierList();
+ expectNotNullIfNoErrors(list);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<AsExpression>());
- AsExpression asExpression = expression;
- expect(asExpression.expression, isNotNull);
- expect(asExpression.asOperator, isNotNull);
- expect(asExpression.type, new isInstanceOf<TypeName>());
+ expect(list, hasLength(1));
}
- void test_parseRelationalExpression_as_nullable() {
- enableNnbd = true;
- createParser('x as Y?)');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseIfStatement_else_block() {
+ createParser('if (x) {} else {}');
+ IfStatement statement = parser.parseIfStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<AsExpression>());
- AsExpression asExpression = expression;
- expect(asExpression.expression, isNotNull);
- expect(asExpression.asOperator, isNotNull);
- expect(asExpression.type, new isInstanceOf<TypeName>());
+ expect(statement.ifKeyword, isNotNull);
+ expect(statement.leftParenthesis, isNotNull);
+ expect(statement.condition, isNotNull);
+ expect(statement.rightParenthesis, isNotNull);
+ expect(statement.thenStatement, isNotNull);
+ expect(statement.elseKeyword, isNotNull);
+ expect(statement.elseStatement, isNotNull);
}
- void test_parseRelationalExpression_as_simple() {
- createParser('x as Y');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseIfStatement_else_statement() {
+ createParser('if (x) f(x); else f(y);');
+ IfStatement statement = parser.parseIfStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<AsExpression>());
- AsExpression asExpression = expression;
- expect(asExpression.expression, isNotNull);
- expect(asExpression.asOperator, isNotNull);
- expect(asExpression.type, new isInstanceOf<TypeName>());
+ expect(statement.ifKeyword, isNotNull);
+ expect(statement.leftParenthesis, isNotNull);
+ expect(statement.condition, isNotNull);
+ expect(statement.rightParenthesis, isNotNull);
+ expect(statement.thenStatement, isNotNull);
+ expect(statement.elseKeyword, isNotNull);
+ expect(statement.elseStatement, isNotNull);
}
- void test_parseRelationalExpression_as_simple_function() {
- createParser('x as Function');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<AsExpression>());
- AsExpression asExpression = expression;
- expect(asExpression.expression, isNotNull);
- expect(asExpression.asOperator, isNotNull);
- expect(asExpression.type, new isInstanceOf<TypeName>());
+ void test_parseIfStatement_noElse_block() {
+ createParser('if (x) {}');
+ IfStatement statement = parser.parseIfStatement();
+ expectNotNullIfNoErrors(statement);
+ listener.assertNoErrors();
+ expect(statement.ifKeyword, isNotNull);
+ expect(statement.leftParenthesis, isNotNull);
+ expect(statement.condition, isNotNull);
+ expect(statement.rightParenthesis, isNotNull);
+ expect(statement.thenStatement, isNotNull);
+ expect(statement.elseKeyword, isNull);
+ expect(statement.elseStatement, isNull);
}
- void test_parseRelationalExpression_is() {
- createParser('x is y');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseIfStatement_noElse_statement() {
+ createParser('if (x) f(x);');
+ IfStatement statement = parser.parseIfStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<IsExpression>());
- IsExpression isExpression = expression;
- expect(isExpression.expression, isNotNull);
- expect(isExpression.isOperator, isNotNull);
- expect(isExpression.notOperator, isNull);
- expect(isExpression.type, isNotNull);
+ expect(statement.ifKeyword, isNotNull);
+ expect(statement.leftParenthesis, isNotNull);
+ expect(statement.condition, isNotNull);
+ expect(statement.rightParenthesis, isNotNull);
+ expect(statement.thenStatement, isNotNull);
+ expect(statement.elseKeyword, isNull);
+ expect(statement.elseStatement, isNull);
}
- void test_parseRelationalExpression_is_nullable() {
- enableNnbd = true;
- createParser('x is y?)');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseImplementsClause_multiple() {
+ createParser('implements A, B, C');
+ ImplementsClause clause = parser.parseImplementsClause();
+ expectNotNullIfNoErrors(clause);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<IsExpression>());
- IsExpression isExpression = expression;
- expect(isExpression.expression, isNotNull);
- expect(isExpression.isOperator, isNotNull);
- expect(isExpression.notOperator, isNull);
- expect(isExpression.type, isNotNull);
+ expect(clause.interfaces, hasLength(3));
+ expect(clause.implementsKeyword, isNotNull);
}
- void test_parseRelationalExpression_isNot() {
- createParser('x is! y');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseImplementsClause_single() {
+ createParser('implements A');
+ ImplementsClause clause = parser.parseImplementsClause();
+ expectNotNullIfNoErrors(clause);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<IsExpression>());
- IsExpression isExpression = expression;
- expect(isExpression.expression, isNotNull);
- expect(isExpression.isOperator, isNotNull);
- expect(isExpression.notOperator, isNotNull);
- expect(isExpression.type, isNotNull);
+ expect(clause.interfaces, hasLength(1));
+ expect(clause.implementsKeyword, isNotNull);
}
- void test_parseRelationalExpression_normal() {
- createParser('x < y');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseLibraryIdentifier_multiple() {
+ String name = "a.b.c";
+ createParser(name);
+ LibraryIdentifier identifier = parser.parseLibraryIdentifier();
+ expectNotNullIfNoErrors(identifier);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.LT);
- expect(binaryExpression.rightOperand, isNotNull);
+ expect(identifier.name, name);
}
- void test_parseRelationalExpression_super() {
- createParser('super < y');
- Expression expression = parser.parseRelationalExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseLibraryIdentifier_single() {
+ String name = "a";
+ createParser(name);
+ LibraryIdentifier identifier = parser.parseLibraryIdentifier();
+ expectNotNullIfNoErrors(identifier);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<BinaryExpression>());
- BinaryExpression binaryExpression = expression;
- expect(binaryExpression.leftOperand, isNotNull);
- expect(binaryExpression.operator, isNotNull);
- expect(binaryExpression.operator.type, TokenType.LT);
- expect(binaryExpression.rightOperand, isNotNull);
+ expect(identifier.name, name);
}
- void test_parseRethrowExpression() {
- createParser('rethrow;');
- RethrowExpression expression = parser.parseRethrowExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseModifiers_abstract() {
+ createParser('abstract A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(expression.rethrowKeyword, isNotNull);
+ expect(modifiers.abstractKeyword, isNotNull);
}
- void test_parseReturnStatement_noValue() {
- createParser('return;');
- ReturnStatement statement = parser.parseReturnStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseModifiers_const() {
+ createParser('const A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(statement.returnKeyword, isNotNull);
- expect(statement.expression, isNull);
- expect(statement.semicolon, isNotNull);
+ expect(modifiers.constKeyword, isNotNull);
}
- void test_parseReturnStatement_value() {
- createParser('return x;');
- ReturnStatement statement = parser.parseReturnStatement();
- expectNotNullIfNoErrors(statement);
+ void test_parseModifiers_covariant() {
+ createParser('covariant A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(statement.returnKeyword, isNotNull);
- expect(statement.expression, isNotNull);
- expect(statement.semicolon, isNotNull);
+ expect(modifiers.covariantKeyword, isNotNull);
}
- void test_parseReturnType_function() {
- createParser('A<B> Function<B>(B)');
- GenericFunctionType type = parser.parseReturnType(false);
- expectNotNullIfNoErrors(type);
+ void test_parseModifiers_external() {
+ createParser('external A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(type.returnType, isNotNull);
- expect(type.typeParameters, isNotNull);
- expect(type.parameters, isNotNull);
+ expect(modifiers.externalKeyword, isNotNull);
}
- void test_parseReturnType_named() {
- createParser('A<B>');
- TypeName typeName = parser.parseReturnType(false);
- expectNotNullIfNoErrors(typeName);
+ void test_parseModifiers_factory() {
+ createParser('factory A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(typeName.name, isNotNull);
- expect(typeName.typeArguments, isNotNull);
+ expect(modifiers.factoryKeyword, isNotNull);
}
- void test_parseReturnType_void() {
- createParser('void');
- TypeName typeName = parser.parseReturnType(false);
- expectNotNullIfNoErrors(typeName);
+ void test_parseModifiers_final() {
+ createParser('final A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(typeName.name, isNotNull);
- expect(typeName.typeArguments, isNull);
+ expect(modifiers.finalKeyword, isNotNull);
}
- void test_parseShiftExpression_normal() {
- createParser('x << y');
- BinaryExpression expression = parser.parseShiftExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseModifiers_static() {
+ createParser('static A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(expression.leftOperand, isNotNull);
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.LT_LT);
- expect(expression.rightOperand, isNotNull);
+ expect(modifiers.staticKeyword, isNotNull);
}
- void test_parseShiftExpression_super() {
- createParser('super << y');
- BinaryExpression expression = parser.parseShiftExpression();
- expectNotNullIfNoErrors(expression);
+ void test_parseModifiers_var() {
+ createParser('var A');
+ Modifiers modifiers = parser.parseModifiers();
+ expectNotNullIfNoErrors(modifiers);
listener.assertNoErrors();
- expect(expression.leftOperand, isNotNull);
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.LT_LT);
- expect(expression.rightOperand, isNotNull);
+ expect(modifiers.varKeyword, isNotNull);
}
- void test_parseSimpleIdentifier1_normalIdentifier() {
- // TODO(brianwilkerson) Implement tests for this method.
+ void test_parseNonLabeledStatement_const_list_empty() {
+ createParser('const [];');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
+ listener.assertNoErrors();
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseSimpleIdentifier_builtInIdentifier() {
- String lexeme = "as";
- createParser(lexeme);
- SimpleIdentifier identifier = parser.parseSimpleIdentifier();
- expectNotNullIfNoErrors(identifier);
+ void test_parseNonLabeledStatement_const_list_nonEmpty() {
+ createParser('const [1, 2];');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(identifier.token, isNotNull);
- expect(identifier.name, lexeme);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseSimpleIdentifier_normalIdentifier() {
- String lexeme = "foo";
- createParser(lexeme);
- SimpleIdentifier identifier = parser.parseSimpleIdentifier();
- expectNotNullIfNoErrors(identifier);
+ void test_parseNonLabeledStatement_const_map_empty() {
+ createParser('const {};');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(identifier.token, isNotNull);
- expect(identifier.name, lexeme);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStatement_emptyTypeArgumentList() {
- createParser('C<> c;');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_const_map_nonEmpty() {
+ // TODO(brianwilkerson) Implement more tests for this method.
+ createParser("const {'a' : 1};");
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
- listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TYPE_NAME]);
- expect(statement, new isInstanceOf<VariableDeclarationStatement>());
- VariableDeclarationStatement declaration = statement;
- VariableDeclarationList variables = declaration.variables;
- TypeName type = variables.type;
- TypeArgumentList argumentList = type.typeArguments;
- expect(argumentList.leftBracket, isNotNull);
- expect(argumentList.arguments, hasLength(1));
- expect(argumentList.arguments[0].isSynthetic, isTrue);
- expect(argumentList.rightBracket, isNotNull);
+ listener.assertNoErrors();
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStatement_functionDeclaration_noReturnType() {
- createParser('f(a, b) {};');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_const_object() {
+ createParser('const A();');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
- FunctionDeclarationStatement declaration = statement;
- expect(declaration.functionDeclaration, isNotNull);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void
- test_parseStatement_functionDeclaration_noReturnType_typeParameterComments() {
- enableGenericMethodComments = true;
- createParser('f/*<E>*/(a, b) {};');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_const_object_named_typeParameters() {
+ createParser('const A<B>.c();');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
- FunctionDeclarationStatement declaration = statement;
- expect(declaration.functionDeclaration, isNotNull);
- expect(declaration.functionDeclaration.functionExpression.typeParameters,
- isNotNull);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStatement_functionDeclaration_noReturnType_typeParameters() {
- createParser('f<E>(a, b) {};');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_constructorInvocation() {
+ createParser('new C().m();');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
- FunctionDeclarationStatement declaration = statement;
- expect(declaration.functionDeclaration, isNotNull);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStatement_functionDeclaration_returnType() {
- // TODO(brianwilkerson) Implement more tests for this method.
- createParser('int f(a, b) {};');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_false() {
+ createParser('false;');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
- FunctionDeclarationStatement declaration = statement;
- expect(declaration.functionDeclaration, isNotNull);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStatement_functionDeclaration_returnType_typeParameters() {
- createParser('int f<E>(a, b) {};');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_functionDeclaration() {
+ createParser('f() {};');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
- FunctionDeclarationStatement declaration = statement;
- expect(declaration.functionDeclaration, isNotNull);
}
- void test_parseStatement_mulipleLabels() {
- createParser('l: m: return x;');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_functionDeclaration_arguments() {
+ createParser('f(void g()) {};');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<LabeledStatement>());
- LabeledStatement labeledStatement = statement;
- expect(labeledStatement.labels, hasLength(2));
- expect(labeledStatement.statement, isNotNull);
}
- void test_parseStatement_noLabels() {
- createParser('return x;');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_functionExpressionIndex() {
+ createParser('() {}[0] = null;');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
}
- void test_parseStatement_singleLabel() {
- createParser('l: return x;');
- Statement statement = parser.parseStatement2();
+ void test_parseNonLabeledStatement_functionInvocation() {
+ createParser('f();');
+ Statement statement = parser.parseNonLabeledStatement();
expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(statement, new isInstanceOf<LabeledStatement>());
- LabeledStatement labeledStatement = statement;
- expect(labeledStatement.labels, hasLength(1));
- expect(labeledStatement.labels[0].label.inDeclarationContext(), isTrue);
- expect(labeledStatement.statement, isNotNull);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStatements_multiple() {
- List<Statement> statements = parseStatements("return; return;", 2);
- expect(statements, hasLength(2));
+ void test_parseNonLabeledStatement_invokeFunctionExpression() {
+ createParser('(a) {return a + a;} (3);');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
+ listener.assertNoErrors();
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ EngineTestCase.assertInstanceOf(
+ (obj) => obj is FunctionExpressionInvocation,
+ FunctionExpressionInvocation,
+ expressionStatement.expression);
+ FunctionExpressionInvocation invocation =
+ expressionStatement.expression as FunctionExpressionInvocation;
+ EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression,
+ FunctionExpression, invocation.function);
+ FunctionExpression expression = invocation.function as FunctionExpression;
+ expect(expression.parameters, isNotNull);
+ expect(expression.body, isNotNull);
+ expect(invocation.typeArguments, isNull);
+ ArgumentList list = invocation.argumentList;
+ expect(list, isNotNull);
+ expect(list.arguments, hasLength(1));
}
- void test_parseStatements_single() {
- List<Statement> statements = parseStatements("return;", 1);
- expect(statements, hasLength(1));
+ void test_parseNonLabeledStatement_null() {
+ createParser('null;');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
+ listener.assertNoErrors();
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStringLiteral_adjacent() {
- createParser("'a' 'b'");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseNonLabeledStatement_startingWithBuiltInIdentifier() {
+ createParser('library.getName();');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<AdjacentStrings>());
- AdjacentStrings literal = expression;
- NodeList<StringLiteral> strings = literal.strings;
- expect(strings, hasLength(2));
- StringLiteral firstString = strings[0];
- StringLiteral secondString = strings[1];
- expect((firstString as SimpleStringLiteral).value, "a");
- expect((secondString as SimpleStringLiteral).value, "b");
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStringLiteral_endsWithInterpolation() {
- createParser(r"'x$y'");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseNonLabeledStatement_true() {
+ createParser('true;');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<StringInterpolation>());
- StringInterpolation interpolation = expression;
- expect(interpolation.elements, hasLength(3));
- expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
- InterpolationString element0 = interpolation.elements[0];
- expect(element0.value, 'x');
- expect(
- interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
- InterpolationExpression element1 = interpolation.elements[1];
- expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
- expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
- InterpolationString element2 = interpolation.elements[2];
- expect(element2.value, '');
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStringLiteral_interpolated() {
- createParser("'a \${b} c \$this d'");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseNonLabeledStatement_typeCast() {
+ createParser('double.NAN as num;');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<StringInterpolation>());
- StringInterpolation literal = expression;
- NodeList<InterpolationElement> elements = literal.elements;
- expect(elements, hasLength(5));
- expect(elements[0] is InterpolationString, isTrue);
- expect(elements[1] is InterpolationExpression, isTrue);
- expect(elements[2] is InterpolationString, isTrue);
- expect(elements[3] is InterpolationExpression, isTrue);
- expect(elements[4] is InterpolationString, isTrue);
+ expect(statement, new isInstanceOf<ExpressionStatement>());
+ ExpressionStatement expressionStatement = statement;
+ expect(expressionStatement.expression, isNotNull);
}
- void test_parseStringLiteral_multiline_encodedSpace() {
- createParser("'''\\x20\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseNonLabeledStatement_variableDeclaration_final_namedFunction() {
+ createParser('final int Function = 0;');
+ Statement statement = parser.parseNonLabeledStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, " \na");
}
- void test_parseStringLiteral_multiline_endsWithInterpolation() {
- createParser(r"'''x$y'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<StringInterpolation>());
- StringInterpolation interpolation = expression;
- expect(interpolation.elements, hasLength(3));
- expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
- InterpolationString element0 = interpolation.elements[0];
- expect(element0.value, 'x');
- expect(
- interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
- InterpolationExpression element1 = interpolation.elements[1];
- expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
- expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
- InterpolationString element2 = interpolation.elements[2];
- expect(element2.value, '');
+ void test_parseOptionalReturnType() {
+ // TODO(brianwilkerson) Implement tests for this method.
}
- void test_parseStringLiteral_multiline_escapedBackslash() {
- createParser("'''\\\\\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "\\\na");
+ void test_Parser() {
+ expect(new Parser(null, null), isNotNull);
}
- void test_parseStringLiteral_multiline_escapedBackslash_raw() {
- createParser("r'''\\\\\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseRedirectingConstructorInvocation_named() {
+ createParser('this.a()');
+ RedirectingConstructorInvocation invocation =
+ parser.parseRedirectingConstructorInvocation(true);
+ expectNotNullIfNoErrors(invocation);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "\\\\\na");
+ expect(invocation.argumentList, isNotNull);
+ expect(invocation.constructorName, isNotNull);
+ expect(invocation.thisKeyword, isNotNull);
+ expect(invocation.period, isNotNull);
}
- void test_parseStringLiteral_multiline_escapedEolMarker() {
- createParser("'''\\\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseRedirectingConstructorInvocation_unnamed() {
+ createParser('this()');
+ RedirectingConstructorInvocation invocation =
+ parser.parseRedirectingConstructorInvocation(false);
+ expectNotNullIfNoErrors(invocation);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "a");
+ expect(invocation.argumentList, isNotNull);
+ expect(invocation.constructorName, isNull);
+ expect(invocation.thisKeyword, isNotNull);
+ expect(invocation.period, isNull);
}
- void test_parseStringLiteral_multiline_escapedEolMarker_raw() {
- createParser("r'''\\\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseReturnStatement_noValue() {
+ createParser('return;');
+ ReturnStatement statement = parser.parseReturnStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "a");
+ expect(statement.returnKeyword, isNotNull);
+ expect(statement.expression, isNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker() {
- createParser("'''\\ \\\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseReturnStatement_value() {
+ createParser('return x;');
+ ReturnStatement statement = parser.parseReturnStatement();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "a");
+ expect(statement.returnKeyword, isNotNull);
+ expect(statement.expression, isNotNull);
+ expect(statement.semicolon, isNotNull);
}
- void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw() {
- createParser("r'''\\ \\\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseReturnType_function() {
+ createParser('A<B> Function<B>(B)');
+ GenericFunctionType type = parser.parseReturnType(false);
+ expectNotNullIfNoErrors(type);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "a");
+ expect(type.returnType, isNotNull);
+ expect(type.typeParameters, isNotNull);
+ expect(type.parameters, isNotNull);
}
- void test_parseStringLiteral_multiline_escapedTab() {
- createParser("'''\\t\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseReturnType_named() {
+ createParser('A<B>');
+ TypeName typeName = parser.parseReturnType(false);
+ expectNotNullIfNoErrors(typeName);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "\t\na");
+ expect(typeName.name, isNotNull);
+ expect(typeName.typeArguments, isNotNull);
}
- void test_parseStringLiteral_multiline_escapedTab_raw() {
- createParser("r'''\\t\na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseReturnType_void() {
+ createParser('void');
+ TypeName typeName = parser.parseReturnType(false);
+ expectNotNullIfNoErrors(typeName);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "\\t\na");
+ expect(typeName.name, isNotNull);
+ expect(typeName.typeArguments, isNull);
}
- void test_parseStringLiteral_multiline_quoteAfterInterpolation() {
- createParser(r"""'''$x'y'''""");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<StringInterpolation>());
- StringInterpolation interpolation = expression;
- expect(interpolation.elements, hasLength(3));
- expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
- InterpolationString element0 = interpolation.elements[0];
- expect(element0.value, '');
- expect(
- interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
- InterpolationExpression element1 = interpolation.elements[1];
- expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
- expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
- InterpolationString element2 = interpolation.elements[2];
- expect(element2.value, "'y");
+ void test_parseStatement_emptyTypeArgumentList() {
+ createParser('C<> c;');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
+ listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TYPE_NAME]);
+ expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+ VariableDeclarationStatement declaration = statement;
+ VariableDeclarationList variables = declaration.variables;
+ TypeName type = variables.type;
+ TypeArgumentList argumentList = type.typeArguments;
+ expect(argumentList.leftBracket, isNotNull);
+ expect(argumentList.arguments, hasLength(1));
+ expect(argumentList.arguments[0].isSynthetic, isTrue);
+ expect(argumentList.rightBracket, isNotNull);
}
- void test_parseStringLiteral_multiline_startsWithInterpolation() {
- createParser(r"'''${x}y'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseStatement_functionDeclaration_noReturnType() {
+ createParser('f(a, b) {};');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<StringInterpolation>());
- StringInterpolation interpolation = expression;
- expect(interpolation.elements, hasLength(3));
- expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
- InterpolationString element0 = interpolation.elements[0];
- expect(element0.value, '');
- expect(
- interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
- InterpolationExpression element1 = interpolation.elements[1];
- expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
- expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
- InterpolationString element2 = interpolation.elements[2];
- expect(element2.value, 'y');
+ expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
+ FunctionDeclarationStatement declaration = statement;
+ expect(declaration.functionDeclaration, isNotNull);
}
- void test_parseStringLiteral_multiline_twoSpaces() {
- createParser("''' \na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void
+ test_parseStatement_functionDeclaration_noReturnType_typeParameterComments() {
+ enableGenericMethodComments = true;
+ createParser('f/*<E>*/(a, b) {};');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "a");
+ expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
+ FunctionDeclarationStatement declaration = statement;
+ expect(declaration.functionDeclaration, isNotNull);
+ expect(declaration.functionDeclaration.functionExpression.typeParameters,
+ isNotNull);
}
- void test_parseStringLiteral_multiline_twoSpaces_raw() {
- createParser("r''' \na'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseStatement_functionDeclaration_noReturnType_typeParameters() {
+ createParser('f<E>(a, b) {};');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "a");
+ expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
+ FunctionDeclarationStatement declaration = statement;
+ expect(declaration.functionDeclaration, isNotNull);
}
- void test_parseStringLiteral_multiline_untrimmed() {
- createParser("''' a\nb'''");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseStatement_functionDeclaration_returnType() {
+ // TODO(brianwilkerson) Implement more tests for this method.
+ createParser('int f(a, b) {};');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, " a\nb");
+ expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
+ FunctionDeclarationStatement declaration = statement;
+ expect(declaration.functionDeclaration, isNotNull);
}
- void test_parseStringLiteral_quoteAfterInterpolation() {
- createParser(r"""'$x"'""");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseStatement_functionDeclaration_returnType_typeParameters() {
+ createParser('int f<E>(a, b) {};');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<StringInterpolation>());
- StringInterpolation interpolation = expression;
- expect(interpolation.elements, hasLength(3));
- expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
- InterpolationString element0 = interpolation.elements[0];
- expect(element0.value, '');
- expect(
- interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
- InterpolationExpression element1 = interpolation.elements[1];
- expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
- expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
- InterpolationString element2 = interpolation.elements[2];
- expect(element2.value, '"');
+ expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
+ FunctionDeclarationStatement declaration = statement;
+ expect(declaration.functionDeclaration, isNotNull);
}
- void test_parseStringLiteral_single() {
- createParser("'a'");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseStatement_mulipleLabels() {
+ createParser('l: m: return x;');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<SimpleStringLiteral>());
- SimpleStringLiteral literal = expression;
- expect(literal.literal, isNotNull);
- expect(literal.value, "a");
+ expect(statement, new isInstanceOf<LabeledStatement>());
+ LabeledStatement labeledStatement = statement;
+ expect(labeledStatement.labels, hasLength(2));
+ expect(labeledStatement.statement, isNotNull);
}
- void test_parseStringLiteral_startsWithInterpolation() {
- createParser(r"'${x}y'");
- Expression expression = parser.parseStringLiteral();
- expectNotNullIfNoErrors(expression);
+ void test_parseStatement_noLabels() {
+ createParser('return x;');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(expression, new isInstanceOf<StringInterpolation>());
- StringInterpolation interpolation = expression;
- expect(interpolation.elements, hasLength(3));
- expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
- InterpolationString element0 = interpolation.elements[0];
- expect(element0.value, '');
- expect(
- interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
- InterpolationExpression element1 = interpolation.elements[1];
- expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
- expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
- InterpolationString element2 = interpolation.elements[2];
- expect(element2.value, 'y');
}
- void test_parseSuperConstructorInvocation_named() {
- createParser('super.a()');
- SuperConstructorInvocation invocation =
- parser.parseSuperConstructorInvocation();
- expectNotNullIfNoErrors(invocation);
+ void test_parseStatement_singleLabel() {
+ createParser('l: return x;');
+ Statement statement = parser.parseStatement2();
+ expectNotNullIfNoErrors(statement);
listener.assertNoErrors();
- expect(invocation.argumentList, isNotNull);
- expect(invocation.constructorName, isNotNull);
- expect(invocation.superKeyword, isNotNull);
- expect(invocation.period, isNotNull);
+ expect(statement, new isInstanceOf<LabeledStatement>());
+ LabeledStatement labeledStatement = statement;
+ expect(labeledStatement.labels, hasLength(1));
+ expect(labeledStatement.labels[0].label.inDeclarationContext(), isTrue);
+ expect(labeledStatement.statement, isNotNull);
}
- void test_parseSuperConstructorInvocation_unnamed() {
- createParser('super()');
- SuperConstructorInvocation invocation =
- parser.parseSuperConstructorInvocation();
- expectNotNullIfNoErrors(invocation);
- listener.assertNoErrors();
- expect(invocation.argumentList, isNotNull);
- expect(invocation.constructorName, isNull);
- expect(invocation.superKeyword, isNotNull);
- expect(invocation.period, isNull);
+ void test_parseStatements_multiple() {
+ List<Statement> statements = parseStatements("return; return;", 2);
+ expect(statements, hasLength(2));
+ }
+
+ void test_parseStatements_single() {
+ List<Statement> statements = parseStatements("return;", 1);
+ expect(statements, hasLength(1));
}
void test_parseSwitchStatement_case() {
@@ -11760,87 +12002,6 @@ void''');
expect(statement.rightBracket, isNotNull);
}
- void test_parseSymbolLiteral_builtInIdentifier() {
- createParser('#dynamic.static.abstract');
- SymbolLiteral literal = parser.parseSymbolLiteral();
- expectNotNullIfNoErrors(literal);
- listener.assertNoErrors();
- expect(literal.poundSign, isNotNull);
- List<Token> components = literal.components;
- expect(components, hasLength(3));
- expect(components[0].lexeme, "dynamic");
- expect(components[1].lexeme, "static");
- expect(components[2].lexeme, "abstract");
- }
-
- void test_parseSymbolLiteral_multiple() {
- createParser('#a.b.c');
- SymbolLiteral literal = parser.parseSymbolLiteral();
- expectNotNullIfNoErrors(literal);
- listener.assertNoErrors();
- expect(literal.poundSign, isNotNull);
- List<Token> components = literal.components;
- expect(components, hasLength(3));
- expect(components[0].lexeme, "a");
- expect(components[1].lexeme, "b");
- expect(components[2].lexeme, "c");
- }
-
- void test_parseSymbolLiteral_operator() {
- createParser('#==');
- SymbolLiteral literal = parser.parseSymbolLiteral();
- expectNotNullIfNoErrors(literal);
- listener.assertNoErrors();
- expect(literal.poundSign, isNotNull);
- List<Token> components = literal.components;
- expect(components, hasLength(1));
- expect(components[0].lexeme, "==");
- }
-
- void test_parseSymbolLiteral_single() {
- createParser('#a');
- SymbolLiteral literal = parser.parseSymbolLiteral();
- expectNotNullIfNoErrors(literal);
- listener.assertNoErrors();
- expect(literal.poundSign, isNotNull);
- List<Token> components = literal.components;
- expect(components, hasLength(1));
- expect(components[0].lexeme, "a");
- }
-
- void test_parseSymbolLiteral_void() {
- createParser('#void');
- SymbolLiteral literal = parser.parseSymbolLiteral();
- expectNotNullIfNoErrors(literal);
- listener.assertNoErrors();
- expect(literal.poundSign, isNotNull);
- List<Token> components = literal.components;
- expect(components, hasLength(1));
- expect(components[0].lexeme, "void");
- }
-
- void test_parseThrowExpression() {
- createParser('throw x;');
- Expression expression = parser.parseThrowExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<ThrowExpression>());
- ThrowExpression throwExpression = expression;
- expect(throwExpression.throwKeyword, isNotNull);
- expect(throwExpression.expression, isNotNull);
- }
-
- void test_parseThrowExpressionWithoutCascade() {
- createParser('throw x;');
- Expression expression = parser.parseThrowExpressionWithoutCascade();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression, new isInstanceOf<ThrowExpression>());
- ThrowExpression throwExpression = expression;
- expect(throwExpression.throwKeyword, isNotNull);
- expect(throwExpression.expression, isNotNull);
- }
-
void test_parseTryStatement_catch() {
createParser('try {} catch (e) {}');
TryStatement statement = parser.parseTryStatement();
@@ -12390,158 +12551,6 @@ void''');
expect(parameterList.typeParameters, hasLength(1));
}
- void test_parseUnaryExpression_decrement_normal() {
- createParser('--x');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.MINUS_MINUS);
- expect(expression.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_decrement_super() {
- createParser('--super');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.MINUS);
- Expression innerExpression = expression.operand;
- expect(innerExpression, isNotNull);
- expect(innerExpression is PrefixExpression, isTrue);
- PrefixExpression operand = innerExpression as PrefixExpression;
- expect(operand.operator, isNotNull);
- expect(operand.operator.type, TokenType.MINUS);
- expect(operand.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_decrement_super_propertyAccess() {
- createParser('--super.x');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.MINUS_MINUS);
- expect(expression.operand, isNotNull);
- PropertyAccess operand = expression.operand as PropertyAccess;
- expect(operand.target is SuperExpression, isTrue);
- expect(operand.propertyName.name, "x");
- }
-
- void test_parseUnaryExpression_decrement_super_withComment() {
- createParser('/* 0 */ --super');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.MINUS);
- expect(expression.operator.precedingComments, isNotNull);
- Expression innerExpression = expression.operand;
- expect(innerExpression, isNotNull);
- expect(innerExpression is PrefixExpression, isTrue);
- PrefixExpression operand = innerExpression as PrefixExpression;
- expect(operand.operator, isNotNull);
- expect(operand.operator.type, TokenType.MINUS);
- expect(operand.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_increment_normal() {
- createParser('++x');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.PLUS_PLUS);
- expect(expression.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_increment_super_index() {
- createParser('++super[0]');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.PLUS_PLUS);
- expect(expression.operand, isNotNull);
- IndexExpression operand = expression.operand as IndexExpression;
- expect(operand.realTarget is SuperExpression, isTrue);
- expect(operand.index is IntegerLiteral, isTrue);
- }
-
- void test_parseUnaryExpression_increment_super_propertyAccess() {
- createParser('++super.x');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.PLUS_PLUS);
- expect(expression.operand, isNotNull);
- PropertyAccess operand = expression.operand as PropertyAccess;
- expect(operand.target is SuperExpression, isTrue);
- expect(operand.propertyName.name, "x");
- }
-
- void test_parseUnaryExpression_minus_normal() {
- createParser('-x');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.MINUS);
- expect(expression.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_minus_super() {
- createParser('-super');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.MINUS);
- expect(expression.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_not_normal() {
- createParser('!x');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.BANG);
- expect(expression.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_not_super() {
- createParser('!super');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.BANG);
- expect(expression.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_tilda_normal() {
- createParser('~x');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.TILDE);
- expect(expression.operand, isNotNull);
- }
-
- void test_parseUnaryExpression_tilda_super() {
- createParser('~super');
- PrefixExpression expression = parser.parseUnaryExpression();
- expectNotNullIfNoErrors(expression);
- listener.assertNoErrors();
- expect(expression.operator, isNotNull);
- expect(expression.operator.type, TokenType.TILDE);
- expect(expression.operand, isNotNull);
- }
-
void test_parseVariableDeclaration_equals() {
createParser('a = b');
VariableDeclaration declaration = parser.parseVariableDeclaration();
« no previous file with comments | « pkg/analyzer/test/generated/parser_fasta_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698