Improve field type argument recovery

This CL improves recovery when parsing field type arguments
and adds more tests for parsing type parameters and type arguments.

Change-Id: Ib6ee4081f898d0421d90a66de84d686206a06a8f
Reviewed-on: https://dart-review.googlesource.com/56682
Commit-Queue: Dan Rubel <danrubel@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index d7ad1ec..2ff080d 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -1312,13 +1312,6 @@
 
   @override
   @failingTest
-  void test_incompleteTypeArguments_field() {
-    // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
-    super.test_incompleteTypeArguments_field();
-  }
-
-  @override
-  @failingTest
   void test_missingIdentifier_afterAnnotation() {
     // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
     super.test_missingIdentifier_afterAnnotation();
diff --git a/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart b/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
index b54a731..b8145d1 100644
--- a/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
@@ -91,6 +91,14 @@
 ''');
   }
 
+  void test_typeArguments_inner_last2() {
+    testRecovery('''
+List<List<int> f;
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+List<List<int>> f;
+''');
+  }
+
   @failingTest
   void test_typeArguments_inner_notLast() {
     testRecovery('''
@@ -118,6 +126,14 @@
 ''');
   }
 
+  void test_typeArguments_outer_last2() {
+    testRecovery('''
+List<int f;
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+List<int> f;
+''');
+  }
+
   void test_typeArguments_missing_comma() {
     testRecovery('''
 List<int double> f;
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 08e0144..1375174 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -2389,8 +2389,8 @@
               varFinalOrConst, fasta.templateExtraneousModifier);
         }
       }
-      return parseTopLevelMethod(
-          beforeStart, externalToken, beforeType, typeInfo, getOrSet, token);
+      return parseTopLevelMethod(beforeStart, externalToken, beforeType,
+          typeInfo, getOrSet, token.next);
     }
 
     if (getOrSet != null) {
@@ -2398,7 +2398,7 @@
           getOrSet, fasta.templateExtraneousModifier);
     }
     return parseFields(beforeStart, externalToken, null, null, varFinalOrConst,
-        beforeType, typeInfo, token, true);
+        beforeType, typeInfo, token.next, true);
   }
 
   Token parseFields(
@@ -2409,7 +2409,7 @@
       Token varFinalOrConst,
       Token beforeType,
       TypeInfo typeInfo,
-      Token beforeName,
+      Token name,
       bool isTopLevel) {
     if (externalToken != null) {
       reportRecoverableError(externalToken, fasta.messageExternalField);
@@ -2422,8 +2422,7 @@
     }
     if (typeInfo == noType) {
       if (varFinalOrConst == null) {
-        reportRecoverableError(
-            beforeName.next, fasta.messageMissingConstFinalVarOrType);
+        reportRecoverableError(name, fasta.messageMissingConstFinalVarOrType);
       }
     } else {
       if (varFinalOrConst != null && optional('var', varFinalOrConst)) {
@@ -2431,16 +2430,16 @@
       }
     }
 
-    typeInfo.parseType(beforeType, this);
+    Token token = typeInfo.parseType(beforeType, this);
+    assert(token.next == name);
 
     IdentifierContext context = isTopLevel
         ? IdentifierContext.topLevelVariableDeclaration
         : IdentifierContext.fieldDeclaration;
-    Token name = ensureIdentifier(beforeName, context);
+    name = ensureIdentifier(token, context);
 
     int fieldCount = 1;
-    Token token =
-        parseFieldInitializerOpt(name, name, varFinalOrConst, isTopLevel);
+    token = parseFieldInitializerOpt(name, name, varFinalOrConst, isTopLevel);
     while (optional(',', token.next)) {
       name = ensureIdentifier(token.next, context);
       token = parseFieldInitializerOpt(name, name, varFinalOrConst, isTopLevel);
@@ -2458,14 +2457,14 @@
   }
 
   Token parseTopLevelMethod(Token beforeStart, Token externalToken,
-      Token beforeType, TypeInfo typeInfo, Token getOrSet, Token beforeName) {
+      Token beforeType, TypeInfo typeInfo, Token getOrSet, Token name) {
     listener.beginTopLevelMethod(beforeStart, externalToken);
 
-    typeInfo.parseType(beforeType, this);
-    Token name = ensureIdentifier(
-        beforeName, IdentifierContext.topLevelFunctionDeclaration);
+    Token token = typeInfo.parseType(beforeType, this);
+    assert(token.next == (getOrSet ?? name));
+    name = ensureIdentifier(
+        getOrSet ?? token, IdentifierContext.topLevelFunctionDeclaration);
 
-    Token token;
     bool isGetter = false;
     if (getOrSet == null) {
       token = computeTypeParamOrArg(name, true).parseVariables(name, this);
@@ -2995,7 +2994,7 @@
               beforeType,
               typeInfo,
               getOrSet,
-              token);
+              token.next);
           listener.endMember();
           return token;
         } else if (optional('===', next2) ||
@@ -3016,7 +3015,7 @@
               beforeType,
               typeInfo,
               getOrSet,
-              token);
+              token.next);
           listener.endMember();
           return token;
         }
