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>
This commit is contained in:
Dan Rubel 2018-05-29 16:30:46 +00:00 committed by commit-bot@chromium.org
parent 6bc7288e70
commit b7336ab443
7 changed files with 145 additions and 133 deletions

View file

@ -1310,13 +1310,6 @@ class RecoveryParserTest_Fasta extends FastaParserTestCase
]);
}
@override
@failingTest
void test_incompleteTypeArguments_field() {
// TODO(brianwilkerson) reportUnrecoverableErrorWithToken
super.test_incompleteTypeArguments_field();
}
@override
@failingTest
void test_missingIdentifier_afterAnnotation() {

View file

@ -91,6 +91,14 @@ List<List<int>> _s_;
''');
}
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 @@ List<int> _s_;
''');
}
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;

View file

@ -2389,8 +2389,8 @@ class Parser {
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 @@ class Parser {
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 @@ class Parser {
Token varFinalOrConst,
Token beforeType,
TypeInfo typeInfo,
Token beforeName,
Token name,
bool isTopLevel) {
if (externalToken != null) {
reportRecoverableError(externalToken, fasta.messageExternalField);
@ -2422,8 +2422,7 @@ class Parser {
}
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 @@ class Parser {
}
}
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 @@ class Parser {
}
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 @@ class Parser {
beforeType,
typeInfo,
getOrSet,
token);
token.next);
listener.endMember();
return token;
} else if (optional('===', next2) ||
@ -3016,7 +3015,7 @@ class Parser {
beforeType,
typeInfo,
getOrSet,
token);
token.next);
listener.endMember();
return token;
}
@ -3069,14 +3068,22 @@ class Parser {
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 @@ class Parser {
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 @@ class Parser {
// 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 @@ class Parser {
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 @@ class Parser {
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 @@ class Parser {
}
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 @@ class Parser {
beforeType,
typeInfo,
null,
beforeName);
beforeName.next);
listener.endMember();
return token;
}
@ -5890,7 +5892,7 @@ class Parser {
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 @@ class Parser {
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();

View file

@ -23,7 +23,7 @@ import 'parser.dart' show Parser;
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 @@ bool looksLikeTypeParamOrArg(bool inDeclaration, Token token) {
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 @@ Token processEndGroup(Token token, BeginToken start, Parser parser) {
// 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.

View file

@ -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 @@ class TypeInfoTest {
// 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 @@ class TypeParamOrArgInfoTest {
'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 @@ class TypeParamOrArgInfoTest {
'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 expectInfo(expectedInfo, String source, {bool required}) {
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 @@ ComplexTypeInfo computeComplex(
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 @@ ComplexTypeInfo computeComplex(
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 expectComplexTypeArg(String source,
}
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 expectComplexTypeParam(String source,
}
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');

View file

@ -7089,24 +7089,7 @@ Language/Classes/Constructors/Generative_Constructors/initializers_t12: Crash #
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

View file

@ -559,31 +559,10 @@ generic_methods_type_expression_test/01: Crash # 'file:*/pkg/compiler/lib/src/ss
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.