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.