@@ -3069,14 +3068,22 @@
           beforeType,
           typeInfo,
           getOrSet,
-          token);
+          token.next);
     } else {
       if (getOrSet != null) {
         reportRecoverableErrorWithToken(
             getOrSet, fasta.templateExtraneousModifier);
       }
-      token = parseFields(beforeStart, externalToken, staticToken,
-          covariantToken, varFinalOrConst, beforeType, typeInfo, token, false);
+      token = parseFields(
+          beforeStart,
+          externalToken,
+          staticToken,
+          covariantToken,
+          varFinalOrConst,
+          beforeType,
+          typeInfo,
+          token.next,
+          false);
     }
     listener.endMember();
     return token;
@@ -3091,8 +3098,8 @@
       Token beforeType,
       TypeInfo typeInfo,
       Token getOrSet,
-      Token beforeName) {
-    bool isOperator = getOrSet == null && optional('operator', beforeName.next);
+      Token name) {
+    bool isOperator = getOrSet == null && optional('operator', name);
 
     if (staticToken != null) {
       if (isOperator) {
@@ -3125,16 +3132,17 @@
 
     // TODO(danrubel): Consider parsing the name before calling beginMethod
     // rather than passing the name token into beginMethod.
-    listener.beginMethod(externalToken, staticToken, covariantToken,
-        varFinalOrConst, beforeName.next);
+    listener.beginMethod(
+        externalToken, staticToken, covariantToken, varFinalOrConst, name);
 
-    typeInfo.parseType(beforeType, this);
+    Token token = typeInfo.parseType(beforeType, this);
+    assert(token.next == (getOrSet ?? name));
+    token = getOrSet ?? token;
 
-    Token token;
     if (isOperator) {
-      token = parseOperatorName(beforeName);
+      token = parseOperatorName(token);
     } else {
-      token = ensureIdentifier(beforeName, IdentifierContext.methodDeclaration);
+      token = ensureIdentifier(token, IdentifierContext.methodDeclaration);
       token = parseQualifiedRestOpt(
           token, IdentifierContext.methodDeclarationContinuation);
     }
@@ -3150,7 +3158,7 @@
     MemberKind kind = staticToken != null
         ? MemberKind.StaticMethod
         : MemberKind.NonStaticMethod;
-    checkFormals(beforeName.next, isGetter, token.next, kind);
+    checkFormals(name, isGetter, token.next, kind);
     Token beforeParam = token;
     token = parseFormalParametersOpt(token, kind);
     token = parseInitializersOpt(token);
@@ -5815,7 +5823,7 @@
       Token covariantToken,
       Token varFinalOrConst,
       Token beforeType) {
-    TypeInfo typeInfo = computeType(beforeType, true);
+    TypeInfo typeInfo = computeType(beforeType, true, true);
 
     Token beforeName = typeInfo.skipType(beforeType);
     Token next = beforeName.next;
@@ -5829,12 +5837,6 @@
     }
 
     assert((next.isOperator && next.endGroup == null) || optional('===', next));
-    if (!next.isUserDefinableOperator) {
-      beforeName = next;
-      insertSyntheticIdentifier(beforeName, IdentifierContext.methodDeclaration,
-          message: fasta.templateInvalidOperator.withArguments(next),
-          messageOnToken: next);
-    }
 
     Token token = parseMethod(
         beforeStart,
@@ -5845,7 +5847,7 @@
         beforeType,
         typeInfo,
         null,
-        beforeName);
+        beforeName.next);
     listener.endMember();
     return token;
   }
