| 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 b9d5345741354ca70f3461c7862ed27f77b81988..76aef3540d66d7a68e56b13843577616eb39f859 100644 | 
| --- a/pkg/analyzer/test/generated/parser_test.dart | 
| +++ b/pkg/analyzer/test/generated/parser_test.dart | 
| @@ -8,7 +8,6 @@ import 'package:analyzer/dart/ast/ast.dart'; | 
| import 'package:analyzer/dart/ast/token.dart'; | 
| import 'package:analyzer/dart/ast/visitor.dart'; | 
| import 'package:analyzer/error/error.dart'; | 
| -import 'package:analyzer/error/listener.dart'; | 
| import 'package:analyzer/src/dart/ast/token.dart'; | 
| import 'package:analyzer/src/dart/scanner/reader.dart'; | 
| import 'package:analyzer/src/dart/scanner/scanner.dart'; | 
| @@ -31,15 +30,6 @@ main() { | 
| defineReflectiveTests(SimpleParserTest); | 
| } | 
|  | 
| -class AnalysisErrorListener_SimpleParserTest_computeStringValue | 
| -    implements AnalysisErrorListener { | 
| -  @override | 
| -  void onError(AnalysisError event) { | 
| -    fail( | 
| -        "Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})"); | 
| -  } | 
| -} | 
| - | 
| /** | 
| * Instances of the class `AstValidator` are used to validate the correct construction of an | 
| * AST structure. | 
| @@ -590,8 +580,11 @@ class ErrorParserTest extends ParserTestCase { | 
| // literals that are being created are not always zero length (because they | 
| // could have type parameters), which violates the contract of | 
| // isSynthetic(). | 
| -    TypedLiteral literal = parse3("parseListOrMapLiteral", <Object>[null], "1", | 
| -        [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]); | 
| +    createParser('1'); | 
| +    TypedLiteral literal = parser.parseListOrMapLiteral(null); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]); | 
| expect(literal.isSynthetic, isTrue); | 
| } | 
|  | 
| @@ -604,32 +597,43 @@ class ErrorParserTest extends ParserTestCase { | 
|  | 
| void fail_invalidCommentReference__new_nonIdentifier() { | 
| // This test fails because the method parseCommentReference returns null. | 
| -    parse3("parseCommentReference", <Object>["new 42", 0], "", | 
| -        [ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| +    createParser(''); | 
| +    CommentReference reference = parser.parseCommentReference('new 42', 0); | 
| +    expectNotNullIfNoErrors(reference); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| } | 
|  | 
| void fail_invalidCommentReference__new_tooMuch() { | 
| -    parse3("parseCommentReference", <Object>["new a.b.c.d", 0], "", | 
| -        [ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| +    createParser(''); | 
| +    CommentReference reference = parser.parseCommentReference('new a.b.c.d', 0); | 
| +    expectNotNullIfNoErrors(reference); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| } | 
|  | 
| void fail_invalidCommentReference__nonNew_nonIdentifier() { | 
| // This test fails because the method parseCommentReference returns null. | 
| -    parse3("parseCommentReference", <Object>["42", 0], "", | 
| -        [ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| +    createParser(''); | 
| +    CommentReference reference = parser.parseCommentReference('42', 0); | 
| +    expectNotNullIfNoErrors(reference); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| } | 
|  | 
| void fail_invalidCommentReference__nonNew_tooMuch() { | 
| -    parse3("parseCommentReference", <Object>["a.b.c.d", 0], "", | 
| -        [ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| +    createParser(''); | 
| +    CommentReference reference = parser.parseCommentReference('a.b.c.d', 0); | 
| +    expectNotNullIfNoErrors(reference); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 
| } | 
|  | 
| void fail_missingClosingParenthesis() { | 
| // It is possible that it is not possible to generate this error (that it's | 
| // being reported in code that cannot actually be reached), but that hasn't | 
| // been proven yet. | 
| -    parse4("parseFormalParameterList", "(int a, int b ;", | 
| -        [ParserErrorCode.MISSING_CLOSING_PARENTHESIS]); | 
| +    createParser('(int a, int b ;'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.MISSING_CLOSING_PARENTHESIS]); | 
| } | 
|  | 
| void fail_missingFunctionParameters_local_nonVoid_block() { | 
| @@ -649,10 +653,11 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void fail_namedFunctionExpression() { | 
| -    Expression expression = parse4("parsePrimaryExpression", "f() {}", | 
| -        [ParserErrorCode.NAMED_FUNCTION_EXPRESSION]); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is FunctionExpression, FunctionExpression, expression); | 
| +    createParser('f() {}'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.NAMED_FUNCTION_EXPRESSION]); | 
| +    expect(expression, new isInstanceOf<FunctionExpression>()); | 
| } | 
|  | 
| void fail_unexpectedToken_invalidPostfixExpression() { | 
| @@ -670,33 +675,45 @@ class ErrorParserTest extends ParserTestCase { | 
| void fail_varAndType_parameter() { | 
| // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but | 
| // this would be a better error message. | 
| -    parse4("parseFormalParameterList", "(var int x)", | 
| -        [ParserErrorCode.VAR_AND_TYPE]); | 
| +    createParser('(var int x)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.VAR_AND_TYPE]); | 
| } | 
|  | 
| void test_abstractClassMember_constructor() { | 
| -    parse3("parseClassMember", <Object>["C"], "abstract C.c();", | 
| -        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| +    createParser('abstract C.c();'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| } | 
|  | 
| void test_abstractClassMember_field() { | 
| -    parse3("parseClassMember", <Object>["C"], "abstract C f;", | 
| -        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| +    createParser('abstract C f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| } | 
|  | 
| void test_abstractClassMember_getter() { | 
| -    parse3("parseClassMember", <Object>["C"], "abstract get m;", | 
| -        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| +    createParser('abstract get m;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| } | 
|  | 
| void test_abstractClassMember_method() { | 
| -    parse3("parseClassMember", <Object>["C"], "abstract m();", | 
| -        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| +    createParser('abstract m();'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| } | 
|  | 
| void test_abstractClassMember_setter() { | 
| -    parse3("parseClassMember", <Object>["C"], "abstract set m(v);", | 
| -        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| +    createParser('abstract set m(v);'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ABSTRACT_CLASS_MEMBER]); | 
| } | 
|  | 
| void test_abstractEnum() { | 
| @@ -740,24 +757,38 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_breakOutsideOfLoop_breakInDoStatement() { | 
| -    parse4("parseDoStatement", "do {break;} while (x);"); | 
| +    createParser('do {break;} while (x);'); | 
| +    DoStatement statement = parser.parseDoStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_breakOutsideOfLoop_breakInForStatement() { | 
| -    parse4("parseForStatement", "for (; x;) {break;}"); | 
| +    createParser('for (; x;) {break;}'); | 
| +    Statement statement = parser.parseForStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_breakOutsideOfLoop_breakInIfStatement() { | 
| -    parse4("parseIfStatement", "if (x) {break;}", | 
| -        [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]); | 
| +    createParser('if (x) {break;}'); | 
| +    IfStatement statement = parser.parseIfStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]); | 
| } | 
|  | 
| void test_breakOutsideOfLoop_breakInSwitchStatement() { | 
| -    parse4("parseSwitchStatement", "switch (x) {case 1: break;}"); | 
| +    createParser('switch (x) {case 1: break;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_breakOutsideOfLoop_breakInWhileStatement() { | 
| -    parse4("parseWhileStatement", "while (x) {break;}"); | 
| +    createParser('while (x) {break;}'); | 
| +    WhileStatement statement = parser.parseWhileStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_breakOutsideOfLoop_functionExpression_inALoop() { | 
| @@ -782,10 +813,11 @@ class ErrorParserTest extends ParserTestCase { | 
| void test_classTypeAlias_abstractAfterEq() { | 
| // This syntax has been removed from the language in favor of | 
| // "abstract class A = B with C;" (issue 18098). | 
| -    parse3( | 
| -        "parseCompilationUnitMember", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "class A = abstract B with C;", | 
| +    createParser('class A = abstract B with C;'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN]); | 
| } | 
|  | 
| @@ -795,13 +827,17 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_constAndFinal() { | 
| -    parse3("parseClassMember", <Object>["C"], "const final int x;", | 
| -        [ParserErrorCode.CONST_AND_FINAL]); | 
| +    createParser('const final int x;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.CONST_AND_FINAL]); | 
| } | 
|  | 
| void test_constAndVar() { | 
| -    parse3("parseClassMember", <Object>["C"], "const var x;", | 
| -        [ParserErrorCode.CONST_AND_VAR]); | 
| +    createParser('const var x;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.CONST_AND_VAR]); | 
| } | 
|  | 
| void test_constClass() { | 
| @@ -810,8 +846,11 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_constConstructorWithBody() { | 
| -    parse3("parseClassMember", <Object>["C"], "const C() {}", | 
| -        [ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]); | 
| +    createParser('const C() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]); | 
| } | 
|  | 
| void test_constEnum() { | 
| @@ -820,23 +859,33 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_constFactory() { | 
| -    parse3("parseClassMember", <Object>["C"], "const factory C() {}", | 
| -        [ParserErrorCode.CONST_FACTORY]); | 
| +    createParser('const factory C() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.CONST_FACTORY]); | 
| } | 
|  | 
| void test_constMethod() { | 
| -    parse3("parseClassMember", <Object>["C"], "const int m() {}", | 
| -        [ParserErrorCode.CONST_METHOD]); | 
| +    createParser('const int m() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.CONST_METHOD]); | 
| } | 
|  | 
| void test_constructorWithReturnType() { | 
| -    parse3("parseClassMember", <Object>["C"], "C C() {}", | 
| -        [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]); | 
| +    createParser('C C() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]); | 
| } | 
|  | 
| void test_constructorWithReturnType_var() { | 
| -    parse3("parseClassMember", <Object>["C"], "var C() {}", | 
| -        [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]); | 
| +    createParser('var C() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]); | 
| } | 
|  | 
| void test_constTypedef() { | 
| @@ -845,24 +894,38 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_continueOutsideOfLoop_continueInDoStatement() { | 
| -    parse4("parseDoStatement", "do {continue;} while (x);"); | 
| +    createParser('do {continue;} while (x);'); | 
| +    DoStatement statement = parser.parseDoStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_continueOutsideOfLoop_continueInForStatement() { | 
| -    parse4("parseForStatement", "for (; x;) {continue;}"); | 
| +    createParser('for (; x;) {continue;}'); | 
| +    Statement statement = parser.parseForStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_continueOutsideOfLoop_continueInIfStatement() { | 
| -    parse4("parseIfStatement", "if (x) {continue;}", | 
| -        [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]); | 
| +    createParser('if (x) {continue;}'); | 
| +    IfStatement statement = parser.parseIfStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]); | 
| } | 
|  | 
| void test_continueOutsideOfLoop_continueInSwitchStatement() { | 
| -    parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}"); | 
| +    createParser('switch (x) {case 1: continue a;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_continueOutsideOfLoop_continueInWhileStatement() { | 
| -    parse4("parseWhileStatement", "while (x) {continue;}"); | 
| +    createParser('while (x) {continue;}'); | 
| +    WhileStatement statement = parser.parseWhileStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_continueOutsideOfLoop_functionExpression_inALoop() { | 
| @@ -875,17 +938,25 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_continueWithoutLabelInCase_error() { | 
| -    parse4("parseSwitchStatement", "switch (x) {case 1: continue;}", | 
| +    createParser('switch (x) {case 1: continue;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE]); | 
| } | 
|  | 
| void test_continueWithoutLabelInCase_noError() { | 
| -    parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}"); | 
| +    createParser('switch (x) {case 1: continue a;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_continueWithoutLabelInCase_noError_switchInLoop() { | 
| -    parse4( | 
| -        "parseWhileStatement", "while (a) { switch (b) {default: continue;}}"); | 
| +    createParser('while (a) { switch (b) {default: continue;}}'); | 
| +    WhileStatement statement = parser.parseWhileStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_deprecatedClassTypeAlias() { | 
| @@ -913,76 +984,95 @@ class ErrorParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_duplicatedModifier_const() { | 
| -    parse3("parseClassMember", <Object>["C"], "const const m;", | 
| -        [ParserErrorCode.DUPLICATED_MODIFIER]); | 
| +    createParser('const const m;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); | 
| } | 
|  | 
| void test_duplicatedModifier_external() { | 
| -    parse3("parseClassMember", <Object>["C"], "external external f();", | 
| -        [ParserErrorCode.DUPLICATED_MODIFIER]); | 
| +    createParser('external external f();'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); | 
| } | 
|  | 
| void test_duplicatedModifier_factory() { | 
| -    parse3("parseClassMember", <Object>["C"], "factory factory C() {}", | 
| -        [ParserErrorCode.DUPLICATED_MODIFIER]); | 
| +    createParser('factory factory C() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); | 
| } | 
|  | 
| void test_duplicatedModifier_final() { | 
| -    parse3("parseClassMember", <Object>["C"], "final final m;", | 
| -        [ParserErrorCode.DUPLICATED_MODIFIER]); | 
| +    createParser('final final m;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); | 
| } | 
|  | 
| void test_duplicatedModifier_static() { | 
| -    parse3("parseClassMember", <Object>["C"], "static static var m;", | 
| -        [ParserErrorCode.DUPLICATED_MODIFIER]); | 
| +    createParser('static static var m;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); | 
| } | 
|  | 
| void test_duplicatedModifier_var() { | 
| -    parse3("parseClassMember", <Object>["C"], "var var m;", | 
| -        [ParserErrorCode.DUPLICATED_MODIFIER]); | 
| +    createParser('var var m;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); | 
| } | 
|  | 
| void test_duplicateLabelInSwitchStatement() { | 
| -    parse4( | 
| -        "parseSwitchStatement", | 
| -        "switch (e) {l1: case 0: break; l1: case 1: break;}", | 
| +    createParser('switch (e) {l1: case 0: break; l1: case 1: break;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]); | 
| } | 
|  | 
| void test_emptyEnumBody() { | 
| -    parse3("parseEnumDeclaration", <Object>[emptyCommentAndMetadata()], | 
| -        "enum E {}", [ParserErrorCode.EMPTY_ENUM_BODY]); | 
| +    createParser('enum E {}'); | 
| +    EnumDeclaration declaration = | 
| +        parser.parseEnumDeclaration(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EMPTY_ENUM_BODY]); | 
| } | 
|  | 
| void test_enableAsync_false_1() { | 
| parseAsync = false; | 
| -    FunctionDeclarationStatement stmt = parse4( | 
| -        "parseFunctionDeclarationStatement", | 
| -        "foo() async {}", | 
| -        [ParserErrorCode.ASYNC_NOT_SUPPORTED]); | 
| -    FunctionExpression expr = stmt.functionDeclaration.functionExpression; | 
| +    createParser('foo() async {}'); | 
| +    FunctionDeclarationStatement statement = | 
| +        parser.parseFunctionDeclarationStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ASYNC_NOT_SUPPORTED]); | 
| +    FunctionExpression expr = statement.functionDeclaration.functionExpression; | 
| expect(expr.body.isAsynchronous, isTrue); | 
| expect(expr.body.isGenerator, isFalse); | 
| } | 
|  | 
| void test_enableAsync_false_2() { | 
| parseAsync = false; | 
| -    FunctionDeclarationStatement stmt = parse4( | 
| -        "parseFunctionDeclarationStatement", | 
| -        "foo() async => 0;", | 
| -        [ParserErrorCode.ASYNC_NOT_SUPPORTED]); | 
| -    FunctionExpression expr = stmt.functionDeclaration.functionExpression; | 
| +    createParser('foo() async => 0;'); | 
| +    FunctionDeclarationStatement statement = | 
| +        parser.parseFunctionDeclarationStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ASYNC_NOT_SUPPORTED]); | 
| +    FunctionExpression expr = statement.functionDeclaration.functionExpression; | 
| expect(expr.body.isAsynchronous, isTrue); | 
| expect(expr.body.isGenerator, isFalse); | 
| } | 
|  | 
| void test_enableAsync_false_3() { | 
| parseAsync = false; | 
| -    FunctionDeclarationStatement stmt = parse4( | 
| -        "parseFunctionDeclarationStatement", | 
| -        "foo() sync* {}", | 
| -        [ParserErrorCode.ASYNC_NOT_SUPPORTED]); | 
| -    FunctionExpression expr = stmt.functionDeclaration.functionExpression; | 
| +    createParser('foo() sync* {}'); | 
| +    FunctionDeclarationStatement statement = | 
| +        parser.parseFunctionDeclarationStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.ASYNC_NOT_SUPPORTED]); | 
| +    FunctionExpression expr = statement.functionDeclaration.functionExpression; | 
| expect(expr.body.isAsynchronous, isFalse); | 
| expect(expr.body.isGenerator, isTrue); | 
| } | 
| @@ -1015,42 +1105,59 @@ class Foo { | 
| } | 
|  | 
| void test_expectedCaseOrDefault() { | 
| -    parse4("parseSwitchStatement", "switch (e) {break;}", | 
| -        [ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]); | 
| +    createParser('switch (e) {break;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]); | 
| } | 
|  | 
| void test_expectedClassMember_inClass_afterType() { | 
| -    parse3("parseClassMember", <Object>["C"], "heart 2 heart", | 
| -        [ParserErrorCode.EXPECTED_CLASS_MEMBER]); | 
| +    createParser('heart 2 heart'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CLASS_MEMBER]); | 
| } | 
|  | 
| void test_expectedClassMember_inClass_beforeType() { | 
| -    parse3("parseClassMember", <Object>["C"], "4 score", | 
| -        [ParserErrorCode.EXPECTED_CLASS_MEMBER]); | 
| +    createParser('4 score'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CLASS_MEMBER]); | 
| } | 
|  | 
| void test_expectedExecutable_inClass_afterVoid() { | 
| -    parse3("parseClassMember", <Object>["C"], "void 2 void", | 
| -        [ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| +    createParser('void 2 void'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| } | 
|  | 
| void test_expectedExecutable_topLevel_afterType() { | 
| -    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()], | 
| -        "heart 2 heart", [ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| +    createParser('heart 2 heart'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| } | 
|  | 
| void test_expectedExecutable_topLevel_afterVoid() { | 
| -    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()], | 
| -        "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| +    createParser('void 2 void'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| } | 
|  | 
| void test_expectedExecutable_topLevel_beforeType() { | 
| -    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()], | 
| -        "4 score", [ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| +    createParser('4 score'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_EXECUTABLE]); | 
| } | 
|  | 
| void test_expectedExecutable_topLevel_eof() { | 
| -    parse2( | 
| +    parse( | 
| "parseCompilationUnitMember", | 
| <Object>[emptyCommentAndMetadata()], | 
| "x", | 
| @@ -1058,26 +1165,33 @@ class Foo { | 
| } | 
|  | 
| void test_expectedInterpolationIdentifier() { | 
| -    parse4( | 
| -        "parseStringLiteral", "'\$x\$'", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser("'\$x\$'"); | 
| +    StringLiteral literal = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_expectedInterpolationIdentifier_emptyString() { | 
| // The scanner inserts an empty string token between the two $'s; we need to | 
| // make sure that the MISSING_IDENTIFIER error that is generated has a | 
| // nonzero width so that it will show up in the editor UI. | 
| -    parse2("parseStringLiteral", <Object>[], "'\$\$foo'", | 
| +    parse("parseStringLiteral", <Object>[], "'\$\$foo'", | 
| [new AnalysisError(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER)]); | 
| } | 
|  | 
| void test_expectedStringLiteral() { | 
| -    StringLiteral expression = parse4( | 
| -        "parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]); | 
| -    expect(expression.isSynthetic, isTrue); | 
| +    createParser('1'); | 
| +    StringLiteral literal = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_STRING_LITERAL]); | 
| +    expect(literal.isSynthetic, isTrue); | 
| } | 
|  | 
| void test_expectedToken_commaMissingInArgumentList() { | 
| -    parse4("parseArgumentList", "(x, y z)", [ParserErrorCode.EXPECTED_TOKEN]); | 
| +    createParser('(x, y z)'); | 
| +    ArgumentList list = parser.parseArgumentList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]); | 
| } | 
|  | 
| void test_expectedToken_parseStatement_afterVoid() { | 
| @@ -1087,11 +1201,11 @@ class Foo { | 
|  | 
| void test_expectedToken_semicolonAfterClass() { | 
| Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS); | 
| -    parse3( | 
| -        "parseClassTypeAlias", | 
| -        <Object>[emptyCommentAndMetadata(), null, token], | 
| -        "A = B with C", | 
| -        [ParserErrorCode.EXPECTED_TOKEN]); | 
| +    createParser('A = B with C'); | 
| +    ClassTypeAlias declaration = | 
| +        parser.parseClassTypeAlias(emptyCommentAndMetadata(), null, token); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]); | 
| } | 
|  | 
| void test_expectedToken_semicolonMissingAfterExport() { | 
| @@ -1131,18 +1245,24 @@ class Foo { | 
| } | 
|  | 
| void test_externalAfterConst() { | 
| -    parse3("parseClassMember", <Object>["C"], "const external C();", | 
| -        [ParserErrorCode.EXTERNAL_AFTER_CONST]); | 
| +    createParser('const external C();'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_AFTER_CONST]); | 
| } | 
|  | 
| void test_externalAfterFactory() { | 
| -    parse3("parseClassMember", <Object>["C"], "factory external C();", | 
| -        [ParserErrorCode.EXTERNAL_AFTER_FACTORY]); | 
| +    createParser('factory external C();'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_AFTER_FACTORY]); | 
| } | 
|  | 
| void test_externalAfterStatic() { | 
| -    parse3("parseClassMember", <Object>["C"], "static external int m();", | 
| -        [ParserErrorCode.EXTERNAL_AFTER_STATIC]); | 
| +    createParser('static external int m();'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_AFTER_STATIC]); | 
| } | 
|  | 
| void test_externalClass() { | 
| @@ -1151,12 +1271,18 @@ class Foo { | 
| } | 
|  | 
| void test_externalConstructorWithBody_factory() { | 
| -    parse3("parseClassMember", <Object>["C"], "external factory C() {}", | 
| +    createParser('external factory C() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]); | 
| } | 
|  | 
| void test_externalConstructorWithBody_named() { | 
| -    parse3("parseClassMember", <Object>["C"], "external C.c() {}", | 
| +    createParser('external C.c() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]); | 
| } | 
|  | 
| @@ -1166,51 +1292,67 @@ class Foo { | 
| } | 
|  | 
| void test_externalField_const() { | 
| -    parse3("parseClassMember", <Object>["C"], "external const A f;", | 
| -        [ParserErrorCode.EXTERNAL_FIELD]); | 
| +    createParser('external const A f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_FIELD]); | 
| } | 
|  | 
| void test_externalField_final() { | 
| -    parse3("parseClassMember", <Object>["C"], "external final A f;", | 
| -        [ParserErrorCode.EXTERNAL_FIELD]); | 
| +    createParser('external final A f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_FIELD]); | 
| } | 
|  | 
| void test_externalField_static() { | 
| -    parse3("parseClassMember", <Object>["C"], "external static A f;", | 
| -        [ParserErrorCode.EXTERNAL_FIELD]); | 
| +    createParser('external static A f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_FIELD]); | 
| } | 
|  | 
| void test_externalField_typed() { | 
| -    parse3("parseClassMember", <Object>["C"], "external A f;", | 
| -        [ParserErrorCode.EXTERNAL_FIELD]); | 
| +    createParser('external A f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_FIELD]); | 
| } | 
|  | 
| void test_externalField_untyped() { | 
| -    parse3("parseClassMember", <Object>["C"], "external var f;", | 
| -        [ParserErrorCode.EXTERNAL_FIELD]); | 
| +    createParser('external var f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_FIELD]); | 
| } | 
|  | 
| void test_externalGetterWithBody() { | 
| -    parse3("parseClassMember", <Object>["C"], "external int get x {}", | 
| -        [ParserErrorCode.EXTERNAL_GETTER_WITH_BODY]); | 
| +    createParser('external int get x {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_GETTER_WITH_BODY]); | 
| } | 
|  | 
| void test_externalMethodWithBody() { | 
| -    parse3("parseClassMember", <Object>["C"], "external m() {}", | 
| -        [ParserErrorCode.EXTERNAL_METHOD_WITH_BODY]); | 
| +    createParser('external m() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_METHOD_WITH_BODY]); | 
| } | 
|  | 
| void test_externalOperatorWithBody() { | 
| -    parse3( | 
| -        "parseClassMember", | 
| -        <Object>["C"], | 
| -        "external operator +(int value) {}", | 
| -        [ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY]); | 
| +    createParser('external operator +(int value) {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY]); | 
| } | 
|  | 
| void test_externalSetterWithBody() { | 
| -    parse3("parseClassMember", <Object>["C"], "external set x(int value) {}", | 
| -        [ParserErrorCode.EXTERNAL_SETTER_WITH_BODY]); | 
| +    createParser('external set x(int value) {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXTERNAL_SETTER_WITH_BODY]); | 
| } | 
|  | 
| void test_externalTypedef() { | 
| @@ -1219,27 +1361,38 @@ class Foo { | 
| } | 
|  | 
| void test_extraCommaInParameterList() { | 
| -    parse4("parseFormalParameterList", "(int a, , int b)", | 
| +    createParser('(int a, , int b)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]); | 
| } | 
|  | 
| void test_extraCommaTrailingNamedParameterGroup() { | 
| -    parse4("parseFormalParameterList", "({int b},)", [ | 
| +    createParser('({int b},)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ | 
| ParserErrorCode.MISSING_IDENTIFIER, | 
| ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS | 
| ]); | 
| } | 
|  | 
| void test_extraCommaTrailingPositionalParameterGroup() { | 
| -    parse4("parseFormalParameterList", "([int b],)", [ | 
| +    createParser('([int b],)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ | 
| ParserErrorCode.MISSING_IDENTIFIER, | 
| ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS | 
| ]); | 
| } | 
|  | 
| void test_extraTrailingCommaInParameterList() { | 
| -    parse4("parseFormalParameterList", "(a,,)", | 
| -        [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('(a,,)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_factoryTopLevelDeclaration_class() { | 
| @@ -1253,23 +1406,32 @@ class Foo { | 
| } | 
|  | 
| void test_factoryWithInitializers() { | 
| -    parse3("parseClassMember", <Object>["C"], "factory C() : x = 3 {}", | 
| -        [ParserErrorCode.FACTORY_WITH_INITIALIZERS]); | 
| +    createParser('factory C() : x = 3 {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.FACTORY_WITH_INITIALIZERS]); | 
| } | 
|  | 
| void test_factoryWithoutBody() { | 
| -    parse3("parseClassMember", <Object>["C"], "factory C();", | 
| -        [ParserErrorCode.FACTORY_WITHOUT_BODY]); | 
| +    createParser('factory C();'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.FACTORY_WITHOUT_BODY]); | 
| } | 
|  | 
| void test_fieldInitializerOutsideConstructor() { | 
| -    parse3("parseClassMember", <Object>["C"], "void m(this.x);", | 
| +    createParser('void m(this.x);'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]); | 
| } | 
|  | 
| void test_finalAndVar() { | 
| -    parse3("parseClassMember", <Object>["C"], "final var x;", | 
| -        [ParserErrorCode.FINAL_AND_VAR]); | 
| +    createParser('final var x;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.FINAL_AND_VAR]); | 
| } | 
|  | 
| void test_finalClass() { | 
| @@ -1278,8 +1440,10 @@ class Foo { | 
| } | 
|  | 
| void test_finalConstructor() { | 
| -    parse3("parseClassMember", <Object>["C"], "final C() {}", | 
| -        [ParserErrorCode.FINAL_CONSTRUCTOR]); | 
| +    createParser('final C() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.FINAL_CONSTRUCTOR]); | 
| } | 
|  | 
| void test_finalEnum() { | 
| @@ -1288,8 +1452,10 @@ class Foo { | 
| } | 
|  | 
| void test_finalMethod() { | 
| -    parse3("parseClassMember", <Object>["C"], "final int m() {}", | 
| -        [ParserErrorCode.FINAL_METHOD]); | 
| +    createParser('final int m() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.FINAL_METHOD]); | 
| } | 
|  | 
| void test_finalTypedef() { | 
| @@ -1334,8 +1500,10 @@ class Foo { | 
| } | 
|  | 
| void test_getterWithParameters() { | 
| -    parse3("parseClassMember", <Object>["C"], "int get x() {}", | 
| -        [ParserErrorCode.GETTER_WITH_PARAMETERS]); | 
| +    createParser('int get x() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.GETTER_WITH_PARAMETERS]); | 
| } | 
|  | 
| void test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal() { | 
| @@ -1387,96 +1555,141 @@ class Foo { | 
| } | 
|  | 
| void test_initializedVariableInForEach() { | 
| -    parse4("parseForStatement", "for (int a = 0 in foo) {}", | 
| +    createParser('for (int a = 0 in foo) {}'); | 
| +    Statement statement = parser.parseForStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]); | 
| } | 
|  | 
| void test_invalidAwaitInFor() { | 
| -    parse4("parseForStatement", "await for (; ;) {}", | 
| -        [ParserErrorCode.INVALID_AWAIT_IN_FOR]); | 
| +    createParser('await for (; ;) {}'); | 
| +    Statement statement = parser.parseForStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_AWAIT_IN_FOR]); | 
| } | 
|  | 
| void test_invalidCodePoint() { | 
| -    parse4("parseStringLiteral", "'\\uD900'", | 
| -        [ParserErrorCode.INVALID_CODE_POINT]); | 
| +    createParser("'\\uD900'"); | 
| +    StringLiteral literal = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_CODE_POINT]); | 
| } | 
|  | 
| void test_invalidHexEscape_invalidDigit() { | 
| -    parse4( | 
| -        "parseStringLiteral", "'\\x0 a'", [ParserErrorCode.INVALID_HEX_ESCAPE]); | 
| +    createParser("'\\x0 a'"); | 
| +    StringLiteral literal = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]); | 
| } | 
|  | 
| void test_invalidHexEscape_tooFewDigits() { | 
| -    parse4( | 
| -        "parseStringLiteral", "'\\x0'", [ParserErrorCode.INVALID_HEX_ESCAPE]); | 
| +    createParser("'\\x0'"); | 
| +    StringLiteral literal = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]); | 
| } | 
|  | 
| void test_invalidInterpolationIdentifier_startWithDigit() { | 
| -    parse4("parseStringLiteral", "'\$1'", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser("'\$1'"); | 
| +    StringLiteral literal = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_invalidLiteralInConfiguration() { | 
| -    parse4("parseConfiguration", "if (a == 'x \$y z') 'a.dart'", | 
| +    createParser("if (a == 'x \$y z') 'a.dart'"); | 
| +    Configuration configuration = parser.parseConfiguration(); | 
| +    expectNotNullIfNoErrors(configuration); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION]); | 
| } | 
|  | 
| void test_invalidOperator() { | 
| -    parse3("parseClassMember", <Object>["C"], "void operator ===(x) {}", | 
| -        [ParserErrorCode.INVALID_OPERATOR]); | 
| +    createParser('void operator ===(x) {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_OPERATOR]); | 
| } | 
|  | 
| void test_invalidOperatorAfterSuper_assignableExpression() { | 
| -    parse3('parseAssignableExpression', <Object>[false], 'super?.v', | 
| -        [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]); | 
| +    createParser('super?.v'); | 
| +    Expression expression = parser.parseAssignableExpression(false); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]); | 
| } | 
|  | 
| void test_invalidOperatorAfterSuper_primaryExpression() { | 
| -    parse4('parsePrimaryExpression', 'super?.v', | 
| -        [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]); | 
| +    createParser('super?.v'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]); | 
| } | 
|  | 
| void test_invalidOperatorForSuper() { | 
| -    parse4("parseUnaryExpression", "++super", | 
| -        [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]); | 
| +    createParser('++super'); | 
| +    Expression expression = parser.parseUnaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]); | 
| } | 
|  | 
| void test_invalidStarAfterAsync() { | 
| -    parse3("parseFunctionBody", <Object>[false, null, false], "async* => 0;", | 
| -        [ParserErrorCode.INVALID_STAR_AFTER_ASYNC]); | 
| +    createParser('async* => 0;'); | 
| +    FunctionBody functionBody = parser.parseFunctionBody(false, null, false); | 
| +    expectNotNullIfNoErrors(functionBody); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_STAR_AFTER_ASYNC]); | 
| } | 
|  | 
| void test_invalidSync() { | 
| -    parse3("parseFunctionBody", <Object>[false, null, false], "sync* => 0;", | 
| -        [ParserErrorCode.INVALID_SYNC]); | 
| +    createParser('sync* => 0;'); | 
| +    FunctionBody functionBody = parser.parseFunctionBody(false, null, false); | 
| +    expectNotNullIfNoErrors(functionBody); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_SYNC]); | 
| } | 
|  | 
| void test_invalidUnicodeEscape_incomplete_noDigits() { | 
| -    parse4("parseStringLiteral", "'\\u{'", | 
| -        [ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| +    createParser("'\\u{'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| } | 
|  | 
| void test_invalidUnicodeEscape_incomplete_someDigits() { | 
| -    parse4("parseStringLiteral", "'\\u{0A'", | 
| -        [ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| +    createParser("'\\u{0A'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| } | 
|  | 
| void test_invalidUnicodeEscape_invalidDigit() { | 
| -    parse4("parseStringLiteral", "'\\u0 a'", | 
| -        [ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| +    createParser("'\\u0 a'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| } | 
|  | 
| void test_invalidUnicodeEscape_tooFewDigits_fixed() { | 
| -    parse4("parseStringLiteral", "'\\u04'", | 
| -        [ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| +    createParser("'\\u04'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| } | 
|  | 
| void test_invalidUnicodeEscape_tooFewDigits_variable() { | 
| -    parse4("parseStringLiteral", "'\\u{}'", | 
| -        [ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| +    createParser("'\\u{}'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]); | 
| } | 
|  | 
| void test_invalidUnicodeEscape_tooManyDigits_variable() { | 
| -    parse4("parseStringLiteral", "'\\u{12345678}'", [ | 
| +    createParser("'\\u{12345678}'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ | 
| ParserErrorCode.INVALID_UNICODE_ESCAPE, | 
| ParserErrorCode.INVALID_CODE_POINT | 
| ]); | 
| @@ -1516,17 +1729,18 @@ class Foo { | 
|  | 
| void test_method_invalidTypeParameterComments() { | 
| enableGenericMethodComments = true; | 
| -    MethodDeclaration method = parse3( | 
| -        "parseClassMember", | 
| -        <Object>["C"], | 
| -        "void m/*<E, hello!>*/() {}", | 
| -        [ | 
| -          ParserErrorCode.EXPECTED_TOKEN /*>*/, | 
| -          ParserErrorCode.MISSING_IDENTIFIER, | 
| -          ParserErrorCode.EXPECTED_TOKEN /*(*/, | 
| -          ParserErrorCode.EXPECTED_TOKEN /*)*/, | 
| -          ParserErrorCode.MISSING_FUNCTION_BODY | 
| -        ]); | 
| +    createParser('void m/*<E, hello!>*/() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ | 
| +      ParserErrorCode.EXPECTED_TOKEN /*>*/, | 
| +      ParserErrorCode.MISSING_IDENTIFIER, | 
| +      ParserErrorCode.EXPECTED_TOKEN /*(*/, | 
| +      ParserErrorCode.EXPECTED_TOKEN /*)*/, | 
| +      ParserErrorCode.MISSING_FUNCTION_BODY | 
| +    ]); | 
| +    expect(member, new isInstanceOf<MethodDeclaration>()); | 
| +    MethodDeclaration method = member; | 
| expect(method.typeParameters.toString(), '<E, hello>', | 
| reason: 'parser recovers what it can'); | 
| } | 
| @@ -1536,16 +1750,17 @@ class Foo { | 
|  | 
| // TODO(jmesserly): ideally we'd be better at parser recovery here. | 
| enableGenericMethods = true; | 
| -    MethodDeclaration method = parse3( | 
| -        "parseClassMember", | 
| -        <Object>["C"], | 
| -        "f<E>(E extends num p);", | 
| -        [ | 
| -          ParserErrorCode.MISSING_IDENTIFIER, // `extends` is a keyword | 
| -          ParserErrorCode.EXPECTED_TOKEN, // comma | 
| -          ParserErrorCode.EXPECTED_TOKEN, // close paren | 
| -          ParserErrorCode.MISSING_FUNCTION_BODY | 
| -        ]); | 
| +    createParser('f<E>(E extends num p);'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ | 
| +      ParserErrorCode.MISSING_IDENTIFIER, // `extends` is a keyword | 
| +      ParserErrorCode.EXPECTED_TOKEN, // comma | 
| +      ParserErrorCode.EXPECTED_TOKEN, // close paren | 
| +      ParserErrorCode.MISSING_FUNCTION_BODY | 
| +    ]); | 
| +    expect(member, new isInstanceOf<MethodDeclaration>()); | 
| +    MethodDeclaration method = member; | 
| expect(method.parameters.toString(), '(E, extends)', | 
| reason: 'parser recovers what it can'); | 
| } | 
| @@ -1559,17 +1774,18 @@ class Foo { | 
| // point in the parser. This has a slight effect on the AST that results | 
| // from error recovery. | 
| enableGenericMethodComments = true; | 
| -    MethodDeclaration method = parse3( | 
| -        "parseClassMember", | 
| -        <Object>["C"], | 
| -        "f/*<E>*/(dynamic/*=E extends num*/p);", | 
| -        [ | 
| -          ParserErrorCode.MISSING_IDENTIFIER, // `extends` is a keyword | 
| -          ParserErrorCode.EXPECTED_TOKEN, // comma | 
| -          ParserErrorCode.MISSING_IDENTIFIER, // `extends` is a keyword | 
| -          ParserErrorCode.EXPECTED_TOKEN, // close paren | 
| -          ParserErrorCode.MISSING_FUNCTION_BODY | 
| -        ]); | 
| +    createParser('f/*<E>*/(dynamic/*=E extends num*/p);'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ | 
| +      ParserErrorCode.MISSING_IDENTIFIER, // `extends` is a keyword | 
| +      ParserErrorCode.EXPECTED_TOKEN, // comma | 
| +      ParserErrorCode.MISSING_IDENTIFIER, // `extends` is a keyword | 
| +      ParserErrorCode.EXPECTED_TOKEN, // close paren | 
| +      ParserErrorCode.MISSING_FUNCTION_BODY | 
| +    ]); | 
| +    expect(member, new isInstanceOf<MethodDeclaration>()); | 
| +    MethodDeclaration method = member; | 
| expect(method.parameters.toString(), '(E extends, extends)', | 
| reason: 'parser recovers what it can'); | 
| } | 
| @@ -1580,17 +1796,18 @@ class Foo { | 
| // valid `>`. If it did we'd get less cascading errors, at least for this | 
| // particular example. | 
| enableGenericMethods = true; | 
| -    MethodDeclaration method = parse3( | 
| -        "parseClassMember", | 
| -        <Object>["C"], | 
| -        "void m<E, hello!>() {}", | 
| -        [ | 
| -          ParserErrorCode.EXPECTED_TOKEN /*>*/, | 
| -          ParserErrorCode.MISSING_IDENTIFIER, | 
| -          ParserErrorCode.EXPECTED_TOKEN /*(*/, | 
| -          ParserErrorCode.EXPECTED_TOKEN /*)*/, | 
| -          ParserErrorCode.MISSING_FUNCTION_BODY | 
| -        ]); | 
| +    createParser('void m<E, hello!>() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ | 
| +      ParserErrorCode.EXPECTED_TOKEN /*>*/, | 
| +      ParserErrorCode.MISSING_IDENTIFIER, | 
| +      ParserErrorCode.EXPECTED_TOKEN /*(*/, | 
| +      ParserErrorCode.EXPECTED_TOKEN /*)*/, | 
| +      ParserErrorCode.MISSING_FUNCTION_BODY | 
| +    ]); | 
| +    expect(member, new isInstanceOf<MethodDeclaration>()); | 
| +    MethodDeclaration method = member; | 
| expect(method.typeParameters.toString(), '<E, hello>', | 
| reason: 'parser recovers what it can'); | 
| } | 
| @@ -1612,9 +1829,14 @@ class Foo { | 
| } | 
|  | 
| void test_missingAssignableSelector_superPrimaryExpression() { | 
| -    SuperExpression expression = parse4("parsePrimaryExpression", "super", | 
| -        [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]); | 
| -    expect(expression.superKeyword, isNotNull); | 
| +    createParser('super'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]); | 
| +    expect(expression, new isInstanceOf<SuperExpression>()); | 
| +    SuperExpression superExpression = expression; | 
| +    expect(superExpression.superKeyword, isNotNull); | 
| } | 
|  | 
| void test_missingAssignableSelector_superPropertyAccessAssigned() { | 
| @@ -1622,8 +1844,10 @@ class Foo { | 
| } | 
|  | 
| void test_missingCatchOrFinally() { | 
| -    TryStatement statement = parse4("parseTryStatement", "try {}", | 
| -        [ParserErrorCode.MISSING_CATCH_OR_FINALLY]); | 
| +    createParser('try {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_CATCH_OR_FINALLY]); | 
| expect(statement, isNotNull); | 
| } | 
|  | 
| @@ -1638,39 +1862,51 @@ class Foo { | 
| } | 
|  | 
| void test_missingConstFinalVarOrType_topLevel() { | 
| -    parse3("parseFinalConstVarOrType", <Object>[false], "a;", | 
| +    createParser('a;'); | 
| +    FinalConstVarOrType result = parser.parseFinalConstVarOrType(false); | 
| +    expectNotNullIfNoErrors(result); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]); | 
| } | 
|  | 
| void test_missingEnumBody() { | 
| -    parse3("parseEnumDeclaration", <Object>[emptyCommentAndMetadata()], | 
| -        "enum E;", [ParserErrorCode.MISSING_ENUM_BODY]); | 
| +    createParser('enum E;'); | 
| +    EnumDeclaration declaration = | 
| +        parser.parseEnumDeclaration(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_ENUM_BODY]); | 
| } | 
|  | 
| void test_missingExpressionInThrow_withCascade() { | 
| -    parse4("parseThrowExpression", "throw;", | 
| -        [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]); | 
| +    createParser('throw;'); | 
| +    ThrowExpression expression = parser.parseThrowExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.MISSING_EXPRESSION_IN_THROW]); | 
| } | 
|  | 
| void test_missingExpressionInThrow_withoutCascade() { | 
| -    parse4("parseThrowExpressionWithoutCascade", "throw;", | 
| -        [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]); | 
| +    createParser('throw;'); | 
| +    ThrowExpression expression = parser.parseThrowExpressionWithoutCascade(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.MISSING_EXPRESSION_IN_THROW]); | 
| } | 
|  | 
| void test_missingFunctionBody_emptyNotAllowed() { | 
| -    parse3( | 
| -        "parseFunctionBody", | 
| -        <Object>[false, ParserErrorCode.MISSING_FUNCTION_BODY, false], | 
| -        ";", | 
| -        [ParserErrorCode.MISSING_FUNCTION_BODY]); | 
| +    createParser(';'); | 
| +    FunctionBody functionBody = parser.parseFunctionBody( | 
| +        false, ParserErrorCode.MISSING_FUNCTION_BODY, false); | 
| +    expectNotNullIfNoErrors(functionBody); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_FUNCTION_BODY]); | 
| } | 
|  | 
| void test_missingFunctionBody_invalid() { | 
| -    parse3( | 
| -        "parseFunctionBody", | 
| -        <Object>[false, ParserErrorCode.MISSING_FUNCTION_BODY, false], | 
| -        "return 0;", | 
| -        [ParserErrorCode.MISSING_FUNCTION_BODY]); | 
| +    createParser('return 0;'); | 
| +    FunctionBody functionBody = parser.parseFunctionBody( | 
| +        false, ParserErrorCode.MISSING_FUNCTION_BODY, false); | 
| +    expectNotNullIfNoErrors(functionBody); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_FUNCTION_BODY]); | 
| } | 
|  | 
| void test_missingFunctionParameters_local_void_block() { | 
| @@ -1708,73 +1944,108 @@ class Foo { | 
| } | 
|  | 
| void test_missingIdentifier_afterOperator() { | 
| -    parse4("parseMultiplicativeExpression", "1 *", | 
| -        [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('1 *'); | 
| +    BinaryExpression expression = parser.parseMultiplicativeExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_missingIdentifier_beforeClosingCurly() { | 
| -    parse3("parseClassMember", <Object>["C"], "int}", | 
| +    createParser('int}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]); | 
| } | 
|  | 
| void test_missingIdentifier_functionDeclaration_returnTypeWithoutName() { | 
| -    parse4("parseFunctionDeclarationStatement", "A<T> () {}", | 
| -        [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('A<T> () {}'); | 
| +    Statement statement = parser.parseFunctionDeclarationStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_missingIdentifier_inEnum() { | 
| -    parse3("parseEnumDeclaration", <Object>[emptyCommentAndMetadata()], | 
| -        "enum E {, TWO}", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('enum E {, TWO}'); | 
| +    EnumDeclaration declaration = | 
| +        parser.parseEnumDeclaration(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_missingIdentifier_inSymbol_afterPeriod() { | 
| -    parse4("parseSymbolLiteral", "#a.", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('#a.'); | 
| +    SymbolLiteral literal = parser.parseSymbolLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_missingIdentifier_inSymbol_first() { | 
| -    parse4("parseSymbolLiteral", "#", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('#'); | 
| +    SymbolLiteral literal = parser.parseSymbolLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_missingIdentifier_number() { | 
| -    SimpleIdentifier expression = parse4( | 
| -        "parseSimpleIdentifier", "1", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('1'); | 
| +    SimpleIdentifier expression = parser.parseSimpleIdentifier(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| expect(expression.isSynthetic, isTrue); | 
| } | 
|  | 
| void test_missingIdentifierForParameterGroup() { | 
| -    parse4("parseFormalParameterList", "(,)", | 
| -        [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('(,)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| } | 
|  | 
| void test_missingKeywordOperator() { | 
| -    parse3("parseOperator", <Object>[emptyCommentAndMetadata(), null, null], | 
| -        "+(x) {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| +    createParser('+(x) {}'); | 
| +    MethodDeclaration method = | 
| +        parser.parseOperator(emptyCommentAndMetadata(), null, null); | 
| +    expectNotNullIfNoErrors(method); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| } | 
|  | 
| void test_missingKeywordOperator_parseClassMember() { | 
| -    parse3("parseClassMember", <Object>["C"], "+() {}", | 
| -        [ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| +    createParser('+() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| } | 
|  | 
| void test_missingKeywordOperator_parseClassMember_afterTypeName() { | 
| -    parse3("parseClassMember", <Object>["C"], "int +() {}", | 
| -        [ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| +    createParser('int +() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| } | 
|  | 
| void test_missingKeywordOperator_parseClassMember_afterVoid() { | 
| -    parse3("parseClassMember", <Object>["C"], "void +() {}", | 
| -        [ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| +    createParser('void +() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_KEYWORD_OPERATOR]); | 
| } | 
|  | 
| void test_missingMethodParameters_void_block() { | 
| -    MethodDeclaration method = parse3("parseClassMember", <Object>["C"], | 
| -        "void m {} }", [ParserErrorCode.MISSING_METHOD_PARAMETERS]); | 
| +    createParser('void m {} }'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_METHOD_PARAMETERS]); | 
| +    expect(member, new isInstanceOf<MethodDeclaration>()); | 
| +    MethodDeclaration method = member; | 
| expect(method.parameters, hasLength(0)); | 
| } | 
|  | 
| void test_missingMethodParameters_void_expression() { | 
| -    parse3("parseClassMember", <Object>["C"], "void m => null; }", | 
| -        [ParserErrorCode.MISSING_METHOD_PARAMETERS]); | 
| +    createParser('void m => null; }'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_METHOD_PARAMETERS]); | 
| } | 
|  | 
| void test_missingNameInLibraryDirective() { | 
| @@ -1795,8 +2066,10 @@ class Foo { | 
| } | 
|  | 
| void test_missingStartAfterSync() { | 
| -    parse3("parseFunctionBody", <Object>[false, null, false], "sync {}", | 
| -        [ParserErrorCode.MISSING_STAR_AFTER_SYNC]); | 
| +    createParser('sync {}'); | 
| +    FunctionBody functionBody = parser.parseFunctionBody(false, null, false); | 
| +    expectNotNullIfNoErrors(functionBody); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_STAR_AFTER_SYNC]); | 
| } | 
|  | 
| void test_missingStatement() { | 
| @@ -1808,12 +2081,18 @@ class Foo { | 
| } | 
|  | 
| void test_missingTerminatorForParameterGroup_named() { | 
| -    parse4("parseFormalParameterList", "(a, {b: 0)", | 
| +    createParser('(a, {b: 0)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]); | 
| } | 
|  | 
| void test_missingTerminatorForParameterGroup_optional() { | 
| -    parse4("parseFormalParameterList", "(a, [b = 0)", | 
| +    createParser('(a, [b = 0)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]); | 
| } | 
|  | 
| @@ -1833,18 +2112,25 @@ class Foo { | 
| } | 
|  | 
| void test_missingVariableInForEach() { | 
| -    parse4("parseForStatement", "for (a < b in foo) {}", | 
| -        [ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]); | 
| +    createParser('for (a < b in foo) {}'); | 
| +    Statement statement = parser.parseForStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]); | 
| } | 
|  | 
| void test_mixedParameterGroups_namedPositional() { | 
| -    parse4("parseFormalParameterList", "(a, {b}, [c])", | 
| -        [ParserErrorCode.MIXED_PARAMETER_GROUPS]); | 
| +    createParser('(a, {b}, [c])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MIXED_PARAMETER_GROUPS]); | 
| } | 
|  | 
| void test_mixedParameterGroups_positionalNamed() { | 
| -    parse4("parseFormalParameterList", "(a, [b], {c})", | 
| -        [ParserErrorCode.MIXED_PARAMETER_GROUPS]); | 
| +    createParser('(a, [b], {c})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MIXED_PARAMETER_GROUPS]); | 
| } | 
|  | 
| void test_mixin_application_lacks_with_clause() { | 
| @@ -1868,7 +2154,10 @@ class Foo { | 
| } | 
|  | 
| void test_multipleNamedParameterGroups() { | 
| -    parse4("parseFormalParameterList", "(a, {b}, {c})", | 
| +    createParser('(a, {b}, {c})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS]); | 
| } | 
|  | 
| @@ -1878,12 +2167,18 @@ class Foo { | 
| } | 
|  | 
| void test_multiplePositionalParameterGroups() { | 
| -    parse4("parseFormalParameterList", "(a, [b], [c])", | 
| +    createParser('(a, [b], [c])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]); | 
| } | 
|  | 
| void test_multipleVariablesInForEach() { | 
| -    parse4("parseForStatement", "for (int a, b in foo) {}", | 
| +    createParser('for (int a, b in foo) {}'); | 
| +    Statement statement = parser.parseForStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]); | 
| } | 
|  | 
| @@ -1893,18 +2188,25 @@ class Foo { | 
| } | 
|  | 
| void test_namedParameterOutsideGroup() { | 
| -    parse4("parseFormalParameterList", "(a, b : 0)", | 
| -        [ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]); | 
| +    createParser('(a, b : 0)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]); | 
| } | 
|  | 
| void test_nonConstructorFactory_field() { | 
| -    parse3("parseClassMember", <Object>["C"], "factory int x;", | 
| -        [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]); | 
| +    createParser('factory int x;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.NON_CONSTRUCTOR_FACTORY]); | 
| } | 
|  | 
| void test_nonConstructorFactory_method() { | 
| -    parse3("parseClassMember", <Object>["C"], "factory int m() {}", | 
| -        [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]); | 
| +    createParser('factory int m() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.NON_CONSTRUCTOR_FACTORY]); | 
| } | 
|  | 
| void test_nonIdentifierLibraryName_library() { | 
| @@ -1930,8 +2232,11 @@ class Foo { | 
| } | 
|  | 
| void test_nonUserDefinableOperator() { | 
| -    parse3("parseClassMember", <Object>["C"], "operator +=(int x) => x + 1;", | 
| -        [ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]); | 
| +    createParser('operator +=(int x) => x + 1;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]); | 
| } | 
|  | 
| void test_optionalAfterNormalParameters_named() { | 
| @@ -1945,8 +2250,10 @@ class Foo { | 
| } | 
|  | 
| void test_parseCascadeSection_missingIdentifier() { | 
| -    MethodInvocation methodInvocation = parse4( | 
| -        "parseCascadeSection", "..()", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('..()'); | 
| +    MethodInvocation methodInvocation = parser.parseCascadeSection(); | 
| +    expectNotNullIfNoErrors(methodInvocation); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| expect(methodInvocation.target, isNull); | 
| expect(methodInvocation.methodName.name, ""); | 
| expect(methodInvocation.typeArguments, isNull); | 
| @@ -1955,8 +2262,10 @@ class Foo { | 
|  | 
| void test_parseCascadeSection_missingIdentifier_typeArguments() { | 
| enableGenericMethods = true; | 
| -    MethodInvocation methodInvocation = parse4( | 
| -        "parseCascadeSection", "..<E>()", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    createParser('..<E>()'); | 
| +    MethodInvocation methodInvocation = parser.parseCascadeSection(); | 
| +    expectNotNullIfNoErrors(methodInvocation); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| expect(methodInvocation.target, isNull); | 
| expect(methodInvocation.methodName.name, ""); | 
| expect(methodInvocation.typeArguments, isNotNull); | 
| @@ -1964,27 +2273,42 @@ class Foo { | 
| } | 
|  | 
| void test_positionalAfterNamedArgument() { | 
| -    parse4("parseArgumentList", "(x: 1, 2)", | 
| +    createParser('(x: 1, 2)'); | 
| +    ArgumentList list = parser.parseArgumentList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT]); | 
| } | 
|  | 
| void test_positionalParameterOutsideGroup() { | 
| -    parse4("parseFormalParameterList", "(a, b = 0)", | 
| +    createParser('(a, b = 0)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP]); | 
| } | 
|  | 
| void test_redirectingConstructorWithBody_named() { | 
| -    parse3("parseClassMember", <Object>["C"], "C.x() : this() {}", | 
| +    createParser('C.x() : this() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY]); | 
| } | 
|  | 
| void test_redirectingConstructorWithBody_unnamed() { | 
| -    parse3("parseClassMember", <Object>["C"], "C() : this.x() {}", | 
| +    createParser('C() : this.x() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY]); | 
| } | 
|  | 
| void test_redirectionInNonFactoryConstructor() { | 
| -    parse3("parseClassMember", <Object>["C"], "C() = D;", | 
| +    createParser('C() = D;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR]); | 
| } | 
|  | 
| @@ -1999,49 +2323,61 @@ class Foo { | 
| } | 
|  | 
| void test_staticAfterConst() { | 
| -    parse3("parseClassMember", <Object>["C"], "final static int f;", | 
| -        [ParserErrorCode.STATIC_AFTER_FINAL]); | 
| +    createParser('final static int f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.STATIC_AFTER_FINAL]); | 
| } | 
|  | 
| void test_staticAfterFinal() { | 
| -    parse3("parseClassMember", <Object>["C"], "const static int f;", | 
| -        [ParserErrorCode.STATIC_AFTER_CONST]); | 
| +    createParser('const static int f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.STATIC_AFTER_CONST]); | 
| } | 
|  | 
| void test_staticAfterVar() { | 
| -    parse3("parseClassMember", <Object>["C"], "var static f;", | 
| -        [ParserErrorCode.STATIC_AFTER_VAR]); | 
| +    createParser('var static f;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.STATIC_AFTER_VAR]); | 
| } | 
|  | 
| void test_staticConstructor() { | 
| -    parse3("parseClassMember", <Object>["C"], "static C.m() {}", | 
| -        [ParserErrorCode.STATIC_CONSTRUCTOR]); | 
| +    createParser('static C.m() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.STATIC_CONSTRUCTOR]); | 
| } | 
|  | 
| void test_staticGetterWithoutBody() { | 
| -    parse3("parseClassMember", <Object>["C"], "static get m;", | 
| -        [ParserErrorCode.STATIC_GETTER_WITHOUT_BODY]); | 
| +    createParser('static get m;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.STATIC_GETTER_WITHOUT_BODY]); | 
| } | 
|  | 
| void test_staticOperator_noReturnType() { | 
| -    parse3( | 
| -        "parseClassMember", | 
| -        <Object>["C"], | 
| -        "static operator +(int x) => x + 1;", | 
| -        [ParserErrorCode.STATIC_OPERATOR]); | 
| +    createParser('static operator +(int x) => x + 1;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.STATIC_OPERATOR]); | 
| } | 
|  | 
| void test_staticOperator_returnType() { | 
| -    parse3( | 
| -        "parseClassMember", | 
| -        <Object>["C"], | 
| -        "static int operator +(int x) => x + 1;", | 
| -        [ParserErrorCode.STATIC_OPERATOR]); | 
| +    createParser('static int operator +(int x) => x + 1;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.STATIC_OPERATOR]); | 
| } | 
|  | 
| void test_staticSetterWithoutBody() { | 
| -    parse3("parseClassMember", <Object>["C"], "static set m(x);", | 
| -        [ParserErrorCode.STATIC_SETTER_WITHOUT_BODY]); | 
| +    createParser('static set m(x);'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener | 
| +        .assertErrorsWithCodes([ParserErrorCode.STATIC_SETTER_WITHOUT_BODY]); | 
| } | 
|  | 
| void test_staticTopLevelDeclaration_class() { | 
| @@ -2083,65 +2419,76 @@ m() { | 
| } | 
|  | 
| void test_switchHasCaseAfterDefaultCase() { | 
| -    parse4( | 
| -        "parseSwitchStatement", | 
| -        "switch (a) {default: return 0; case 1: return 1;}", | 
| +    createParser('switch (a) {default: return 0; case 1: return 1;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]); | 
| } | 
|  | 
| void test_switchHasCaseAfterDefaultCase_repeated() { | 
| -    parse4("parseSwitchStatement", | 
| -        "switch (a) {default: return 0; case 1: return 1; case 2: return 2;}", [ | 
| +    createParser( | 
| +        'switch (a) {default: return 0; case 1: return 1; case 2: return 2;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ | 
| ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, | 
| ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE | 
| ]); | 
| } | 
|  | 
| void test_switchHasMultipleDefaultCases() { | 
| -    parse4( | 
| -        "parseSwitchStatement", | 
| -        "switch (a) {default: return 0; default: return 1;}", | 
| +    createParser('switch (a) {default: return 0; default: return 1;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]); | 
| } | 
|  | 
| void test_switchHasMultipleDefaultCases_repeated() { | 
| -    parse4( | 
| -        "parseSwitchStatement", | 
| -        "switch (a) {default: return 0; default: return 1; default: return 2;}", | 
| -        [ | 
| -          ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, | 
| -          ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES | 
| -        ]); | 
| +    createParser( | 
| +        'switch (a) {default: return 0; default: return 1; default: return 2;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertErrorsWithCodes([ | 
| +      ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, | 
| +      ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES | 
| +    ]); | 
| } | 
|  | 
| void test_topLevel_getter() { | 
| -    FunctionDeclaration funct = parse3("parseCompilationUnitMember", | 
| -        <Object>[emptyCommentAndMetadata()], "get x => 7;"); | 
| -    expect(funct.functionExpression.parameters, isNull); | 
| +    createParser('get x => 7;'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertNoErrors(); | 
| +    expect(member, new isInstanceOf<FunctionDeclaration>()); | 
| +    FunctionDeclaration function = member; | 
| +    expect(function.functionExpression.parameters, isNull); | 
| } | 
|  | 
| void test_topLevelOperator_withoutType() { | 
| -    parse3( | 
| -        "parseCompilationUnitMember", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "operator +(bool x, bool y) => x | y;", | 
| -        [ParserErrorCode.TOP_LEVEL_OPERATOR]); | 
| +    createParser('operator +(bool x, bool y) => x | y;'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.TOP_LEVEL_OPERATOR]); | 
| } | 
|  | 
| void test_topLevelOperator_withType() { | 
| -    parse3( | 
| -        "parseCompilationUnitMember", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "bool operator +(bool x, bool y) => x | y;", | 
| -        [ParserErrorCode.TOP_LEVEL_OPERATOR]); | 
| +    createParser('bool operator +(bool x, bool y) => x | y;'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.TOP_LEVEL_OPERATOR]); | 
| } | 
|  | 
| void test_topLevelOperator_withVoid() { | 
| -    parse3( | 
| -        "parseCompilationUnitMember", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "void operator +(bool x, bool y) => x | y;", | 
| -        [ParserErrorCode.TOP_LEVEL_OPERATOR]); | 
| +    createParser('void operator +(bool x, bool y) => x | y;'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.TOP_LEVEL_OPERATOR]); | 
| } | 
|  | 
| void test_topLevelVariable_withMetadata() { | 
| @@ -2163,12 +2510,18 @@ m() { | 
| } | 
|  | 
| void test_unexpectedTerminatorForParameterGroup_named() { | 
| -    parse4("parseFormalParameterList", "(a, b})", | 
| +    createParser('(a, b})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]); | 
| } | 
|  | 
| void test_unexpectedTerminatorForParameterGroup_optional() { | 
| -    parse4("parseFormalParameterList", "(a, b])", | 
| +    createParser('(a, b])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]); | 
| } | 
|  | 
| @@ -2183,8 +2536,11 @@ m() { | 
| } | 
|  | 
| void test_unexpectedToken_semicolonBetweenClassMembers() { | 
| -    parse3("parseClassDeclaration", <Object>[emptyCommentAndMetadata(), null], | 
| -        "class C { int x; ; int y;}", [ParserErrorCode.UNEXPECTED_TOKEN]); | 
| +    createParser('class C { int x; ; int y;}'); | 
| +    ClassDeclaration declaration = | 
| +        parser.parseClassDeclaration(emptyCommentAndMetadata(), null); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.UNEXPECTED_TOKEN]); | 
| } | 
|  | 
| void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() { | 
| @@ -2267,11 +2623,13 @@ void main() { | 
| } | 
|  | 
| void test_useOfUnaryPlusOperator() { | 
| -    SimpleIdentifier expression = parse4( | 
| -        "parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression); | 
| -    expect(expression.isSynthetic, isTrue); | 
| +    createParser('+x'); | 
| +    Expression expression = parser.parseUnaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 
| +    expect(expression, new isInstanceOf<SimpleIdentifier>()); | 
| +    SimpleIdentifier identifier = expression; | 
| +    expect(identifier.isSynthetic, isTrue); | 
| } | 
|  | 
| void test_varAndType_field() { | 
| @@ -2299,8 +2657,10 @@ void main() { | 
| } | 
|  | 
| void test_varReturnType() { | 
| -    parse3("parseClassMember", <Object>["C"], "var m() {}", | 
| -        [ParserErrorCode.VAR_RETURN_TYPE]); | 
| +    createParser('var m() {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.VAR_RETURN_TYPE]); | 
| } | 
|  | 
| void test_varTypedef() { | 
| @@ -2309,18 +2669,24 @@ void main() { | 
| } | 
|  | 
| void test_voidParameter() { | 
| -    parse4("parseNormalFormalParameter", "void a)", | 
| -        [ParserErrorCode.VOID_PARAMETER]); | 
| +    createParser('void a)'); | 
| +    NormalFormalParameter parameter = parser.parseNormalFormalParameter(); | 
| +    expectNotNullIfNoErrors(parameter); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.VOID_PARAMETER]); | 
| } | 
|  | 
| void test_voidVariable_parseClassMember_initializer() { | 
| -    parse3("parseClassMember", <Object>["C"], "void x = 0;", | 
| -        [ParserErrorCode.VOID_VARIABLE]); | 
| +    createParser('void x = 0;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.VOID_VARIABLE]); | 
| } | 
|  | 
| void test_voidVariable_parseClassMember_noInitializer() { | 
| -    parse3("parseClassMember", <Object>["C"], "void x;", | 
| -        [ParserErrorCode.VOID_VARIABLE]); | 
| +    createParser('void x;'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.VOID_VARIABLE]); | 
| } | 
|  | 
| void test_voidVariable_parseCompilationUnit_initializer() { | 
| @@ -2334,13 +2700,19 @@ void main() { | 
| } | 
|  | 
| void test_voidVariable_parseCompilationUnitMember_initializer() { | 
| -    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()], | 
| -        "void a = 0;", [ParserErrorCode.VOID_VARIABLE]); | 
| +    createParser('void a = 0;'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.VOID_VARIABLE]); | 
| } | 
|  | 
| void test_voidVariable_parseCompilationUnitMember_noInitializer() { | 
| -    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()], | 
| -        "void a;", [ParserErrorCode.VOID_VARIABLE]); | 
| +    createParser('void a;'); | 
| +    CompilationUnitMember member = | 
| +        parser.parseCompilationUnitMember(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.VOID_VARIABLE]); | 
| } | 
|  | 
| void test_voidVariable_statement_initializer() { | 
| @@ -2363,27 +2735,42 @@ void main() { | 
| } | 
|  | 
| void test_withWithoutExtends() { | 
| -    parse3("parseClassDeclaration", <Object>[emptyCommentAndMetadata(), null], | 
| -        "class A with B, C {}", [ParserErrorCode.WITH_WITHOUT_EXTENDS]); | 
| +    createParser('class A with B, C {}'); | 
| +    ClassDeclaration declaration = | 
| +        parser.parseClassDeclaration(emptyCommentAndMetadata(), null); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.WITH_WITHOUT_EXTENDS]); | 
| } | 
|  | 
| void test_wrongSeparatorForNamedParameter() { | 
| -    parse4("parseFormalParameterList", "(a, {b = 0})", | 
| +    createParser('(a, {b = 0})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER]); | 
| } | 
|  | 
| void test_wrongSeparatorForPositionalParameter() { | 
| -    parse4("parseFormalParameterList", "(a, [b : 0])", | 
| +    createParser('(a, [b : 0])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER]); | 
| } | 
|  | 
| void test_wrongTerminatorForParameterGroup_named() { | 
| -    parse4("parseFormalParameterList", "(a, {b, c])", | 
| +    createParser('(a, {b, c])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]); | 
| } | 
|  | 
| void test_wrongTerminatorForParameterGroup_optional() { | 
| -    parse4("parseFormalParameterList", "(a, [b, c})", | 
| +    createParser('(a, [b, c})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]); | 
| } | 
| } | 
| @@ -2397,7 +2784,10 @@ class NonErrorParserTest extends ParserTestCase { | 
| void test_staticMethod_notParsingFunctionBodies() { | 
| ParserTestCase.parseFunctionBodies = false; | 
| try { | 
| -      parse4("parseCompilationUnit", "class C { static void m() {} }"); | 
| +      createParser('class C { static void m() {} }'); | 
| +      CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +      expectNotNullIfNoErrors(unit); | 
| +      listener.assertNoErrors(); | 
| } finally { | 
| ParserTestCase.parseFunctionBodies = true; | 
| } | 
| @@ -2450,6 +2840,20 @@ class ParserTestCase extends EngineTestCase { | 
| bool enableNnbd = 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; | 
| + | 
| +  /** | 
| * Return a CommentAndMetadata object with the given values that can be used for testing. | 
| * | 
| * @param comment the comment to be wrapped in the object | 
| @@ -2462,95 +2866,70 @@ class ParserTestCase extends EngineTestCase { | 
| } | 
|  | 
| /** | 
| -   * Return an empty CommentAndMetadata object that can be used for testing. | 
| -   * | 
| -   * @return an empty CommentAndMetadata object that can be used for testing | 
| +   * Create the [parser] and [listener] used by a test. The [parser] will be | 
| +   * prepared to parse the tokens scanned from the given [content]. | 
| */ | 
| -  CommentAndMetadata emptyCommentAndMetadata() => | 
| -      new CommentAndMetadata(null, null); | 
| - | 
| -  /** | 
| -   * Invoke a method in [Parser]. The method is assumed to have the given number and type of | 
| -   * parameters and will be invoked with the given arguments. | 
| -   * | 
| -   * The given source is scanned and the parser is initialized to start with the first token in the | 
| -   * source before the method is invoked. | 
| -   * | 
| -   * @param methodName the name of the method that should be invoked | 
| -   * @param objects the values of the arguments to the method | 
| -   * @param source the source to be processed by the parse method | 
| -   * @param listener the error listener that will be used for both scanning and parsing | 
| -   * @return the result of invoking the method | 
| -   * @throws Exception if the method could not be invoked or throws an exception | 
| -   * @throws AssertionFailedError if the result is `null` or the errors produced while | 
| -   *           scanning and parsing the source do not match the expected errors | 
| -   */ | 
| -  Object invokeParserMethod(String methodName, List<Object> objects, | 
| -      String source, GatheringErrorListener listener) { | 
| +  void createParser(String content) { | 
| +    listener = new GatheringErrorListener(); | 
| // | 
| // Scan the source. | 
| // | 
| -    Scanner scanner = | 
| -        new Scanner(null, new CharSequenceReader(source), listener); | 
| +    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(new TestSource(), scanner.lineStarts); | 
| +    listener.setLineInfo(source, scanner.lineStarts); | 
| // | 
| -    // Parse the source. | 
| +    // Create and initialize the parser. | 
| // | 
| -    Parser parser = createParser(listener); | 
| +    parser = new Parser(source, listener); | 
| parser.enableAssertInitializer = enableAssertInitializer; | 
| parser.parseAsync = parseAsync; | 
| parser.parseGenericMethods = enableGenericMethods; | 
| parser.parseGenericMethodComments = enableGenericMethodComments; | 
| parser.parseFunctionBodies = parseFunctionBodies; | 
| parser.enableNnbd = enableNnbd; | 
| -    Object result = | 
| -        invokeParserMethodImpl(parser, methodName, objects, tokenStream); | 
| -    // | 
| -    // Partially test the results. | 
| -    // | 
| +    parser.currentToken = tokenStream; | 
| +  } | 
| + | 
| +  /** | 
| +   * Return an empty CommentAndMetadata object that can be used for testing. | 
| +   * | 
| +   * @return an empty CommentAndMetadata object that can be used for testing | 
| +   */ | 
| +  CommentAndMetadata emptyCommentAndMetadata() => | 
| +      new CommentAndMetadata(null, null); | 
| + | 
| +  void expectNotNullIfNoErrors(Object result) { | 
| if (!listener.hasErrors) { | 
| expect(result, isNotNull); | 
| } | 
| -    return result; | 
| } | 
|  | 
| /** | 
| -   * Invoke a method in [Parser]. The method is assumed to have no arguments. | 
| +   * Invoke a method in [Parser]. The method is assumed to have the given number and type of | 
| +   * parameters and will be invoked with the given arguments. | 
| * | 
| * The given source is scanned and the parser is initialized to start with the first token in the | 
| * source before the method is invoked. | 
| * | 
| * @param methodName the name of the method that should be invoked | 
| +   * @param objects the values of the arguments to the method | 
| * @param source the source to be processed by the parse method | 
| -   * @param listener the error listener that will be used for both scanning and parsing | 
| * @return the result of invoking the method | 
| * @throws Exception if the method could not be invoked or throws an exception | 
| * @throws AssertionFailedError if the result is `null` or the errors produced while | 
| *           scanning and parsing the source do not match the expected errors | 
| */ | 
| -  Object invokeParserMethod2( | 
| -          String methodName, String source, GatheringErrorListener listener) => | 
| -      invokeParserMethod(methodName, _EMPTY_ARGUMENTS, source, listener); | 
| - | 
| -  /** | 
| -   * Invoke a parse method in [Parser]. The method is assumed to have the given number and | 
| -   * type of parameters and will be invoked with the given arguments. | 
| -   * | 
| -   * The given source is scanned and the parser is initialized to start with the first token in the | 
| -   * source before the parse method is invoked. | 
| -   * | 
| -   * @param methodName the name of the parse method that should be invoked to parse the source | 
| -   * @param objects the values of the arguments to the method | 
| -   * @param source the source to be parsed by the parse method | 
| -   * @return the result of invoking the method | 
| -   * @throws Exception if the method could not be invoked or throws an exception | 
| -   * @throws AssertionFailedError if the result is `null` or if any errors are produced | 
| -   */ | 
| -  Object parse(String methodName, List<Object> objects, String source) => | 
| -      parse2(methodName, objects, source); | 
| +  Object invokeParserMethod( | 
| +      String methodName, List<Object> objects, String source) { | 
| +    createParser(source); | 
| +    Object result = invokeParserMethodImpl(parser, methodName, objects); | 
| +    expectNotNullIfNoErrors(result); | 
| +    return result; | 
| +  } | 
|  | 
| /** | 
| * Invoke a parse method in [Parser]. The method is assumed to have the given number and | 
| @@ -2568,23 +2947,20 @@ class ParserTestCase extends EngineTestCase { | 
| * @throws AssertionFailedError if the result is `null` or the errors produced while | 
| *           scanning and parsing the source do not match the expected errors | 
| */ | 
| -  Object parse2(String methodName, List<Object> objects, String source, | 
| +  Object parse(String methodName, List<Object> objects, String source, | 
| [List<AnalysisError> errors = AnalysisError.NO_ERRORS]) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    Object result = invokeParserMethod(methodName, objects, source, listener); | 
| +    Object result = invokeParserMethod(methodName, objects, source); | 
| listener.assertErrors(errors); | 
| return result; | 
| } | 
|  | 
| /** | 
| -   * Invoke a parse method in [Parser]. The method is assumed to have the given number and | 
| -   * type of parameters and will be invoked with the given arguments. | 
| +   * Invoke a parse method in [Parser]. The method is assumed to have no arguments. | 
| * | 
| * The given source is scanned and the parser is initialized to start with the first token in the | 
| * source before the parse method is invoked. | 
| * | 
| * @param methodName the name of the parse method that should be invoked to parse the source | 
| -   * @param objects the values of the arguments to the method | 
| * @param source the source to be parsed by the parse method | 
| * @param errorCodes the error codes of the errors that should be generated | 
| * @return the result of invoking the method | 
| @@ -2592,52 +2968,22 @@ class ParserTestCase extends EngineTestCase { | 
| * @throws AssertionFailedError if the result is `null` or the errors produced while | 
| *           scanning and parsing the source do not match the expected errors | 
| */ | 
| -  Object parse3(String methodName, List<Object> objects, String source, | 
| +  Object parse4(String methodName, String source, | 
| [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    Object result = invokeParserMethod(methodName, objects, source, listener); | 
| +    Object result = invokeParserMethod(methodName, _EMPTY_ARGUMENTS, source); | 
| listener.assertErrorsWithCodes(errorCodes); | 
| return result; | 
| } | 
|  | 
| /** | 
| -   * Invoke a parse method in [Parser]. The method is assumed to have no arguments. | 
| -   * | 
| -   * The given source is scanned and the parser is initialized to start with the first token in the | 
| -   * source before the parse method is invoked. | 
| -   * | 
| -   * @param methodName the name of the parse method that should be invoked to parse the source | 
| -   * @param source the source to be parsed by the parse method | 
| -   * @param errorCodes the error codes of the errors that should be generated | 
| -   * @return the result of invoking the method | 
| -   * @throws Exception if the method could not be invoked or throws an exception | 
| -   * @throws AssertionFailedError if the result is `null` or the errors produced while | 
| -   *           scanning and parsing the source do not match the expected errors | 
| -   */ | 
| -  Object parse4(String methodName, String source, | 
| -          [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) => | 
| -      parse3(methodName, _EMPTY_ARGUMENTS, source, errorCodes); | 
| - | 
| -  /** | 
| * 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 = ErrorCode.EMPTY_LIST]) { | 
| -    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 = createParser(listener); | 
| -    parser.enableAssertInitializer = enableAssertInitializer; | 
| -    parser.parseAsync = parseAsync; | 
| -    parser.parseFunctionBodies = parseFunctionBodies; | 
| -    parser.parseGenericMethods = enableGenericMethods; | 
| -    parser.parseGenericMethodComments = enableGenericMethodComments; | 
| -    parser.enableNnbd = enableNnbd; | 
| -    CompilationUnit unit = parser.parseCompilationUnit(token); | 
| +    createParser(source); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| expect(unit, isNotNull); | 
| listener.assertErrorsWithCodes(errorCodes); | 
| return unit; | 
| @@ -2654,17 +3000,8 @@ class ParserTestCase extends EngineTestCase { | 
| */ | 
| Expression parseExpression(String source, | 
| [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    Scanner scanner = | 
| -        new Scanner(null, new CharSequenceReader(source), listener); | 
| -    scanner.scanGenericMethodComments = enableGenericMethodComments; | 
| -    listener.setLineInfo(new TestSource(), scanner.lineStarts); | 
| -    Token token = scanner.tokenize(); | 
| -    Parser parser = createParser(listener); | 
| -    parser.parseGenericMethods = enableGenericMethods; | 
| -    parser.parseGenericMethodComments = enableGenericMethodComments; | 
| -    parser.enableNnbd = enableNnbd; | 
| -    Expression expression = parser.parseExpression(token); | 
| +    createParser(source); | 
| +    Expression expression = parser.parseExpression2(); | 
| expect(expression, isNotNull); | 
| listener.assertErrorsWithCodes(errorCodes); | 
| return expression; | 
| @@ -2677,16 +3014,6 @@ class ParserTestCase extends EngineTestCase { | 
| } | 
|  | 
| /** | 
| -   * Create a parser. | 
| -   * | 
| -   * @param listener the listener to be passed to the parser | 
| -   * @return the parser that was created | 
| -   */ | 
| -  static Parser createParser(GatheringErrorListener listener) { | 
| -    return new Parser(null, listener); | 
| -  } | 
| - | 
| -  /** | 
| * Parse the given source as a compilation unit. | 
| * | 
| * @param source the source to be parsed | 
| @@ -2702,7 +3029,7 @@ class ParserTestCase extends EngineTestCase { | 
| new Scanner(null, new CharSequenceReader(source), listener); | 
| listener.setLineInfo(new TestSource(), scanner.lineStarts); | 
| Token token = scanner.tokenize(); | 
| -    Parser parser = createParser(listener); | 
| +    Parser parser = new Parser(null, listener); | 
| CompilationUnit unit = parser.parseCompilationUnit(token); | 
| expect(unit, isNotNull); | 
| listener.assertErrorsWithCodes(errorCodes); | 
| @@ -2724,7 +3051,7 @@ class ParserTestCase extends EngineTestCase { | 
| scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators; | 
| listener.setLineInfo(new TestSource(), scanner.lineStarts); | 
| Token token = scanner.tokenize(); | 
| -    Parser parser = createParser(listener); | 
| +    Parser parser = new Parser(null, listener); | 
| Statement statement = parser.parseStatement(token); | 
| expect(statement, isNotNull); | 
| listener.assertErrorsWithCodes(errorCodes); | 
| @@ -2749,7 +3076,7 @@ class ParserTestCase extends EngineTestCase { | 
| new Scanner(null, new CharSequenceReader(source), listener); | 
| listener.setLineInfo(new TestSource(), scanner.lineStarts); | 
| Token token = scanner.tokenize(); | 
| -    Parser parser = createParser(listener); | 
| +    Parser parser = new Parser(null, listener); | 
| List<Statement> statements = parser.parseStatements(token); | 
| expect(statements, hasLength(expectedCount)); | 
| listener.assertErrorsWithCodes(errorCodes); | 
| @@ -3093,19 +3420,27 @@ class B = Object with A {}''', | 
| } | 
|  | 
| void test_conditionalExpression_missingElse() { | 
| -    ConditionalExpression expression = parse4("parseConditionalExpression", | 
| -        "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| -    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, | 
| -        SimpleIdentifier, expression.elseExpression); | 
| -    expect(expression.elseExpression.isSynthetic, isTrue); | 
| +    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_conditionalExpression_missingThen() { | 
| -    ConditionalExpression expression = parse4("parseConditionalExpression", | 
| -        "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]); | 
| -    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, | 
| -        SimpleIdentifier, expression.thenExpression); | 
| -    expect(expression.thenExpression.isSynthetic, isTrue); | 
| +    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_declarationBeforeDirective() { | 
| @@ -3187,8 +3522,10 @@ class B = Object with A {}''', | 
| } | 
|  | 
| void test_expressionList_multiple_end() { | 
| -    List<Expression> result = parse4("parseExpressionList", ", 2, 3, 4", | 
| -        [ParserErrorCode.MISSING_IDENTIFIER]) as List<Expression>; | 
| +    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, | 
| @@ -3197,8 +3534,10 @@ class B = Object with A {}''', | 
| } | 
|  | 
| void test_expressionList_multiple_middle() { | 
| -    List<Expression> result = parse4("parseExpressionList", "1, 2, , 4", | 
| -        [ParserErrorCode.MISSING_IDENTIFIER]) as List<Expression>; | 
| +    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, | 
| @@ -3207,8 +3546,10 @@ class B = Object with A {}''', | 
| } | 
|  | 
| void test_expressionList_multiple_start() { | 
| -    List<Expression> result = parse4("parseExpressionList", "1, 2, 3,", | 
| -        [ParserErrorCode.MISSING_IDENTIFIER]) as List<Expression>; | 
| +    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, | 
| @@ -3269,12 +3610,17 @@ class B = Object with A {}''', | 
| } | 
|  | 
| void test_incomplete_constructorInitializers_empty() { | 
| -    parse3("parseClassMember", ["C"], "C() : {}", | 
| -        [ParserErrorCode.MISSING_INITIALIZER]); | 
| +    createParser('C() : {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.MISSING_INITIALIZER]); | 
| } | 
|  | 
| void test_incomplete_constructorInitializers_missingEquals() { | 
| -    ClassMember member = parse3("parseClassMember", ["C"], "C() : x(3) {}", | 
| +    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 = | 
| @@ -3289,7 +3635,10 @@ class B = Object with A {}''', | 
| } | 
|  | 
| void test_incomplete_constructorInitializers_variable() { | 
| -    parse3("parseClassMember", ["C"], "C() : x {}", | 
| +    createParser('C() : x {}'); | 
| +    ClassMember member = parser.parseClassMember('C'); | 
| +    expectNotNullIfNoErrors(member); | 
| +    listener.assertErrorsWithCodes( | 
| [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]); | 
| } | 
|  | 
| @@ -3691,8 +4040,12 @@ class C { | 
| } | 
|  | 
| void test_missingIdentifier_afterAnnotation() { | 
| -    MethodDeclaration method = parse3("parseClassMember", <Object>["C"], | 
| -        "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]); | 
| +    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)); | 
| @@ -3802,10 +4155,11 @@ class C { | 
| } | 
|  | 
| void test_primaryExpression_argumentDefinitionTest() { | 
| -    Expression expression = parse4( | 
| -        "parsePrimaryExpression", "?a", [ParserErrorCode.UNEXPECTED_TOKEN]); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression); | 
| +    createParser('?a'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.UNEXPECTED_TOKEN]); | 
| +    expect(expression, new isInstanceOf<SimpleIdentifier>()); | 
| } | 
|  | 
| void test_relationalExpression_missing_LHS() { | 
| @@ -3976,9 +4330,13 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void fail_parseStatement_functionDeclaration_noReturnType_typeParameters() { | 
| enableGenericMethods = true; | 
| -    FunctionDeclarationStatement statement = | 
| -        parse4("parseStatement", "f<E>(a, b) {};"); | 
| -    expect(statement.functionDeclaration, isNotNull); | 
| +    createParser('f<E>(a, b) {};'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| +    expect(statement, new isInstanceOf<FunctionDeclarationStatement>()); | 
| +    FunctionDeclarationStatement declaration = statement; | 
| +    expect(declaration.functionDeclaration, isNotNull); | 
| } | 
|  | 
| void test_computeStringValue_emptyInterpolationPrefix() { | 
| @@ -4066,12 +4424,16 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_createSyntheticIdentifier() { | 
| -    SimpleIdentifier identifier = _createSyntheticIdentifier(); | 
| +    createParser(''); | 
| +    SimpleIdentifier identifier = parser.createSyntheticIdentifier(); | 
| +    expectNotNullIfNoErrors(identifier); | 
| expect(identifier.isSynthetic, isTrue); | 
| } | 
|  | 
| void test_createSyntheticStringLiteral() { | 
| -    SimpleStringLiteral literal = _createSyntheticStringLiteral(); | 
| +    createParser(''); | 
| +    SimpleStringLiteral literal = parser.createSyntheticStringLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| expect(literal.isSynthetic, isTrue); | 
| } | 
|  | 
| @@ -4322,25 +4684,36 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAdditiveExpression_normal() { | 
| -    BinaryExpression expression = parse4("parseAdditiveExpression", "x + y"); | 
| -    expect(expression.leftOperand, isNotNull); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.PLUS); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseAdditiveExpression_super() { | 
| -    BinaryExpression expression = | 
| -        parse4("parseAdditiveExpression", "super + y"); | 
| -    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, | 
| -        SuperExpression, expression.leftOperand); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.PLUS); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseAnnotation_n1() { | 
| -    Annotation annotation = parse4("parseAnnotation", "@A"); | 
| +    createParser('@A'); | 
| +    Annotation annotation = parser.parseAnnotation(); | 
| +    expectNotNullIfNoErrors(annotation); | 
| +    listener.assertNoErrors(); | 
| expect(annotation.atSign, isNotNull); | 
| expect(annotation.name, isNotNull); | 
| expect(annotation.period, isNull); | 
| @@ -4349,7 +4722,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAnnotation_n1_a() { | 
| -    Annotation annotation = parse4("parseAnnotation", "@A(x,y)"); | 
| +    createParser('@A(x,y)'); | 
| +    Annotation annotation = parser.parseAnnotation(); | 
| +    expectNotNullIfNoErrors(annotation); | 
| +    listener.assertNoErrors(); | 
| expect(annotation.atSign, isNotNull); | 
| expect(annotation.name, isNotNull); | 
| expect(annotation.period, isNull); | 
| @@ -4358,7 +4734,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAnnotation_n2() { | 
| -    Annotation annotation = parse4("parseAnnotation", "@A.B"); | 
| +    createParser('@A.B'); | 
| +    Annotation annotation = parser.parseAnnotation(); | 
| +    expectNotNullIfNoErrors(annotation); | 
| +    listener.assertNoErrors(); | 
| expect(annotation.atSign, isNotNull); | 
| expect(annotation.name, isNotNull); | 
| expect(annotation.period, isNull); | 
| @@ -4367,7 +4746,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAnnotation_n2_a() { | 
| -    Annotation annotation = parse4("parseAnnotation", "@A.B(x,y)"); | 
| +    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); | 
| @@ -4376,7 +4758,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAnnotation_n3() { | 
| -    Annotation annotation = parse4("parseAnnotation", "@A.B.C"); | 
| +    createParser('@A.B.C'); | 
| +    Annotation annotation = parser.parseAnnotation(); | 
| +    expectNotNullIfNoErrors(annotation); | 
| +    listener.assertNoErrors(); | 
| expect(annotation.atSign, isNotNull); | 
| expect(annotation.name, isNotNull); | 
| expect(annotation.period, isNotNull); | 
| @@ -4385,7 +4770,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAnnotation_n3_a() { | 
| -    Annotation annotation = parse4("parseAnnotation", "@A.B.C(x,y)"); | 
| +    createParser('@A.B.C(x,y)'); | 
| +    Annotation annotation = parser.parseAnnotation(); | 
| +    expectNotNullIfNoErrors(annotation); | 
| +    listener.assertNoErrors(); | 
| expect(annotation.atSign, isNotNull); | 
| expect(annotation.name, isNotNull); | 
| expect(annotation.period, isNotNull); | 
| @@ -4394,53 +4782,80 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseArgument_named() { | 
| -    NamedExpression expression = parse4("parseArgument", "n: x"); | 
| -    Label name = expression.name; | 
| +    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(expression.expression, isNotNull); | 
| +    expect(namedExpression.expression, isNotNull); | 
| } | 
|  | 
| void test_parseArgument_unnamed() { | 
| String lexeme = "x"; | 
| -    SimpleIdentifier identifier = parse4("parseArgument", lexeme); | 
| +    createParser(lexeme); | 
| +    Expression expression = parser.parseArgument(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleIdentifier>()); | 
| +    SimpleIdentifier identifier = expression; | 
| expect(identifier.name, lexeme); | 
| } | 
|  | 
| void test_parseArgumentList_empty() { | 
| -    ArgumentList argumentList = parse4("parseArgumentList", "()"); | 
| +    createParser('()'); | 
| +    ArgumentList argumentList = parser.parseArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| NodeList<Expression> arguments = argumentList.arguments; | 
| expect(arguments, hasLength(0)); | 
| } | 
|  | 
| void test_parseArgumentList_mixed() { | 
| -    ArgumentList argumentList = | 
| -        parse4("parseArgumentList", "(w, x, y: y, z: z)"); | 
| +    createParser('(w, x, y: y, z: z)'); | 
| +    ArgumentList argumentList = parser.parseArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| NodeList<Expression> arguments = argumentList.arguments; | 
| expect(arguments, hasLength(4)); | 
| } | 
|  | 
| void test_parseArgumentList_noNamed() { | 
| -    ArgumentList argumentList = parse4("parseArgumentList", "(x, y, z)"); | 
| +    createParser('(x, y, z)'); | 
| +    ArgumentList argumentList = parser.parseArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| NodeList<Expression> arguments = argumentList.arguments; | 
| expect(arguments, hasLength(3)); | 
| } | 
|  | 
| void test_parseArgumentList_onlyNamed() { | 
| -    ArgumentList argumentList = parse4("parseArgumentList", "(x: x, y: y)"); | 
| +    createParser('(x: x, y: y)'); | 
| +    ArgumentList argumentList = parser.parseArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| NodeList<Expression> arguments = argumentList.arguments; | 
| expect(arguments, hasLength(2)); | 
| } | 
|  | 
| void test_parseArgumentList_trailing_comma() { | 
| -    ArgumentList argumentList = parse4("parseArgumentList", "(x, y, z,)"); | 
| +    createParser('(x, y, z,)'); | 
| +    ArgumentList argumentList = parser.parseArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| NodeList<Expression> arguments = argumentList.arguments; | 
| expect(arguments, hasLength(3)); | 
| } | 
|  | 
| void test_parseAssertStatement() { | 
| -    AssertStatement statement = parse4("parseAssertStatement", "assert (x);"); | 
| +    createParser('assert (x);'); | 
| +    AssertStatement statement = parser.parseAssertStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.assertKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.condition, isNotNull); | 
| @@ -4455,8 +4870,10 @@ class SimpleParserTest extends ParserTestCase { | 
| // 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. | 
| -    AssertStatement statement = | 
| -        parse4('parseAssertStatement', 'assert (x, throw "foo");'); | 
| +    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); | 
| @@ -4467,8 +4884,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAssertStatement_messageString() { | 
| -    AssertStatement statement = | 
| -        parse4('parseAssertStatement', 'assert (x, "foo");'); | 
| +    createParser('assert (x, "foo");'); | 
| +    AssertStatement statement = parser.parseAssertStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.assertKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.condition, isNotNull); | 
| @@ -4670,7 +5089,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseAwaitExpression() { | 
| -    AwaitExpression expression = parse4("parseAwaitExpression", "await x;"); | 
| +    createParser('await x;'); | 
| +    AwaitExpression expression = parser.parseAwaitExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| expect(expression.awaitKeyword, isNotNull); | 
| expect(expression.expression, isNotNull); | 
| } | 
| @@ -4705,90 +5127,130 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseBitwiseAndExpression_normal() { | 
| -    BinaryExpression expression = parse4("parseBitwiseAndExpression", "x & y"); | 
| -    expect(expression.leftOperand, isNotNull); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.AMPERSAND); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseBitwiseAndExpression_super() { | 
| -    BinaryExpression expression = | 
| -        parse4("parseBitwiseAndExpression", "super & y"); | 
| -    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, | 
| -        SuperExpression, expression.leftOperand); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.AMPERSAND); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseBitwiseOrExpression_normal() { | 
| -    BinaryExpression expression = parse4("parseBitwiseOrExpression", "x | y"); | 
| -    expect(expression.leftOperand, isNotNull); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.BAR); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseBitwiseOrExpression_super() { | 
| -    BinaryExpression expression = | 
| -        parse4("parseBitwiseOrExpression", "super | y"); | 
| -    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, | 
| -        SuperExpression, expression.leftOperand); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.BAR); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseBitwiseXorExpression_normal() { | 
| -    BinaryExpression expression = parse4("parseBitwiseXorExpression", "x ^ y"); | 
| -    expect(expression.leftOperand, isNotNull); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.CARET); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseBitwiseXorExpression_super() { | 
| -    BinaryExpression expression = | 
| -        parse4("parseBitwiseXorExpression", "super ^ y"); | 
| -    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, | 
| -        SuperExpression, expression.leftOperand); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.CARET); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    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_parseBlock_empty() { | 
| -    Block block = parse4("parseBlock", "{}"); | 
| +    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() { | 
| -    Block block = parse4("parseBlock", "{;}"); | 
| +    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() { | 
| -    BreakStatement statement = parse4("parseBreakStatement", "break foo;"); | 
| +    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_parseBreakStatement_noLabel() { | 
| -    BreakStatement statement = parse4("parseBreakStatement", "break;", | 
| -        [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]); | 
| +    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_parseCascadeSection_i() { | 
| -    IndexExpression section = parse4("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); | 
| @@ -4796,38 +5258,51 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCascadeSection_ia() { | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..[i](b)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is IndexExpression, IndexExpression, section.function); | 
| +    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_parseCascadeSection_ia_typeArgumentComments() { | 
| enableGenericMethodComments = true; | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..[i]/*<E>*/(b)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is IndexExpression, IndexExpression, section.function); | 
| +    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_parseCascadeSection_ia_typeArguments() { | 
| enableGenericMethods = true; | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..[i]<E>(b)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is IndexExpression, IndexExpression, section.function); | 
| +    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_parseCascadeSection_ii() { | 
| -    MethodInvocation section = parse4("parseCascadeSection", "..a(b).c(d)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.target); | 
| +    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); | 
| @@ -4837,10 +5312,13 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_ii_typeArgumentComments() { | 
| enableGenericMethodComments = true; | 
| -    MethodInvocation section = | 
| -        parse4("parseCascadeSection", "..a/*<E>*/(b).c/*<F>*/(d)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.target); | 
| +    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); | 
| @@ -4850,10 +5328,13 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_ii_typeArguments() { | 
| enableGenericMethods = true; | 
| -    MethodInvocation section = | 
| -        parse4("parseCascadeSection", "..a<E>(b).c<F>(d)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.target); | 
| +    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); | 
| @@ -4862,14 +5343,24 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCascadeSection_p() { | 
| -    PropertyAccess section = parse4("parseCascadeSection", "..a"); | 
| +    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_parseCascadeSection_p_assign() { | 
| -    AssignmentExpression section = parse4("parseCascadeSection", "..a = 3"); | 
| +    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; | 
| @@ -4877,8 +5368,12 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCascadeSection_p_assign_withCascade() { | 
| -    AssignmentExpression section = | 
| -        parse4("parseCascadeSection", "..a = 3..m()"); | 
| +    createParser('..a = 3..m()'); | 
| +    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; | 
| @@ -4888,8 +5383,12 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() { | 
| enableGenericMethodComments = true; | 
| -    AssignmentExpression section = | 
| -        parse4("parseCascadeSection", "..a = 3..m/*<E>*/()"); | 
| +    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; | 
| @@ -4899,8 +5398,12 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_p_assign_withCascade_typeArguments() { | 
| enableGenericMethods = true; | 
| -    AssignmentExpression section = | 
| -        parse4("parseCascadeSection", "..a = 3..m<E>()"); | 
| +    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; | 
| @@ -4909,14 +5412,24 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCascadeSection_p_builtIn() { | 
| -    PropertyAccess section = parse4("parseCascadeSection", "..as"); | 
| +    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_parseCascadeSection_pa() { | 
| -    MethodInvocation section = parse4("parseCascadeSection", "..a(b)"); | 
| +    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); | 
| @@ -4927,7 +5440,12 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_pa_typeArgumentComments() { | 
| enableGenericMethodComments = true; | 
| -    MethodInvocation section = parse4("parseCascadeSection", "..a/*<E>*/(b)"); | 
| +    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); | 
| @@ -4938,7 +5456,12 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_pa_typeArguments() { | 
| enableGenericMethods = true; | 
| -    MethodInvocation section = parse4("parseCascadeSection", "..a<E>(b)"); | 
| +    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); | 
| @@ -4948,10 +5471,13 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCascadeSection_paa() { | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..a(b)(c)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.function); | 
| +    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)); | 
| @@ -4959,10 +5485,13 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_paa_typeArgumentComments() { | 
| enableGenericMethodComments = true; | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..a/*<E>*/(b)/*<F>*/(c)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.function); | 
| +    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)); | 
| @@ -4970,20 +5499,26 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_paa_typeArguments() { | 
| enableGenericMethods = true; | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..a<E>(b)<F>(c)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.function); | 
| +    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_parseCascadeSection_paapaa() { | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..a(b)(c).d(e)(f)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.function); | 
| +    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)); | 
| @@ -4991,10 +5526,13 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_paapaa_typeArgumentComments() { | 
| enableGenericMethodComments = true; | 
| -    FunctionExpressionInvocation section = parse4( | 
| -        "parseCascadeSection", "..a/*<E>*/(b)/*<F>*/(c).d/*<G>*/(e)/*<H>*/(f)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.function); | 
| +    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)); | 
| @@ -5002,17 +5540,25 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_paapaa_typeArguments() { | 
| enableGenericMethods = true; | 
| -    FunctionExpressionInvocation section = | 
| -        parse4("parseCascadeSection", "..a<E>(b)<F>(c).d<G>(e)<H>(f)"); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is MethodInvocation, MethodInvocation, section.function); | 
| +    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_parseCascadeSection_pap() { | 
| -    PropertyAccess section = parse4("parseCascadeSection", "..a(b).c"); | 
| +    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); | 
| @@ -5020,7 +5566,12 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_pap_typeArgumentComments() { | 
| enableGenericMethodComments = true; | 
| -    PropertyAccess section = parse4("parseCascadeSection", "..a/*<E>*/(b).c"); | 
| +    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); | 
| @@ -5028,7 +5579,12 @@ class SimpleParserTest extends ParserTestCase { | 
|  | 
| void test_parseCascadeSection_pap_typeArguments() { | 
| enableGenericMethods = true; | 
| -    PropertyAccess section = parse4("parseCascadeSection", "..a<E>(b).c"); | 
| +    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); | 
| @@ -5762,22 +6318,32 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCombinator_hide() { | 
| -    HideCombinator combinator = parse4('parseCombinator', 'hide a;'); | 
| +    createParser('hide a;'); | 
| +    Combinator combinator = parser.parseCombinator(); | 
| +    expectNotNullIfNoErrors(combinator); | 
| +    listener.assertNoErrors(); | 
| expect(combinator, new isInstanceOf<HideCombinator>()); | 
| -    expect(combinator.keyword, isNotNull); | 
| -    expect(combinator.hiddenNames, hasLength(1)); | 
| +    HideCombinator hideCombinator = combinator; | 
| +    expect(hideCombinator.keyword, isNotNull); | 
| +    expect(hideCombinator.hiddenNames, hasLength(1)); | 
| } | 
|  | 
| void test_parseCombinator_show() { | 
| -    ShowCombinator combinator = parse4('parseCombinator', 'show a;'); | 
| +    createParser('show a;'); | 
| +    Combinator combinator = parser.parseCombinator(); | 
| +    expectNotNullIfNoErrors(combinator); | 
| +    listener.assertNoErrors(); | 
| expect(combinator, new isInstanceOf<ShowCombinator>()); | 
| -    expect(combinator.keyword, isNotNull); | 
| -    expect(combinator.shownNames, hasLength(1)); | 
| +    ShowCombinator showCombinator = combinator; | 
| +    expect(showCombinator.keyword, isNotNull); | 
| +    expect(showCombinator.shownNames, hasLength(1)); | 
| } | 
|  | 
| void test_parseCombinators_h() { | 
| -    List<Combinator> combinators = | 
| -        parse4("parseCombinators", "hide a;") as List<Combinator>; | 
| +    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); | 
| @@ -5786,8 +6352,10 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCombinators_hs() { | 
| -    List<Combinator> combinators = | 
| -        parse4("parseCombinators", "hide a show b;") as List<Combinator>; | 
| +    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); | 
| @@ -5800,15 +6368,18 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCombinators_hshs() { | 
| -    List<Combinator> combinators = | 
| -        parse4("parseCombinators", "hide a show b hide c show d;") | 
| -        as List<Combinator>; | 
| +    createParser('hide a show b hide c show d;'); | 
| +    List<Combinator> combinators = parser.parseCombinators(); | 
| +    expectNotNullIfNoErrors(combinators); | 
| +    listener.assertNoErrors(); | 
| expect(combinators, hasLength(4)); | 
| } | 
|  | 
| void test_parseCombinators_s() { | 
| -    List<Combinator> combinators = | 
| -        parse4("parseCombinators", "show a;") as List<Combinator>; | 
| +    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); | 
| @@ -5817,75 +6388,94 @@ class SimpleParserTest extends ParserTestCase { | 
| } | 
|  | 
| void test_parseCommentAndMetadata_c() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "/** 1 */ void"); | 
| +    createParser('/** 1 */ void'); | 
| +    CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata(); | 
| +    expectNotNullIfNoErrors(commentAndMetadata); | 
| +    listener.assertNoErrors(); | 
| expect(commentAndMetadata.comment, isNotNull); | 
| expect(commentAndMetadata.metadata, isNull); | 
| } | 
|  | 
| void test_parseCommentAndMetadata_cmc() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ void"); | 
| +    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() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ @B void"); | 
| +    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_parseCommentAndMetadata_cmm() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "/** 1 */ @A @B void"); | 
| +    createParser('/** 1 */ @A @B void'); | 
| +    CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata(); | 
| +    expectNotNullIfNoErrors(commentAndMetadata); | 
| +    listener.assertNoErrors(); | 
| expect(commentAndMetadata.comment, isNotNull); | 
| expect(commentAndMetadata.metadata, hasLength(2)); | 
| } | 
|  | 
| void test_parseCommentAndMetadata_m() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "@A void"); | 
| +    createParser('@A void'); | 
| +    CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata(); | 
| +    expectNotNullIfNoErrors(commentAndMetadata); | 
| +    listener.assertNoErrors(); | 
| expect(commentAndMetadata.comment, isNull); | 
| expect(commentAndMetadata.metadata, hasLength(1)); | 
| } | 
|  | 
| void test_parseCommentAndMetadata_mcm() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "@A /** 1 */ @B void"); | 
| +    createParser('@A /** 1 */ @B void'); | 
| +    CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata(); | 
| +    expectNotNullIfNoErrors(commentAndMetadata); | 
| +    listener.assertNoErrors(); | 
| expect(commentAndMetadata.comment, isNotNull); | 
| expect(commentAndMetadata.metadata, hasLength(2)); | 
| } | 
|  | 
| void test_parseCommentAndMetadata_mcmc() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "@A /** 1 */ @B /** 2 */ void"); | 
| +    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_parseCommentAndMetadata_mm() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "@A @B(x) void"); | 
| +    createParser('@A @B(x) void'); | 
| +    CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata(); | 
| +    expectNotNullIfNoErrors(commentAndMetadata); | 
| +    listener.assertNoErrors(); | 
| expect(commentAndMetadata.comment, isNull); | 
| expect(commentAndMetadata.metadata, hasLength(2)); | 
| } | 
|  | 
| void test_parseCommentAndMetadata_none() { | 
| -    CommentAndMetadata commentAndMetadata = | 
| -        parse4("parseCommentAndMetadata", "void"); | 
| +    createParser('void'); | 
| +    CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata(); | 
| +    expectNotNullIfNoErrors(commentAndMetadata); | 
| +    listener.assertNoErrors(); | 
| expect(commentAndMetadata.comment, isNull); | 
| expect(commentAndMetadata.metadata, isNull); | 
| } | 
|  | 
| void test_parseCommentAndMetadata_singleLine() { | 
| -    CommentAndMetadata commentAndMetadata = parse4( | 
| -        "parseCommentAndMetadata", | 
| -        r''' | 
| +    createParser(r''' | 
| /// 1 | 
| /// 2 | 
| void'''); | 
| +    CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata(); | 
| +    expectNotNullIfNoErrors(commentAndMetadata); | 
| +    listener.assertNoErrors(); | 
| expect(commentAndMetadata.comment, isNotNull); | 
| expect(commentAndMetadata.metadata, isNull); | 
| } | 
| @@ -6299,79 +6889,98 @@ void'''); | 
| } | 
|  | 
| void test_parseCompilationUnit_abstractAsPrefix_parameterized() { | 
| -    CompilationUnit unit = parse4("parseCompilationUnit", | 
| -        "abstract<dynamic> _abstract = new abstract.A();"); | 
| +    createParser('abstract<dynamic> _abstract = new abstract.A();'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(1)); | 
| } | 
|  | 
| void test_parseCompilationUnit_builtIn_asFunctionName() { | 
| -    parse4("parseCompilationUnit", "abstract(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "as(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "dynamic(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "export(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "external(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "factory(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "get(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "implements(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "import(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "library(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "operator(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "part(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "set(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "static(x) => 0;"); | 
| -    parse4("parseCompilationUnit", "typedef(x) => 0;"); | 
| +    ParserTestCase.parseCompilationUnit('abstract(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('as(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('dynamic(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('export(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('external(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('factory(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('get(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('implements(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('import(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('library(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('operator(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('part(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('set(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('static(x) => 0;'); | 
| +    ParserTestCase.parseCompilationUnit('typedef(x) => 0;'); | 
| } | 
|  | 
| void test_parseCompilationUnit_directives_multiple() { | 
| -    CompilationUnit unit = | 
| -        parse4("parseCompilationUnit", "library l;\npart 'a.dart';"); | 
| +    createParser("library l;\npart 'a.dart';"); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(2)); | 
| expect(unit.declarations, hasLength(0)); | 
| } | 
|  | 
| void test_parseCompilationUnit_directives_single() { | 
| -    CompilationUnit unit = parse4("parseCompilationUnit", "library l;"); | 
| +    createParser('library l;'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(1)); | 
| expect(unit.declarations, hasLength(0)); | 
| } | 
|  | 
| void test_parseCompilationUnit_empty() { | 
| -    CompilationUnit unit = parse4("parseCompilationUnit", ""); | 
| +    createParser(''); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(0)); | 
| } | 
|  | 
| void test_parseCompilationUnit_exportAsPrefix() { | 
| -    CompilationUnit unit = | 
| -        parse4("parseCompilationUnit", "export.A _export = new export.A();"); | 
| +    createParser('export.A _export = new export.A();'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(1)); | 
| } | 
|  | 
| void test_parseCompilationUnit_exportAsPrefix_parameterized() { | 
| -    CompilationUnit unit = parse4( | 
| -        "parseCompilationUnit", "export<dynamic> _export = new export.A();"); | 
| +    createParser('export<dynamic> _export = new export.A();'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(1)); | 
| } | 
|  | 
| void test_parseCompilationUnit_operatorAsPrefix_parameterized() { | 
| -    CompilationUnit unit = parse4("parseCompilationUnit", | 
| -        "operator<dynamic> _operator = new operator.A();"); | 
| +    createParser('operator<dynamic> _operator = new operator.A();'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(1)); | 
| } | 
|  | 
| void test_parseCompilationUnit_script() { | 
| -    CompilationUnit unit = parse4("parseCompilationUnit", "#! /bin/dart"); | 
| +    createParser('#! /bin/dart'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNotNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(0)); | 
| @@ -6379,21 +6988,29 @@ void'''); | 
|  | 
| void test_parseCompilationUnit_skipFunctionBody_withInterpolation() { | 
| ParserTestCase.parseFunctionBodies = false; | 
| -    CompilationUnit unit = parse4("parseCompilationUnit", "f() { '\${n}'; }"); | 
| +    createParser('f() { "\${n}"; }'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.declarations, hasLength(1)); | 
| } | 
|  | 
| void test_parseCompilationUnit_topLevelDeclaration() { | 
| -    CompilationUnit unit = parse4("parseCompilationUnit", "class A {}"); | 
| +    createParser('class A {}'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(1)); | 
| } | 
|  | 
| void test_parseCompilationUnit_typedefAsPrefix() { | 
| -    CompilationUnit unit = | 
| -        parse4("parseCompilationUnit", "typedef.A _typedef = new typedef.A();"); | 
| +    createParser('typedef.A _typedef = new typedef.A();'); | 
| +    CompilationUnit unit = parser.parseCompilationUnit2(); | 
| +    expectNotNullIfNoErrors(unit); | 
| +    listener.assertNoErrors(); | 
| expect(unit.scriptTag, isNull); | 
| expect(unit.directives, hasLength(0)); | 
| expect(unit.declarations, hasLength(1)); | 
| @@ -6665,8 +7282,10 @@ void'''); | 
| } | 
|  | 
| void test_parseConditionalExpression() { | 
| -    ConditionalExpression expression = | 
| -        parse4("parseConditionalExpression", "x ? y : z"); | 
| +    createParser('x ? y : z'); | 
| +    ConditionalExpression expression = parser.parseConditionalExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| expect(expression.condition, isNotNull); | 
| expect(expression.question, isNotNull); | 
| expect(expression.thenExpression, isNotNull); | 
| @@ -6675,8 +7294,10 @@ void'''); | 
| } | 
|  | 
| void test_parseConfiguration_noOperator_dottedIdentifier() { | 
| -    Configuration configuration = | 
| -        parse4('parseConfiguration', "if (a.b) 'c.dart'"); | 
| +    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"]); | 
| @@ -6687,8 +7308,10 @@ void'''); | 
| } | 
|  | 
| void test_parseConfiguration_noOperator_simpleIdentifier() { | 
| -    Configuration configuration = | 
| -        parse4('parseConfiguration', "if (a) 'b.dart'"); | 
| +    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"]); | 
| @@ -6699,8 +7322,10 @@ void'''); | 
| } | 
|  | 
| void test_parseConfiguration_operator_dottedIdentifier() { | 
| -    Configuration configuration = | 
| -        parse4('parseConfiguration', "if (a.b == 'c') 'd.dart'"); | 
| +    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"]); | 
| @@ -6711,8 +7336,10 @@ void'''); | 
| } | 
|  | 
| void test_parseConfiguration_operator_simpleIdentifier() { | 
| -    Configuration configuration = | 
| -        parse4('parseConfiguration', "if (a == 'b') 'c.dart'"); | 
| +    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"]); | 
| @@ -6723,19 +7350,28 @@ void'''); | 
| } | 
|  | 
| void test_parseConstExpression_instanceCreation() { | 
| -    InstanceCreationExpression expression = | 
| -        parse4("parseConstExpression", "const A()"); | 
| -    expect(expression.keyword, isNotNull); | 
| -    ConstructorName name = expression.constructorName; | 
| +    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(expression.argumentList, isNotNull); | 
| +    expect(instanceCreation.argumentList, isNotNull); | 
| } | 
|  | 
| void test_parseConstExpression_listLiteral_typed() { | 
| -    ListLiteral literal = parse4("parseConstExpression", "const <A> []"); | 
| +    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); | 
| @@ -6745,7 +7381,12 @@ void'''); | 
|  | 
| void test_parseConstExpression_listLiteral_typed_genericComment() { | 
| enableGenericMethodComments = true; | 
| -    ListLiteral literal = parse4("parseConstExpression", "const /*<A>*/ []"); | 
| +    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); | 
| @@ -6754,7 +7395,12 @@ void'''); | 
| } | 
|  | 
| void test_parseConstExpression_listLiteral_untyped() { | 
| -    ListLiteral literal = parse4("parseConstExpression", "const []"); | 
| +    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); | 
| @@ -6763,7 +7409,12 @@ void'''); | 
| } | 
|  | 
| void test_parseConstExpression_mapLiteral_typed() { | 
| -    MapLiteral literal = parse4("parseConstExpression", "const <A, B> {}"); | 
| +    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); | 
| @@ -6772,7 +7423,12 @@ void'''); | 
|  | 
| void test_parseConstExpression_mapLiteral_typed_genericComment() { | 
| enableGenericMethodComments = true; | 
| -    MapLiteral literal = parse4("parseConstExpression", "const /*<A, B>*/ {}"); | 
| +    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); | 
| @@ -6780,7 +7436,12 @@ void'''); | 
| } | 
|  | 
| void test_parseConstExpression_mapLiteral_untyped() { | 
| -    MapLiteral literal = parse4("parseConstExpression", "const {}"); | 
| +    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); | 
| @@ -6828,7 +7489,7 @@ void'''); | 
|  | 
| void test_parseConstructorFieldInitializer_qualified() { | 
| ConstructorFieldInitializer invocation = | 
| -        parse2("parseConstructorFieldInitializer", [true], "this.a = b"); | 
| +        parse("parseConstructorFieldInitializer", [true], "this.a = b"); | 
| expect(invocation.equals, isNotNull); | 
| expect(invocation.expression, isNotNull); | 
| expect(invocation.fieldName, isNotNull); | 
| @@ -6838,7 +7499,7 @@ void'''); | 
|  | 
| void test_parseConstructorFieldInitializer_unqualified() { | 
| ConstructorFieldInitializer invocation = | 
| -        parse2("parseConstructorFieldInitializer", [false], "a = b"); | 
| +        parse("parseConstructorFieldInitializer", [false], "a = b"); | 
| expect(invocation.equals, isNotNull); | 
| expect(invocation.expression, isNotNull); | 
| expect(invocation.fieldName, isNotNull); | 
| @@ -6847,44 +7508,60 @@ void'''); | 
| } | 
|  | 
| void test_parseConstructorName_named_noPrefix() { | 
| -    ConstructorName name = parse4("parseConstructorName", "A.n;"); | 
| +    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_parseConstructorName_named_prefixed() { | 
| -    ConstructorName name = parse4("parseConstructorName", "p.A.n;"); | 
| +    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_parseConstructorName_unnamed_noPrefix() { | 
| -    ConstructorName name = parse4("parseConstructorName", "A;"); | 
| +    createParser('A;'); | 
| +    ConstructorName name = parser.parseConstructorName(); | 
| +    expectNotNullIfNoErrors(name); | 
| +    listener.assertNoErrors(); | 
| expect(name.type, isNotNull); | 
| expect(name.period, isNull); | 
| expect(name.name, isNull); | 
| } | 
|  | 
| void test_parseConstructorName_unnamed_prefixed() { | 
| -    ConstructorName name = parse4("parseConstructorName", "p.A;"); | 
| +    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_parseContinueStatement_label() { | 
| -    ContinueStatement statement = parse4("parseContinueStatement", | 
| -        "continue foo;", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]); | 
| +    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_parseContinueStatement_noLabel() { | 
| -    ContinueStatement statement = parse4("parseContinueStatement", "continue;", | 
| -        [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]); | 
| +    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); | 
| @@ -6980,14 +7657,22 @@ void'''); | 
| } | 
|  | 
| void test_parseDocumentationComment_block() { | 
| -    Comment comment = parse4("parseDocumentationComment", "/** */ class"); | 
| +    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_parseDocumentationComment_block_withReference() { | 
| -    Comment comment = parse4("parseDocumentationComment", "/** [a] */ class"); | 
| +    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); | 
| @@ -6999,14 +7684,21 @@ void'''); | 
| } | 
|  | 
| void test_parseDocumentationComment_endOfLine() { | 
| -    Comment comment = parse4("parseDocumentationComment", "/// \n/// \n class"); | 
| +    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_parseDoStatement() { | 
| -    DoStatement statement = parse4("parseDoStatement", "do {} while (x);"); | 
| +    createParser('do {} while (x);'); | 
| +    DoStatement statement = parser.parseDoStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.doKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| expect(statement.whileKeyword, isNotNull); | 
| @@ -7017,17 +7709,26 @@ void'''); | 
| } | 
|  | 
| void test_parseDottedName_multiple() { | 
| -    DottedName name = parse4("parseDottedName", "a.b.c"); | 
| +    createParser('a.b.c'); | 
| +    DottedName name = parser.parseDottedName(); | 
| +    expectNotNullIfNoErrors(name); | 
| +    listener.assertNoErrors(); | 
| _expectDottedName(name, ["a", "b", "c"]); | 
| } | 
|  | 
| void test_parseDottedName_single() { | 
| -    DottedName name = parse4("parseDottedName", "a"); | 
| +    createParser('a'); | 
| +    DottedName name = parser.parseDottedName(); | 
| +    expectNotNullIfNoErrors(name); | 
| +    listener.assertNoErrors(); | 
| _expectDottedName(name, ["a"]); | 
| } | 
|  | 
| void test_parseEmptyStatement() { | 
| -    EmptyStatement statement = parse4("parseEmptyStatement", ";"); | 
| +    createParser(';'); | 
| +    EmptyStatement statement = parser.parseEmptyStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.semicolon, isNotNull); | 
| } | 
|  | 
| @@ -7567,397 +8268,488 @@ void'''); | 
| } | 
|  | 
| void test_parseFormalParameterList_empty() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "()"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNull); | 
| -    expect(parameterList.parameters, hasLength(0)); | 
| -    expect(parameterList.rightDelimiter, isNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('()'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNull); | 
| +    expect(list.parameters, hasLength(0)); | 
| +    expect(list.rightDelimiter, isNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_named_multiple() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "({A a : 1, B b, C c : 3})"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(3)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('({A a : 1, B b, C c : 3})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(3)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_named_single() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "({A a})"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(1)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('({A a})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(1)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_named_trailing_comma() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(A a, {B b,})"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(2)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(A a, {B b,})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(2)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_normal_multiple() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(A a, B b, C c)"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNull); | 
| -    expect(parameterList.parameters, hasLength(3)); | 
| -    expect(parameterList.rightDelimiter, isNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(A a, B b, C c)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNull); | 
| +    expect(list.parameters, hasLength(3)); | 
| +    expect(list.rightDelimiter, isNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_normal_named() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(A a, {B b})"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(2)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(A a, {B b})'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(2)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_normal_positional() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(A a, [B b])"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(2)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(A a, [B b])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(2)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_normal_single() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(A a)"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNull); | 
| -    expect(parameterList.parameters, hasLength(1)); | 
| -    expect(parameterList.rightDelimiter, isNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(A a)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNull); | 
| +    expect(list.parameters, hasLength(1)); | 
| +    expect(list.rightDelimiter, isNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_normal_single_trailing_comma() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(A a,)"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNull); | 
| -    expect(parameterList.parameters, hasLength(1)); | 
| -    expect(parameterList.rightDelimiter, isNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(A a,)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNull); | 
| +    expect(list.parameters, hasLength(1)); | 
| +    expect(list.rightDelimiter, isNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_positional_multiple() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "([A a = null, B b, C c = null])"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(3)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('([A a = null, B b, C c = null])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(3)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_positional_single() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "([A a = null])"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(1)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('([A a = null])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(1)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_positional_trailing_comma() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(A a, [B b,])"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNotNull); | 
| -    expect(parameterList.parameters, hasLength(2)); | 
| -    expect(parameterList.rightDelimiter, isNotNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(A a, [B b,])'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertNoErrors(); | 
| +    expect(list.leftParenthesis, isNotNull); | 
| +    expect(list.leftDelimiter, isNotNull); | 
| +    expect(list.parameters, hasLength(2)); | 
| +    expect(list.rightDelimiter, isNotNull); | 
| +    expect(list.rightParenthesis, isNotNull); | 
| } | 
|  | 
| void test_parseFormalParameterList_prefixedType() { | 
| -    FormalParameterList parameterList = | 
| -        parse4("parseFormalParameterList", "(io.File f)"); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNull); | 
| -    expect(parameterList.parameters, hasLength(1)); | 
| -    expect(parameterList.parameters[0].toSource(), 'io.File f'); | 
| -    expect(parameterList.rightDelimiter, isNull); | 
| -    expect(parameterList.rightParenthesis, isNotNull); | 
| +    createParser('(io.File f)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.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 parameterList = parse4( | 
| -        "parseFormalParameterList", "(io.)", [ | 
| +    createParser('(io.)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ | 
| ParserErrorCode.MISSING_IDENTIFIER, | 
| ParserErrorCode.MISSING_IDENTIFIER | 
| ]); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNull); | 
| -    expect(parameterList.parameters, hasLength(1)); | 
| -    expect(parameterList.parameters[0].toSource(), 'io. '); | 
| -    expect(parameterList.rightDelimiter, isNull); | 
| -    expect(parameterList.rightParenthesis, 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 parameterList = parse4( | 
| -        "parseFormalParameterList", "(io.,a)", [ | 
| +    createParser('(io.,a)'); | 
| +    FormalParameterList list = parser.parseFormalParameterList(); | 
| +    expectNotNullIfNoErrors(list); | 
| +    listener.assertErrorsWithCodes([ | 
| ParserErrorCode.MISSING_IDENTIFIER, | 
| ParserErrorCode.MISSING_IDENTIFIER | 
| ]); | 
| -    expect(parameterList.leftParenthesis, isNotNull); | 
| -    expect(parameterList.leftDelimiter, isNull); | 
| -    expect(parameterList.parameters, hasLength(2)); | 
| -    expect(parameterList.parameters[0].toSource(), 'io. '); | 
| -    expect(parameterList.parameters[1].toSource(), 'a'); | 
| -    expect(parameterList.rightDelimiter, isNull); | 
| -    expect(parameterList.rightParenthesis, 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_parseForStatement_each_await() { | 
| -    ForEachStatement statement = | 
| -        parse4("parseForStatement", "await for (element in list) {}"); | 
| -    expect(statement.awaitKeyword, isNotNull); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.loopVariable, isNull); | 
| -    expect(statement.identifier, isNotNull); | 
| -    expect(statement.inKeyword, isNotNull); | 
| -    expect(statement.iterable, isNotNull); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_each_identifier() { | 
| -    ForEachStatement statement = | 
| -        parse4("parseForStatement", "for (element in list) {}"); | 
| -    expect(statement.awaitKeyword, isNull); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.loopVariable, isNull); | 
| -    expect(statement.identifier, isNotNull); | 
| -    expect(statement.inKeyword, isNotNull); | 
| -    expect(statement.iterable, isNotNull); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_each_noType_metadata() { | 
| -    ForEachStatement statement = | 
| -        parse4("parseForStatement", "for (@A var element in list) {}"); | 
| -    expect(statement.awaitKeyword, isNull); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.loopVariable, isNotNull); | 
| -    expect(statement.loopVariable.metadata, hasLength(1)); | 
| -    expect(statement.identifier, isNull); | 
| -    expect(statement.inKeyword, isNotNull); | 
| -    expect(statement.iterable, isNotNull); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_each_type() { | 
| -    ForEachStatement statement = | 
| -        parse4("parseForStatement", "for (A element in list) {}"); | 
| -    expect(statement.awaitKeyword, isNull); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.loopVariable, isNotNull); | 
| -    expect(statement.identifier, isNull); | 
| -    expect(statement.inKeyword, isNotNull); | 
| -    expect(statement.iterable, isNotNull); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_each_var() { | 
| -    ForEachStatement statement = | 
| -        parse4("parseForStatement", "for (var element in list) {}"); | 
| -    expect(statement.awaitKeyword, isNull); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.loopVariable, isNotNull); | 
| -    expect(statement.identifier, isNull); | 
| -    expect(statement.inKeyword, isNotNull); | 
| -    expect(statement.iterable, isNotNull); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_c() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (; i < count;) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.variables, isNull); | 
| -    expect(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNotNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(0)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_cu() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (; i < count; i++) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.variables, isNull); | 
| -    expect(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNotNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(1)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_ecu() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (i--; i < count; i++) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.variables, isNull); | 
| -    expect(statement.initialization, isNotNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNotNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(1)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_i() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (var i = 0;;) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    VariableDeclarationList variables = statement.variables; | 
| +    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(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(0)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_i_withMetadata() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (@A var i = 0;;) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    VariableDeclarationList variables = statement.variables; | 
| +    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(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(0)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_ic() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (var i = 0; i < count;) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    VariableDeclarationList variables = statement.variables; | 
| +    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(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNotNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(0)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_icu() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (var i = 0; i < count; i++) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    VariableDeclarationList variables = statement.variables; | 
| +    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(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNotNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(1)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_iicuu() { | 
| -    ForStatement statement = parse4( | 
| -        "parseForStatement", "for (int i = 0, j = count; i < j; i++, j--) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    VariableDeclarationList variables = statement.variables; | 
| +    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(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNotNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(2)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_iu() { | 
| -    ForStatement statement = | 
| -        parse4("parseForStatement", "for (var i = 0;; i++) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    VariableDeclarationList variables = statement.variables; | 
| +    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(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(1)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseForStatement_loop_u() { | 
| -    ForStatement statement = parse4("parseForStatement", "for (;; i++) {}"); | 
| -    expect(statement.forKeyword, isNotNull); | 
| -    expect(statement.leftParenthesis, isNotNull); | 
| -    expect(statement.variables, isNull); | 
| -    expect(statement.initialization, isNull); | 
| -    expect(statement.leftSeparator, isNotNull); | 
| -    expect(statement.condition, isNull); | 
| -    expect(statement.rightSeparator, isNotNull); | 
| -    expect(statement.updaters, hasLength(1)); | 
| -    expect(statement.rightParenthesis, isNotNull); | 
| -    expect(statement.body, isNotNull); | 
| +    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_parseFunctionBody_block() { | 
| @@ -8056,10 +8848,11 @@ void'''); | 
|  | 
| void test_parseFunctionBody_skip_block_invalid() { | 
| ParserTestCase.parseFunctionBodies = false; | 
| -    FunctionBody functionBody = parse3("parseFunctionBody", | 
| -        <Object>[false, null, false], "{", [ParserErrorCode.EXPECTED_TOKEN]); | 
| -    EngineTestCase.assertInstanceOf( | 
| -        (obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody); | 
| +    createParser('{'); | 
| +    FunctionBody functionBody = parser.parseFunctionBody(false, null, false); | 
| +    expectNotNullIfNoErrors(functionBody); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]); | 
| +    expect(functionBody, new isInstanceOf<EmptyFunctionBody>()); | 
| } | 
|  | 
| void test_parseFunctionBody_skip_blocks() { | 
| @@ -8272,7 +9065,10 @@ void'''); | 
| } | 
|  | 
| void test_parseIfStatement_else_block() { | 
| -    IfStatement statement = parse4("parseIfStatement", "if (x) {} else {}"); | 
| +    createParser('if (x) {} else {}'); | 
| +    IfStatement statement = parser.parseIfStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.ifKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.condition, isNotNull); | 
| @@ -8283,8 +9079,10 @@ void'''); | 
| } | 
|  | 
| void test_parseIfStatement_else_statement() { | 
| -    IfStatement statement = | 
| -        parse4("parseIfStatement", "if (x) f(x); else f(y);"); | 
| +    createParser('if (x) f(x); else f(y);'); | 
| +    IfStatement statement = parser.parseIfStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.ifKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.condition, isNotNull); | 
| @@ -8295,7 +9093,10 @@ void'''); | 
| } | 
|  | 
| void test_parseIfStatement_noElse_block() { | 
| -    IfStatement statement = parse4("parseIfStatement", "if (x) {}"); | 
| +    createParser('if (x) {}'); | 
| +    IfStatement statement = parser.parseIfStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.ifKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.condition, isNotNull); | 
| @@ -8306,7 +9107,10 @@ void'''); | 
| } | 
|  | 
| void test_parseIfStatement_noElse_statement() { | 
| -    IfStatement statement = parse4("parseIfStatement", "if (x) f(x);"); | 
| +    createParser('if (x) f(x);'); | 
| +    IfStatement statement = parser.parseIfStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.ifKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.condition, isNotNull); | 
| @@ -9480,140 +10284,242 @@ void'''); | 
| } | 
|  | 
| void test_parsePrimaryExpression_const() { | 
| -    InstanceCreationExpression expression = | 
| -        parse4("parsePrimaryExpression", "const A()"); | 
| +    createParser('const A()'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| expect(expression, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_double() { | 
| String doubleLiteral = "3.2e4"; | 
| -    DoubleLiteral literal = parse4("parsePrimaryExpression", doubleLiteral); | 
| +    createParser(doubleLiteral); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<DoubleLiteral>()); | 
| +    DoubleLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, double.parse(doubleLiteral)); | 
| } | 
|  | 
| void test_parsePrimaryExpression_false() { | 
| -    BooleanLiteral literal = parse4("parsePrimaryExpression", "false"); | 
| +    createParser('false'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<BooleanLiteral>()); | 
| +    BooleanLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, isFalse); | 
| } | 
|  | 
| void test_parsePrimaryExpression_function_arguments() { | 
| -    FunctionExpression expression = | 
| -        parse4("parsePrimaryExpression", "(int i) => i + 1"); | 
| -    expect(expression.parameters, isNotNull); | 
| -    expect(expression.body, isNotNull); | 
| +    createParser('(int i) => i + 1'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<FunctionExpression>()); | 
| +    FunctionExpression functionExpression = expression; | 
| +    expect(functionExpression.parameters, isNotNull); | 
| +    expect(functionExpression.body, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_function_noArguments() { | 
| -    FunctionExpression expression = | 
| -        parse4("parsePrimaryExpression", "() => 42"); | 
| -    expect(expression.parameters, isNotNull); | 
| -    expect(expression.body, isNotNull); | 
| +    createParser('() => 42'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<FunctionExpression>()); | 
| +    FunctionExpression functionExpression = expression; | 
| +    expect(functionExpression.parameters, isNotNull); | 
| +    expect(functionExpression.body, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_hex() { | 
| String hexLiteral = "3F"; | 
| -    IntegerLiteral literal = parse4("parsePrimaryExpression", "0x$hexLiteral"); | 
| +    createParser('0x$hexLiteral'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<IntegerLiteral>()); | 
| +    IntegerLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, int.parse(hexLiteral, radix: 16)); | 
| } | 
|  | 
| void test_parsePrimaryExpression_identifier() { | 
| -    SimpleIdentifier identifier = parse4("parsePrimaryExpression", "a"); | 
| +    createParser('a'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleIdentifier>()); | 
| +    SimpleIdentifier identifier = expression; | 
| expect(identifier, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_int() { | 
| String intLiteral = "472"; | 
| -    IntegerLiteral literal = parse4("parsePrimaryExpression", intLiteral); | 
| +    createParser(intLiteral); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<IntegerLiteral>()); | 
| +    IntegerLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, int.parse(intLiteral)); | 
| } | 
|  | 
| void test_parsePrimaryExpression_listLiteral() { | 
| -    ListLiteral literal = parse4("parsePrimaryExpression", "[ ]"); | 
| +    createParser('[ ]'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<ListLiteral>()); | 
| +    ListLiteral literal = expression; | 
| expect(literal, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_listLiteral_index() { | 
| -    ListLiteral literal = parse4("parsePrimaryExpression", "[]"); | 
| +    createParser('[]'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<ListLiteral>()); | 
| +    ListLiteral literal = expression; | 
| expect(literal, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_listLiteral_typed() { | 
| -    ListLiteral literal = parse4("parsePrimaryExpression", "<A>[ ]"); | 
| +    createParser('<A>[ ]'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.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; | 
| -    ListLiteral literal = parse4("parsePrimaryExpression", "/*<A>*/[ ]"); | 
| +    createParser('/*<A>*/[ ]'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<ListLiteral>()); | 
| +    ListLiteral literal = expression; | 
| expect(literal.typeArguments, isNotNull); | 
| expect(literal.typeArguments.arguments, hasLength(1)); | 
| } | 
|  | 
| void test_parsePrimaryExpression_mapLiteral() { | 
| -    MapLiteral literal = parse4("parsePrimaryExpression", "{}"); | 
| +    createParser('{}'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<MapLiteral>()); | 
| +    MapLiteral literal = expression; | 
| +    expect(literal.typeArguments, isNull); | 
| expect(literal, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_mapLiteral_typed() { | 
| -    MapLiteral literal = parse4("parsePrimaryExpression", "<A, B>{}"); | 
| +    createParser('<A, B>{}'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<MapLiteral>()); | 
| +    MapLiteral literal = expression; | 
| expect(literal.typeArguments, isNotNull); | 
| expect(literal.typeArguments.arguments, hasLength(2)); | 
| } | 
|  | 
| void test_parsePrimaryExpression_mapLiteral_typed_genericComment() { | 
| enableGenericMethodComments = true; | 
| -    MapLiteral literal = parse4("parsePrimaryExpression", "/*<A, B>*/{}"); | 
| +    createParser('/*<A, B>*/{}'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<MapLiteral>()); | 
| +    MapLiteral literal = expression; | 
| expect(literal.typeArguments, isNotNull); | 
| expect(literal.typeArguments.arguments, hasLength(2)); | 
| } | 
|  | 
| void test_parsePrimaryExpression_new() { | 
| -    InstanceCreationExpression expression = | 
| -        parse4("parsePrimaryExpression", "new A()"); | 
| -    expect(expression, isNotNull); | 
| +    createParser('new A()'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<InstanceCreationExpression>()); | 
| +    InstanceCreationExpression creation = expression; | 
| +    expect(creation, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_null() { | 
| -    NullLiteral literal = parse4("parsePrimaryExpression", "null"); | 
| +    createParser('null'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<NullLiteral>()); | 
| +    NullLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_parenthesized() { | 
| -    ParenthesizedExpression expression = | 
| -        parse4("parsePrimaryExpression", "(x)"); | 
| -    expect(expression, isNotNull); | 
| +    createParser('(x)'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<ParenthesizedExpression>()); | 
| +    ParenthesizedExpression parens = expression; | 
| +    expect(parens, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_string() { | 
| -    SimpleStringLiteral literal = | 
| -        parse4("parsePrimaryExpression", "\"string\""); | 
| +    createParser('"string"'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.isMultiline, isFalse); | 
| expect(literal.isRaw, isFalse); | 
| expect(literal.value, "string"); | 
| } | 
|  | 
| void test_parsePrimaryExpression_string_multiline() { | 
| -    SimpleStringLiteral literal = | 
| -        parse4("parsePrimaryExpression", "'''string'''"); | 
| +    createParser("'''string'''"); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.isMultiline, isTrue); | 
| expect(literal.isRaw, isFalse); | 
| expect(literal.value, "string"); | 
| } | 
|  | 
| void test_parsePrimaryExpression_string_raw() { | 
| -    SimpleStringLiteral literal = parse4("parsePrimaryExpression", "r'string'"); | 
| +    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_parsePrimaryExpression_super() { | 
| -    PropertyAccess propertyAccess = parse4("parsePrimaryExpression", "super.x"); | 
| +    createParser('super.x'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    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); | 
| @@ -9621,12 +10527,22 @@ void'''); | 
| } | 
|  | 
| void test_parsePrimaryExpression_this() { | 
| -    ThisExpression expression = parse4("parsePrimaryExpression", "this"); | 
| -    expect(expression.thisKeyword, isNotNull); | 
| +    createParser('this'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<ThisExpression>()); | 
| +    ThisExpression thisExpression = expression; | 
| +    expect(thisExpression.thisKeyword, isNotNull); | 
| } | 
|  | 
| void test_parsePrimaryExpression_true() { | 
| -    BooleanLiteral literal = parse4("parsePrimaryExpression", "true"); | 
| +    createParser('true'); | 
| +    Expression expression = parser.parsePrimaryExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<BooleanLiteral>()); | 
| +    BooleanLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, isTrue); | 
| } | 
| @@ -9637,7 +10553,7 @@ void'''); | 
|  | 
| void test_parseRedirectingConstructorInvocation_named() { | 
| RedirectingConstructorInvocation invocation = | 
| -        parse2("parseRedirectingConstructorInvocation", [true], "this.a()"); | 
| +        parse("parseRedirectingConstructorInvocation", [true], "this.a()"); | 
| expect(invocation.argumentList, isNotNull); | 
| expect(invocation.constructorName, isNotNull); | 
| expect(invocation.thisKeyword, isNotNull); | 
| @@ -9646,7 +10562,7 @@ void'''); | 
|  | 
| void test_parseRedirectingConstructorInvocation_unnamed() { | 
| RedirectingConstructorInvocation invocation = | 
| -        parse2("parseRedirectingConstructorInvocation", [false], "this()"); | 
| +        parse("parseRedirectingConstructorInvocation", [false], "this()"); | 
| expect(invocation.argumentList, isNotNull); | 
| expect(invocation.constructorName, isNull); | 
| expect(invocation.thisKeyword, isNotNull); | 
| @@ -9654,72 +10570,111 @@ void'''); | 
| } | 
|  | 
| void test_parseRelationalExpression_as() { | 
| -    AsExpression expression = parse4("parseRelationalExpression", "x as Y"); | 
| -    expect(expression.expression, isNotNull); | 
| -    expect(expression.asOperator, isNotNull); | 
| -    expect(expression.type, isNotNull); | 
| +    createParser('x as Y'); | 
| +    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, isNotNull); | 
| } | 
|  | 
| void test_parseRelationalExpression_is() { | 
| -    IsExpression expression = parse4("parseRelationalExpression", "x is y"); | 
| -    expect(expression.expression, isNotNull); | 
| -    expect(expression.isOperator, isNotNull); | 
| -    expect(expression.notOperator, isNull); | 
| -    expect(expression.type, isNotNull); | 
| +    createParser('x is y'); | 
| +    Expression expression = parser.parseRelationalExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    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); | 
| } | 
|  | 
| void test_parseRelationalExpression_isNot() { | 
| -    IsExpression expression = parse4("parseRelationalExpression", "x is! y"); | 
| -    expect(expression.expression, isNotNull); | 
| -    expect(expression.isOperator, isNotNull); | 
| -    expect(expression.notOperator, isNotNull); | 
| -    expect(expression.type, isNotNull); | 
| +    createParser('x is! y'); | 
| +    Expression expression = parser.parseRelationalExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    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); | 
| } | 
|  | 
| void test_parseRelationalExpression_normal() { | 
| -    BinaryExpression expression = parse4("parseRelationalExpression", "x < y"); | 
| -    expect(expression.leftOperand, isNotNull); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.LT); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    createParser('x < y'); | 
| +    Expression expression = parser.parseRelationalExpression(); | 
| +    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.LT); | 
| +    expect(binaryExpression.rightOperand, isNotNull); | 
| } | 
|  | 
| void test_parseRelationalExpression_super() { | 
| -    BinaryExpression expression = | 
| -        parse4("parseRelationalExpression", "super < y"); | 
| -    expect(expression.leftOperand, isNotNull); | 
| -    expect(expression.operator, isNotNull); | 
| -    expect(expression.operator.type, TokenType.LT); | 
| -    expect(expression.rightOperand, isNotNull); | 
| +    createParser('super < y'); | 
| +    Expression expression = parser.parseRelationalExpression(); | 
| +    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.LT); | 
| +    expect(binaryExpression.rightOperand, isNotNull); | 
| } | 
|  | 
| void test_parseRethrowExpression() { | 
| -    RethrowExpression expression = parse4("parseRethrowExpression", "rethrow;"); | 
| +    createParser('rethrow;'); | 
| +    RethrowExpression expression = parser.parseRethrowExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| expect(expression.rethrowKeyword, isNotNull); | 
| } | 
|  | 
| void test_parseReturnStatement_noValue() { | 
| -    ReturnStatement statement = parse4("parseReturnStatement", "return;"); | 
| +    createParser('return;'); | 
| +    ReturnStatement statement = parser.parseReturnStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.returnKeyword, isNotNull); | 
| expect(statement.expression, isNull); | 
| expect(statement.semicolon, isNotNull); | 
| } | 
|  | 
| void test_parseReturnStatement_value() { | 
| -    ReturnStatement statement = parse4("parseReturnStatement", "return x;"); | 
| +    createParser('return x;'); | 
| +    ReturnStatement statement = parser.parseReturnStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.returnKeyword, isNotNull); | 
| expect(statement.expression, isNotNull); | 
| expect(statement.semicolon, isNotNull); | 
| } | 
|  | 
| void test_parseReturnType_nonVoid() { | 
| -    TypeName typeName = parse4("parseReturnType", "A<B>"); | 
| +    createParser('A<B>'); | 
| +    TypeName typeName = parser.parseReturnType(); | 
| +    expectNotNullIfNoErrors(typeName); | 
| +    listener.assertNoErrors(); | 
| expect(typeName.name, isNotNull); | 
| expect(typeName.typeArguments, isNotNull); | 
| } | 
|  | 
| void test_parseReturnType_void() { | 
| -    TypeName typeName = parse4("parseReturnType", "void"); | 
| +    createParser('void'); | 
| +    TypeName typeName = parser.parseReturnType(); | 
| +    expectNotNullIfNoErrors(typeName); | 
| +    listener.assertNoErrors(); | 
| expect(typeName.name, isNotNull); | 
| expect(typeName.typeArguments, isNull); | 
| } | 
| @@ -9764,7 +10719,10 @@ void'''); | 
| } | 
|  | 
| void test_parseShiftExpression_normal() { | 
| -    BinaryExpression expression = parse4("parseShiftExpression", "x << y"); | 
| +    createParser('x << y'); | 
| +    BinaryExpression expression = parser.parseShiftExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| expect(expression.leftOperand, isNotNull); | 
| expect(expression.operator, isNotNull); | 
| expect(expression.operator.type, TokenType.LT_LT); | 
| @@ -9772,7 +10730,10 @@ void'''); | 
| } | 
|  | 
| void test_parseShiftExpression_super() { | 
| -    BinaryExpression expression = parse4("parseShiftExpression", "super << y"); | 
| +    createParser('super << y'); | 
| +    BinaryExpression expression = parser.parseShiftExpression(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| expect(expression.leftOperand, isNotNull); | 
| expect(expression.operator, isNotNull); | 
| expect(expression.operator.type, TokenType.LT_LT); | 
| @@ -9785,22 +10746,32 @@ void'''); | 
|  | 
| void test_parseSimpleIdentifier_builtInIdentifier() { | 
| String lexeme = "as"; | 
| -    SimpleIdentifier identifier = parse4("parseSimpleIdentifier", lexeme); | 
| +    createParser(lexeme); | 
| +    SimpleIdentifier identifier = parser.parseSimpleIdentifier(); | 
| +    expectNotNullIfNoErrors(identifier); | 
| +    listener.assertNoErrors(); | 
| expect(identifier.token, isNotNull); | 
| expect(identifier.name, lexeme); | 
| } | 
|  | 
| void test_parseSimpleIdentifier_normalIdentifier() { | 
| String lexeme = "foo"; | 
| -    SimpleIdentifier identifier = parse4("parseSimpleIdentifier", lexeme); | 
| +    createParser(lexeme); | 
| +    SimpleIdentifier identifier = parser.parseSimpleIdentifier(); | 
| +    expectNotNullIfNoErrors(identifier); | 
| +    listener.assertNoErrors(); | 
| expect(identifier.token, isNotNull); | 
| expect(identifier.name, lexeme); | 
| } | 
|  | 
| void test_parseStatement_emptyTypeArgumentList() { | 
| -    VariableDeclarationStatement statement = parse4( | 
| -        "parseStatement", "C<> c;", [ParserErrorCode.EXPECTED_TYPE_NAME]); | 
| -    VariableDeclarationList variables = statement.variables; | 
| +    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); | 
| @@ -9810,50 +10781,79 @@ void'''); | 
| } | 
|  | 
| void test_parseStatement_functionDeclaration_noReturnType() { | 
| -    FunctionDeclarationStatement statement = | 
| -        parse4("parseStatement", "f(a, b) {};"); | 
| -    expect(statement.functionDeclaration, isNotNull); | 
| +    createParser('f(a, b) {};'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| +    expect(statement, new isInstanceOf<FunctionDeclarationStatement>()); | 
| +    FunctionDeclarationStatement declaration = statement; | 
| +    expect(declaration.functionDeclaration, isNotNull); | 
| } | 
|  | 
| void | 
| test_parseStatement_functionDeclaration_noReturnType_typeParameterComments() { | 
| enableGenericMethodComments = true; | 
| -    FunctionDeclarationStatement statement = | 
| -        parse4("parseStatement", "f/*<E>*/(a, b) {};"); | 
| -    expect(statement.functionDeclaration, isNotNull); | 
| -    expect(statement.functionDeclaration.functionExpression.typeParameters, | 
| +    createParser('f/*<E>*/(a, b) {};'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| +    expect(statement, new isInstanceOf<FunctionDeclarationStatement>()); | 
| +    FunctionDeclarationStatement declaration = statement; | 
| +    expect(declaration.functionDeclaration, isNotNull); | 
| +    expect(declaration.functionDeclaration.functionExpression.typeParameters, | 
| isNotNull); | 
| } | 
|  | 
| void test_parseStatement_functionDeclaration_returnType() { | 
| // TODO(brianwilkerson) Implement more tests for this method. | 
| -    FunctionDeclarationStatement statement = | 
| -        parse4("parseStatement", "int f(a, b) {};", []); | 
| -    expect(statement.functionDeclaration, isNotNull); | 
| +    createParser('int f(a, b) {};'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| +    expect(statement, new isInstanceOf<FunctionDeclarationStatement>()); | 
| +    FunctionDeclarationStatement declaration = statement; | 
| +    expect(declaration.functionDeclaration, isNotNull); | 
| } | 
|  | 
| void test_parseStatement_functionDeclaration_returnType_typeParameters() { | 
| enableGenericMethods = true; | 
| -    FunctionDeclarationStatement statement = | 
| -        parse4("parseStatement", "int f<E>(a, b) {};"); | 
| -    expect(statement.functionDeclaration, isNotNull); | 
| +    createParser('int f<E>(a, b) {};'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| +    expect(statement, new isInstanceOf<FunctionDeclarationStatement>()); | 
| +    FunctionDeclarationStatement declaration = statement; | 
| +    expect(declaration.functionDeclaration, isNotNull); | 
| } | 
|  | 
| void test_parseStatement_mulipleLabels() { | 
| -    LabeledStatement statement = parse4("parseStatement", "l: m: return x;"); | 
| -    expect(statement.labels, hasLength(2)); | 
| -    expect(statement.statement, isNotNull); | 
| +    createParser('l: m: return x;'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    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() { | 
| -    parse4("parseStatement", "return x;"); | 
| +    createParser('return x;'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| } | 
|  | 
| void test_parseStatement_singleLabel() { | 
| -    LabeledStatement statement = parse4("parseStatement", "l: return x;"); | 
| -    expect(statement.labels, hasLength(1)); | 
| -    expect(statement.labels[0].label.inDeclarationContext(), isTrue); | 
| -    expect(statement.statement, isNotNull); | 
| +    createParser('l: return x;'); | 
| +    Statement statement = parser.parseStatement2(); | 
| +    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); | 
| } | 
|  | 
| void test_parseStatements_multiple() { | 
| @@ -9868,7 +10868,12 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_adjacent() { | 
| -    AdjacentStrings literal = parse4("parseStringLiteral", "'a' 'b'"); | 
| +    createParser("'a' 'b'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<AdjacentStrings>()); | 
| +    AdjacentStrings literal = expression; | 
| NodeList<StringLiteral> strings = literal.strings; | 
| expect(strings, hasLength(2)); | 
| StringLiteral firstString = strings[0]; | 
| @@ -9878,9 +10883,12 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_endsWithInterpolation() { | 
| -    StringLiteral literal = parse4('parseStringLiteral', r"'x$y'"); | 
| -    expect(literal, new isInstanceOf<StringInterpolation>()); | 
| -    StringInterpolation interpolation = literal; | 
| +    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]; | 
| @@ -9895,8 +10903,12 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_interpolated() { | 
| -    StringInterpolation literal = | 
| -        parse4("parseStringLiteral", "'a \${b} c \$this d'"); | 
| +    createParser("'a \${b} c \$this d'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    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); | 
| @@ -9907,16 +10919,23 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_encodedSpace() { | 
| -    SimpleStringLiteral literal = | 
| -        parse4("parseStringLiteral", "'''\\x20\na'''"); | 
| +    createParser("'''\\x20\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_parseStringLiteral_multiline_endsWithInterpolation() { | 
| -    StringLiteral literal = parse4('parseStringLiteral', r"'''x$y'''"); | 
| -    expect(literal, new isInstanceOf<StringInterpolation>()); | 
| -    StringInterpolation interpolation = literal; | 
| +    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]; | 
| @@ -9931,60 +10950,100 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_escapedBackslash() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''\\\\\na'''"); | 
| +    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_parseStringLiteral_multiline_escapedBackslash_raw() { | 
| -    SimpleStringLiteral literal = | 
| -        parse4("parseStringLiteral", "r'''\\\\\na'''"); | 
| +    createParser("r'''\\\\\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_parseStringLiteral_multiline_escapedEolMarker() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''\\\na'''"); | 
| +    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, "a"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_escapedEolMarker_raw() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "r'''\\\na'''"); | 
| +    createParser("r'''\\\na'''"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, "a"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker() { | 
| -    SimpleStringLiteral literal = | 
| -        parse4("parseStringLiteral", "'''\\ \\\na'''"); | 
| +    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, "a"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw() { | 
| -    SimpleStringLiteral literal = | 
| -        parse4("parseStringLiteral", "r'''\\ \\\na'''"); | 
| +    createParser("r'''\\ \\\na'''"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, "a"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_escapedTab() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''\\t\na'''"); | 
| +    createParser("'''\\t\na'''"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, "\t\na"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_escapedTab_raw() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "r'''\\t\na'''"); | 
| +    createParser("r'''\\t\na'''"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, "\\t\na"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_quoteAfterInterpolation() { | 
| -    StringLiteral literal = parse4('parseStringLiteral', r"""'''$x'y'''"""); | 
| -    expect(literal, new isInstanceOf<StringInterpolation>()); | 
| -    StringInterpolation interpolation = literal; | 
| +    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]; | 
| @@ -9999,9 +11058,12 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_startsWithInterpolation() { | 
| -    StringLiteral literal = parse4('parseStringLiteral', r"'''${x}y'''"); | 
| -    expect(literal, new isInstanceOf<StringInterpolation>()); | 
| -    StringInterpolation interpolation = literal; | 
| +    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]; | 
| @@ -10016,27 +11078,45 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_twoSpaces() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''  \na'''"); | 
| +    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, "a"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_twoSpaces_raw() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "r'''  \na'''"); | 
| +    createParser("r'''  \na'''"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, "a"); | 
| } | 
|  | 
| void test_parseStringLiteral_multiline_untrimmed() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "''' a\nb'''"); | 
| +    createParser("''' a\nb'''"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, " a\nb"); | 
| } | 
|  | 
| void test_parseStringLiteral_quoteAfterInterpolation() { | 
| -    StringLiteral literal = parse4('parseStringLiteral', r"""'$x"'"""); | 
| -    expect(literal, new isInstanceOf<StringInterpolation>()); | 
| -    StringInterpolation interpolation = literal; | 
| +    createParser(r"""'$x"'"""); | 
| +    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]; | 
| @@ -10051,15 +11131,23 @@ void'''); | 
| } | 
|  | 
| void test_parseStringLiteral_single() { | 
| -    SimpleStringLiteral literal = parse4("parseStringLiteral", "'a'"); | 
| +    createParser("'a'"); | 
| +    Expression expression = parser.parseStringLiteral(); | 
| +    expectNotNullIfNoErrors(expression); | 
| +    listener.assertNoErrors(); | 
| +    expect(expression, new isInstanceOf<SimpleStringLiteral>()); | 
| +    SimpleStringLiteral literal = expression; | 
| expect(literal.literal, isNotNull); | 
| expect(literal.value, "a"); | 
| } | 
|  | 
| void test_parseStringLiteral_startsWithInterpolation() { | 
| -    StringLiteral literal = parse4('parseStringLiteral', r"'${x}y'"); | 
| -    expect(literal, new isInstanceOf<StringInterpolation>()); | 
| -    StringInterpolation interpolation = literal; | 
| +    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]; | 
| @@ -10074,8 +11162,11 @@ void'''); | 
| } | 
|  | 
| void test_parseSuperConstructorInvocation_named() { | 
| +    createParser('super.a()'); | 
| SuperConstructorInvocation invocation = | 
| -        parse4("parseSuperConstructorInvocation", "super.a()"); | 
| +        parser.parseSuperConstructorInvocation(); | 
| +    expectNotNullIfNoErrors(invocation); | 
| +    listener.assertNoErrors(); | 
| expect(invocation.argumentList, isNotNull); | 
| expect(invocation.constructorName, isNotNull); | 
| expect(invocation.superKeyword, isNotNull); | 
| @@ -10083,8 +11174,11 @@ void'''); | 
| } | 
|  | 
| void test_parseSuperConstructorInvocation_unnamed() { | 
| +    createParser('super()'); | 
| SuperConstructorInvocation invocation = | 
| -        parse4("parseSuperConstructorInvocation", "super()"); | 
| +        parser.parseSuperConstructorInvocation(); | 
| +    expectNotNullIfNoErrors(invocation); | 
| +    listener.assertNoErrors(); | 
| expect(invocation.argumentList, isNotNull); | 
| expect(invocation.constructorName, isNull); | 
| expect(invocation.superKeyword, isNotNull); | 
| @@ -10092,8 +11186,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSwitchStatement_case() { | 
| -    SwitchStatement statement = | 
| -        parse4("parseSwitchStatement", "switch (a) {case 1: return 'I';}"); | 
| +    createParser('switch (a) {case 1: return "I";}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.switchKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.expression, isNotNull); | 
| @@ -10104,7 +11200,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSwitchStatement_empty() { | 
| -    SwitchStatement statement = parse4("parseSwitchStatement", "switch (a) {}"); | 
| +    createParser('switch (a) {}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.switchKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.expression, isNotNull); | 
| @@ -10115,8 +11214,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSwitchStatement_labeledCase() { | 
| -    SwitchStatement statement = | 
| -        parse4("parseSwitchStatement", "switch (a) {l1: l2: l3: case(1):}"); | 
| +    createParser('switch (a) {l1: l2: l3: case(1):}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.switchKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.expression, isNotNull); | 
| @@ -10134,8 +11235,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSwitchStatement_labeledDefault() { | 
| -    SwitchStatement statement = | 
| -        parse4("parseSwitchStatement", "switch (a) {l1: l2: l3: default:}"); | 
| +    createParser('switch (a) {l1: l2: l3: default:}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.switchKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.expression, isNotNull); | 
| @@ -10153,8 +11256,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSwitchStatement_labeledStatementInCase() { | 
| -    SwitchStatement statement = parse4( | 
| -        "parseSwitchStatement", "switch (a) {case 0: f(); l1: g(); break;}"); | 
| +    createParser('switch (a) {case 0: f(); l1: g(); break;}'); | 
| +    SwitchStatement statement = parser.parseSwitchStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.switchKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.expression, isNotNull); | 
| @@ -10166,8 +11271,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSymbolLiteral_builtInIdentifier() { | 
| -    SymbolLiteral literal = | 
| -        parse4("parseSymbolLiteral", "#dynamic.static.abstract"); | 
| +    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)); | 
| @@ -10177,7 +11284,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSymbolLiteral_multiple() { | 
| -    SymbolLiteral literal = parse4("parseSymbolLiteral", "#a.b.c"); | 
| +    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)); | 
| @@ -10187,7 +11297,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSymbolLiteral_operator() { | 
| -    SymbolLiteral literal = parse4("parseSymbolLiteral", "#=="); | 
| +    createParser('#=='); | 
| +    SymbolLiteral literal = parser.parseSymbolLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertNoErrors(); | 
| expect(literal.poundSign, isNotNull); | 
| List<Token> components = literal.components; | 
| expect(components, hasLength(1)); | 
| @@ -10195,7 +11308,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSymbolLiteral_single() { | 
| -    SymbolLiteral literal = parse4("parseSymbolLiteral", "#a"); | 
| +    createParser('#a'); | 
| +    SymbolLiteral literal = parser.parseSymbolLiteral(); | 
| +    expectNotNullIfNoErrors(literal); | 
| +    listener.assertNoErrors(); | 
| expect(literal.poundSign, isNotNull); | 
| List<Token> components = literal.components; | 
| expect(components, hasLength(1)); | 
| @@ -10203,7 +11319,10 @@ void'''); | 
| } | 
|  | 
| void test_parseSymbolLiteral_void() { | 
| -    SymbolLiteral literal = parse4("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)); | 
| @@ -10211,20 +11330,32 @@ void'''); | 
| } | 
|  | 
| void test_parseThrowExpression() { | 
| -    ThrowExpression expression = parse4("parseThrowExpression", "throw x;"); | 
| -    expect(expression.throwKeyword, isNotNull); | 
| -    expect(expression.expression, isNotNull); | 
| +    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() { | 
| -    ThrowExpression expression = | 
| -        parse4("parseThrowExpressionWithoutCascade", "throw x;"); | 
| -    expect(expression.throwKeyword, isNotNull); | 
| -    expect(expression.expression, isNotNull); | 
| +    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() { | 
| -    TryStatement statement = parse4("parseTryStatement", "try {} catch (e) {}"); | 
| +    createParser('try {} catch (e) {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.tryKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| NodeList<CatchClause> catchClauses = statement.catchClauses; | 
| @@ -10242,8 +11373,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTryStatement_catch_finally() { | 
| -    TryStatement statement = | 
| -        parse4("parseTryStatement", "try {} catch (e, s) {} finally {}"); | 
| +    createParser('try {} catch (e, s) {} finally {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.tryKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| NodeList<CatchClause> catchClauses = statement.catchClauses; | 
| @@ -10261,7 +11394,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTryStatement_finally() { | 
| -    TryStatement statement = parse4("parseTryStatement", "try {} finally {}"); | 
| +    createParser('try {} finally {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.tryKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| expect(statement.catchClauses, hasLength(0)); | 
| @@ -10270,8 +11406,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTryStatement_multiple() { | 
| -    TryStatement statement = parse4("parseTryStatement", | 
| -        "try {} on NPE catch (e) {} on Error {} catch (e) {}"); | 
| +    createParser('try {} on NPE catch (e) {} on Error {} catch (e) {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.tryKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| expect(statement.catchClauses, hasLength(3)); | 
| @@ -10280,7 +11418,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTryStatement_on() { | 
| -    TryStatement statement = parse4("parseTryStatement", "try {} on Error {}"); | 
| +    createParser('try {} on Error {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.tryKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| NodeList<CatchClause> catchClauses = statement.catchClauses; | 
| @@ -10298,8 +11439,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTryStatement_on_catch() { | 
| -    TryStatement statement = | 
| -        parse4("parseTryStatement", "try {} on Error catch (e, s) {}"); | 
| +    createParser('try {} on Error catch (e, s) {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.tryKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| NodeList<CatchClause> catchClauses = statement.catchClauses; | 
| @@ -10317,8 +11460,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTryStatement_on_catch_finally() { | 
| -    TryStatement statement = parse4( | 
| -        "parseTryStatement", "try {} on Error catch (e, s) {} finally {}"); | 
| +    createParser('try {} on Error catch (e, s) {} finally {}'); | 
| +    TryStatement statement = parser.parseTryStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.tryKeyword, isNotNull); | 
| expect(statement.body, isNotNull); | 
| NodeList<CatchClause> catchClauses = statement.catchClauses; | 
| @@ -10402,23 +11547,30 @@ void'''); | 
| } | 
|  | 
| void test_parseTypeArgumentList_empty() { | 
| -    TypeArgumentList argumentList = parse4( | 
| -        "parseTypeArgumentList", "<>", [ParserErrorCode.EXPECTED_TYPE_NAME]); | 
| +    createParser('<>'); | 
| +    TypeArgumentList argumentList = parser.parseTypeArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TYPE_NAME]); | 
| expect(argumentList.leftBracket, isNotNull); | 
| expect(argumentList.arguments, hasLength(1)); | 
| expect(argumentList.rightBracket, isNotNull); | 
| } | 
|  | 
| void test_parseTypeArgumentList_multiple() { | 
| -    TypeArgumentList argumentList = | 
| -        parse4("parseTypeArgumentList", "<int, int, int>"); | 
| +    createParser('<int, int, int>'); | 
| +    TypeArgumentList argumentList = parser.parseTypeArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| expect(argumentList.leftBracket, isNotNull); | 
| expect(argumentList.arguments, hasLength(3)); | 
| expect(argumentList.rightBracket, isNotNull); | 
| } | 
|  | 
| void test_parseTypeArgumentList_nested() { | 
| -    TypeArgumentList argumentList = parse4("parseTypeArgumentList", "<A<B>>"); | 
| +    createParser('<A<B>>'); | 
| +    TypeArgumentList argumentList = parser.parseTypeArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| expect(argumentList.leftBracket, isNotNull); | 
| expect(argumentList.arguments, hasLength(1)); | 
| TypeName argument = argumentList.arguments[0]; | 
| @@ -10430,8 +11582,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTypeArgumentList_nested_withComment_double() { | 
| -    TypeArgumentList argumentList = | 
| -        parse4("parseTypeArgumentList", "<A<B /* 0 */ >>"); | 
| +    createParser('<A<B /* 0 */ >>'); | 
| +    TypeArgumentList argumentList = parser.parseTypeArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| expect(argumentList.leftBracket, isNotNull); | 
| expect(argumentList.rightBracket, isNotNull); | 
| expect(argumentList.arguments, hasLength(1)); | 
| @@ -10448,8 +11602,10 @@ void'''); | 
| } | 
|  | 
| void test_parseTypeArgumentList_nested_withComment_tripple() { | 
| -    TypeArgumentList argumentList = | 
| -        parse4("parseTypeArgumentList", "<A<B<C /* 0 */ >>>"); | 
| +    createParser('<A<B<C /* 0 */ >>>'); | 
| +    TypeArgumentList argumentList = parser.parseTypeArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| expect(argumentList.leftBracket, isNotNull); | 
| expect(argumentList.rightBracket, isNotNull); | 
| expect(argumentList.arguments, hasLength(1)); | 
| @@ -10475,14 +11631,20 @@ void'''); | 
| } | 
|  | 
| void test_parseTypeArgumentList_single() { | 
| -    TypeArgumentList argumentList = parse4("parseTypeArgumentList", "<int>"); | 
| +    createParser('<int>'); | 
| +    TypeArgumentList argumentList = parser.parseTypeArgumentList(); | 
| +    expectNotNullIfNoErrors(argumentList); | 
| +    listener.assertNoErrors(); | 
| expect(argumentList.leftBracket, isNotNull); | 
| expect(argumentList.arguments, hasLength(1)); | 
| expect(argumentList.rightBracket, isNotNull); | 
| } | 
|  | 
| void test_parseTypeName_parameterized() { | 
| -    TypeName typeName = parse4("parseTypeName", "List<int>"); | 
| +    createParser('List<int>'); | 
| +    TypeName typeName = parser.parseTypeName(false); | 
| +    expectNotNullIfNoErrors(typeName); | 
| +    listener.assertNoErrors(); | 
| expect(typeName.name, isNotNull); | 
| expect(typeName.typeArguments, isNotNull); | 
| expect(typeName.question, isNull); | 
| @@ -10490,14 +11652,20 @@ void'''); | 
|  | 
| void test_parseTypeName_parameterized_nullable() { | 
| enableNnbd = true; | 
| -    TypeName typeName = parse4("parseTypeName", "List<int>?"); | 
| +    createParser('List<int>?'); | 
| +    TypeName typeName = parser.parseTypeName(false); | 
| +    expectNotNullIfNoErrors(typeName); | 
| +    listener.assertNoErrors(); | 
| expect(typeName.name, isNotNull); | 
| expect(typeName.typeArguments, isNotNull); | 
| expect(typeName.question, isNotNull); | 
| } | 
|  | 
| void test_parseTypeName_simple() { | 
| -    TypeName typeName = parse4("parseTypeName", "int"); | 
| +    createParser('int'); | 
| +    TypeName typeName = parser.parseTypeName(false); | 
| +    expectNotNullIfNoErrors(typeName); | 
| +    listener.assertNoErrors(); | 
| expect(typeName.name, isNotNull); | 
| expect(typeName.typeArguments, isNull); | 
| expect(typeName.question, isNull); | 
| @@ -10505,65 +11673,90 @@ void'''); | 
|  | 
| void test_parseTypeName_simple_nullable() { | 
| enableNnbd = true; | 
| -    TypeName typeName = parse4("parseTypeName", "String?"); | 
| +    createParser('String?'); | 
| +    TypeName typeName = parser.parseTypeName(false); | 
| +    expectNotNullIfNoErrors(typeName); | 
| +    listener.assertNoErrors(); | 
| expect(typeName.name, isNotNull); | 
| expect(typeName.typeArguments, isNull); | 
| expect(typeName.question, isNotNull); | 
| } | 
|  | 
| void test_parseTypeParameter_bounded() { | 
| -    TypeParameter parameter = parse4("parseTypeParameter", "A extends B"); | 
| +    createParser('A extends B'); | 
| +    TypeParameter parameter = parser.parseTypeParameter(); | 
| +    expectNotNullIfNoErrors(parameter); | 
| +    listener.assertNoErrors(); | 
| expect(parameter.bound, isNotNull); | 
| expect(parameter.extendsKeyword, isNotNull); | 
| expect(parameter.name, isNotNull); | 
| } | 
|  | 
| void test_parseTypeParameter_simple() { | 
| -    TypeParameter parameter = parse4("parseTypeParameter", "A"); | 
| +    createParser('A'); | 
| +    TypeParameter parameter = parser.parseTypeParameter(); | 
| +    expectNotNullIfNoErrors(parameter); | 
| +    listener.assertNoErrors(); | 
| expect(parameter.bound, isNull); | 
| expect(parameter.extendsKeyword, isNull); | 
| expect(parameter.name, isNotNull); | 
| } | 
|  | 
| void test_parseTypeParameterList_multiple() { | 
| -    TypeParameterList parameterList = | 
| -        parse4("parseTypeParameterList", "<A, B extends C, D>"); | 
| +    createParser('<A, B extends C, D>'); | 
| +    TypeParameterList parameterList = parser.parseTypeParameterList(); | 
| +    expectNotNullIfNoErrors(parameterList); | 
| +    listener.assertNoErrors(); | 
| expect(parameterList.leftBracket, isNotNull); | 
| expect(parameterList.rightBracket, isNotNull); | 
| expect(parameterList.typeParameters, hasLength(3)); | 
| } | 
|  | 
| void test_parseTypeParameterList_parameterizedWithTrailingEquals() { | 
| -    TypeParameterList parameterList = | 
| -        parse4("parseTypeParameterList", "<A extends B<E>>="); | 
| +    createParser('<A extends B<E>>='); | 
| +    TypeParameterList parameterList = parser.parseTypeParameterList(); | 
| +    expectNotNullIfNoErrors(parameterList); | 
| +    listener.assertNoErrors(); | 
| expect(parameterList.leftBracket, isNotNull); | 
| expect(parameterList.rightBracket, isNotNull); | 
| expect(parameterList.typeParameters, hasLength(1)); | 
| } | 
|  | 
| void test_parseTypeParameterList_single() { | 
| -    TypeParameterList parameterList = parse4("parseTypeParameterList", "<A>"); | 
| +    createParser('<<A>'); | 
| +    TypeParameterList parameterList = parser.parseTypeParameterList(); | 
| +    expectNotNullIfNoErrors(parameterList); | 
| +    listener.assertNoErrors(); | 
| expect(parameterList.leftBracket, isNotNull); | 
| expect(parameterList.rightBracket, isNotNull); | 
| expect(parameterList.typeParameters, hasLength(1)); | 
| } | 
|  | 
| void test_parseTypeParameterList_withTrailingEquals() { | 
| -    TypeParameterList parameterList = parse4("parseTypeParameterList", "<A>="); | 
| +    createParser('<A>='); | 
| +    TypeParameterList parameterList = parser.parseTypeParameterList(); | 
| +    expectNotNullIfNoErrors(parameterList); | 
| +    listener.assertNoErrors(); | 
| expect(parameterList.leftBracket, isNotNull); | 
| expect(parameterList.rightBracket, isNotNull); | 
| expect(parameterList.typeParameters, hasLength(1)); | 
| } | 
|  | 
| void test_parseUnaryExpression_decrement_normal() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "--x"); | 
| +    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() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "--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; | 
| @@ -10576,7 +11769,10 @@ void'''); | 
| } | 
|  | 
| void test_parseUnaryExpression_decrement_super_propertyAccess() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "--super.x"); | 
| +    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); | 
| @@ -10586,8 +11782,10 @@ void'''); | 
| } | 
|  | 
| void test_parseUnaryExpression_decrement_super_withComment() { | 
| -    PrefixExpression expression = | 
| -        parse4("parseUnaryExpression", "/* 0 */ --super"); | 
| +    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); | 
| @@ -10601,14 +11799,20 @@ void'''); | 
| } | 
|  | 
| void test_parseUnaryExpression_increment_normal() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "++x"); | 
| +    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() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "++super[0]"); | 
| +    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); | 
| @@ -10618,7 +11822,10 @@ void'''); | 
| } | 
|  | 
| void test_parseUnaryExpression_increment_super_propertyAccess() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "++super.x"); | 
| +    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); | 
| @@ -10628,97 +11835,124 @@ void'''); | 
| } | 
|  | 
| void test_parseUnaryExpression_minus_normal() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "-x"); | 
| +    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() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "-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() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "!x"); | 
| +    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() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "!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() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "~x"); | 
| +    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() { | 
| -    PrefixExpression expression = parse4("parseUnaryExpression", "~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() { | 
| -    VariableDeclaration declaration = | 
| -        parse4("parseVariableDeclaration", "a = b"); | 
| +    createParser('a = b'); | 
| +    VariableDeclaration declaration = parser.parseVariableDeclaration(); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertNoErrors(); | 
| expect(declaration.name, isNotNull); | 
| expect(declaration.equals, isNotNull); | 
| expect(declaration.initializer, isNotNull); | 
| } | 
|  | 
| void test_parseVariableDeclaration_noEquals() { | 
| -    VariableDeclaration declaration = parse4("parseVariableDeclaration", "a"); | 
| +    createParser('a'); | 
| +    VariableDeclaration declaration = parser.parseVariableDeclaration(); | 
| +    expectNotNullIfNoErrors(declaration); | 
| +    listener.assertNoErrors(); | 
| expect(declaration.name, isNotNull); | 
| expect(declaration.equals, isNull); | 
| expect(declaration.initializer, isNull); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_const_noType() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "const a"); | 
| +    createParser('const a'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNotNull); | 
| expect(declarationList.type, isNull); | 
| expect(declarationList.variables, hasLength(1)); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_const_type() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "const A a"); | 
| +    createParser('const A a'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNotNull); | 
| expect(declarationList.type, isNotNull); | 
| expect(declarationList.variables, hasLength(1)); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_final_noType() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "final a"); | 
| +    createParser('final a'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNotNull); | 
| expect(declarationList.type, isNull); | 
| expect(declarationList.variables, hasLength(1)); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_final_type() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "final A a"); | 
| +    createParser('final A a'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNotNull); | 
| expect(declarationList.type, isNotNull); | 
| expect(declarationList.variables, hasLength(1)); | 
| @@ -10726,49 +11960,54 @@ void'''); | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_final_typeComment() { | 
| enableGenericMethodComments = true; | 
| -    VariableDeclarationList decl = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "final/*=T*/ x"); | 
| -    expect(decl.type.name.name, 'T'); | 
| -    expect(decl.isFinal, true); | 
| +    createParser('final/*=T*/ x'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| +    expect(declarationList.type.name.name, 'T'); | 
| +    expect(declarationList.isFinal, true); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_type_multiple() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "A a, b, c"); | 
| +    createParser('A a, b, c'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNull); | 
| expect(declarationList.type, isNotNull); | 
| expect(declarationList.variables, hasLength(3)); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_type_single() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "A a"); | 
| +    createParser('A a'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNull); | 
| expect(declarationList.type, isNotNull); | 
| expect(declarationList.variables, hasLength(1)); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_var_multiple() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "var a, b, c"); | 
| +    createParser('var a, b, c'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNotNull); | 
| expect(declarationList.type, isNull); | 
| expect(declarationList.variables, hasLength(3)); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_var_single() { | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "var a"); | 
| +    createParser('var a'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNotNull); | 
| expect(declarationList.type, isNull); | 
| expect(declarationList.variables, hasLength(1)); | 
| @@ -10776,20 +12015,23 @@ void'''); | 
|  | 
| void test_parseVariableDeclarationListAfterMetadata_var_typeComment() { | 
| enableGenericMethodComments = true; | 
| -    VariableDeclarationList decl = parse( | 
| -        "parseVariableDeclarationListAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "var/*=T*/ x"); | 
| -    expect(decl.type.name.name, 'T'); | 
| -    expect(decl.keyword, isNull); | 
| +    createParser('var/*=T*/ x'); | 
| +    VariableDeclarationList declarationList = parser | 
| +        .parseVariableDeclarationListAfterMetadata(emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| +    expect(declarationList.type.name.name, 'T'); | 
| +    expect(declarationList.keyword, isNull); | 
| } | 
|  | 
| void test_parseVariableDeclarationListAfterType_type() { | 
| TypeName type = new TypeName(new SimpleIdentifier(null), null); | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterType", | 
| -        <Object>[emptyCommentAndMetadata(), null, type], | 
| -        "a"); | 
| +    createParser('a'); | 
| +    VariableDeclarationList declarationList = | 
| +        parser.parseVariableDeclarationListAfterType( | 
| +            emptyCommentAndMetadata(), null, type); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, isNull); | 
| expect(declarationList.type, type); | 
| expect(declarationList.variables, hasLength(1)); | 
| @@ -10797,20 +12039,24 @@ void'''); | 
|  | 
| void test_parseVariableDeclarationListAfterType_var() { | 
| Token keyword = TokenFactory.tokenFromKeyword(Keyword.VAR); | 
| -    VariableDeclarationList declarationList = parse( | 
| -        "parseVariableDeclarationListAfterType", | 
| -        <Object>[emptyCommentAndMetadata(), keyword, null], | 
| -        "a, b, c"); | 
| +    createParser('a, b, c'); | 
| +    VariableDeclarationList declarationList = | 
| +        parser.parseVariableDeclarationListAfterType( | 
| +            emptyCommentAndMetadata(), keyword, null); | 
| +    expectNotNullIfNoErrors(declarationList); | 
| +    listener.assertNoErrors(); | 
| expect(declarationList.keyword, keyword); | 
| expect(declarationList.type, isNull); | 
| expect(declarationList.variables, hasLength(3)); | 
| } | 
|  | 
| void test_parseVariableDeclarationStatementAfterMetadata_multiple() { | 
| -    VariableDeclarationStatement statement = parse( | 
| -        "parseVariableDeclarationStatementAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "var x, y, z;"); | 
| +    createParser('var x, y, z;'); | 
| +    VariableDeclarationStatement statement = | 
| +        parser.parseVariableDeclarationStatementAfterMetadata( | 
| +            emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.semicolon, isNotNull); | 
| VariableDeclarationList variableList = statement.variables; | 
| expect(variableList, isNotNull); | 
| @@ -10818,10 +12064,12 @@ void'''); | 
| } | 
|  | 
| void test_parseVariableDeclarationStatementAfterMetadata_single() { | 
| -    VariableDeclarationStatement statement = parse( | 
| -        "parseVariableDeclarationStatementAfterMetadata", | 
| -        <Object>[emptyCommentAndMetadata()], | 
| -        "var x;"); | 
| +    createParser('var x;'); | 
| +    VariableDeclarationStatement statement = | 
| +        parser.parseVariableDeclarationStatementAfterMetadata( | 
| +            emptyCommentAndMetadata()); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.semicolon, isNotNull); | 
| VariableDeclarationList variableList = statement.variables; | 
| expect(variableList, isNotNull); | 
| @@ -10829,7 +12077,10 @@ void'''); | 
| } | 
|  | 
| void test_parseWhileStatement() { | 
| -    WhileStatement statement = parse4("parseWhileStatement", "while (x) {}"); | 
| +    createParser('while (x) {}'); | 
| +    WhileStatement statement = parser.parseWhileStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.whileKeyword, isNotNull); | 
| expect(statement.leftParenthesis, isNotNull); | 
| expect(statement.condition, isNotNull); | 
| @@ -10838,19 +12089,28 @@ void'''); | 
| } | 
|  | 
| void test_parseWithClause_multiple() { | 
| -    WithClause clause = parse4("parseWithClause", "with A, B, C"); | 
| +    createParser('with A, B, C'); | 
| +    WithClause clause = parser.parseWithClause(); | 
| +    expectNotNullIfNoErrors(clause); | 
| +    listener.assertNoErrors(); | 
| expect(clause.withKeyword, isNotNull); | 
| expect(clause.mixinTypes, hasLength(3)); | 
| } | 
|  | 
| void test_parseWithClause_single() { | 
| -    WithClause clause = parse4("parseWithClause", "with M"); | 
| +    createParser('with M'); | 
| +    WithClause clause = parser.parseWithClause(); | 
| +    expectNotNullIfNoErrors(clause); | 
| +    listener.assertNoErrors(); | 
| expect(clause.withKeyword, isNotNull); | 
| expect(clause.mixinTypes, hasLength(1)); | 
| } | 
|  | 
| void test_parseYieldStatement_each() { | 
| -    YieldStatement statement = parse4("parseYieldStatement", "yield* x;"); | 
| +    createParser('yield* x;'); | 
| +    YieldStatement statement = parser.parseYieldStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.yieldKeyword, isNotNull); | 
| expect(statement.star, isNotNull); | 
| expect(statement.expression, isNotNull); | 
| @@ -10858,7 +12118,10 @@ void'''); | 
| } | 
|  | 
| void test_parseYieldStatement_normal() { | 
| -    YieldStatement statement = parse4("parseYieldStatement", "yield x;"); | 
| +    createParser('yield x;'); | 
| +    YieldStatement statement = parser.parseYieldStatement(); | 
| +    expectNotNullIfNoErrors(statement); | 
| +    listener.assertNoErrors(); | 
| expect(statement.yieldKeyword, isNotNull); | 
| expect(statement.star, isNull); | 
| expect(statement.expression, isNotNull); | 
| @@ -10866,109 +12129,128 @@ void'''); | 
| } | 
|  | 
| void test_skipPrefixedIdentifier_invalid() { | 
| -    Token following = _skip("skipPrefixedIdentifier", "+"); | 
| +    createParser('+'); | 
| +    Token following = parser.skipPrefixedIdentifier(parser.currentToken); | 
| expect(following, isNull); | 
| } | 
|  | 
| void test_skipPrefixedIdentifier_notPrefixed() { | 
| -    Token following = _skip("skipPrefixedIdentifier", "a +"); | 
| +    createParser('a +'); | 
| +    Token following = parser.skipPrefixedIdentifier(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipPrefixedIdentifier_prefixed() { | 
| -    Token following = _skip("skipPrefixedIdentifier", "a.b +"); | 
| +    createParser('a.b +'); | 
| +    Token following = parser.skipPrefixedIdentifier(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipReturnType_invalid() { | 
| -    Token following = _skip("skipReturnType", "+"); | 
| +    createParser('+'); | 
| +    Token following = parser.skipReturnType(parser.currentToken); | 
| expect(following, isNull); | 
| } | 
|  | 
| void test_skipReturnType_type() { | 
| -    Token following = _skip("skipReturnType", "C +"); | 
| +    createParser('C +'); | 
| +    Token following = parser.skipReturnType(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipReturnType_void() { | 
| -    Token following = _skip("skipReturnType", "void +"); | 
| +    createParser('void +'); | 
| +    Token following = parser.skipReturnType(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipSimpleIdentifier_identifier() { | 
| -    Token following = _skip("skipSimpleIdentifier", "i +"); | 
| +    createParser('i +'); | 
| +    Token following = parser.skipSimpleIdentifier(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipSimpleIdentifier_invalid() { | 
| -    Token following = _skip("skipSimpleIdentifier", "9 +"); | 
| +    createParser('9 +'); | 
| +    Token following = parser.skipSimpleIdentifier(parser.currentToken); | 
| expect(following, isNull); | 
| } | 
|  | 
| void test_skipSimpleIdentifier_pseudoKeyword() { | 
| -    Token following = _skip("skipSimpleIdentifier", "as +"); | 
| +    createParser('as +'); | 
| +    Token following = parser.skipSimpleIdentifier(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipStringLiteral_adjacent() { | 
| -    Token following = _skip("skipStringLiteral", "'a' 'b' +"); | 
| +    createParser("'a' 'b' +"); | 
| +    Token following = parser.skipStringLiteral(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipStringLiteral_interpolated() { | 
| -    Token following = _skip("skipStringLiteral", "'a\${b}c' +"); | 
| +    createParser("'a\${b}c' +"); | 
| +    Token following = parser.skipStringLiteral(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipStringLiteral_invalid() { | 
| -    Token following = _skip("skipStringLiteral", "a"); | 
| +    createParser('a'); | 
| +    Token following = parser.skipStringLiteral(parser.currentToken); | 
| expect(following, isNull); | 
| } | 
|  | 
| void test_skipStringLiteral_single() { | 
| -    Token following = _skip("skipStringLiteral", "'a' +"); | 
| +    createParser("'a' +"); | 
| +    Token following = parser.skipStringLiteral(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipTypeArgumentList_invalid() { | 
| -    Token following = _skip("skipTypeArgumentList", "+"); | 
| +    createParser('+'); | 
| +    Token following = parser.skipTypeArgumentList(parser.currentToken); | 
| expect(following, isNull); | 
| } | 
|  | 
| void test_skipTypeArgumentList_multiple() { | 
| -    Token following = _skip("skipTypeArgumentList", "<E, F, G> +"); | 
| +    createParser('<E, F, G> +'); | 
| +    Token following = parser.skipTypeArgumentList(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipTypeArgumentList_single() { | 
| -    Token following = _skip("skipTypeArgumentList", "<E> +"); | 
| +    createParser('<E> +'); | 
| +    Token following = parser.skipTypeArgumentList(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipTypeName_invalid() { | 
| -    Token following = _skip("skipTypeName", "+"); | 
| +    createParser('+'); | 
| +    Token following = parser.skipTypeName(parser.currentToken); | 
| expect(following, isNull); | 
| } | 
|  | 
| void test_skipTypeName_parameterized() { | 
| -    Token following = _skip("skipTypeName", "C<E<F<G>>> +"); | 
| +    createParser('C<E<F<G>>> +'); | 
| +    Token following = parser.skipTypeName(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
|  | 
| void test_skipTypeName_simple() { | 
| -    Token following = _skip("skipTypeName", "C +"); | 
| +    createParser('C +'); | 
| +    Token following = parser.skipTypeName(parser.currentToken); | 
| expect(following, isNotNull); | 
| expect(following.type, TokenType.PLUS); | 
| } | 
| @@ -10983,38 +12265,10 @@ void'''); | 
| * @throws Exception if the method could not be invoked or throws an exception | 
| */ | 
| String _computeStringValue(String lexeme, bool first, bool last) { | 
| -    AnalysisErrorListener listener = | 
| -        new AnalysisErrorListener_SimpleParserTest_computeStringValue(); | 
| -    Parser parser = new Parser(null, listener); | 
| -    return invokeParserMethodImpl( | 
| -            parser, "computeStringValue", <Object>[lexeme, first, last], null) | 
| -        as String; | 
| -  } | 
| - | 
| -  /** | 
| -   * Invoke the method [Parser.createSyntheticIdentifier] with the parser set to the token | 
| -   * stream produced by scanning the given source. | 
| -   * | 
| -   * @param source the source to be scanned to produce the token stream being tested | 
| -   * @return the result of invoking the method | 
| -   * @throws Exception if the method could not be invoked or throws an exception | 
| -   */ | 
| -  SimpleIdentifier _createSyntheticIdentifier() { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    return invokeParserMethod2("createSyntheticIdentifier", "", listener); | 
| -  } | 
| - | 
| -  /** | 
| -   * Invoke the method [Parser.createSyntheticIdentifier] with the parser set to the token | 
| -   * stream produced by scanning the given source. | 
| -   * | 
| -   * @param source the source to be scanned to produce the token stream being tested | 
| -   * @return the result of invoking the method | 
| -   * @throws Exception if the method could not be invoked or throws an exception | 
| -   */ | 
| -  SimpleStringLiteral _createSyntheticStringLiteral() { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    return invokeParserMethod2("createSyntheticStringLiteral", "", listener); | 
| +    createParser(''); | 
| +    String value = parser.computeStringValue(lexeme, first, last); | 
| +    listener.assertNoErrors(); | 
| +    return value; | 
| } | 
|  | 
| void _expectDottedName(DottedName name, List<String> expectedComponents) { | 
| @@ -11037,9 +12291,10 @@ void'''); | 
| * @throws Exception if the method could not be invoked or throws an exception | 
| */ | 
| bool _isFunctionDeclaration(String source) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    return invokeParserMethod2("isFunctionDeclaration", source, listener) | 
| -        as bool; | 
| +    createParser(source); | 
| +    bool result = parser.isFunctionDeclaration(); | 
| +    expectNotNullIfNoErrors(result); | 
| +    return result; | 
| } | 
|  | 
| /** | 
| @@ -11051,20 +12306,8 @@ void'''); | 
| * @throws Exception if the method could not be invoked or throws an exception | 
| */ | 
| bool _isFunctionExpression(String source) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    // | 
| -    // Scan the source. | 
| -    // | 
| -    Scanner scanner = | 
| -        new Scanner(null, new CharSequenceReader(source), listener); | 
| -    Token tokenStream = scanner.tokenize(); | 
| -    // | 
| -    // Parse the source. | 
| -    // | 
| -    Parser parser = new Parser(null, listener); | 
| -    return invokeParserMethodImpl( | 
| -            parser, "isFunctionExpression", <Object>[tokenStream], tokenStream) | 
| -        as bool; | 
| +    createParser(source); | 
| +    return parser.isFunctionExpression(parser.currentToken); | 
| } | 
|  | 
| /** | 
| @@ -11076,9 +12319,10 @@ void'''); | 
| * @throws Exception if the method could not be invoked or throws an exception | 
| */ | 
| bool _isInitializedVariableDeclaration(String source) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    return invokeParserMethod2( | 
| -        "isInitializedVariableDeclaration", source, listener) as bool; | 
| +    createParser(source); | 
| +    bool result = parser.isInitializedVariableDeclaration(); | 
| +    expectNotNullIfNoErrors(result); | 
| +    return result; | 
| } | 
|  | 
| /** | 
| @@ -11090,8 +12334,10 @@ void'''); | 
| * @throws Exception if the method could not be invoked or throws an exception | 
| */ | 
| bool _isSwitchMember(String source) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    return invokeParserMethod2("isSwitchMember", source, listener) as bool; | 
| +    createParser(source); | 
| +    bool result = parser.isSwitchMember(); | 
| +    expectNotNullIfNoErrors(result); | 
| +    return result; | 
| } | 
|  | 
| /** | 
| @@ -11105,42 +12351,11 @@ void'''); | 
| */ | 
| CompilationUnit _parseDirectives(String source, | 
| [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) { | 
| -    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.parseDirectives(token); | 
| +    createParser(source); | 
| +    CompilationUnit unit = parser.parseDirectives2(); | 
| expect(unit, isNotNull); | 
| expect(unit.declarations, hasLength(0)); | 
| listener.assertErrorsWithCodes(errorCodes); | 
| return unit; | 
| } | 
| - | 
| -  /** | 
| -   * Invoke a "skip" method in [Parser]. The method is assumed to take a token as it's | 
| -   * parameter and is given the first token in the scanned source. | 
| -   * | 
| -   * @param methodName the name of the method that should be invoked | 
| -   * @param source the source to be processed by the method | 
| -   * @return the result of invoking the method | 
| -   * @throws Exception if the method could not be invoked or throws an exception | 
| -   * @throws AssertionFailedError if the result is `null` | 
| -   */ | 
| -  Token _skip(String methodName, String source) { | 
| -    GatheringErrorListener listener = new GatheringErrorListener(); | 
| -    // | 
| -    // Scan the source. | 
| -    // | 
| -    Scanner scanner = | 
| -        new Scanner(null, new CharSequenceReader(source), listener); | 
| -    Token tokenStream = scanner.tokenize(); | 
| -    // | 
| -    // Parse the source. | 
| -    // | 
| -    Parser parser = new Parser(null, listener); | 
| -    return invokeParserMethodImpl( | 
| -        parser, methodName, <Object>[tokenStream], tokenStream) as Token; | 
| -  } | 
| } | 
|  |