diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart index e6f1d45f5cc..80663317adf 100644 --- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart +++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart @@ -2881,17 +2881,6 @@ const MessageCode messageEmptyOptionalParameterList = const MessageCode( problemMessage: r"""Optional parameter lists cannot be empty.""", correctionMessage: r"""Try adding an optional parameter to the list."""); -// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. -const Code codeEmptyRecordTypeFieldsList = - messageEmptyRecordTypeFieldsList; - -// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. -const MessageCode messageEmptyRecordTypeFieldsList = const MessageCode( - "EmptyRecordTypeFieldsList", - analyzerCodes: ["MISSING_IDENTIFIER"], - problemMessage: r"""Record type fields list cannot be empty.""", - correctionMessage: r"""Try adding a record type field to the list."""); - // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. const Code codeEmptyRecordTypeNamedFieldsList = messageEmptyRecordTypeNamedFieldsList; @@ -2899,8 +2888,8 @@ const Code codeEmptyRecordTypeNamedFieldsList = // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. const MessageCode messageEmptyRecordTypeNamedFieldsList = const MessageCode( "EmptyRecordTypeNamedFieldsList", - analyzerCodes: ["MISSING_IDENTIFIER"], - problemMessage: r"""Record type named fields list cannot be empty.""", + index: 129, + problemMessage: r"""Record type named fields list can't be empty.""", correctionMessage: r"""Try adding a record type named field to the list."""); @@ -9124,19 +9113,6 @@ const Code codeObjectMixesIn = messageObjectMixesIn; const MessageCode messageObjectMixesIn = const MessageCode("ObjectMixesIn", problemMessage: r"""The class 'Object' can't use mixins."""); -// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. -const Code codeOnlyOneRecordTypeFieldsList = - messageOnlyOneRecordTypeFieldsList; - -// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. -const MessageCode messageOnlyOneRecordTypeFieldsList = const MessageCode( - "OnlyOneRecordTypeFieldsList", - analyzerCodes: ["MISSING_IDENTIFIER"], - problemMessage: - r"""Record type fields list cannot contain only one element without a named field.""", - correctionMessage: - r"""Try adding another record type field to the list or add a named field."""); - // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. const Code codeOnlyTry = messageOnlyTry; @@ -9934,7 +9910,19 @@ const MessageCode messageRecordLiteralOnePositionalFieldNoTrailingComma = const MessageCode("RecordLiteralOnePositionalFieldNoTrailingComma", index: 127, problemMessage: - r"""Record literal with one entry requires a trailing comma.""", + r"""Record literal with one field requires a trailing comma.""", + correctionMessage: r"""Try adding a trailing comma."""); + +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const Code codeRecordTypeOnePositionalFieldNoTrailingComma = + messageRecordTypeOnePositionalFieldNoTrailingComma; + +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const MessageCode messageRecordTypeOnePositionalFieldNoTrailingComma = + const MessageCode("RecordTypeOnePositionalFieldNoTrailingComma", + index: 130, + problemMessage: + r"""Record type with one entry requires a trailing comma.""", correctionMessage: r"""Try adding a trailing comma."""); // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart index 47270f49853..26082722661 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart @@ -1394,6 +1394,7 @@ class Parser { /// parameterCount counting the presence of named fields as 1. int parameterCount = 0; bool hasNamedFields = false; + bool sawComma = false; while (true) { Token next = token.next!; if (optional(')', next)) { @@ -1436,15 +1437,17 @@ class Parser { } } break; + } else { + sawComma = true; } token = next; } assert(optional(')', token)); - if (parameterCount == 0) { - reportRecoverableError(token, codes.messageEmptyRecordTypeFieldsList); - } else if (parameterCount == 1 && !hasNamedFields) { - reportRecoverableError(token, codes.messageOnlyOneRecordTypeFieldsList); + if (parameterCount == 1 && !hasNamedFields && !sawComma) { + // Single non-named element without trailing comma. + reportRecoverableError( + token, codes.messageRecordTypeOnePositionalFieldNoTrailingComma); } Token? questionMark = token.next!; diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart index 2cf0b4a0dc8..8f1ce4a7cc6 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart @@ -769,6 +769,7 @@ class ComplexTypeInfo implements TypeInfo { Token token, final Token endGroup) { int parameterCount = 0; bool hasNamedFields = false; + bool hasComma = false; while (true) { Token next = token.next!; if (optional(')', next)) { @@ -815,13 +816,14 @@ class ComplexTypeInfo implements TypeInfo { return; } break; + } else { + hasComma = true; } token = next; } if (!recovered && - (parameterCount == 0 || - (parameterCount == 1 && !hasNamedFields) || + ((parameterCount == 1 && !hasNamedFields && !hasComma) || token != endGroup)) { recovered = true; return; diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml index d7d2b2abb6e..dbb359e5731 100644 --- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml +++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml @@ -2107,6 +2107,8 @@ ParserErrorCode.EMPTY_ENUM_BODY: notes: |- We can't guess at the names or number of the enum constants that should be added. +ParserErrorCode.EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST: + status: needsEvaluation ParserErrorCode.ENUM_IN_CLASS: status: needsEvaluation ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND: @@ -2385,6 +2387,8 @@ ParserErrorCode.RECORD_LITERAL_EMPTY: status: needsEvaluation ParserErrorCode.RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA: status: needsEvaluation +ParserErrorCode.RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA: + status: needsEvaluation ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY: status: needsEvaluation ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR: diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart index e08dba4c13c..33e6c4881d2 100644 --- a/pkg/analyzer/lib/error/error.dart +++ b/pkg/analyzer/lib/error/error.dart @@ -747,6 +747,7 @@ const List errorCodeValues = [ ParserErrorCode.DUPLICATE_PREFIX, ParserErrorCode.DUPLICATED_MODIFIER, ParserErrorCode.EMPTY_ENUM_BODY, + ParserErrorCode.EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST, ParserErrorCode.ENUM_IN_CLASS, ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, ParserErrorCode.EXPECTED_BODY, @@ -886,6 +887,7 @@ const List errorCodeValues = [ ParserErrorCode.PREFIX_AFTER_COMBINATOR, ParserErrorCode.RECORD_LITERAL_EMPTY, ParserErrorCode.RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA, + ParserErrorCode.RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA, ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY, ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR, ParserErrorCode.SETTER_CONSTRUCTOR, diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart index c1298360072..1f9467d3d4b 100644 --- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart +++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart @@ -143,6 +143,8 @@ final fastaAnalyzerErrorCodes = [ ParserErrorCode.INVALID_UNICODE_ESCAPE_STARTED, ParserErrorCode.RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA, ParserErrorCode.RECORD_LITERAL_EMPTY, + ParserErrorCode.EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST, + ParserErrorCode.RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA, ]; class ParserErrorCode extends ErrorCode { @@ -433,6 +435,13 @@ class ParserErrorCode extends ErrorCode { correctionMessage: "Try declaring a constant.", ); + static const ParserErrorCode EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST = + ParserErrorCode( + 'EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST', + "Record type named fields list can't be empty.", + correctionMessage: "Try adding a record type named field to the list.", + ); + static const ParserErrorCode ENUM_IN_CLASS = ParserErrorCode( 'ENUM_IN_CLASS', "Enums can't be declared inside classes.", @@ -1392,7 +1401,14 @@ class ParserErrorCode extends ErrorCode { static const ParserErrorCode RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA = ParserErrorCode( 'RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA', - "Record literal with one entry requires a trailing comma.", + "Record literal with one field requires a trailing comma.", + correctionMessage: "Try adding a trailing comma.", + ); + + static const ParserErrorCode RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA = + ParserErrorCode( + 'RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA', + "Record type with one entry requires a trailing comma.", correctionMessage: "Try adding a trailing comma.", ); diff --git a/pkg/analyzer/test/src/fasta/ast_builder_test.dart b/pkg/analyzer/test/src/fasta/ast_builder_test.dart index 82bb936e020..1f13330a2c2 100644 --- a/pkg/analyzer/test/src/fasta/ast_builder_test.dart +++ b/pkg/analyzer/test/src/fasta/ast_builder_test.dart @@ -785,7 +785,6 @@ RecordLiteral '''); } - @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49826') void test_recordTypeAnnotation_empty() { var parseResult = parseStringWithErrors(r''' () f() {} diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml index 6971806e09d..401ed623cb6 100644 --- a/pkg/front_end/messages.yaml +++ b/pkg/front_end/messages.yaml @@ -324,7 +324,7 @@ EmptyNamedParameterList: } RecordLiteralOnePositionalFieldNoTrailingComma: - problemMessage: "Record literal with one entry requires a trailing comma." + problemMessage: "Record literal with one field requires a trailing comma." correctionMessage: "Try adding a trailing comma." analyzerCode: ParserErrorCode.RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA index: 127 @@ -345,34 +345,26 @@ RecordLiteralEmpty: var record = const (); } -EmptyRecordTypeFieldsList: - problemMessage: "Record type fields list cannot be empty." - correctionMessage: "Try adding a record type field to the list." - analyzerCode: "MISSING_IDENTIFIER" - experiments: records - script: > - main() { - (/*missing*/) record = ((1, 2,) as dynamic); - } - EmptyRecordTypeNamedFieldsList: - problemMessage: "Record type named fields list cannot be empty." + problemMessage: "Record type named fields list can't be empty." correctionMessage: "Try adding a record type named field to the list." - analyzerCode: "MISSING_IDENTIFIER" + analyzerCode: ParserErrorCode.EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST + index: 129 experiments: records script: > main() { (int, int, {/*missing*/}) record = (1, 2,); } -OnlyOneRecordTypeFieldsList: - problemMessage: "Record type fields list cannot contain only one element without a named field." - correctionMessage: "Try adding another record type field to the list or add a named field." - analyzerCode: "MISSING_IDENTIFIER" +RecordTypeOnePositionalFieldNoTrailingComma: + problemMessage: "Record type with one entry requires a trailing comma." + correctionMessage: "Try adding a trailing comma." + analyzerCode: ParserErrorCode.RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA + index: 130 experiments: records script: > main() { - (int /*missing*/) record = ((1, 2,) as dynamic); + (int /* missing trailing comma */) record = const (1, ); } DuplicatedRecordTypeFieldName: diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect index 6767fb44819..3ede2bce1d9 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect @@ -4,7 +4,7 @@ parser/error_recovery/issue_26073:3:16: Expected 'Function' before this. typedef c = foo(int x); // error. ^ -parser/error_recovery/issue_26073:4:19: Record type fields list cannot contain only one element without a named field. +parser/error_recovery/issue_26073:4:19: Record type with one entry requires a trailing comma. typedef d = (int x); // error. ^ @@ -122,7 +122,7 @@ beginCompilationUnit(typedef) handleType(int, null) handleIdentifier(x, recordFieldDeclaration) endRecordTypeEntry() - handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) endRecordType((, null, 1, false) endTypedef(typedef, =, ;) endTopLevelDeclaration(typedef) diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect index 8874f3a6a70..97bcffec7cd 100644 --- a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect @@ -137,8 +137,8 @@ parseUnit(typedef) ensureIdentifier(int, recordFieldDeclaration) listener: handleIdentifier(x, recordFieldDeclaration) listener: endRecordTypeEntry() - reportRecoverableError(), OnlyOneRecordTypeFieldsList) - listener: handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + reportRecoverableError(), RecordTypeOnePositionalFieldNoTrailingComma) + listener: handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) listener: endRecordType((, null, 1, false) ensureSemicolon()) listener: endTypedef(typedef, =, ;) diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect index 22bddf767b6..d289556f795 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect @@ -56,7 +56,7 @@ parser/error_recovery/keyword_named_class_methods:47:7: 'const' can't be used as int const(int x) { ^^^^^ -parser/error_recovery/keyword_named_class_methods:49:21: Record literal with one entry requires a trailing comma. +parser/error_recovery/keyword_named_class_methods:49:21: Record literal with one field requires a trailing comma. return const(x-1) + 1; ^ @@ -272,7 +272,7 @@ parser/error_recovery/keyword_named_class_methods:184:16: Expected ')' before th return is(x-1) + 1; ^ -parser/error_recovery/keyword_named_class_methods:184:18: Record type fields list cannot contain only one element without a named field. +parser/error_recovery/keyword_named_class_methods:184:18: Record type with one entry requires a trailing comma. return is(x-1) + 1; ^ @@ -2773,7 +2773,7 @@ beginCompilationUnit(class) handleNoName(-) endRecordTypeEntry() handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], -, -) - handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) endRecordType((, null, 1, false) endIsOperatorType(is) handleIsOperator(is, null) diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect index 34ad062c3df..e3a0fdf7be8 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect @@ -5741,8 +5741,8 @@ parseUnit(class) ensureCloseParen(x, () reportRecoverableError(-, Message[ExpectedButGot, Expected ')' before this., null, {string: )}]) listener: handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], -, -) - reportRecoverableError(), OnlyOneRecordTypeFieldsList) - listener: handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + reportRecoverableError(), RecordTypeOnePositionalFieldNoTrailingComma) + listener: handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) listener: endRecordType((, null, 1, false) listener: endIsOperatorType(is) listener: handleIsOperator(is, null) diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect index a9351f79897..68428557139 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect @@ -56,7 +56,7 @@ parser/error_recovery/keyword_named_top_level_methods:46:5: 'const' can't be use int const(int x) { ^^^^^ -parser/error_recovery/keyword_named_top_level_methods:48:19: Record literal with one entry requires a trailing comma. +parser/error_recovery/keyword_named_top_level_methods:48:19: Record literal with one field requires a trailing comma. return const(x-1) + 1; ^ @@ -272,7 +272,7 @@ parser/error_recovery/keyword_named_top_level_methods:183:14: Expected ')' befor return is(x-1) + 1; ^ -parser/error_recovery/keyword_named_top_level_methods:183:16: Record type fields list cannot contain only one element without a named field. +parser/error_recovery/keyword_named_top_level_methods:183:16: Record type with one entry requires a trailing comma. return is(x-1) + 1; ^ @@ -2708,7 +2708,7 @@ beginCompilationUnit(int) handleNoName(-) endRecordTypeEntry() handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], -, -) - handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) endRecordType((, null, 1, false) endIsOperatorType(is) handleIsOperator(is, null) diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect index 4c1a7a5a3c0..9268c49f798 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect @@ -5569,8 +5569,8 @@ parseUnit(int) ensureCloseParen(x, () reportRecoverableError(-, Message[ExpectedButGot, Expected ')' before this., null, {string: )}]) listener: handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], -, -) - reportRecoverableError(), OnlyOneRecordTypeFieldsList) - listener: handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + reportRecoverableError(), RecordTypeOnePositionalFieldNoTrailingComma) + listener: handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) listener: endRecordType((, null, 1, false) listener: endIsOperatorType(is) listener: handleIsOperator(is, null) diff --git a/pkg/front_end/parser_testcases/general/issue_45848_06.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_06.dart.expect index 7487cdf698c..79fe27322a5 100644 --- a/pkg/front_end/parser_testcases/general/issue_45848_06.dart.expect +++ b/pkg/front_end/parser_testcases/general/issue_45848_06.dart.expect @@ -102,38 +102,35 @@ beginCompilationUnit(void) handleNoTypeArguments(() beginArguments(() handleIdentifier(x, expression) - handleNoTypeArguments(<) - handleNoArguments(<) - handleSend(x, <) - beginBinaryExpression(<) - handleIdentifier(y, expression) + beginTypeArguments(<) + handleIdentifier(y, typeReference) handleNoTypeArguments(,) - handleNoArguments(,) - handleSend(y, ,) - endBinaryExpression(<) - beginParenthesizedExpressionOrRecordLiteral(() - beginAwaitExpression(await) - handleIdentifier(o, expression) - handleNoTypeArguments(,) - handleNoArguments(,) - handleSend(o, ,) - endAwaitExpression(await, ,) - endRecordLiteral((, 1, null) - beginBinaryExpression(>) - beginParenthesizedExpressionOrRecordLiteral(() - handleIdentifier(p, expression) - handleNoTypeArguments(as) - handleNoArguments(as) - handleSend(p, as) - beginAsOperatorType(as) - handleIdentifier(int, typeReference) - handleNoTypeArguments()) - handleType(int, null) - endAsOperatorType(as) - handleAsOperator(as) - endParenthesizedExpression(() - endBinaryExpression(>) - endArguments(2, (, )) + handleType(y, null) + beginRecordType(() + beginRecordTypeEntry() + beginMetadataStar(await) + endMetadataStar(0) + handleIdentifier(await, typeReference) + handleNoTypeArguments(o) + handleType(await, null) + handleIdentifier(o, recordFieldDeclaration) + endRecordTypeEntry() + endRecordType((, null, 1, false) + endTypeArguments(2, <, >) + beginArguments(() + handleIdentifier(p, expression) + handleNoTypeArguments(as) + handleNoArguments(as) + handleSend(p, as) + beginAsOperatorType(as) + handleIdentifier(int, typeReference) + handleNoTypeArguments()) + handleType(int, null) + endAsOperatorType(as) + handleAsOperator(as) + endArguments(1, (, )) + handleSend(x, )) + endArguments(1, (, )) handleSend(f, ;) handleExpressionStatement(;) endBlockFunctionBody(1, {, }) diff --git a/pkg/front_end/parser_testcases/general/issue_45848_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_06.dart.intertwined.expect index 694ee775c0d..62b0cc1988b 100644 --- a/pkg/front_end/parser_testcases/general/issue_45848_06.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/general/issue_45848_06.dart.intertwined.expect @@ -212,86 +212,54 @@ parseUnit(void) isNextIdentifier(() ensureIdentifier((, expression) listener: handleIdentifier(x, expression) - listener: handleNoTypeArguments(<) - parseArgumentsOpt(x) - listener: handleNoArguments(<) - listener: handleSend(x, <) - listener: beginBinaryExpression(<) - parsePrecedenceExpression(<, 9, true) - parseUnaryExpression(<, true) - parsePrimary(<, expression) - parseSendOrFunctionLiteral(<, expression) - parseSend(<, expression) - isNextIdentifier(<) - ensureIdentifier(<, expression) - listener: handleIdentifier(y, expression) - listener: handleNoTypeArguments(,) - parseArgumentsOpt(y) - listener: handleNoArguments(,) - listener: handleSend(y, ,) - listener: endBinaryExpression(<) - parseExpression(,) - parsePrecedenceExpression(,, 1, true) - parseUnaryExpression(,, true) - parsePrimary(,, expression) - parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,) - parseParenthesizedExpressionOrRecordLiteral(,, null) - listener: beginParenthesizedExpressionOrRecordLiteral(() - parseExpression(() - parsePrecedenceExpression((, 1, true) - parseUnaryExpression((, true) - inPlainSync() - parseAwaitExpression((, true) - listener: beginAwaitExpression(await) - parsePrecedenceExpression(await, 16, true) - parseUnaryExpression(await, true) - parsePrimary(await, expression) - parseSendOrFunctionLiteral(await, expression) - parseSend(await, expression) - isNextIdentifier(await) - ensureIdentifier(await, expression) - listener: handleIdentifier(o, expression) - listener: handleNoTypeArguments(,) - parseArgumentsOpt(o) - listener: handleNoArguments(,) - listener: handleSend(o, ,) - inAsync() - listener: endAwaitExpression(await, ,) - ensureCloseParen(,, () - listener: endRecordLiteral((, 1, null) - listener: beginBinaryExpression(>) - parsePrecedenceExpression(>, 9, true) - parseUnaryExpression(>, true) - parsePrimary(>, expression) - parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>) - parseParenthesizedExpressionOrRecordLiteral(>, null) - listener: beginParenthesizedExpressionOrRecordLiteral(() - parseExpression(() - parsePrecedenceExpression((, 1, true) - parseUnaryExpression((, true) - parsePrimary((, expression) - parseSendOrFunctionLiteral((, expression) - parseSend((, expression) - isNextIdentifier(() - ensureIdentifier((, expression) - listener: handleIdentifier(p, expression) - listener: handleNoTypeArguments(as) - parseArgumentsOpt(p) - listener: handleNoArguments(as) - listener: handleSend(p, as) - parseAsOperatorRest(p) - listener: beginAsOperatorType(as) - computeTypeAfterIsOrAs(as) - listener: handleIdentifier(int, typeReference) - listener: handleNoTypeArguments()) - listener: handleType(int, null) - listener: endAsOperatorType(as) - listener: handleAsOperator(as) - skipChainedAsIsOperators(int) - ensureCloseParen(int, () - listener: endParenthesizedExpression(() - listener: endBinaryExpression(>) - listener: endArguments(2, (, )) + listener: beginTypeArguments(<) + listener: handleIdentifier(y, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(y, null) + parseRecordType((, ,) + listener: beginRecordType(() + parseRecordTypeField((, identifierIsOptional: true) + listener: beginRecordTypeEntry() + parseMetadataStar(() + listener: beginMetadataStar(await) + listener: endMetadataStar(0) + listener: handleIdentifier(await, typeReference) + listener: handleNoTypeArguments(o) + listener: handleType(await, null) + ensureIdentifier(await, recordFieldDeclaration) + listener: handleIdentifier(o, recordFieldDeclaration) + listener: endRecordTypeEntry() + listener: endRecordType((, null, 1, false) + listener: endTypeArguments(2, <, >) + parseArgumentsOpt(>) + parseArguments(>) + parseArgumentsRest(() + listener: beginArguments(() + parseExpression(() + parsePrecedenceExpression((, 1, true) + parseUnaryExpression((, true) + parsePrimary((, expression) + parseSendOrFunctionLiteral((, expression) + parseSend((, expression) + isNextIdentifier(() + ensureIdentifier((, expression) + listener: handleIdentifier(p, expression) + listener: handleNoTypeArguments(as) + parseArgumentsOpt(p) + listener: handleNoArguments(as) + listener: handleSend(p, as) + parseAsOperatorRest(p) + listener: beginAsOperatorType(as) + computeTypeAfterIsOrAs(as) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments()) + listener: handleType(int, null) + listener: endAsOperatorType(as) + listener: handleAsOperator(as) + skipChainedAsIsOperators(int) + listener: endArguments(1, (, )) + listener: handleSend(x, )) + listener: endArguments(1, (, )) listener: handleSend(f, ;) ensureSemicolon()) listener: handleExpressionStatement(;) diff --git a/pkg/front_end/parser_testcases/record/record_literal_04.dart.expect b/pkg/front_end/parser_testcases/record/record_literal_04.dart.expect index 20c212c433b..d56b11647b0 100644 --- a/pkg/front_end/parser_testcases/record/record_literal_04.dart.expect +++ b/pkg/front_end/parser_testcases/record/record_literal_04.dart.expect @@ -1,6 +1,6 @@ Problems reported: -parser/record/record_literal_04:9:21: Record literal with one entry requires a trailing comma. +parser/record/record_literal_04:9:21: Record literal with one field requires a trailing comma. var r5 = const (42); ^ diff --git a/pkg/front_end/parser_testcases/record/record_type_02.dart b/pkg/front_end/parser_testcases/record/record_type_02.dart index 449c8a203f0..3ef1eac1495 100644 --- a/pkg/front_end/parser_testcases/record/record_type_02.dart +++ b/pkg/front_end/parser_testcases/record/record_type_02.dart @@ -1,6 +1,10 @@ -void foo() { +void errors() { (int, int, {/*missing*/}) record1 = (1, 2); - (int /* missing */ ) record2 = (1); - ({int ok}) record3 = (ok: 1); - (/*missing*/) record4 = (); + (int /* missing trailing comma */ ) record2 = (1, ); +} + +void ok() { + (int, ) record1 = (1, ); + ({int ok}) record2 = (ok: 1); + () record3 = Record.empty; } diff --git a/pkg/front_end/parser_testcases/record/record_type_02.dart.expect b/pkg/front_end/parser_testcases/record/record_type_02.dart.expect index bc4ea4de99e..fb6031a0bee 100644 --- a/pkg/front_end/parser_testcases/record/record_type_02.dart.expect +++ b/pkg/front_end/parser_testcases/record/record_type_02.dart.expect @@ -1,20 +1,12 @@ Problems reported: -parser/record/record_type_02:2:26: Record type named fields list cannot be empty. +parser/record/record_type_02:2:26: Record type named fields list can't be empty. (int, int, {/*missing*/}) record1 = (1, 2); ^ -parser/record/record_type_02:3:22: Record type fields list cannot contain only one element without a named field. - (int /* missing */ ) record2 = (1); - ^ - -parser/record/record_type_02:5:15: Record type fields list cannot be empty. - (/*missing*/) record4 = (); - ^ - -parser/record/record_type_02:5:28: Expected an identifier, but got ')'. - (/*missing*/) record4 = (); - ^ +parser/record/record_type_02:3:37: Record type with one entry requires a trailing comma. + (int /* missing trailing comma */ ) record2 = (1, ); + ^ beginCompilationUnit(void) beginMetadataStar(void) @@ -22,7 +14,7 @@ beginCompilationUnit(void) beginTopLevelMember(void) beginTopLevelMethod(, null, null) handleVoidKeyword(void) - handleIdentifier(foo, topLevelFunctionDeclaration) + handleIdentifier(errors, topLevelFunctionDeclaration) handleNoTypeVariables(() beginFormalParameters((, MemberKind.TopLevelMethod) endFormalParameters(0, (, ), MemberKind.TopLevelMethod) @@ -73,7 +65,7 @@ beginCompilationUnit(void) handleType(int, null) handleNoName()) endRecordTypeEntry() - handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) endRecordType((, null, 1, false) beginVariablesDeclaration(record2, null, null) handleIdentifier(record2, localVariableDeclaration) @@ -81,10 +73,46 @@ beginCompilationUnit(void) beginVariableInitializer(=) beginParenthesizedExpressionOrRecordLiteral(() handleLiteralInt(1) - endParenthesizedExpression(() + endRecordLiteral((, 1, null) endVariableInitializer(=) endInitializedIdentifier(record2) endVariablesDeclaration(1, ;) + endBlockFunctionBody(2, {, }) + endTopLevelMethod(void, null, }) + endTopLevelDeclaration(void) + beginMetadataStar(void) + endMetadataStar(0) + beginTopLevelMember(void) + beginTopLevelMethod(}, null, null) + handleVoidKeyword(void) + handleIdentifier(ok, topLevelFunctionDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.TopLevelMethod) + endFormalParameters(0, (, ), MemberKind.TopLevelMethod) + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + beginMetadataStar(() + endMetadataStar(0) + beginRecordType(() + beginRecordTypeEntry() + beginMetadataStar(int) + endMetadataStar(0) + handleIdentifier(int, typeReference) + handleNoTypeArguments(,) + handleType(int, null) + handleNoName(,) + endRecordTypeEntry() + endRecordType((, null, 1, false) + beginVariablesDeclaration(record1, null, null) + handleIdentifier(record1, localVariableDeclaration) + beginInitializedIdentifier(record1) + beginVariableInitializer(=) + beginParenthesizedExpressionOrRecordLiteral(() + handleLiteralInt(1) + endRecordLiteral((, 1, null) + endVariableInitializer(=) + endInitializedIdentifier(record1) + endVariablesDeclaration(1, ;) beginMetadataStar(() endMetadataStar(0) beginRecordType(() @@ -99,9 +127,9 @@ beginCompilationUnit(void) endRecordTypeEntry() endRecordTypeNamedFields(1, {) endRecordType((, null, 1, true) - beginVariablesDeclaration(record3, null, null) - handleIdentifier(record3, localVariableDeclaration) - beginInitializedIdentifier(record3) + beginVariablesDeclaration(record2, null, null) + handleIdentifier(record2, localVariableDeclaration) + beginInitializedIdentifier(record2) beginVariableInitializer(=) beginParenthesizedExpressionOrRecordLiteral(() handleIdentifier(ok, namedRecordFieldReference) @@ -109,28 +137,29 @@ beginCompilationUnit(void) handleNamedRecordField(:) endRecordLiteral((, 1, null) endVariableInitializer(=) - endInitializedIdentifier(record3) + endInitializedIdentifier(record2) endVariablesDeclaration(1, ;) beginMetadataStar(() endMetadataStar(0) beginRecordType(() - handleRecoverableError(EmptyRecordTypeFieldsList, ), )) endRecordType((, null, 0, false) - beginVariablesDeclaration(record4, null, null) - handleIdentifier(record4, localVariableDeclaration) - beginInitializedIdentifier(record4) + beginVariablesDeclaration(record3, null, null) + handleIdentifier(record3, localVariableDeclaration) + beginInitializedIdentifier(record3) beginVariableInitializer(=) - beginParenthesizedExpressionOrRecordLiteral(() - handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), )) - handleIdentifier(, expression) - handleNoTypeArguments()) - handleNoArguments()) - handleSend(, )) - endParenthesizedExpression(() + handleIdentifier(Record, expression) + handleNoTypeArguments(.) + handleNoArguments(.) + handleSend(Record, .) + handleIdentifier(empty, expressionContinuation) + handleNoTypeArguments(;) + handleNoArguments(;) + handleSend(empty, ;) + handleEndingBinaryExpression(.) endVariableInitializer(=) - endInitializedIdentifier(record4) + endInitializedIdentifier(record3) endVariablesDeclaration(1, ;) - endBlockFunctionBody(4, {, }) + endBlockFunctionBody(3, {, }) endTopLevelMethod(void, null, }) endTopLevelDeclaration() -endCompilationUnit(1, ) +endCompilationUnit(2, ) diff --git a/pkg/front_end/parser_testcases/record/record_type_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/record/record_type_02.dart.intertwined.expect index 8c926b2d294..6ffd80e3754 100644 --- a/pkg/front_end/parser_testcases/record/record_type_02.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/record/record_type_02.dart.intertwined.expect @@ -8,15 +8,15 @@ parseUnit(void) listener: endMetadataStar(0) parseTopLevelMemberImpl() listener: beginTopLevelMember(void) - parseTopLevelMethod(, null, null, , Instance of 'VoidType', null, foo, false) + parseTopLevelMethod(, null, null, , Instance of 'VoidType', null, errors, false) listener: beginTopLevelMethod(, null, null) listener: handleVoidKeyword(void) ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false) - listener: handleIdentifier(foo, topLevelFunctionDeclaration) - parseMethodTypeVar(foo) + listener: handleIdentifier(errors, topLevelFunctionDeclaration) + parseMethodTypeVar(errors) listener: handleNoTypeVariables(() - parseGetterOrFormalParameters(foo, foo, false, MemberKind.TopLevelMethod) - parseFormalParameters(foo, MemberKind.TopLevelMethod) + parseGetterOrFormalParameters(errors, errors, false, MemberKind.TopLevelMethod) + parseFormalParameters(errors, MemberKind.TopLevelMethod) parseFormalParametersRest((, MemberKind.TopLevelMethod) listener: beginFormalParameters((, MemberKind.TopLevelMethod) listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod) @@ -115,8 +115,8 @@ parseUnit(void) listener: handleType(int, null) listener: handleNoName()) listener: endRecordTypeEntry() - reportRecoverableError(), OnlyOneRecordTypeFieldsList) - listener: handleRecoverableError(OnlyOneRecordTypeFieldsList, ), )) + reportRecoverableError(), RecordTypeOnePositionalFieldNoTrailingComma) + listener: handleRecoverableError(RecordTypeOnePositionalFieldNoTrailingComma, ), )) listener: endRecordType((, null, 1, false) listener: beginVariablesDeclaration(record2, null, null) parseVariablesDeclarationRest(), true) @@ -139,18 +139,93 @@ parseUnit(void) parsePrimary((, expression) parseLiteralInt(() listener: handleLiteralInt(1) - ensureCloseParen(1, () - listener: endParenthesizedExpression(() + ensureCloseParen(,, () + listener: endRecordLiteral((, 1, null) listener: endVariableInitializer(=) listener: endInitializedIdentifier(record2) ensureSemicolon()) listener: endVariablesDeclaration(1, ;) + notEofOrValue(}, }) + listener: endBlockFunctionBody(2, {, }) + listener: endTopLevelMethod(void, null, }) + listener: endTopLevelDeclaration(void) + parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext') + parseMetadataStar(}) + listener: beginMetadataStar(void) + listener: endMetadataStar(0) + parseTopLevelMemberImpl(}) + listener: beginTopLevelMember(void) + parseTopLevelMethod(}, null, null, }, Instance of 'VoidType', null, ok, false) + listener: beginTopLevelMethod(}, null, null) + listener: handleVoidKeyword(void) + ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false) + listener: handleIdentifier(ok, topLevelFunctionDeclaration) + parseMethodTypeVar(ok) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(ok, ok, false, MemberKind.TopLevelMethod) + parseFormalParameters(ok, MemberKind.TopLevelMethod) + parseFormalParametersRest((, MemberKind.TopLevelMethod) + listener: beginFormalParameters((, MemberKind.TopLevelMethod) + listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + parseFunctionBody(), false, false) + listener: beginBlockFunctionBody({) + notEofOrValue(}, () + parseStatement({) + parseStatementX({) + parseExpressionStatementOrDeclaration({, false) + parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false) + looksLikeLocalFunction(record1) + listener: beginMetadataStar(() + listener: endMetadataStar(0) + parseRecordType((, {) + listener: beginRecordType(() + parseRecordTypeField((, identifierIsOptional: true) + listener: beginRecordTypeEntry() + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(,) + listener: handleType(int, null) + listener: handleNoName(,) + listener: endRecordTypeEntry() + listener: endRecordType((, null, 1, false) + listener: beginVariablesDeclaration(record1, null, null) + parseVariablesDeclarationRest(), true) + parseOptionallyInitializedIdentifier()) + ensureIdentifier(), localVariableDeclaration) + listener: handleIdentifier(record1, localVariableDeclaration) + listener: beginInitializedIdentifier(record1) + parseVariableInitializerOpt(record1) + listener: beginVariableInitializer(=) + parseExpression(=) + parsePrecedenceExpression(=, 1, true) + parseUnaryExpression(=, true) + parsePrimary(=, expression) + parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=) + parseParenthesizedExpressionOrRecordLiteral(=, null) + listener: beginParenthesizedExpressionOrRecordLiteral(() + parseExpression(() + parsePrecedenceExpression((, 1, true) + parseUnaryExpression((, true) + parsePrimary((, expression) + parseLiteralInt(() + listener: handleLiteralInt(1) + ensureCloseParen(,, () + listener: endRecordLiteral((, 1, null) + listener: endVariableInitializer(=) + listener: endInitializedIdentifier(record1) + ensureSemicolon()) + listener: endVariablesDeclaration(1, ;) notEofOrValue(}, () parseStatement(;) parseStatementX(;) parseExpressionStatementOrDeclaration(;, false) parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false) - looksLikeLocalFunction(record3) + looksLikeLocalFunction(record2) listener: beginMetadataStar(() listener: endMetadataStar(0) parseRecordType((, ;) @@ -171,13 +246,13 @@ parseUnit(void) listener: endRecordTypeNamedFields(1, {) ensureCloseParen(}, () listener: endRecordType((, null, 1, true) - listener: beginVariablesDeclaration(record3, null, null) + listener: beginVariablesDeclaration(record2, null, null) parseVariablesDeclarationRest(), true) parseOptionallyInitializedIdentifier()) ensureIdentifier(), localVariableDeclaration) - listener: handleIdentifier(record3, localVariableDeclaration) - listener: beginInitializedIdentifier(record3) - parseVariableInitializerOpt(record3) + listener: handleIdentifier(record2, localVariableDeclaration) + listener: beginInitializedIdentifier(record2) + parseVariableInitializerOpt(record2) listener: beginVariableInitializer(=) parseExpression(=) parsePrecedenceExpression(=, 1, true) @@ -198,7 +273,7 @@ parseUnit(void) ensureCloseParen(1, () listener: endRecordLiteral((, 1, null) listener: endVariableInitializer(=) - listener: endInitializedIdentifier(record3) + listener: endInitializedIdentifier(record2) ensureSemicolon()) listener: endVariablesDeclaration(1, ;) notEofOrValue(}, () @@ -206,53 +281,51 @@ parseUnit(void) parseStatementX(;) parseExpressionStatementOrDeclaration(;, false) parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false) - looksLikeLocalFunction(record4) + looksLikeLocalFunction(record3) listener: beginMetadataStar(() listener: endMetadataStar(0) parseRecordType((, ;) listener: beginRecordType(() - reportRecoverableError(), EmptyRecordTypeFieldsList) - listener: handleRecoverableError(EmptyRecordTypeFieldsList, ), )) listener: endRecordType((, null, 0, false) - listener: beginVariablesDeclaration(record4, null, null) + listener: beginVariablesDeclaration(record3, null, null) parseVariablesDeclarationRest(), true) parseOptionallyInitializedIdentifier()) ensureIdentifier(), localVariableDeclaration) - listener: handleIdentifier(record4, localVariableDeclaration) - listener: beginInitializedIdentifier(record4) - parseVariableInitializerOpt(record4) + listener: handleIdentifier(record3, localVariableDeclaration) + listener: beginInitializedIdentifier(record3) + parseVariableInitializerOpt(record3) listener: beginVariableInitializer(=) parseExpression(=) parsePrecedenceExpression(=, 1, true) parseUnaryExpression(=, true) parsePrimary(=, expression) - parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=) - parseParenthesizedExpressionOrRecordLiteral(=, null) - listener: beginParenthesizedExpressionOrRecordLiteral(() - parseExpression(() - parsePrecedenceExpression((, 1, true) - parseUnaryExpression((, true) - parsePrimary((, expression) - parseSend((, expression) - isNextIdentifier(() - ensureIdentifier((, expression) - reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>') - listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), )) - rewriter() - listener: handleIdentifier(, expression) - listener: handleNoTypeArguments()) - parseArgumentsOpt() - listener: handleNoArguments()) - listener: handleSend(, )) - ensureCloseParen(, () - listener: endParenthesizedExpression(() + parseSendOrFunctionLiteral(=, expression) + parseSend(=, expression) + isNextIdentifier(=) + ensureIdentifier(=, expression) + listener: handleIdentifier(Record, expression) + listener: handleNoTypeArguments(.) + parseArgumentsOpt(Record) + listener: handleNoArguments(.) + listener: handleSend(Record, .) + parsePrimary(., expressionContinuation) + parseSendOrFunctionLiteral(., expressionContinuation) + parseSend(., expressionContinuation) + isNextIdentifier(.) + ensureIdentifier(., expressionContinuation) + listener: handleIdentifier(empty, expressionContinuation) + listener: handleNoTypeArguments(;) + parseArgumentsOpt(empty) + listener: handleNoArguments(;) + listener: handleSend(empty, ;) + listener: handleEndingBinaryExpression(.) listener: endVariableInitializer(=) - listener: endInitializedIdentifier(record4) - ensureSemicolon()) + listener: endInitializedIdentifier(record3) + ensureSemicolon(empty) listener: endVariablesDeclaration(1, ;) notEofOrValue(}, }) - listener: endBlockFunctionBody(4, {, }) + listener: endBlockFunctionBody(3, {, }) listener: endTopLevelMethod(void, null, }) listener: endTopLevelDeclaration() reportAllErrorTokens(void) - listener: endCompilationUnit(1, ) + listener: endCompilationUnit(2, ) diff --git a/pkg/front_end/parser_testcases/record/record_type_02.dart.parser.expect b/pkg/front_end/parser_testcases/record/record_type_02.dart.parser.expect index 3f49c38d95f..92d366c556b 100644 --- a/pkg/front_end/parser_testcases/record/record_type_02.dart.parser.expect +++ b/pkg/front_end/parser_testcases/record/record_type_02.dart.parser.expect @@ -1,17 +1,23 @@ -NOTICE: Stream was rewritten by parser! - -void foo() { +void errors() { (int, int, { }) record1 = (1, 2); -(int ) record2 = (1); -({int ok}) record3 = (ok: 1); -( ) record4 = (*synthetic*); +(int ) record2 = (1, ); +} + +void ok() { +(int, ) record1 = (1, ); +({int ok}) record2 = (ok: 1); +() record3 = Record.empty; } -void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +void[KeywordToken] errors[StringToken]([BeginToken])[SimpleToken] {[BeginToken] ([BeginToken]int[StringToken],[SimpleToken] int[StringToken],[SimpleToken] {[BeginToken] }[SimpleToken])[SimpleToken] record1[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] -([BeginToken]int[StringToken] )[SimpleToken] record2[StringToken] =[SimpleToken] ([BeginToken]1[StringToken])[SimpleToken];[SimpleToken] -([BeginToken]{[BeginToken]int[StringToken] ok[StringToken]}[SimpleToken])[SimpleToken] record3[StringToken] =[SimpleToken] ([BeginToken]ok[StringToken]:[SimpleToken] 1[StringToken])[SimpleToken];[SimpleToken] -([BeginToken] )[SimpleToken] record4[StringToken] =[SimpleToken] ([BeginToken][SyntheticStringToken])[SimpleToken];[SimpleToken] +([BeginToken]int[StringToken] )[SimpleToken] record2[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken] +}[SimpleToken] + +void[KeywordToken] ok[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +([BeginToken]int[StringToken],[SimpleToken] )[SimpleToken] record1[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken] +([BeginToken]{[BeginToken]int[StringToken] ok[StringToken]}[SimpleToken])[SimpleToken] record2[StringToken] =[SimpleToken] ([BeginToken]ok[StringToken]:[SimpleToken] 1[StringToken])[SimpleToken];[SimpleToken] +([BeginToken])[SimpleToken] record3[StringToken] =[SimpleToken] Record[StringToken].[SimpleToken]empty[StringToken];[SimpleToken] }[SimpleToken] [SimpleToken] diff --git a/pkg/front_end/parser_testcases/record/record_type_02.dart.scanner.expect b/pkg/front_end/parser_testcases/record/record_type_02.dart.scanner.expect index e1a2d617a56..92d366c556b 100644 --- a/pkg/front_end/parser_testcases/record/record_type_02.dart.scanner.expect +++ b/pkg/front_end/parser_testcases/record/record_type_02.dart.scanner.expect @@ -1,15 +1,23 @@ -void foo() { +void errors() { (int, int, { }) record1 = (1, 2); -(int ) record2 = (1); -({int ok}) record3 = (ok: 1); -( ) record4 = (); +(int ) record2 = (1, ); +} + +void ok() { +(int, ) record1 = (1, ); +({int ok}) record2 = (ok: 1); +() record3 = Record.empty; } -void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +void[KeywordToken] errors[StringToken]([BeginToken])[SimpleToken] {[BeginToken] ([BeginToken]int[StringToken],[SimpleToken] int[StringToken],[SimpleToken] {[BeginToken] }[SimpleToken])[SimpleToken] record1[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] -([BeginToken]int[StringToken] )[SimpleToken] record2[StringToken] =[SimpleToken] ([BeginToken]1[StringToken])[SimpleToken];[SimpleToken] -([BeginToken]{[BeginToken]int[StringToken] ok[StringToken]}[SimpleToken])[SimpleToken] record3[StringToken] =[SimpleToken] ([BeginToken]ok[StringToken]:[SimpleToken] 1[StringToken])[SimpleToken];[SimpleToken] -([BeginToken] )[SimpleToken] record4[StringToken] =[SimpleToken] ([BeginToken])[SimpleToken];[SimpleToken] +([BeginToken]int[StringToken] )[SimpleToken] record2[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken] +}[SimpleToken] + +void[KeywordToken] ok[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +([BeginToken]int[StringToken],[SimpleToken] )[SimpleToken] record1[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken] +([BeginToken]{[BeginToken]int[StringToken] ok[StringToken]}[SimpleToken])[SimpleToken] record2[StringToken] =[SimpleToken] ([BeginToken]ok[StringToken]:[SimpleToken] 1[StringToken])[SimpleToken];[SimpleToken] +([BeginToken])[SimpleToken] record3[StringToken] =[SimpleToken] Record[StringToken].[SimpleToken]empty[StringToken];[SimpleToken] }[SimpleToken] [SimpleToken] diff --git a/pkg/front_end/testcases/records/record_type_errors.dart.strong.expect b/pkg/front_end/testcases/records/record_type_errors.dart.strong.expect index 71154db687c..67dfe7fe73e 100644 --- a/pkg/front_end/testcases/records/record_type_errors.dart.strong.expect +++ b/pkg/front_end/testcases/records/record_type_errors.dart.strong.expect @@ -2,13 +2,8 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/records/record_type_errors.dart:5:2: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -25,12 +20,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ @@ -71,13 +66,8 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:14:4: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -98,12 +88,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ diff --git a/pkg/front_end/testcases/records/record_type_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/records/record_type_errors.dart.strong.transformed.expect index 71154db687c..67dfe7fe73e 100644 --- a/pkg/front_end/testcases/records/record_type_errors.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/records/record_type_errors.dart.strong.transformed.expect @@ -2,13 +2,8 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/records/record_type_errors.dart:5:2: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -25,12 +20,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ @@ -71,13 +66,8 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:14:4: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -98,12 +88,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ diff --git a/pkg/front_end/testcases/records/record_type_errors.dart.weak.expect b/pkg/front_end/testcases/records/record_type_errors.dart.weak.expect index 71154db687c..67dfe7fe73e 100644 --- a/pkg/front_end/testcases/records/record_type_errors.dart.weak.expect +++ b/pkg/front_end/testcases/records/record_type_errors.dart.weak.expect @@ -2,13 +2,8 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/records/record_type_errors.dart:5:2: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -25,12 +20,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ @@ -71,13 +66,8 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:14:4: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -98,12 +88,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ diff --git a/pkg/front_end/testcases/records/record_type_errors.dart.weak.modular.expect b/pkg/front_end/testcases/records/record_type_errors.dart.weak.modular.expect index 71154db687c..67dfe7fe73e 100644 --- a/pkg/front_end/testcases/records/record_type_errors.dart.weak.modular.expect +++ b/pkg/front_end/testcases/records/record_type_errors.dart.weak.modular.expect @@ -2,13 +2,8 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/records/record_type_errors.dart:5:2: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -25,12 +20,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ @@ -71,13 +66,8 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:14:4: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -98,12 +88,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ diff --git a/pkg/front_end/testcases/records/record_type_errors.dart.weak.outline.expect b/pkg/front_end/testcases/records/record_type_errors.dart.weak.outline.expect index a9179117b4b..7f4a4e9336f 100644 --- a/pkg/front_end/testcases/records/record_type_errors.dart.weak.outline.expect +++ b/pkg/front_end/testcases/records/record_type_errors.dart.weak.outline.expect @@ -2,13 +2,8 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/records/record_type_errors.dart:5:2: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -25,12 +20,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ diff --git a/pkg/front_end/testcases/records/record_type_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/records/record_type_errors.dart.weak.transformed.expect index 71154db687c..67dfe7fe73e 100644 --- a/pkg/front_end/testcases/records/record_type_errors.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/records/record_type_errors.dart.weak.transformed.expect @@ -2,13 +2,8 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/records/record_type_errors.dart:5:2: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:6:5: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -25,12 +20,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:8:16: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:9:8: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ @@ -71,13 +66,8 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:14:4: Error: Record type fields list cannot be empty. -// Try adding a record type field to the list. -// () emptyType = throw ''; -// ^ -// -// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:15:7: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (int) singleType = throw ''; // ^ // @@ -98,12 +88,12 @@ library /*isNonNullableByDefault*/; // (var a, {var b}) missingType = throw ''; // ^^^ // -// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type fields list cannot contain only one element without a named field. -// Try adding another record type field to the list or add a named field. +// pkg/front_end/testcases/records/record_type_errors.dart:17:18: Error: Record type with one entry requires a trailing comma. +// Try adding a trailing comma. // (var a, {var b}) missingType = throw ''; // ^ // -// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list cannot be empty. +// pkg/front_end/testcases/records/record_type_errors.dart:18:10: Error: Record type named fields list can't be empty. // Try adding a record type named field to the list. // (int, {}) emptyNamedFields = throw ''; // ^ diff --git a/tests/language/record_literal_problems_test.dart b/tests/language/record_literal_problems_test.dart index 07d592394a5..ab279dffb3f 100644 --- a/tests/language/record_literal_problems_test.dart +++ b/tests/language/record_literal_problems_test.dart @@ -8,7 +8,7 @@ main() { var r1 = const (42); // ^ // [analyzer] SYNTACTIC_ERROR.RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA - // [cfe] Record literal with one entry requires a trailing comma. + // [cfe] Record literal with one field requires a trailing comma. var r2 = const (); // ^ diff --git a/tests/language/record_type_problems_test.dart b/tests/language/record_type_problems_test.dart new file mode 100644 index 00000000000..a847433d4e4 --- /dev/null +++ b/tests/language/record_type_problems_test.dart @@ -0,0 +1,17 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// SharedOptions=--enable-experiment=records + +main() { + (int, int, {/*missing*/}) r1 = (1, 2); + // ^ + // [analyzer] SYNTACTIC_ERROR.EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST + // [cfe] Record type named fields list can't be empty. + + (int /* missing trailing comma */ ) r2 = (1, ); + // ^ + // [analyzer] SYNTACTIC_ERROR.RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA + // [cfe] Record type with one entry requires a trailing comma. +} diff --git a/tests/language/record_type_test.dart b/tests/language/record_type_test.dart index 1be89ab6d4d..58e5fe70729 100644 --- a/tests/language/record_type_test.dart +++ b/tests/language/record_type_test.dart @@ -7,6 +7,7 @@ main() { (int, int) record1 = (1, 2); print(record1); + (int x, int y) record1Named = (1, 2); print(record1Named); @@ -39,6 +40,18 @@ main() { List<(int, int)> listOfRecords = []; var listOfRecords2 = <(int, int)>[]; + + (int, ) oneElementRecord = (1, ); + print(oneElementRecord); + + ({int ok}) oneElementNamedRecord = (ok: 1); + print(oneElementNamedRecord); + + () emptyRecord = Record.empty; +// ^^^^^^ +// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER +// [cfe] Undefined name 'Record'. + print(emptyRecord); } (int, T) f1(T t) { diff --git a/tests/language_2/record_literal_problems_test.dart b/tests/language_2/record_literal_problems_test.dart index b88b35bcff8..66da8f220c6 100644 --- a/tests/language_2/record_literal_problems_test.dart +++ b/tests/language_2/record_literal_problems_test.dart @@ -13,7 +13,7 @@ main() { // [cfe] This requires the experimental 'records' language feature to be enabled. // ^ // [analyzer] SYNTACTIC_ERROR.RECORD_LITERAL_ONE_POSITIONAL_NO_TRAILING_COMMA - // [cfe] Record literal with one entry requires a trailing comma. + // [cfe] Record literal with one field requires a trailing comma. var r2 = const (); // ^ diff --git a/tests/language_2/record_type_problems_test.dart b/tests/language_2/record_type_problems_test.dart new file mode 100644 index 00000000000..df45f093054 --- /dev/null +++ b/tests/language_2/record_type_problems_test.dart @@ -0,0 +1,31 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// @dart = 2.9 + +// SharedOptions=--enable-experiment=records + +main() { + (int, int, {/*missing*/}) r1 = (1, 2); +//^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. +// ^ +// [analyzer] SYNTACTIC_ERROR.EMPTY_RECORD_TYPE_NAMED_FIELDS_LIST +// [cfe] Record type named fields list can't be empty. +// ^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. + + (int /* missing trailing comma */ ) r2 = (1, ); +//^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. +// ^ +// [analyzer] SYNTACTIC_ERROR.RECORD_TYPE_ONE_POSITIONAL_NO_TRAILING_COMMA +// [cfe] Record type with one entry requires a trailing comma. +// ^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. +} diff --git a/tests/language_2/record_type_test.dart b/tests/language_2/record_type_test.dart index b1aae072163..a0e2be642f7 100644 --- a/tests/language_2/record_type_test.dart +++ b/tests/language_2/record_type_test.dart @@ -116,6 +116,33 @@ main() { // ^ // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED // [cfe] This requires the experimental 'records' language feature to be enabled. + + (int, ) oneElementRecord = (1, ); +//^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. +// ^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. + print(oneElementRecord); + + ({int ok}) oneElementNamedRecord = (ok: 1); +//^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. +// ^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. + print(oneElementNamedRecord); + + () emptyRecord = Record.empty; +//^ +// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED +// [cfe] This requires the experimental 'records' language feature to be enabled. +// ^^^^^^ +// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER +// [cfe] Undefined name 'Record'. + print(emptyRecord); } (int, T) f1(T t) {