@@ -5890,7 +5892,7 @@
           beforeType,
           typeInfo,
           getOrSet,
-          token);
+          token.next);
     } else if (token == beforeStart) {
       // TODO(danrubel): Provide a more specific error message for extra ';'.
       reportRecoverableErrorWithToken(next, fasta.templateExpectedClassMember);
@@ -5900,8 +5902,16 @@
         token = next;
       }
     } else {
-      token = parseFields(beforeStart, externalToken, staticToken,
-          covariantToken, varFinalOrConst, beforeType, typeInfo, token, false);
+      token = parseFields(
+          beforeStart,
+          externalToken,
+          staticToken,
+          covariantToken,
+          varFinalOrConst,
+          beforeType,
+          typeInfo,
+          token.next,
+          false);
     }
 
     listener.endMember();
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index c0774ee..461ebcc 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -23,7 +23,7 @@
 
 import 'type_info.dart';
 
-import 'util.dart' show optional, skipMetadata;
+import 'util.dart' show isOneOf, optional, skipMetadata;
 
 /// See documentation on the [noType] const.
 class NoType implements TypeInfo {
@@ -231,9 +231,7 @@
   if (inDeclaration && token.kind == IDENTIFIER_TOKEN) {
     Token next = token.next;
     if (next.kind == IDENTIFIER_TOKEN ||
-        optional(',', next) ||
-        optional('>', next) ||
-        optional('>>', next)) {
+        isOneOf(next, const [',', '>', '>>'])) {
       return true;
     }
   }
@@ -760,9 +758,8 @@
     // Extraneous tokens between `<` and `>`.
     parser.reportRecoverableErrorWithToken(next, fasta.templateUnexpectedToken);
     return start.endGroup;
-  } else if (optional('>>', next) ||
-      optional('>=', next) ||
-      optional('>>=', next)) {
+  } else if (isOneOf(next, const ['>>', '>=', '>>='])) {
+    // Found single unbalanced `<`.
     return parser.rewriter.splitEndGroup(start, next);
   }
   // Ensure that `>` is inserted after any newly inserted synthetic tokens.
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 9fed8bf..d2d53a5 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:front_end/src/fasta/messages.dart';
 import 'package:front_end/src/fasta/parser.dart';
+import 'package:front_end/src/fasta/parser/type_continuation.dart';
 import 'package:front_end/src/fasta/parser/type_info.dart';
 import 'package:front_end/src/fasta/parser/type_info_impl.dart';
 import 'package:front_end/src/fasta/scanner.dart';
@@ -522,23 +523,25 @@
     // TOOD(danrubel): dynamic, do, other keywords, malformed, recovery
     // <T>
 
-    // TODO(danrubel): Improve missing comma recovery
     expectTypeParamOrArg(noTypeParamOrArg, 'G<int double> g');
-    // expectComplexInfo('G<int double> g',
-    //     required: true,
-    //     tokenAfter: 'g',
-    //     expectedCalls: [
-    //       'handleIdentifier G typeReference',
-    //       'beginTypeArguments <',
-    //       'handleIdentifier int typeReference',
-    //       'handleNoTypeArguments double',
-    //       'handleType int double',
-    //       'endTypeArguments 1 < >',
-    //       'handleType G g',
-    //     ],
-    //     expectedErrors: [
-    //       error(codeExpectedToken, 6, 6)
-    //     ]);
+    expectComplexInfo('G<int double> g',
+        inDeclaration: true,
+        expectedAfter: 'g',
+        expectedCalls: [
+          'handleIdentifier G typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier int typeReference',
+          'handleNoTypeArguments double' /* was , */,
+          'handleType int double' /* was , */,
+          'handleIdentifier double typeReference',
+          'handleNoTypeArguments >',
+          'handleType double >',
+          'endTypeArguments 2 < >',
+          'handleType G g',
+        ],
+        expectedErrors: [
+          error(codeExpectedButGot, 6, 6)
+        ]);
 
     expectInfo(noType, 'C<>', required: false);
     expectComplexInfo('C<>', required: true, expectedCalls: [
@@ -1024,6 +1027,14 @@
       'handleType T >',
       'endTypeArguments 2 < >'
     ]);
+    expectComplexTypeArg('<S T>',
+        inDeclaration: true, expectedErrors: [error(codeExpectedButGot, 3, 1)]);
+    expectComplexTypeArg('<S',
+        inDeclaration: true, expectedErrors: [error(codeExpectedButGot, 2, 0)]);
+    expectComplexTypeArg('<@Foo S', inDeclaration: true, expectedErrors: [
+      error(codeUnexpectedToken, 1, 1),
+      error(codeExpectedButGot, 7, 0)
+    ]);
   }
 
   void test_computeTypeParam_complex() {
@@ -1214,6 +1225,14 @@
       'endTypeVariable < null',
       'endTypeVariables 1 < >',
     ]);
+    expectComplexTypeParam('<S T>', inDeclaration: true, expectedErrors: [
+      error(codeExpectedButGot, 3, 1),
+    ]);
+    expectComplexTypeParam('<S', inDeclaration: true, expectedErrors: [
+      error(codeExpectedButGot, 2, 0),
+    ]);
+    expectComplexTypeParam('<@Foo S',
+        inDeclaration: true, expectedErrors: [error(codeExpectedButGot, 7, 0)]);
   }
 }
 
@@ -1228,17 +1247,18 @@
 
 void expectComplexInfo(String source,
     {bool required,
+    bool inDeclaration = false,
     String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors}) {
   if (required == null) {
-    computeComplex(source, scan(source), true, expectedAfter, expectedCalls,
-        expectedErrors);
-    computeComplex(source, scan(source), false, expectedAfter, expectedCalls,
-        expectedErrors);
+    computeComplex(source, scan(source), true, inDeclaration, expectedAfter,
+        expectedCalls, expectedErrors);
+    computeComplex(source, scan(source), false, inDeclaration, expectedAfter,
+        expectedCalls, expectedErrors);
   } else {
-    computeComplex(source, scan(source), required, expectedAfter, expectedCalls,
-        expectedErrors);
+    computeComplex(source, scan(source), required, inDeclaration, expectedAfter,
+        expectedCalls, expectedErrors);
   }
 }
 
@@ -1274,12 +1294,14 @@
     String source,
     Token start,
     bool required,
+    bool inDeclaration,
     String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors) {
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
-  ComplexTypeInfo typeInfo =
-      compute(const isInstanceOf<ComplexTypeInfo>(), source, start, required);
+  ComplexTypeInfo typeInfo = compute(
+      const isInstanceOf<ComplexTypeInfo>(), source, start, required,
+      inDeclaration: inDeclaration);
   expect(typeInfo.start, start.next, reason: source);
   expect(typeInfo.couldBeExpression, isFalse);
   expectEnd(expectedAfter, typeInfo.skipType(start));
@@ -1291,28 +1313,35 @@
 
   expectEnd(expectedAfter, actualEnd);
   if (expectedCalls != null) {
-    // TypeInfoListener listener2 = new TypeInfoListener();
-    // new Parser(listener2).parseType(start, TypeContinuation.Required);
-    // print('[');
-    // for (String call in listener2.calls) {
-    //   print("'$call',");
-    // }
-    // print(']');
-
-    expect(listener.calls, expectedCalls, reason: source);
+    try {
+      expect(listener.calls, expectedCalls, reason: source);
+    } catch (e) {
+      TypeInfoListener listener2 = new TypeInfoListener();
+      new Parser(listener2).parseType(start, TypeContinuation.Required);
+      print('[');
+      for (String call in listener2.calls) {
+        print("'$call',");
+      }
+      print(']');
+      rethrow;
+    }
   }
   expect(listener.errors, expectedErrors, reason: source);
   return typeInfo;
 }
 
 void expectComplexTypeArg(String source,
-    {String expectedAfter,
+    {bool inDeclaration = false,
+    String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors}) {
   Token start = scan(source);
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeParamOrArgInfo typeVarInfo = computeVar(
-      const isInstanceOf<ComplexTypeParamOrArgInfo>(), source, start);
+      const isInstanceOf<ComplexTypeParamOrArgInfo>(),
+      source,
+      start,
+      inDeclaration);
 
   expect(typeVarInfo.start, start.next, reason: source);
   expectEnd(expectedAfter, typeVarInfo.skip(start));
@@ -1343,13 +1372,17 @@
 }
 
 void expectComplexTypeParam(String source,
-    {String expectedAfter,
+    {bool inDeclaration = false,
+    String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors}) {
   Token start = scan(source);
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeParamOrArgInfo typeVarInfo = computeVar(
-      const isInstanceOf<ComplexTypeParamOrArgInfo>(), source, start);
+      const isInstanceOf<ComplexTypeParamOrArgInfo>(),
+      source,
+      start,
+      inDeclaration);
 
   expect(typeVarInfo.start, start.next, reason: source);
   expectEnd(expectedAfter, typeVarInfo.skip(start));
@@ -1380,17 +1413,18 @@
 }
 
 void expectTypeParamOrArg(expectedInfo, String source,
-    {bool splitGtGt: true,
+    {bool inDeclaration = false,
     String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors}) {
   Token start = scan(source);
-  computeVar(expectedInfo, source, start);
+  computeVar(expectedInfo, source, start, inDeclaration);
 }
 
-TypeParamOrArgInfo computeVar(expectedInfo, String source, Token start) {
+TypeParamOrArgInfo computeVar(
+    expectedInfo, String source, Token start, bool inDeclaration) {
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
-  TypeParamOrArgInfo typeVarInfo = computeTypeParamOrArg(start);
+  TypeParamOrArgInfo typeVarInfo = computeTypeParamOrArg(start, inDeclaration);
   expect(typeVarInfo, expectedInfo, reason: source);
   expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
       reason: 'computeTypeParamOrArg should not modify the token stream');
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 5efb0e9..7f22c73 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -7089,24 +7089,7 @@
 Language/Classes/Constructors/Generative_Constructors/redirection_t03: Crash
 Language/Classes/Constructors/Generative_Constructors/redirection_t07: Crash
 Language/Classes/Constructors/Generative_Constructors/redirection_t08: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t02: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t05: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t07: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t08: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t09: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t10: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t11: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t12: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t13: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t14: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t15: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t16: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t17: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t18: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t19: Crash
 Language/Classes/Instance_Methods/Operators/allowed_names_t20: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t21: Crash
-Language/Classes/Instance_Methods/Operators/allowed_names_t22: Crash
 Language/Classes/member_definition_t04: Crash
 Language/Classes/member_definition_t06: Crash
 Language/Classes/member_definition_t07: Crash
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index e634a35..76720a4 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -559,31 +559,10 @@
 generic_methods_type_expression_test/03: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
 generic_methods_type_expression_test/none: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
 invocation_mirror_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 3014 pos 14: 'arguments.named.isEmpty': is not true.
-operator2_negative_test: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 sync_generator2_test/41: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
 sync_generator2_test/52: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
-syntax_test/04: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/05: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/06: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/07: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/08: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/09: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/10: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/11: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/13: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/14: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/15: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/16: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/17: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/18: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/19: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/20: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 syntax_test/21: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 syntax_test/22: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/23: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/24: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/25: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/26: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 
 [ $compiler == dart2js && $fasta && $minified ]
 deferred_load_library_wrong_args_test/01: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.