From 2692a110f03d1fa915ef2a259b948aa2dfd31958 Mon Sep 17 00:00:00 2001 From: Kallen Tu Date: Fri, 7 Nov 2025 13:14:13 -0800 Subject: [PATCH] [parser] Declaring constructors - Parse primary constructor `this` body. Added two listener calls `beginPrimaryConstructorBody` and `endPrimaryConstructorBody` for parsing the `this` body. No AST implementation has been done, only parsing. Bug: https://github.com/dart-lang/sdk/issues/61699 Change-Id: I6aaf621bb3e67bfe00efe32de8097ca1e5048afb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/459901 Reviewed-by: Johnni Winther Reviewed-by: Konstantin Shcheglov Commit-Queue: Kallen Tu --- .../lib/src/parser/forwarding_listener.dart | 18 + .../lib/src/parser/listener.dart | 15 + .../lib/src/parser/parser_impl.dart | 34 ++ pkg/analyzer/lib/src/fasta/ast_builder.dart | 22 ++ .../lib/src/source/diet_listener.dart | 16 + .../lib/src/source/outline_builder.dart | 25 ++ pkg/front_end/lib/src/util/parser_ast.dart | 12 + .../lib/src/util/parser_ast_helper.dart | 83 ++++ .../class_primary_constructor_body.dart | 15 + ...class_primary_constructor_body.dart.expect | 134 +++++++ ...y_constructor_body.dart.intertwined.expect | 264 +++++++++++++ ...rimary_constructor_body.dart.parser.expect | 33 ++ ...imary_constructor_body.dart.scanner.expect | 33 ++ .../class_primary_constructor_body_error.dart | 15 + ...primary_constructor_body_error.dart.expect | 204 ++++++++++ ...tructor_body_error.dart.intertwined.expect | 344 ++++++++++++++++ ..._constructor_body_error.dart.parser.expect | 33 ++ ...constructor_body_error.dart.scanner.expect | 33 ++ .../enum_primary_constructor_body.dart | 19 + .../enum_primary_constructor_body.dart.expect | 170 ++++++++ ...y_constructor_body.dart.intertwined.expect | 300 ++++++++++++++ ...rimary_constructor_body.dart.parser.expect | 41 ++ ...imary_constructor_body.dart.scanner.expect | 41 ++ .../enum_primary_constructor_body_error.dart | 23 ++ ...primary_constructor_body_error.dart.expect | 257 ++++++++++++ ...tructor_body_error.dart.intertwined.expect | 343 ++++++++++++++++ ..._constructor_body_error.dart.parser.expect | 51 +++ ...constructor_body_error.dart.scanner.expect | 49 +++ ...tension_type_primary_constructor_body.dart | 15 + ..._type_primary_constructor_body.dart.expect | 150 +++++++ ...y_constructor_body.dart.intertwined.expect | 276 +++++++++++++ ...rimary_constructor_body.dart.parser.expect | 33 ++ ...imary_constructor_body.dart.scanner.expect | 33 ++ ...n_type_primary_constructor_body_error.dart | 15 + ...primary_constructor_body_error.dart.expect | 235 +++++++++++ ...tructor_body_error.dart.intertwined.expect | 374 ++++++++++++++++++ ..._constructor_body_error.dart.parser.expect | 33 ++ ...constructor_body_error.dart.scanner.expect | 33 ++ ...named_class_fields.dart.intertwined.expect | 45 ++- .../keyword_named_class_methods.dart.expect | 27 +- ...amed_class_methods.dart.intertwined.expect | 289 +++++++------- ...ord_named_class_methods.dart.parser.expect | 4 +- .../keyword_named_class_methods_2.dart.expect | 27 +- ...ed_class_methods_2.dart.intertwined.expect | 309 +++++++-------- ...d_named_class_methods_2.dart.parser.expect | 4 +- .../test/parser/parser_ast_test.dart | 9 + pkg/front_end/test/parser_test_listener.dart | 28 ++ pkg/front_end/test/parser_test_parser.dart | 12 + .../general/issue43363.dart.strong.expect | 74 +++- .../issue43363.dart.strong.modular.expect | 74 +++- .../issue43363.dart.strong.outline.expect | 40 +- .../issue43363.dart.strong.transformed.expect | 74 +++- .../issue43363.dart.textual_outline.expect | 4 +- 53 files changed, 4392 insertions(+), 452 deletions(-) create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.intertwined.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.parser.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.scanner.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.intertwined.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.parser.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.scanner.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.intertwined.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.parser.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.scanner.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.intertwined.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.parser.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.scanner.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.intertwined.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.parser.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.scanner.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.intertwined.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.parser.expect create mode 100644 pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.scanner.expect diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart index 3c8f88c3933..b88555e8501 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart @@ -2669,6 +2669,24 @@ class ForwardingListener implements Listener { void endConstDotShorthand(Token token) { listener?.beginConstDotShorthand(token); } + + @override + void beginPrimaryConstructorBody(Token token) { + listener?.beginPrimaryConstructorBody(token); + } + + @override + void endPrimaryConstructorBody( + Token beginToken, + Token? beginInitializers, + Token endToken, + ) { + listener?.endPrimaryConstructorBody( + beginToken, + beginInitializers, + endToken, + ); + } } class NullListener extends ForwardingListener { diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart index 7d51650b661..d5152c26563 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart @@ -356,6 +356,21 @@ abstract class Listener implements UnescapeErrorListener { bool forExtensionType, ) {} + void beginPrimaryConstructorBody(Token token) {} + + // Handles the `this` body block for a primary constructor. Substructures: + /// - metadata + /// - initializers + /// - async marker + /// - body + void endPrimaryConstructorBody( + Token beginToken, + Token? beginInitializers, + Token endToken, + ) { + logEvent("endPrimaryConstructorBody"); + } + void beginCombinators(Token token) {} void endCombinators(int count) { 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 83aee6e90eb..f7657817529 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart @@ -3715,6 +3715,24 @@ class Parser { return token; } + Token parsePrimaryConstructorBody(Token token) { + Token beginToken = token; + listener.beginPrimaryConstructorBody(token); + + Token? beforeInitializers = token; + token = parseInitializersOpt(beforeInitializers); + + token = parseAsyncModifierOpt(token); + token = parseFunctionBody( + token, + /* ofFunctionExpression = */ false, + /* allowAbstract = */ inPlainSync, + ); + + listener.endPrimaryConstructorBody(beginToken, beforeInitializers, token); + return token; + } + /// Parses an extension type declaration after /// /// 'extension' 'type' @@ -5361,6 +5379,22 @@ class Parser { return token; } // Fall through to continue parsing `operator` as an identifier. + } else if (identical(value, 'this')) { + Token next2 = next.next!; + if (next2.isA(TokenType.COLON) || + next2.isA(TokenType.SEMICOLON) || + next2.isA(TokenType.OPEN_CURLY_BRACKET)) { + if (!_isDeclaringConstructorsFeatureEnabled) { + reportExperimentNotEnabled( + ExperimentalFlag.declaringConstructors, + next, + next, + ); + } + token = parsePrimaryConstructorBody(next); + listener.endMember(); + return token; + } } else if (!next.isIdentifier || (identical(value, 'typedef') && token == beforeStart && diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart index b02d2f5f2db..16de183de3a 100644 --- a/pkg/analyzer/lib/src/fasta/ast_builder.dart +++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart @@ -617,6 +617,11 @@ class AstBuilder extends StackListener { debugEvent("PrimaryConstructor"); } + @override + void beginPrimaryConstructorBody(Token beginToken) { + debugEvent("PrimaryConstructorBody"); + } + @override void beginSwitchCaseWhenClause(Token when) { debugEvent("PatternSwitchCaseGuard"); @@ -3168,6 +3173,23 @@ class AstBuilder extends StackListener { } } + @override + void endPrimaryConstructorBody( + Token beginToken, + Token? beginInitializers, + Token endToken, + ) { + // TODO(declaring-constructors): Implement primary constructor body. + // ignore: unused_local_variable + var bodyObject = pop(); + // ignore: unused_local_variable + var initializers = (pop() as List?) ?? const []; + // ignore: unused_local_variable + var separator = pop() as Token?; + // ignore: unused_local_variable + var metadata = pop() as List?; + } + @override void endRecordLiteral(Token leftParenthesis, int count, Token? constKeyword) { debugEvent("RecordLiteral"); diff --git a/pkg/front_end/lib/src/source/diet_listener.dart b/pkg/front_end/lib/src/source/diet_listener.dart index 2fb2dc5623a..84680e0bd6a 100644 --- a/pkg/front_end/lib/src/source/diet_listener.dart +++ b/pkg/front_end/lib/src/source/diet_listener.dart @@ -1213,6 +1213,22 @@ class DietListener extends StackListenerImpl { _memberScope = outermostScope; } + @override + // Coverage-ignore(suite): Not run. + void endPrimaryConstructorBody( + Token beginToken, + Token? beginInitializers, + Token endToken, + ) { + debugEvent("endPrimaryConstructorBody"); + assert( + checkState(beginToken, [/* metadata token */ ValueKinds.TokenOrNull]), + ); + // TODO(declaring-constructors): Implement primary constructor body. + pop() as Token?; + checkEmpty(beginToken.charOffset); + } + @override void endExtensionTypeDeclaration( Token beginToken, diff --git a/pkg/front_end/lib/src/source/outline_builder.dart b/pkg/front_end/lib/src/source/outline_builder.dart index c54bc488231..3352eebb4b8 100644 --- a/pkg/front_end/lib/src/source/outline_builder.dart +++ b/pkg/front_end/lib/src/source/outline_builder.dart @@ -1960,6 +1960,31 @@ class OutlineBuilder extends StackListenerImpl { ); } + @override + // Coverage-ignore(suite): Not run. + void endPrimaryConstructorBody( + Token beginToken, + Token? beginInitializers, + Token endToken, + ) { + debugEvent("endPrimaryConstructorBody"); + assert( + checkState(beginToken, [ + ValueKinds.MethodBody, + ValueKinds.AsyncModifier, + ValueKinds.MetadataListOrNull, + ]), + ); + + // TODO(declaring-constructors): Implement primary constructor body. + // ignore: unused_local_variable + MethodBody bodyKind = pop() as MethodBody; + // ignore: unused_local_variable + AsyncMarker asyncModifier = pop() as AsyncMarker; + // ignore: unused_local_variable + List? metadata = pop() as List?; + } + @override void beginTopLevelMethod( Token lastConsumed, diff --git a/pkg/front_end/lib/src/util/parser_ast.dart b/pkg/front_end/lib/src/util/parser_ast.dart index 45a20b2d24b..9faa804be2e 100644 --- a/pkg/front_end/lib/src/util/parser_ast.dart +++ b/pkg/front_end/lib/src/util/parser_ast.dart @@ -1533,6 +1533,18 @@ extension MemberExtension on MemberEnd { if (child is EnumFactoryMethodEnd) return child; throw "Not found"; } + + bool isPrimaryConstructorBody() { + ParserAstNode child = children![1]; + if (child is PrimaryConstructorBodyEnd) return true; + return false; + } + + PrimaryConstructorBodyEnd getPrimaryConstructorBody() { + ParserAstNode child = children![1]; + if (child is PrimaryConstructorBodyEnd) return child; + throw "Not found"; + } } // Coverage-ignore(suite): Not run. diff --git a/pkg/front_end/lib/src/util/parser_ast_helper.dart b/pkg/front_end/lib/src/util/parser_ast_helper.dart index e369359ce70..6a0d52c2f6e 100644 --- a/pkg/front_end/lib/src/util/parser_ast_helper.dart +++ b/pkg/front_end/lib/src/util/parser_ast_helper.dart @@ -548,6 +548,30 @@ abstract class AbstractParserAstListener implements Listener { seen(data); } + @override + void beginPrimaryConstructorBody(Token token) { + PrimaryConstructorBodyBegin data = new PrimaryConstructorBodyBegin( + ParserAstType.BEGIN, + token: token, + ); + seen(data); + } + + @override + void endPrimaryConstructorBody( + Token beginToken, + Token? beginInitializers, + Token endToken, + ) { + PrimaryConstructorBodyEnd data = new PrimaryConstructorBodyEnd( + ParserAstType.END, + beginToken: beginToken, + beginInitializers: beginInitializers, + endToken: endToken, + ); + seen(data); + } + @override void beginCombinators(Token token) { CombinatorsBegin data = new CombinatorsBegin( @@ -5082,6 +5106,46 @@ class NoPrimaryConstructorHandle extends ParserAstNode { R accept(ParserAstVisitor v) => v.visitNoPrimaryConstructorHandle(this); } +class PrimaryConstructorBodyBegin extends ParserAstNode { + final Token token; + + PrimaryConstructorBodyBegin(ParserAstType type, {required this.token}) + : super("PrimaryConstructorBody", type); + + @override + Map get deprecatedArguments => {"token": token}; + + @override + R accept(ParserAstVisitor v) => + v.visitPrimaryConstructorBodyBegin(this); +} + +class PrimaryConstructorBodyEnd extends ParserAstNode + implements BeginAndEndTokenParserAstNode { + @override + final Token beginToken; + final Token? beginInitializers; + @override + final Token endToken; + + PrimaryConstructorBodyEnd( + ParserAstType type, { + required this.beginToken, + this.beginInitializers, + required this.endToken, + }) : super("PrimaryConstructorBody", type); + + @override + Map get deprecatedArguments => { + "beginToken": beginToken, + "beginInitializers": beginInitializers, + "endToken": endToken, + }; + + @override + R accept(ParserAstVisitor v) => v.visitPrimaryConstructorBodyEnd(this); +} + class CombinatorsBegin extends ParserAstNode { final Token token; @@ -11379,6 +11443,8 @@ abstract class ParserAstVisitor { R visitPrimaryConstructorBegin(PrimaryConstructorBegin node); R visitPrimaryConstructorEnd(PrimaryConstructorEnd node); R visitNoPrimaryConstructorHandle(NoPrimaryConstructorHandle node); + R visitPrimaryConstructorBodyBegin(PrimaryConstructorBodyBegin node); + R visitPrimaryConstructorBodyEnd(PrimaryConstructorBodyEnd node); R visitCombinatorsBegin(CombinatorsBegin node); R visitCombinatorsEnd(CombinatorsEnd node); R visitCompilationUnitBegin(CompilationUnitBegin node); @@ -11917,6 +11983,14 @@ class RecursiveParserAstVisitor implements ParserAstVisitor { void visitNoPrimaryConstructorHandle(NoPrimaryConstructorHandle node) => node.visitChildren(this); + @override + void visitPrimaryConstructorBodyBegin(PrimaryConstructorBodyBegin node) => + node.visitChildren(this); + + @override + void visitPrimaryConstructorBodyEnd(PrimaryConstructorBodyEnd node) => + node.visitChildren(this); + @override void visitCombinatorsBegin(CombinatorsBegin node) => node.visitChildren(this); @@ -13384,6 +13458,15 @@ class RecursiveParserAstVisitorWithDefaultNodeAsync NoPrimaryConstructorHandle node, ) => defaultNode(node); + @override + Future visitPrimaryConstructorBodyBegin( + PrimaryConstructorBodyBegin node, + ) => defaultNode(node); + + @override + Future visitPrimaryConstructorBodyEnd(PrimaryConstructorBodyEnd node) => + defaultNode(node); + @override Future visitCombinatorsBegin(CombinatorsBegin node) => defaultNode(node); diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart new file mode 100644 index 00000000000..eb9336132e7 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart @@ -0,0 +1,15 @@ +class C1() { + this {} +} + +class C2() { + this : assert(1 > 2) {} +} + +class C3() { + this; +} + +class C4() { + this : assert(1 > 2); +} diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.expect new file mode 100644 index 00000000000..900ec452a3b --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.expect @@ -0,0 +1,134 @@ +beginCompilationUnit(class) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C1, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C1) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + handleNoInitializers() + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endPrimaryConstructorBody(this, this, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C2, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C2) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endPrimaryConstructorBody(this, this, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C3, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C3) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + handleNoInitializers() + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + endPrimaryConstructorBody(this, this, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C4, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C4) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + endPrimaryConstructorBody(this, this, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) +endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.intertwined.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.intertwined.expect new file mode 100644 index 00000000000..0d49641d4e1 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.intertwined.expect @@ -0,0 +1,264 @@ +parseUnit(class) + skipErrorTokens(class) + listener: beginCompilationUnit(class) + syntheticPreviousToken(class) + parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown)) + parseMetadataStar() + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, , class, null, null, null, null, DirectiveContext(DirectiveState.Unknown)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C1, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C1) + parseClass(C1, class, class, null, C1) + parsePrimaryConstructorOpt(C1, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C1, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C1) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C1) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + listener: handleNoInitializers() + parseAsyncModifierOpt(this) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(this, false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endPrimaryConstructorBody(this, this, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C2, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C2) + parseClass(C2, class, class, null, C2) + parsePrimaryConstructorOpt(C2, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C2, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C2) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C2) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endPrimaryConstructorBody(this, this, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C3, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C3) + parseClass(C3, class, class, null, C3) + parsePrimaryConstructorOpt(C3, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C3, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C3) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C3) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + listener: handleNoInitializers() + parseAsyncModifierOpt(this) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(this, false, true) + listener: handleEmptyFunctionBody(;) + listener: endPrimaryConstructorBody(this, this, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C4, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C4) + parseClass(C4, class, class, null, C4) + parsePrimaryConstructorOpt(C4, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C4, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C4) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C4) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: handleEmptyFunctionBody(;) + listener: endPrimaryConstructorBody(this, this, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + reportAllErrorTokens(class) + listener: endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.parser.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.parser.expect new file mode 100644 index 00000000000..a66ca35b381 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.parser.expect @@ -0,0 +1,33 @@ +class C1() { +this {} +} + +class C2() { +this : assert(1 > 2) {} +} + +class C3() { +this; +} + +class C4() { +this : assert(1 > 2); +} + + +class[KeywordToken] C1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken];[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.scanner.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.scanner.expect new file mode 100644 index 00000000000..a66ca35b381 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body.dart.scanner.expect @@ -0,0 +1,33 @@ +class C1() { +this {} +} + +class C2() { +this : assert(1 > 2) {} +} + +class C3() { +this; +} + +class C4() { +this : assert(1 > 2); +} + + +class[KeywordToken] C1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken];[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart new file mode 100644 index 00000000000..2ab967e2526 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart @@ -0,0 +1,15 @@ +class C1() { + this() {} +} + +class C2() { + this(int x) : assert(1 > 2) {} +} + +class C3() { + this(); +} + +class C4() { + this(int x) : assert(1 > 2); +} diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.expect new file mode 100644 index 00000000000..d85666286ba --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.expect @@ -0,0 +1,204 @@ +Problems reported: + +parser/declaring_constructors/class_primary_constructor_body_error:2:3: 'this' can't be used as an identifier because it's a keyword. + this() {} + ^^^^ + +parser/declaring_constructors/class_primary_constructor_body_error:6:3: 'this' can't be used as an identifier because it's a keyword. + this(int x) : assert(1 > 2) {} + ^^^^ + +parser/declaring_constructors/class_primary_constructor_body_error:6:3: The name of a constructor must match the name of the enclosing class. + this(int x) : assert(1 > 2) {} + ^^^^ + +parser/declaring_constructors/class_primary_constructor_body_error:10:3: 'this' can't be used as an identifier because it's a keyword. + this(); + ^^^^ + +parser/declaring_constructors/class_primary_constructor_body_error:14:3: 'this' can't be used as an identifier because it's a keyword. + this(int x) : assert(1 > 2); + ^^^^ + +parser/declaring_constructors/class_primary_constructor_body_error:14:3: The name of a constructor must match the name of the enclosing class. + this(int x) : assert(1 > 2); + ^^^^ + +beginCompilationUnit(class) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C1, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C1) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C1) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.NonStaticMethod) + endFormalParameters(0, (, ), MemberKind.NonStaticMethod) + handleNoInitializers() + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endClassMethod(null, this, (, null, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C2, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C2) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C2) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.NonStaticMethod) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + endFormalParameters(1, (, ), MemberKind.NonStaticMethod) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + handleRecoverableError(ConstructorWithWrongName, this, this) + endClassConstructor(null, this, (, :, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C3, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C3) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C3) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.NonStaticMethod) + endFormalParameters(0, (, ), MemberKind.NonStaticMethod) + handleNoInitializers() + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + endClassMethod(null, this, (, null, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) + beginMetadataStar(class) + endMetadataStar(0) + beginClassOrMixinOrNamedMixinApplicationPrelude(class) + handleIdentifier(C4, classOrMixinDeclaration) + handleNoTypeVariables(() + beginClassDeclaration(class, null, null, null, null, null, null, null, null, C4) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, false) + handleNoType()) + handleClassExtends(null, 1) + handleClassNoWithClause() + handleImplements(null, 0) + handleClassHeader(class, class, null) + beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C4) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.NonStaticMethod) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + endFormalParameters(1, (, ), MemberKind.NonStaticMethod) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + handleRecoverableError(ConstructorWithWrongName, this, this) + endClassConstructor(null, this, (, :, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + endClassDeclaration(class, }) + endTopLevelDeclaration(}) +endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.intertwined.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.intertwined.expect new file mode 100644 index 00000000000..d38204b0d5d --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.intertwined.expect @@ -0,0 +1,344 @@ +parseUnit(class) + skipErrorTokens(class) + listener: beginCompilationUnit(class) + syntheticPreviousToken(class) + parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown)) + parseMetadataStar() + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, , class, null, null, null, null, DirectiveContext(DirectiveState.Unknown)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C1, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C1) + parseClass(C1, class, class, null, C1) + parsePrimaryConstructorOpt(C1, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C1, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C1) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C1) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.Class, C1, false) + listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C1) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.NonStaticMethod) + parseFormalParameters(this, MemberKind.NonStaticMethod) + parseFormalParametersRest((, MemberKind.NonStaticMethod) + listener: beginFormalParameters((, MemberKind.NonStaticMethod) + listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod) + parseInitializersOpt()) + listener: handleNoInitializers() + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endClassMethod(null, this, (, null, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C2, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C2) + parseClass(C2, class, class, null, C2) + parsePrimaryConstructorOpt(C2, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C2, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C2) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C2) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.Class, C2, false) + listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C2) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.NonStaticMethod) + parseFormalParameters(this, MemberKind.NonStaticMethod) + parseFormalParametersRest((, MemberKind.NonStaticMethod) + listener: beginFormalParameters((, MemberKind.NonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod) + parseInitializersOpt()) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + reportRecoverableError(this, ConstructorWithWrongName) + listener: handleRecoverableError(ConstructorWithWrongName, this, this) + listener: endClassConstructor(null, this, (, :, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C3, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C3) + parseClass(C3, class, class, null, C3) + parsePrimaryConstructorOpt(C3, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C3, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C3) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C3) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.Class, C3, false) + listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C3) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.NonStaticMethod) + parseFormalParameters(this, MemberKind.NonStaticMethod) + parseFormalParametersRest((, MemberKind.NonStaticMethod) + listener: beginFormalParameters((, MemberKind.NonStaticMethod) + listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod) + parseInitializersOpt()) + listener: handleNoInitializers() + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: handleEmptyFunctionBody(;) + listener: endClassMethod(null, this, (, null, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(class) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class) + listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class) + ensureIdentifier(class, classOrMixinDeclaration) + listener: handleIdentifier(C4, classOrMixinDeclaration) + listener: handleNoTypeVariables(() + listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, C4) + parseClass(C4, class, class, null, C4) + parsePrimaryConstructorOpt(C4, null, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(C4, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, false) + parseClassHeaderOpt(), class, class) + parseClassExtendsOpt(), DeclarationHeaderKind.Class) + listener: handleNoType()) + listener: handleClassExtends(null, 1) + parseClassWithClauseOpt()) + listener: handleClassNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleClassHeader(class, class, null) + parseClassOrMixinOrExtensionBody(), DeclarationKind.Class, C4) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C4) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.Class, C4, false) + listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, C4) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.NonStaticMethod) + parseFormalParameters(this, MemberKind.NonStaticMethod) + parseFormalParametersRest((, MemberKind.NonStaticMethod) + listener: beginFormalParameters((, MemberKind.NonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod) + parseInitializersOpt()) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: handleEmptyFunctionBody(;) + reportRecoverableError(this, ConstructorWithWrongName) + listener: handleRecoverableError(ConstructorWithWrongName, this, this) + listener: endClassConstructor(null, this, (, :, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, }) + listener: endClassDeclaration(class, }) + listener: endTopLevelDeclaration(}) + reportAllErrorTokens(class) + listener: endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.parser.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.parser.expect new file mode 100644 index 00000000000..8e768c1cc58 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.parser.expect @@ -0,0 +1,33 @@ +class C1() { +this() {} +} + +class C2() { +this(int x) : assert(1 > 2) {} +} + +class C3() { +this(); +} + +class C4() { +this(int x) : assert(1 > 2); +} + + +class[KeywordToken] C1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.scanner.expect b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.scanner.expect new file mode 100644 index 00000000000..8e768c1cc58 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/class_primary_constructor_body_error.dart.scanner.expect @@ -0,0 +1,33 @@ +class C1() { +this() {} +} + +class C2() { +this(int x) : assert(1 > 2) {} +} + +class C3() { +this(); +} + +class C4() { +this(int x) : assert(1 > 2); +} + + +class[KeywordToken] C1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +class[KeywordToken] C4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart new file mode 100644 index 00000000000..c0f080a30c5 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart @@ -0,0 +1,19 @@ +enum const E1() { + e; + this {} +} + +enum const E2() { + e; + this : assert(1 > 2) {} +} + +enum const E3() { + e; + this; +} + +enum const E4() { + e; + this : assert(1 > 2); +} diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.expect new file mode 100644 index 00000000000..177aac55994 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.expect @@ -0,0 +1,170 @@ +beginCompilationUnit(enum) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E1, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E1) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(e) + endMetadataStar(0) + handleIdentifier(e, enumValueDeclaration) + handleNoTypeNameInConstructorReference(;) + beginConstructorReference(e) + handleNoTypeArguments(;) + handleNoConstructorReferenceContinuationAfterTypeArguments(e) + endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + handleNoArguments(e) + handleEnumElement({, null) + handleEnumElements(;, 1) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + handleNoInitializers() + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endPrimaryConstructorBody(this, this, }) + endMember() + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 1, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E2, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E2) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(e) + endMetadataStar(0) + handleIdentifier(e, enumValueDeclaration) + handleNoTypeNameInConstructorReference(;) + beginConstructorReference(e) + handleNoTypeArguments(;) + handleNoConstructorReferenceContinuationAfterTypeArguments(e) + endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + handleNoArguments(e) + handleEnumElement({, null) + handleEnumElements(;, 1) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endPrimaryConstructorBody(this, this, }) + endMember() + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 1, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E3, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E3) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(e) + endMetadataStar(0) + handleIdentifier(e, enumValueDeclaration) + handleNoTypeNameInConstructorReference(;) + beginConstructorReference(e) + handleNoTypeArguments(;) + handleNoConstructorReferenceContinuationAfterTypeArguments(e) + endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + handleNoArguments(e) + handleEnumElement({, null) + handleEnumElements(;, 1) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + handleNoInitializers() + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + endPrimaryConstructorBody(this, this, ;) + endMember() + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 1, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E4, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E4) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(e) + endMetadataStar(0) + handleIdentifier(e, enumValueDeclaration) + handleNoTypeNameInConstructorReference(;) + beginConstructorReference(e) + handleNoTypeArguments(;) + handleNoConstructorReferenceContinuationAfterTypeArguments(e) + endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + handleNoArguments(e) + handleEnumElement({, null) + handleEnumElements(;, 1) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + endPrimaryConstructorBody(this, this, ;) + endMember() + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 1, }) + endTopLevelDeclaration(}) +endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.intertwined.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.intertwined.expect new file mode 100644 index 00000000000..86fadf0b483 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.intertwined.expect @@ -0,0 +1,300 @@ +parseUnit(enum) + skipErrorTokens(enum) + listener: beginCompilationUnit(enum) + syntheticPreviousToken(enum) + parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown)) + parseMetadataStar() + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, , enum, null, null, null, null, DirectiveContext(DirectiveState.Unknown)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E1, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E1) + parsePrimaryConstructorOpt(E1, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E1, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(e) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + listener: handleIdentifier(e, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(;) + listener: beginConstructorReference(e) + listener: handleNoTypeArguments(;) + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(e) + listener: endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + listener: handleNoArguments(e) + listener: handleEnumElement({, null) + listener: handleEnumElements(;, 1) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E1) + parseMetadataStar(;) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + listener: handleNoInitializers() + parseAsyncModifierOpt(this) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(this, false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endPrimaryConstructorBody(this, this, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 1, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E2, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E2) + parsePrimaryConstructorOpt(E2, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E2, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(e) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + listener: handleIdentifier(e, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(;) + listener: beginConstructorReference(e) + listener: handleNoTypeArguments(;) + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(e) + listener: endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + listener: handleNoArguments(e) + listener: handleEnumElement({, null) + listener: handleEnumElements(;, 1) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E2) + parseMetadataStar(;) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endPrimaryConstructorBody(this, this, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 1, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E3, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E3) + parsePrimaryConstructorOpt(E3, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E3, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(e) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + listener: handleIdentifier(e, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(;) + listener: beginConstructorReference(e) + listener: handleNoTypeArguments(;) + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(e) + listener: endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + listener: handleNoArguments(e) + listener: handleEnumElement({, null) + listener: handleEnumElements(;, 1) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E3) + parseMetadataStar(;) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + listener: handleNoInitializers() + parseAsyncModifierOpt(this) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(this, false, true) + listener: handleEmptyFunctionBody(;) + listener: endPrimaryConstructorBody(this, this, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 1, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E4, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E4) + parsePrimaryConstructorOpt(E4, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E4, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(e) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + listener: handleIdentifier(e, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(;) + listener: beginConstructorReference(e) + listener: handleNoTypeArguments(;) + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(e) + listener: endConstructorReference(e, null, e, ConstructorReferenceContext.Const) + listener: handleNoArguments(e) + listener: handleEnumElement({, null) + listener: handleEnumElements(;, 1) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E4) + parseMetadataStar(;) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: handleEmptyFunctionBody(;) + listener: endPrimaryConstructorBody(this, this, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 1, }) + listener: endTopLevelDeclaration(}) + reportAllErrorTokens(enum) + listener: endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.parser.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.parser.expect new file mode 100644 index 00000000000..b4e1efd1414 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.parser.expect @@ -0,0 +1,41 @@ +enum const E1() { +e; +this {} +} + +enum const E2() { +e; +this : assert(1 > 2) {} +} + +enum const E3() { +e; +this; +} + +enum const E4() { +e; +this : assert(1 > 2); +} + + +enum[KeywordToken] const[KeywordToken] E1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.scanner.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.scanner.expect new file mode 100644 index 00000000000..b4e1efd1414 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body.dart.scanner.expect @@ -0,0 +1,41 @@ +enum const E1() { +e; +this {} +} + +enum const E2() { +e; +this : assert(1 > 2) {} +} + +enum const E3() { +e; +this; +} + +enum const E4() { +e; +this : assert(1 > 2); +} + + +enum[KeywordToken] const[KeywordToken] E1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +e[StringToken];[SimpleToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart new file mode 100644 index 00000000000..9853cc74fde --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart @@ -0,0 +1,23 @@ +enum const E1() { + this() {} +} + +enum const E2() { + this(int x) : assert(1 > 2) {} +} + +enum const E3() { + this(); +} + +enum const E4() { + this(int x) : assert(1 > 2); +} + +enum const E5() { // missing constants + this : assert(1 > 2); +} + +enum const E6() { // missing constants + this {} +} diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.expect new file mode 100644 index 00000000000..5044ac08303 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.expect @@ -0,0 +1,257 @@ +Problems reported: + +parser/declaring_constructors/enum_primary_constructor_body_error:2:3: 'this' can't be used as an identifier because it's a keyword. + this() {} + ^^^^ + +parser/declaring_constructors/enum_primary_constructor_body_error:2:10: Expected '}' before this. + this() {} + ^ + +parser/declaring_constructors/enum_primary_constructor_body_error:6:3: 'this' can't be used as an identifier because it's a keyword. + this(int x) : assert(1 > 2) {} + ^^^^ + +parser/declaring_constructors/enum_primary_constructor_body_error:6:12: Expected ',' before this. + this(int x) : assert(1 > 2) {} + ^ + +parser/declaring_constructors/enum_primary_constructor_body_error:6:15: Expected '}' before this. + this(int x) : assert(1 > 2) {} + ^ + +parser/declaring_constructors/enum_primary_constructor_body_error:10:3: 'this' can't be used as an identifier because it's a keyword. + this(); + ^^^^ + +parser/declaring_constructors/enum_primary_constructor_body_error:14:3: 'this' can't be used as an identifier because it's a keyword. + this(int x) : assert(1 > 2); + ^^^^ + +parser/declaring_constructors/enum_primary_constructor_body_error:14:12: Expected ',' before this. + this(int x) : assert(1 > 2); + ^ + +parser/declaring_constructors/enum_primary_constructor_body_error:14:15: Expected '}' before this. + this(int x) : assert(1 > 2); + ^ + +parser/declaring_constructors/enum_primary_constructor_body_error:18:3: 'this' can't be used as an identifier because it's a keyword. + this : assert(1 > 2); + ^^^^ + +parser/declaring_constructors/enum_primary_constructor_body_error:18:8: Expected '}' before this. + this : assert(1 > 2); + ^ + +parser/declaring_constructors/enum_primary_constructor_body_error:22:3: 'this' can't be used as an identifier because it's a keyword. + this {} + ^^^^ + +parser/declaring_constructors/enum_primary_constructor_body_error:22:8: Expected '}' before this. + this {} + ^ + +beginCompilationUnit(enum) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E1, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E1) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(this) + endMetadataStar(0) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, enumValueDeclaration) + handleNoTypeNameInConstructorReference(() + beginConstructorReference(this) + handleNoTypeArguments(() + handleNoConstructorReferenceContinuationAfterTypeArguments(this) + endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + beginArguments(() + endArguments(0, (, )) + handleEnumElement({, null) + handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], {, {) + handleEnumElements(}, 1) + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 0, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E2, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E2) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(this) + endMetadataStar(0) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, enumValueDeclaration) + handleNoTypeNameInConstructorReference(() + beginConstructorReference(this) + handleNoTypeArguments(() + handleNoConstructorReferenceContinuationAfterTypeArguments(this) + endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + beginArguments(() + handleIdentifier(int, expression) + handleNoTypeArguments(x) + handleNoArguments(x) + handleSend(int, int) + handleRecoverableError(Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}], x, x) + handleIdentifier(x, expression) + handleNoTypeArguments()) + handleNoArguments()) + handleSend(x, x) + endArguments(2, (, )) + handleEnumElement({, null) + handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], :, :) + handleEnumElements(}, 1) + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 0, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E3, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E3) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(this) + endMetadataStar(0) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, enumValueDeclaration) + handleNoTypeNameInConstructorReference(() + beginConstructorReference(this) + handleNoTypeArguments(() + handleNoConstructorReferenceContinuationAfterTypeArguments(this) + endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + beginArguments(() + endArguments(0, (, )) + handleEnumElement({, null) + handleEnumElements(;, 1) + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 0, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E4, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E4) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(this) + endMetadataStar(0) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, enumValueDeclaration) + handleNoTypeNameInConstructorReference(() + beginConstructorReference(this) + handleNoTypeArguments(() + handleNoConstructorReferenceContinuationAfterTypeArguments(this) + endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + beginArguments(() + handleIdentifier(int, expression) + handleNoTypeArguments(x) + handleNoArguments(x) + handleSend(int, int) + handleRecoverableError(Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}], x, x) + handleIdentifier(x, expression) + handleNoTypeArguments()) + handleNoArguments()) + handleSend(x, x) + endArguments(2, (, )) + handleEnumElement({, null) + handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], :, :) + handleEnumElements(}, 1) + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 0, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E5, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E5) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(this) + endMetadataStar(0) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, enumValueDeclaration) + handleNoTypeNameInConstructorReference(:) + beginConstructorReference(this) + handleNoTypeArguments(:) + handleNoConstructorReferenceContinuationAfterTypeArguments(this) + endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + handleNoArguments(this) + handleEnumElement({, null) + handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], :, :) + handleEnumElements(}, 1) + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 0, }) + endTopLevelDeclaration(}) + beginMetadataStar(enum) + endMetadataStar(0) + beginEnumDeclarationPrelude(enum) + handleIdentifier(E6, enumDeclaration) + handleNoTypeVariables(() + beginEnumDeclaration(enum, null, enum, E6) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, const, false, false) + handleEnumNoWithClause() + handleImplements(null, 0) + handleEnumHeader(null, enum, {) + beginEnumBody({) + beginMetadataStar(this) + endMetadataStar(0) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, enumValueDeclaration) + handleNoTypeNameInConstructorReference({) + beginConstructorReference(this) + handleNoTypeArguments({) + handleNoConstructorReferenceContinuationAfterTypeArguments(this) + endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + handleNoArguments(this) + handleEnumElement({, null) + handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], {, {) + handleEnumElements(}, 1) + endEnumBody({, }) + endEnumDeclaration(enum, enum, {, 0, }) + endTopLevelDeclaration(}) +endCompilationUnit(6, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.intertwined.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.intertwined.expect new file mode 100644 index 00000000000..447685cf160 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.intertwined.expect @@ -0,0 +1,343 @@ +parseUnit(enum) + skipErrorTokens(enum) + listener: beginCompilationUnit(enum) + syntheticPreviousToken(enum) + parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown)) + parseMetadataStar() + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, , enum, null, null, null, null, DirectiveContext(DirectiveState.Unknown)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E1, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E1) + parsePrimaryConstructorOpt(E1, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E1, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(() + listener: beginConstructorReference(this) + listener: handleNoTypeArguments(() + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(this) + listener: endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + parseConstructorInvocationArguments(this) + parseArgumentsRest(() + listener: beginArguments(() + listener: endArguments(0, (, )) + listener: handleEnumElement({, null) + reportRecoverableError({, Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}]) + listener: handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], {, {) + listener: handleEnumElements(}, 1) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 0, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E2, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E2) + parsePrimaryConstructorOpt(E2, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E2, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(() + listener: beginConstructorReference(this) + listener: handleNoTypeArguments(() + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(this) + listener: endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + parseConstructorInvocationArguments(this) + parseArgumentsRest(() + listener: beginArguments(() + allowedToShortcutParseExpression() + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + skipObjectPatternRest(int) + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + ensureIdentifier((, expression) + listener: handleIdentifier(int, expression) + listener: handleNoTypeArguments(x) + parseArgumentsOpt(int) + listener: handleNoArguments(x) + listener: handleSend(int, int) + rewriteAndRecover(int, Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}], ,) + reportRecoverableError(x, Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}]) + listener: handleRecoverableError(Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}], x, x) + rewriter() + allowedToShortcutParseExpression() + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments()) + listener: handleNoArguments()) + listener: handleSend(x, x) + listener: endArguments(2, (, )) + listener: handleEnumElement({, null) + reportRecoverableError(:, Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}]) + listener: handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], :, :) + listener: handleEnumElements(}, 1) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 0, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E3, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E3) + parsePrimaryConstructorOpt(E3, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E3, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(() + listener: beginConstructorReference(this) + listener: handleNoTypeArguments(() + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(this) + listener: endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + parseConstructorInvocationArguments(this) + parseArgumentsRest(() + listener: beginArguments(() + listener: endArguments(0, (, )) + listener: handleEnumElement({, null) + listener: handleEnumElements(;, 1) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 0, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E4, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E4) + parsePrimaryConstructorOpt(E4, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E4, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(() + listener: beginConstructorReference(this) + listener: handleNoTypeArguments(() + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(this) + listener: endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + parseConstructorInvocationArguments(this) + parseArgumentsRest(() + listener: beginArguments(() + allowedToShortcutParseExpression() + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + skipObjectPatternRest(int) + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + ensureIdentifier((, expression) + listener: handleIdentifier(int, expression) + listener: handleNoTypeArguments(x) + parseArgumentsOpt(int) + listener: handleNoArguments(x) + listener: handleSend(int, int) + rewriteAndRecover(int, Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}], ,) + reportRecoverableError(x, Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}]) + listener: handleRecoverableError(Message[Template(ExpectedButGot), Expected ',' before this., null, {string: ,}], x, x) + rewriter() + allowedToShortcutParseExpression() + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments()) + listener: handleNoArguments()) + listener: handleSend(x, x) + listener: endArguments(2, (, )) + listener: handleEnumElement({, null) + reportRecoverableError(:, Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}]) + listener: handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], :, :) + listener: handleEnumElements(}, 1) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 0, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E5, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E5) + parsePrimaryConstructorOpt(E5, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E5, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference(:) + listener: beginConstructorReference(this) + listener: handleNoTypeArguments(:) + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(this) + listener: endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + listener: handleNoArguments(this) + listener: handleEnumElement({, null) + reportRecoverableError(:, Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}]) + listener: handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], :, :) + listener: handleEnumElements(}, 1) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 0, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(enum) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(enum, }, enum, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseEnum(enum, null, enum) + listener: beginEnumDeclarationPrelude(enum) + ensureIdentifier(const, enumDeclaration) + listener: handleIdentifier(E6, enumDeclaration) + listener: handleNoTypeVariables(() + listener: beginEnumDeclaration(enum, null, enum, E6) + parsePrimaryConstructorOpt(E6, const, false) + listener: beginPrimaryConstructor(() + parseFormalParameters(E6, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + listener: endFormalParameters(0, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, const, false, false) + parseEnumHeaderOpt(), enum) + parseEnumWithClauseOpt()) + listener: handleEnumNoWithClause() + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + listener: handleEnumHeader(null, enum, {) + listener: beginEnumBody({) + parseEnumElement({) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + ensureIdentifier({, enumValueDeclaration) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, enumValueDeclaration) + listener: handleNoTypeNameInConstructorReference({) + listener: beginConstructorReference(this) + listener: handleNoTypeArguments({) + listener: handleNoConstructorReferenceContinuationAfterTypeArguments(this) + listener: endConstructorReference(this, null, this, ConstructorReferenceContext.Const) + listener: handleNoArguments(this) + listener: handleEnumElement({, null) + reportRecoverableError({, Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}]) + listener: handleRecoverableError(Message[Template(ExpectedButGot), Expected '}' before this., null, {string: }}], {, {) + listener: handleEnumElements(}, 1) + listener: endEnumBody({, }) + listener: endEnumDeclaration(enum, enum, {, 0, }) + listener: endTopLevelDeclaration(}) + reportAllErrorTokens(enum) + listener: endCompilationUnit(6, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.parser.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.parser.expect new file mode 100644 index 00000000000..dae1e1f7d79 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.parser.expect @@ -0,0 +1,51 @@ +NOTICE: Stream was rewritten by parser! + +enum const E1() { +this() {} +} + +enum const E2() { +this(int ,x) : assert(1 > 2) {} +} + +enum const E3() { +this(); +} + +enum const E4() { +this(int ,x) : assert(1 > 2); +} + +enum const E5() { +this : assert(1 > 2); +} + +enum const E6() { +this {} +} + + +enum[KeywordToken] const[KeywordToken] E1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] ,[SyntheticToken]x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] ,[SyntheticToken]x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E5[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E6[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.scanner.expect b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.scanner.expect new file mode 100644 index 00000000000..a26c6e3c9c4 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/enum_primary_constructor_body_error.dart.scanner.expect @@ -0,0 +1,49 @@ +enum const E1() { +this() {} +} + +enum const E2() { +this(int x) : assert(1 > 2) {} +} + +enum const E3() { +this(); +} + +enum const E4() { +this(int x) : assert(1 > 2); +} + +enum const E5() { +this : assert(1 > 2); +} + +enum const E6() { +this {} +} + + +enum[KeywordToken] const[KeywordToken] E1[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E2[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E3[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E4[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E5[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] + +enum[KeywordToken] const[KeywordToken] E6[StringToken]([BeginToken])[SimpleToken] {[BeginToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart new file mode 100644 index 00000000000..634e4a6680b --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart @@ -0,0 +1,15 @@ +extension type E1(int x) { + this {} +} + +extension type E2(int x) { + this : assert(1 > 2) {} +} + +extension type E3(int x) { + this; +} + +extension type E4(int x) { + this : assert(1 > 2); +} diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.expect new file mode 100644 index 00000000000..8c3ed0a61d5 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.expect @@ -0,0 +1,150 @@ +beginCompilationUnit(extension) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E1) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + handleNoInitializers() + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endPrimaryConstructorBody(this, this, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E2) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endPrimaryConstructorBody(this, this, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E3) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + handleNoInitializers() + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + endPrimaryConstructorBody(this, this, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E4) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginPrimaryConstructorBody(this) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + endPrimaryConstructorBody(this, this, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) +endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.intertwined.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.intertwined.expect new file mode 100644 index 00000000000..0476cda4e1f --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.intertwined.expect @@ -0,0 +1,276 @@ +parseUnit(extension) + skipErrorTokens(extension) + listener: beginCompilationUnit(extension) + syntheticPreviousToken(extension) + parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown)) + parseMetadataStar() + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, , extension, null, null, null, null, DirectiveContext(DirectiveState.Unknown)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E1) + parsePrimaryConstructorOpt(E1, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E1, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E1) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E1) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + listener: handleNoInitializers() + parseAsyncModifierOpt(this) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(this, false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endPrimaryConstructorBody(this, this, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, }, extension, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E2) + parsePrimaryConstructorOpt(E2, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E2, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E2) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E2) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endPrimaryConstructorBody(this, this, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, }, extension, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E3) + parsePrimaryConstructorOpt(E3, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E3, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E3) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E3) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + listener: handleNoInitializers() + parseAsyncModifierOpt(this) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(this, false, true) + listener: handleEmptyFunctionBody(;) + listener: endPrimaryConstructorBody(this, this, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, }, extension, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E4) + parsePrimaryConstructorOpt(E4, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E4, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E4) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E4) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parsePrimaryConstructorBody(this) + listener: beginPrimaryConstructorBody(this) + parseInitializersOpt(this) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: handleEmptyFunctionBody(;) + listener: endPrimaryConstructorBody(this, this, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + reportAllErrorTokens(extension) + listener: endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.parser.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.parser.expect new file mode 100644 index 00000000000..7ea64568331 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.parser.expect @@ -0,0 +1,33 @@ +extension type E1(int x) { +this {} +} + +extension type E2(int x) { +this : assert(1 > 2) {} +} + +extension type E3(int x) { +this; +} + +extension type E4(int x) { +this : assert(1 > 2); +} + + +extension[KeywordToken] type[StringToken] E1[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E2[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E3[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken];[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E4[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.scanner.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.scanner.expect new file mode 100644 index 00000000000..7ea64568331 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body.dart.scanner.expect @@ -0,0 +1,33 @@ +extension type E1(int x) { +this {} +} + +extension type E2(int x) { +this : assert(1 > 2) {} +} + +extension type E3(int x) { +this; +} + +extension type E4(int x) { +this : assert(1 > 2); +} + + +extension[KeywordToken] type[StringToken] E1[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E2[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E3[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken];[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E4[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart new file mode 100644 index 00000000000..ef6f47b2440 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart @@ -0,0 +1,15 @@ +extension type E1(int x) { + this(this.x) {} +} + +extension type E2(int x) { + this(this.x) : assert(1 > 2) {} +} + +extension type E3(int x) { + this(this.x) ; +} + +extension type E4(int x) { + this(this.x) : assert(1 > 2); +} diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.expect new file mode 100644 index 00000000000..ec736b240c9 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.expect @@ -0,0 +1,235 @@ +Problems reported: + +parser/declaring_constructors/extension_type_primary_constructor_body_error:2:3: 'this' can't be used as an identifier because it's a keyword. + this(this.x) {} + ^^^^ + +parser/declaring_constructors/extension_type_primary_constructor_body_error:6:3: 'this' can't be used as an identifier because it's a keyword. + this(this.x) : assert(1 > 2) {} + ^^^^ + +parser/declaring_constructors/extension_type_primary_constructor_body_error:6:3: The name of a constructor must match the name of the enclosing class. + this(this.x) : assert(1 > 2) {} + ^^^^ + +parser/declaring_constructors/extension_type_primary_constructor_body_error:10:3: 'this' can't be used as an identifier because it's a keyword. + this(this.x) ; + ^^^^ + +parser/declaring_constructors/extension_type_primary_constructor_body_error:10:3: Extension types can't declare abstract members. + this(this.x) ; + ^^^^ + +parser/declaring_constructors/extension_type_primary_constructor_body_error:14:3: 'this' can't be used as an identifier because it's a keyword. + this(this.x) : assert(1 > 2); + ^^^^ + +parser/declaring_constructors/extension_type_primary_constructor_body_error:14:3: The name of a constructor must match the name of the enclosing class. + this(this.x) : assert(1 > 2); + ^^^^ + +beginCompilationUnit(extension) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E1) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E1) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + beginMetadataStar(this) + endMetadataStar(0) + beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + handleNoType(() + handleIdentifier(x, fieldInitializer) + handleFormalParameterWithoutValue()) + endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + handleNoInitializers() + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + endExtensionTypeMethod(null, this, (, null, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E2) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E2) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + beginMetadataStar(this) + endMetadataStar(0) + beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + handleNoType(() + handleIdentifier(x, fieldInitializer) + handleFormalParameterWithoutValue()) + endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + beginBlockFunctionBody({) + endBlockFunctionBody(0, {, }) + handleRecoverableError(ConstructorWithWrongName, this, this) + endExtensionTypeConstructor(null, this, (, :, }) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E3) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E3) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + beginMetadataStar(this) + endMetadataStar(0) + beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + handleNoType(() + handleIdentifier(x, fieldInitializer) + handleFormalParameterWithoutValue()) + endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + handleNoInitializers() + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + handleRecoverableError(ExtensionTypeDeclaresAbstractMember, this, this) + endExtensionTypeMethod(null, this, (, null, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) + beginMetadataStar(extension) + endMetadataStar(0) + beginExtensionDeclarationPrelude(extension) + handleNoTypeVariables(() + beginExtensionTypeDeclaration(null, extension, E4) + beginPrimaryConstructor(() + beginFormalParameters((, MemberKind.PrimaryConstructor) + beginMetadataStar(int) + endMetadataStar(0) + beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + handleIdentifier(int, typeReference) + handleNoTypeArguments(x) + handleType(int, null) + handleIdentifier(x, formalParameterDeclaration) + handleFormalParameterWithoutValue()) + endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + endPrimaryConstructor((, null, false, true) + handleImplements(null, 0) + beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + beginMetadataStar(this) + endMetadataStar(0) + beginMember() + beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E4) + handleNoType({) + handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + handleIdentifier(this, methodDeclaration) + handleNoTypeVariables(() + beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + beginMetadataStar(this) + endMetadataStar(0) + beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + handleNoType(() + handleIdentifier(x, fieldInitializer) + handleFormalParameterWithoutValue()) + endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + beginInitializers(:) + beginInitializer(assert) + beginAssert(assert, Assert.Initializer) + handleLiteralInt(1) + beginBinaryExpression(>) + handleLiteralInt(2) + endBinaryExpression(>, 2) + endAssert(assert, Assert.Initializer, (, null, )) + endInitializer()) + endInitializers(1, :, )) + handleAsyncModifier(null, null) + handleEmptyFunctionBody(;) + handleRecoverableError(ConstructorWithWrongName, this, this) + endExtensionTypeConstructor(null, this, (, :, ;) + endMember() + endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + endExtensionTypeDeclaration(extension, null, extension, type, }) + endTopLevelDeclaration(}) +endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.intertwined.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.intertwined.expect new file mode 100644 index 00000000000..8166699838f --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.intertwined.expect @@ -0,0 +1,374 @@ +parseUnit(extension) + skipErrorTokens(extension) + listener: beginCompilationUnit(extension) + syntheticPreviousToken(extension) + parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown)) + parseMetadataStar() + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, , extension, null, null, null, null, DirectiveContext(DirectiveState.Unknown)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E1) + parsePrimaryConstructorOpt(E1, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E1, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E1) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E1) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.ExtensionType, E1, false) + listener: beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E1) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameters(this, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParametersRest((, MemberKind.ExtensionTypeNonStaticMethod) + listener: beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + listener: handleNoType(() + ensureIdentifier(., fieldInitializer) + listener: handleIdentifier(x, fieldInitializer) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + parseInitializersOpt()) + listener: handleNoInitializers() + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + listener: endExtensionTypeMethod(null, this, (, null, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, }, extension, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E2) + parsePrimaryConstructorOpt(E2, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E2, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E2) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E2) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.ExtensionType, E2, false) + listener: beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E2) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameters(this, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParametersRest((, MemberKind.ExtensionTypeNonStaticMethod) + listener: beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + listener: handleNoType(() + ensureIdentifier(., fieldInitializer) + listener: handleIdentifier(x, fieldInitializer) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + parseInitializersOpt()) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(0, {, }) + reportRecoverableError(this, ConstructorWithWrongName) + listener: handleRecoverableError(ConstructorWithWrongName, this, this) + listener: endExtensionTypeConstructor(null, this, (, :, }) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, }, extension, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E3) + parsePrimaryConstructorOpt(E3, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E3, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E3) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E3) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.ExtensionType, E3, false) + listener: beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E3) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameters(this, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParametersRest((, MemberKind.ExtensionTypeNonStaticMethod) + listener: beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + listener: handleNoType(() + ensureIdentifier(., fieldInitializer) + listener: handleIdentifier(x, fieldInitializer) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + parseInitializersOpt()) + listener: handleNoInitializers() + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: handleEmptyFunctionBody(;) + reportRecoverableError(this, ExtensionTypeDeclaresAbstractMember) + listener: handleRecoverableError(ExtensionTypeDeclaresAbstractMember, this, this) + listener: endExtensionTypeMethod(null, this, (, null, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) + parseMetadataStar(}) + listener: beginMetadataStar(extension) + listener: endMetadataStar(0) + parseTopLevelKeywordDeclaration(extension, }, extension, null, null, null, null, DirectiveContext(DirectiveState.Declarations)) + parseExtension(extension, null, extension) + listener: beginExtensionDeclarationPrelude(extension) + parseExtensionTypeDeclaration(extension, type, null, extension, type) + listener: handleNoTypeVariables(() + listener: beginExtensionTypeDeclaration(null, extension, E4) + parsePrimaryConstructorOpt(E4, null, true) + listener: beginPrimaryConstructor(() + parseFormalParameters(E4, MemberKind.PrimaryConstructor) + parseFormalParametersRest((, MemberKind.PrimaryConstructor) + listener: beginFormalParameters((, MemberKind.PrimaryConstructor) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.PrimaryConstructor, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.PrimaryConstructor) + listener: endFormalParameters(1, (, ), MemberKind.PrimaryConstructor) + listener: endPrimaryConstructor((, null, false, true) + parseClassOrMixinOrEnumImplementsOpt()) + listener: handleImplements(null, 0) + parseClassOrMixinOrExtensionBody(), DeclarationKind.ExtensionType, E4) + listener: beginClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, {) + notEofOrType(CLOSE_CURLY_BRACKET, this) + parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.ExtensionType, E4) + parseMetadataStar({) + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginMember() + parseMethod({, null, null, null, null, null, null, null, {, NoType(), null, this, DeclarationKind.ExtensionType, E4, false) + listener: beginMethod(DeclarationKind.ExtensionType, null, null, null, null, null, null, this, E4) + listener: handleNoType({) + ensureIdentifierPotentiallyRecovered({, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameters(this, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParametersRest((, MemberKind.ExtensionTypeNonStaticMethod) + listener: beginFormalParameters((, MemberKind.ExtensionTypeNonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(this) + listener: endMetadataStar(0) + listener: beginFormalParameter(this, MemberKind.ExtensionTypeNonStaticMethod, null, null, null) + listener: handleNoType(() + ensureIdentifier(., fieldInitializer) + listener: handleIdentifier(x, fieldInitializer) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, this, null, ., x, null, null, FormalParameterKind.requiredPositional, MemberKind.ExtensionTypeNonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.ExtensionTypeNonStaticMethod) + parseInitializersOpt()) + parseInitializers(:) + listener: beginInitializers(:) + parseInitializer(:) + listener: beginInitializer(assert) + parseAssert(:, Assert.Initializer) + listener: beginAssert(assert, Assert.Initializer) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseLiteralInt(() + listener: handleLiteralInt(1) + listener: beginBinaryExpression(>) + parsePrecedenceExpression(>, 9, true, ConstantPatternContext.none) + parseUnaryExpression(>, true, ConstantPatternContext.none) + parsePrimary(>, expression, ConstantPatternContext.none) + parseLiteralInt(>) + listener: handleLiteralInt(2) + listener: endBinaryExpression(>, 2) + listener: endAssert(assert, Assert.Initializer, (, null, )) + listener: endInitializer()) + listener: endInitializers(1, :, )) + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) + inPlainSync() + inPlainSync() + parseFunctionBody(), false, true) + listener: handleEmptyFunctionBody(;) + reportRecoverableError(this, ConstructorWithWrongName) + listener: handleRecoverableError(ConstructorWithWrongName, this, this) + listener: endExtensionTypeConstructor(null, this, (, :, ;) + listener: endMember() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.ExtensionType, 1, {, }) + listener: endExtensionTypeDeclaration(extension, null, extension, type, }) + listener: endTopLevelDeclaration(}) + reportAllErrorTokens(extension) + listener: endCompilationUnit(4, ) diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.parser.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.parser.expect new file mode 100644 index 00000000000..5246fe92b48 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.parser.expect @@ -0,0 +1,33 @@ +extension type E1(int x) { +this(this.x) {} +} + +extension type E2(int x) { +this(this.x) : assert(1 > 2) {} +} + +extension type E3(int x) { +this(this.x) ; +} + +extension type E4(int x) { +this(this.x) : assert(1 > 2); +} + + +extension[KeywordToken] type[StringToken] E1[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E2[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E3[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] ;[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E4[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.scanner.expect b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.scanner.expect new file mode 100644 index 00000000000..5246fe92b48 --- /dev/null +++ b/pkg/front_end/parser_testcases/declaring_constructors/extension_type_primary_constructor_body_error.dart.scanner.expect @@ -0,0 +1,33 @@ +extension type E1(int x) { +this(this.x) {} +} + +extension type E2(int x) { +this(this.x) : assert(1 > 2) {} +} + +extension type E3(int x) { +this(this.x) ; +} + +extension type E4(int x) { +this(this.x) : assert(1 > 2); +} + + +extension[KeywordToken] type[StringToken] E1[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E2[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E3[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] ;[SimpleToken] +}[SimpleToken] + +extension[KeywordToken] type[StringToken] E4[StringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +this[KeywordToken]([BeginToken]this[KeywordToken].[SimpleToken]x[StringToken])[SimpleToken] :[SimpleToken] assert[KeywordToken]([BeginToken]1[StringToken] >[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken] +}[SimpleToken] +[SimpleToken] diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect index 5e92672ab10..e0fa28e905e 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect @@ -1669,29 +1669,28 @@ parseUnit(class) listener: beginMetadataStar(int) listener: endMetadataStar(0) listener: beginMember() - recoverFromInvalidMember(int, ;, null, null, null, null, null, null, null, ;, SimpleType(), null, DeclarationKind.Class, WrapperClass) - parseFields(;, null, null, null, null, null, null, null, ;, SimpleType(), this, DeclarationKind.Class, WrapperClass, false) - listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;) - listener: handleIdentifier(int, typeReference) - listener: handleNoTypeArguments(this) - listener: handleType(int, null) - ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, false) - reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) - listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) - listener: handleIdentifier(this, fieldDeclaration) - parseFieldInitializerOpt(this, this, null, null, null, null, null, DeclarationKind.Class, WrapperClass) - listener: beginFieldInitializer(=) - parseExpression(=) - looksLikeOuterPatternEquals(=) - skipOuterPattern(=) - parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none) - parseUnaryExpression(=, true, ConstantPatternContext.none) - parsePrimary(=, expression, ConstantPatternContext.none) - parseLiteralInt(=) - listener: handleLiteralInt(42) - listener: endFieldInitializer(=, 42) - listener: endClassFields(null, null, null, null, null, null, null, 1, int, ;) - listener: endMember() + parseFields(;, null, null, null, null, null, null, null, ;, SimpleType(), this, DeclarationKind.Class, WrapperClass, false) + listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(this) + listener: handleType(int, null) + ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, fieldDeclaration) + parseFieldInitializerOpt(this, this, null, null, null, null, null, DeclarationKind.Class, WrapperClass) + listener: beginFieldInitializer(=) + parseExpression(=) + looksLikeOuterPatternEquals(=) + skipOuterPattern(=) + parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none) + parseUnaryExpression(=, true, ConstantPatternContext.none) + parsePrimary(=, expression, ConstantPatternContext.none) + parseLiteralInt(=) + listener: handleLiteralInt(42) + listener: endFieldInitializer(=, 42) + listener: endClassFields(null, null, null, null, null, null, null, 1, int, ;) + listener: endMember() notEofOrType(CLOSE_CURLY_BRACKET, int) parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass) parseMetadataStar(;) 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 77ffd9b4e86..0fff1e69440 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 @@ -348,14 +348,6 @@ parser/error_recovery/keyword_named_class_methods:298:7: 'this' can't be used as int this(int x) { ^^^^ -parser/error_recovery/keyword_named_class_methods:298:7: Expected ';' after this. - int this(int x) { - ^^^^ - -parser/error_recovery/keyword_named_class_methods:298:11: Expected an identifier, but got '('. - int this(int x) { - ^ - parser/error_recovery/keyword_named_class_methods:303:7: 'throw' can't be used as an identifier because it's a keyword. int throw(int x) { ^^^^^ @@ -4105,23 +4097,12 @@ beginCompilationUnit(class) beginMetadataStar(int) endMetadataStar(0) beginMember() - beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, }) + beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, WrapperClass) handleIdentifier(int, typeReference) handleNoTypeArguments(this) handleType(int, null) handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) - handleIdentifier(this, fieldDeclaration) - handleNoFieldInitializer(() - handleRecoverableError(Message[Template(ExpectedAfterButGot), Expected ';' after this., null, {string: ;}], this, this) - endClassFields(null, null, null, null, null, null, null, 1, int, ;) - endMember() - beginMetadataStar(() - endMetadataStar(0) - beginMember() - beginMethod(DeclarationKind.Class, null, null, null, null, null, null, (, WrapperClass) - handleNoType(;) - handleRecoverableError(Message[Template(ExpectedIdentifier), Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], (, () - handleIdentifier(, methodDeclaration) + handleIdentifier(this, methodDeclaration) handleNoTypeVariables(() beginFormalParameters((, MemberKind.NonStaticMethod) beginMetadataStar(int) @@ -4170,7 +4151,7 @@ beginCompilationUnit(class) endBinaryExpression(+, 1) endReturnStatement(true, return, ;) endBlockFunctionBody(2, {, }) - endClassMethod(null, , (, null, }) + endClassMethod(null, int, (, null, }) endMember() beginMetadataStar(int) endMetadataStar(0) @@ -4778,7 +4759,7 @@ beginCompilationUnit(class) endBlockFunctionBody(2, {, }) endClassMethod(null, int, (, null, }) endMember() - endClassOrMixinOrExtensionBody(DeclarationKind.Class, 71, {, }) + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 70, {, }) endClassDeclaration(class, }) endTopLevelDeclaration(}) endCompilationUnit(1, ) 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 00bd591231e..eafcd09f07b 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 @@ -8915,163 +8915,138 @@ parseUnit(class) listener: beginMetadataStar(int) listener: endMetadataStar(0) listener: beginMember() - recoverFromInvalidMember(int, }, null, null, null, null, null, null, null, }, SimpleType(), null, DeclarationKind.Class, WrapperClass) - parseFields(}, null, null, null, null, null, null, null, }, SimpleType(), this, DeclarationKind.Class, WrapperClass, false) - listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, }) - listener: handleIdentifier(int, typeReference) - listener: handleNoTypeArguments(this) - listener: handleType(int, null) - ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, false) - reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) - listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) - listener: handleIdentifier(this, fieldDeclaration) - parseFieldInitializerOpt(this, this, null, null, null, null, null, DeclarationKind.Class, WrapperClass) - listener: handleNoFieldInitializer(() - ensureSemicolon(this) - reportRecoverableError(this, Message[Template(ExpectedAfterButGot), Expected ';' after this., null, {string: ;}]) - listener: handleRecoverableError(Message[Template(ExpectedAfterButGot), Expected ';' after this., null, {string: ;}], this, this) - rewriter() - listener: endClassFields(null, null, null, null, null, null, null, 1, int, ;) - listener: endMember() - notEofOrType(CLOSE_CURLY_BRACKET, () - parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass) - parseMetadataStar(;) - listener: beginMetadataStar(() - listener: endMetadataStar(0) - listener: beginMember() - recoverFromInvalidMember(;, ;, null, null, null, null, null, null, null, ;, NoType(), null, DeclarationKind.Class, WrapperClass) - parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, (, DeclarationKind.Class, WrapperClass, false) - listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, (, WrapperClass) - listener: handleNoType(;) - ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false) - insertSyntheticIdentifier(;, methodDeclaration, message: null, messageOnToken: null) - reportRecoverableError((, Message[Template(ExpectedIdentifier), Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}]) - listener: handleRecoverableError(Message[Template(ExpectedIdentifier), Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], (, () - rewriter() - listener: handleIdentifier(, methodDeclaration) - parseQualifiedRestOpt(, methodDeclarationContinuation) - parseMethodTypeVar() - listener: handleNoTypeVariables(() - parseGetterOrFormalParameters(, (, false, MemberKind.NonStaticMethod) - parseFormalParameters(, MemberKind.NonStaticMethod) - parseFormalParametersRest((, MemberKind.NonStaticMethod) - listener: beginFormalParameters((, MemberKind.NonStaticMethod) - parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) - parseMetadataStar(() - listener: beginMetadataStar(int) - listener: endMetadataStar(0) - listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) - listener: handleIdentifier(int, typeReference) - listener: handleNoTypeArguments(x) - listener: handleType(int, null) - ensureIdentifier(int, formalParameterDeclaration) - listener: handleIdentifier(x, formalParameterDeclaration) - listener: handleFormalParameterWithoutValue()) - listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) - listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod) - parseInitializersOpt()) - listener: handleNoInitializers() - parseAsyncModifierOpt()) - listener: handleAsyncModifier(null, null) - inPlainSync() + parseMethod(}, null, null, null, null, null, null, null, }, SimpleType(), null, this, DeclarationKind.Class, WrapperClass, false) + listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, WrapperClass) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(this) + listener: handleType(int, null) + ensureIdentifierPotentiallyRecovered(int, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.NonStaticMethod) + parseFormalParameters(this, MemberKind.NonStaticMethod) + parseFormalParametersRest((, MemberKind.NonStaticMethod) + listener: beginFormalParameters((, MemberKind.NonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod) + parseInitializersOpt()) + listener: handleNoInitializers() + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) inPlainSync() - parseFunctionBody(), false, true) - listener: beginBlockFunctionBody({) - notEofOrType(CLOSE_CURLY_BRACKET, if) - parseStatement({) - parseStatementX({) - parseIfStatement({) - listener: beginIfStatement(if) - ensureParenthesizedCondition(if, allowCase: false) - parseExpressionInParenthesisRest((, allowCase: false) - parseExpression(() - parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) - parseUnaryExpression((, true, ConstantPatternContext.none) - parsePrimary((, expression, ConstantPatternContext.none) - parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) - parseSend((, expression, ConstantPatternContext.none) - ensureIdentifier((, expression) - listener: handleIdentifier(x, expression) - listener: handleNoTypeArguments(==) - parseArgumentsOpt(x) - listener: handleNoArguments(==) - listener: handleSend(x, x) - listener: beginBinaryExpression(==) - parsePrecedenceExpression(==, 8, true, ConstantPatternContext.none) - parseUnaryExpression(==, true, ConstantPatternContext.none) - parsePrimary(==, expression, ConstantPatternContext.none) - parseLiteralInt(==) - listener: handleLiteralInt(0) - listener: endBinaryExpression(==, 0) - ensureCloseParen(0, () - listener: handleParenthesizedCondition((, null, null) - listener: beginThenStatement(return) - parseStatement()) - parseStatementX()) - parseReturnStatement()) - listener: beginReturnStatement(return) - parseExpression(return) - parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) - parseUnaryExpression(return, true, ConstantPatternContext.none) - parsePrimary(return, expression, ConstantPatternContext.none) - parseLiteralInt(return) - listener: handleLiteralInt(42) - ensureSemicolon(42) - listener: endReturnStatement(true, return, ;) - inGenerator() - listener: endThenStatement(return, ;) - listener: endIfStatement(if, null, ;) - notEofOrType(CLOSE_CURLY_BRACKET, return) - parseStatement(;) - parseStatementX(;) - parseReturnStatement(;) - listener: beginReturnStatement(return) - parseExpression(return) - parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) - parseUnaryExpression(return, true, ConstantPatternContext.none) - parsePrimary(return, expression, ConstantPatternContext.none) - parseThisExpression(return, expression) - listener: handleThisExpression(this, expression) - listener: handleNoTypeArguments(() - parseArguments(this) - parseArgumentsRest(() - listener: beginArguments(() - allowedToShortcutParseExpression() - parseExpression(() - parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) - parseUnaryExpression((, true, ConstantPatternContext.none) - parsePrimary((, expression, ConstantPatternContext.none) - parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) - parseSend((, expression, ConstantPatternContext.none) - ensureIdentifier((, expression) - listener: handleIdentifier(x, expression) - listener: handleNoTypeArguments(-) - parseArgumentsOpt(x) - listener: handleNoArguments(-) - listener: handleSend(x, x) - listener: beginBinaryExpression(-) - parsePrecedenceExpression(-, 14, true, ConstantPatternContext.none) - parseUnaryExpression(-, true, ConstantPatternContext.none) - parsePrimary(-, expression, ConstantPatternContext.none) - parseLiteralInt(-) - listener: handleLiteralInt(1) - listener: endBinaryExpression(-, 1) - listener: endArguments(1, (, )) - listener: handleSend(this, )) - listener: beginBinaryExpression(+) - parsePrecedenceExpression(+, 14, true, ConstantPatternContext.none) - parseUnaryExpression(+, true, ConstantPatternContext.none) - parsePrimary(+, expression, ConstantPatternContext.none) - parseLiteralInt(+) - listener: handleLiteralInt(1) - listener: endBinaryExpression(+, 1) - ensureSemicolon(1) - listener: endReturnStatement(true, return, ;) - inGenerator() - notEofOrType(CLOSE_CURLY_BRACKET, }) - listener: endBlockFunctionBody(2, {, }) - listener: endClassMethod(null, , (, null, }) - listener: endMember() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, if) + parseStatement({) + parseStatementX({) + parseIfStatement({) + listener: beginIfStatement(if) + ensureParenthesizedCondition(if, allowCase: false) + parseExpressionInParenthesisRest((, allowCase: false) + parseExpression(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + ensureIdentifier((, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(==) + parseArgumentsOpt(x) + listener: handleNoArguments(==) + listener: handleSend(x, x) + listener: beginBinaryExpression(==) + parsePrecedenceExpression(==, 8, true, ConstantPatternContext.none) + parseUnaryExpression(==, true, ConstantPatternContext.none) + parsePrimary(==, expression, ConstantPatternContext.none) + parseLiteralInt(==) + listener: handleLiteralInt(0) + listener: endBinaryExpression(==, 0) + ensureCloseParen(0, () + listener: handleParenthesizedCondition((, null, null) + listener: beginThenStatement(return) + parseStatement()) + parseStatementX()) + parseReturnStatement()) + listener: beginReturnStatement(return) + parseExpression(return) + parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) + parseUnaryExpression(return, true, ConstantPatternContext.none) + parsePrimary(return, expression, ConstantPatternContext.none) + parseLiteralInt(return) + listener: handleLiteralInt(42) + ensureSemicolon(42) + listener: endReturnStatement(true, return, ;) + inGenerator() + listener: endThenStatement(return, ;) + listener: endIfStatement(if, null, ;) + notEofOrType(CLOSE_CURLY_BRACKET, return) + parseStatement(;) + parseStatementX(;) + parseReturnStatement(;) + listener: beginReturnStatement(return) + parseExpression(return) + parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) + parseUnaryExpression(return, true, ConstantPatternContext.none) + parsePrimary(return, expression, ConstantPatternContext.none) + parseThisExpression(return, expression) + listener: handleThisExpression(this, expression) + listener: handleNoTypeArguments(() + parseArguments(this) + parseArgumentsRest(() + listener: beginArguments(() + allowedToShortcutParseExpression() + parseExpression(() + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + ensureIdentifier((, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(-) + parseArgumentsOpt(x) + listener: handleNoArguments(-) + listener: handleSend(x, x) + listener: beginBinaryExpression(-) + parsePrecedenceExpression(-, 14, true, ConstantPatternContext.none) + parseUnaryExpression(-, true, ConstantPatternContext.none) + parsePrimary(-, expression, ConstantPatternContext.none) + parseLiteralInt(-) + listener: handleLiteralInt(1) + listener: endBinaryExpression(-, 1) + listener: endArguments(1, (, )) + listener: handleSend(this, )) + listener: beginBinaryExpression(+) + parsePrecedenceExpression(+, 14, true, ConstantPatternContext.none) + parseUnaryExpression(+, true, ConstantPatternContext.none) + parsePrimary(+, expression, ConstantPatternContext.none) + parseLiteralInt(+) + listener: handleLiteralInt(1) + listener: endBinaryExpression(+, 1) + ensureSemicolon(1) + listener: endReturnStatement(true, return, ;) + inGenerator() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(2, {, }) + listener: endClassMethod(null, int, (, null, }) + listener: endMember() notEofOrType(CLOSE_CURLY_BRACKET, int) parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass) parseMetadataStar(}) @@ -10613,7 +10588,7 @@ parseUnit(class) listener: endClassMethod(null, int, (, null, }) listener: endMember() notEofOrType(CLOSE_CURLY_BRACKET, }) - listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 71, {, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 70, {, }) listener: endClassDeclaration(class, }) listener: endTopLevelDeclaration(}) reportAllErrorTokens(class) diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.parser.expect index 62954053757..4e77265379f 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.parser.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.parser.expect @@ -296,7 +296,7 @@ if (x == 0) return 42; return sync(x-1) + 1; } -int this;*synthetic*(int x) { +int this(int x) { if (x == 0) return 42; return this(x-1) + 1; } @@ -644,7 +644,7 @@ if[KeywordToken] ([BeginToken]x[StringToken] ==[SimpleToken] 0[StringToken])[Sim return[KeywordToken] sync[KeywordToken]([BeginToken]x[StringToken]-[SimpleToken]1[StringToken])[SimpleToken] +[SimpleToken] 1[StringToken];[SimpleToken] }[SimpleToken] -int[StringToken] this[KeywordToken];[SyntheticToken][SyntheticStringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +int[StringToken] this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] if[KeywordToken] ([BeginToken]x[StringToken] ==[SimpleToken] 0[StringToken])[SimpleToken] return[KeywordToken] 42[StringToken];[SimpleToken] return[KeywordToken] this[KeywordToken]([BeginToken]x[StringToken]-[SimpleToken]1[StringToken])[SimpleToken] +[SimpleToken] 1[StringToken];[SimpleToken] }[SimpleToken] diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.expect index 93c9258faeb..319fa0743b2 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.expect @@ -336,14 +336,6 @@ parser/error_recovery/keyword_named_class_methods_2:297:7: 'this' can't be used int this(int x) { ^^^^ -parser/error_recovery/keyword_named_class_methods_2:297:7: Expected ';' after this. - int this(int x) { - ^^^^ - -parser/error_recovery/keyword_named_class_methods_2:297:11: Expected an identifier, but got '('. - int this(int x) { - ^ - parser/error_recovery/keyword_named_class_methods_2:302:7: 'throw' can't be used as an identifier because it's a keyword. int throw(int x) { ^^^^^ @@ -4081,23 +4073,12 @@ beginCompilationUnit(class) beginMetadataStar(int) endMetadataStar(0) beginMember() - beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, }) + beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, WrapperClass) handleIdentifier(int, typeReference) handleNoTypeArguments(this) handleType(int, null) handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) - handleIdentifier(this, fieldDeclaration) - handleNoFieldInitializer(() - handleRecoverableError(Message[Template(ExpectedAfterButGot), Expected ';' after this., null, {string: ;}], this, this) - endClassFields(null, null, null, null, null, null, null, 1, int, ;) - endMember() - beginMetadataStar(() - endMetadataStar(0) - beginMember() - beginMethod(DeclarationKind.Class, null, null, null, null, null, null, (, WrapperClass) - handleNoType(;) - handleRecoverableError(Message[Template(ExpectedIdentifier), Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], (, () - handleIdentifier(, methodDeclaration) + handleIdentifier(this, methodDeclaration) handleNoTypeVariables(() beginFormalParameters((, MemberKind.NonStaticMethod) beginMetadataStar(int) @@ -4146,7 +4127,7 @@ beginCompilationUnit(class) endBinaryExpression(+, 1) endReturnStatement(true, return, ;) endBlockFunctionBody(2, {, }) - endClassMethod(null, , (, null, }) + endClassMethod(null, int, (, null, }) endMember() beginMetadataStar(int) endMetadataStar(0) @@ -4754,7 +4735,7 @@ beginCompilationUnit(class) endBlockFunctionBody(2, {, }) endClassMethod(null, int, (, null, }) endMember() - endClassOrMixinOrExtensionBody(DeclarationKind.Class, 71, {, }) + endClassOrMixinOrExtensionBody(DeclarationKind.Class, 70, {, }) endClassDeclaration(class, }) endTopLevelDeclaration(}) endCompilationUnit(1, ) diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.intertwined.expect index fb96c2b5661..c857c73ab00 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.intertwined.expect @@ -9518,173 +9518,148 @@ parseUnit(class) listener: beginMetadataStar(int) listener: endMetadataStar(0) listener: beginMember() - recoverFromInvalidMember(int, }, null, null, null, null, null, null, null, }, SimpleType(), null, DeclarationKind.Class, WrapperClass) - parseFields(}, null, null, null, null, null, null, null, }, SimpleType(), this, DeclarationKind.Class, WrapperClass, false) - listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, }) - listener: handleIdentifier(int, typeReference) - listener: handleNoTypeArguments(this) - listener: handleType(int, null) - ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, false) - reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) - listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) - listener: handleIdentifier(this, fieldDeclaration) - parseFieldInitializerOpt(this, this, null, null, null, null, null, DeclarationKind.Class, WrapperClass) - listener: handleNoFieldInitializer(() - ensureSemicolon(this) - reportRecoverableError(this, Message[Template(ExpectedAfterButGot), Expected ';' after this., null, {string: ;}]) - listener: handleRecoverableError(Message[Template(ExpectedAfterButGot), Expected ';' after this., null, {string: ;}], this, this) - rewriter() - listener: endClassFields(null, null, null, null, null, null, null, 1, int, ;) - listener: endMember() - notEofOrType(CLOSE_CURLY_BRACKET, () - parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass) - parseMetadataStar(;) - listener: beginMetadataStar(() - listener: endMetadataStar(0) - listener: beginMember() - recoverFromInvalidMember(;, ;, null, null, null, null, null, null, null, ;, NoType(), null, DeclarationKind.Class, WrapperClass) - parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, (, DeclarationKind.Class, WrapperClass, false) - listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, (, WrapperClass) - listener: handleNoType(;) - ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false) - insertSyntheticIdentifier(;, methodDeclaration, message: null, messageOnToken: null) - reportRecoverableError((, Message[Template(ExpectedIdentifier), Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}]) - listener: handleRecoverableError(Message[Template(ExpectedIdentifier), Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], (, () - rewriter() - listener: handleIdentifier(, methodDeclaration) - parseQualifiedRestOpt(, methodDeclarationContinuation) - parseMethodTypeVar() - listener: handleNoTypeVariables(() - parseGetterOrFormalParameters(, (, false, MemberKind.NonStaticMethod) - parseFormalParameters(, MemberKind.NonStaticMethod) - parseFormalParametersRest((, MemberKind.NonStaticMethod) - listener: beginFormalParameters((, MemberKind.NonStaticMethod) - parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) - parseMetadataStar(() - listener: beginMetadataStar(int) - listener: endMetadataStar(0) - listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) - listener: handleIdentifier(int, typeReference) - listener: handleNoTypeArguments(x) - listener: handleType(int, null) - ensureIdentifier(int, formalParameterDeclaration) - listener: handleIdentifier(x, formalParameterDeclaration) - listener: handleFormalParameterWithoutValue()) - listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) - listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod) - parseInitializersOpt()) - listener: handleNoInitializers() - parseAsyncModifierOpt()) - listener: handleAsyncModifier(null, null) - inPlainSync() + parseMethod(}, null, null, null, null, null, null, null, }, SimpleType(), null, this, DeclarationKind.Class, WrapperClass, false) + listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, this, WrapperClass) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(this) + listener: handleType(int, null) + ensureIdentifierPotentiallyRecovered(int, methodDeclaration, false) + reportRecoverableErrorWithToken(this, Template(ExpectedIdentifierButGotKeyword)) + listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this) + listener: handleIdentifier(this, methodDeclaration) + parseQualifiedRestOpt(this, methodDeclarationContinuation) + parseMethodTypeVar(this) + listener: handleNoTypeVariables(() + parseGetterOrFormalParameters(this, this, false, MemberKind.NonStaticMethod) + parseFormalParameters(this, MemberKind.NonStaticMethod) + parseFormalParametersRest((, MemberKind.NonStaticMethod) + listener: beginFormalParameters((, MemberKind.NonStaticMethod) + parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + parseMetadataStar(() + listener: beginMetadataStar(int) + listener: endMetadataStar(0) + listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null) + listener: handleIdentifier(int, typeReference) + listener: handleNoTypeArguments(x) + listener: handleType(int, null) + ensureIdentifier(int, formalParameterDeclaration) + listener: handleIdentifier(x, formalParameterDeclaration) + listener: handleFormalParameterWithoutValue()) + listener: endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod) + listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod) + parseInitializersOpt()) + listener: handleNoInitializers() + parseAsyncModifierOpt()) + listener: handleAsyncModifier(null, null) inPlainSync() - parseFunctionBody(), false, true) - listener: beginBlockFunctionBody({) - notEofOrType(CLOSE_CURLY_BRACKET, if) - parseStatement({) - parseStatementX({) - parseIfStatement({) - listener: beginIfStatement(if) - ensureParenthesizedCondition(if, allowCase: true) - parseExpressionInParenthesisRest((, allowCase: true) - parseExpression(() - looksLikeOuterPatternEquals(() - skipOuterPattern(() - skipObjectPatternRest(x) - parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) - parseUnaryExpression((, true, ConstantPatternContext.none) - parsePrimary((, expression, ConstantPatternContext.none) - parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) - parseSend((, expression, ConstantPatternContext.none) - ensureIdentifier((, expression) - listener: handleIdentifier(x, expression) - listener: handleNoTypeArguments(==) - parseArgumentsOpt(x) - listener: handleNoArguments(==) - listener: handleSend(x, x) - listener: beginBinaryExpression(==) - parsePrecedenceExpression(==, 8, true, ConstantPatternContext.none) - parseUnaryExpression(==, true, ConstantPatternContext.none) - parsePrimary(==, expression, ConstantPatternContext.none) - parseLiteralInt(==) - listener: handleLiteralInt(0) - listener: endBinaryExpression(==, 0) - ensureCloseParen(0, () - listener: handleParenthesizedCondition((, null, null) - listener: beginThenStatement(return) - parseStatement()) - parseStatementX()) - parseReturnStatement()) - listener: beginReturnStatement(return) - parseExpression(return) - looksLikeOuterPatternEquals(return) - skipOuterPattern(return) - parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) - parseUnaryExpression(return, true, ConstantPatternContext.none) - parsePrimary(return, expression, ConstantPatternContext.none) - parseLiteralInt(return) - listener: handleLiteralInt(42) - ensureSemicolon(42) - listener: endReturnStatement(true, return, ;) - inGenerator() - listener: endThenStatement(return, ;) - listener: endIfStatement(if, null, ;) - notEofOrType(CLOSE_CURLY_BRACKET, return) - parseStatement(;) - parseStatementX(;) - parseReturnStatement(;) - listener: beginReturnStatement(return) - parseExpression(return) - looksLikeOuterPatternEquals(return) - skipOuterPattern(return) - parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) - parseUnaryExpression(return, true, ConstantPatternContext.none) - parsePrimary(return, expression, ConstantPatternContext.none) - parseThisExpression(return, expression) - listener: handleThisExpression(this, expression) - listener: handleNoTypeArguments(() - parseArguments(this) - parseArgumentsRest(() - listener: beginArguments(() - allowedToShortcutParseExpression() - parseExpression(() - looksLikeOuterPatternEquals(() - skipOuterPattern(() - skipObjectPatternRest(x) - parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) - parseUnaryExpression((, true, ConstantPatternContext.none) - parsePrimary((, expression, ConstantPatternContext.none) - parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) - parseSend((, expression, ConstantPatternContext.none) - ensureIdentifier((, expression) - listener: handleIdentifier(x, expression) - listener: handleNoTypeArguments(-) - parseArgumentsOpt(x) - listener: handleNoArguments(-) - listener: handleSend(x, x) - listener: beginBinaryExpression(-) - parsePrecedenceExpression(-, 14, true, ConstantPatternContext.none) - parseUnaryExpression(-, true, ConstantPatternContext.none) - parsePrimary(-, expression, ConstantPatternContext.none) - parseLiteralInt(-) - listener: handleLiteralInt(1) - listener: endBinaryExpression(-, 1) - listener: endArguments(1, (, )) - listener: handleSend(this, )) - listener: beginBinaryExpression(+) - parsePrecedenceExpression(+, 14, true, ConstantPatternContext.none) - parseUnaryExpression(+, true, ConstantPatternContext.none) - parsePrimary(+, expression, ConstantPatternContext.none) - parseLiteralInt(+) - listener: handleLiteralInt(1) - listener: endBinaryExpression(+, 1) - ensureSemicolon(1) - listener: endReturnStatement(true, return, ;) - inGenerator() - notEofOrType(CLOSE_CURLY_BRACKET, }) - listener: endBlockFunctionBody(2, {, }) - listener: endClassMethod(null, , (, null, }) - listener: endMember() + inPlainSync() + parseFunctionBody(), false, true) + listener: beginBlockFunctionBody({) + notEofOrType(CLOSE_CURLY_BRACKET, if) + parseStatement({) + parseStatementX({) + parseIfStatement({) + listener: beginIfStatement(if) + ensureParenthesizedCondition(if, allowCase: true) + parseExpressionInParenthesisRest((, allowCase: true) + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + skipObjectPatternRest(x) + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + ensureIdentifier((, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(==) + parseArgumentsOpt(x) + listener: handleNoArguments(==) + listener: handleSend(x, x) + listener: beginBinaryExpression(==) + parsePrecedenceExpression(==, 8, true, ConstantPatternContext.none) + parseUnaryExpression(==, true, ConstantPatternContext.none) + parsePrimary(==, expression, ConstantPatternContext.none) + parseLiteralInt(==) + listener: handleLiteralInt(0) + listener: endBinaryExpression(==, 0) + ensureCloseParen(0, () + listener: handleParenthesizedCondition((, null, null) + listener: beginThenStatement(return) + parseStatement()) + parseStatementX()) + parseReturnStatement()) + listener: beginReturnStatement(return) + parseExpression(return) + looksLikeOuterPatternEquals(return) + skipOuterPattern(return) + parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) + parseUnaryExpression(return, true, ConstantPatternContext.none) + parsePrimary(return, expression, ConstantPatternContext.none) + parseLiteralInt(return) + listener: handleLiteralInt(42) + ensureSemicolon(42) + listener: endReturnStatement(true, return, ;) + inGenerator() + listener: endThenStatement(return, ;) + listener: endIfStatement(if, null, ;) + notEofOrType(CLOSE_CURLY_BRACKET, return) + parseStatement(;) + parseStatementX(;) + parseReturnStatement(;) + listener: beginReturnStatement(return) + parseExpression(return) + looksLikeOuterPatternEquals(return) + skipOuterPattern(return) + parsePrecedenceExpression(return, 1, true, ConstantPatternContext.none) + parseUnaryExpression(return, true, ConstantPatternContext.none) + parsePrimary(return, expression, ConstantPatternContext.none) + parseThisExpression(return, expression) + listener: handleThisExpression(this, expression) + listener: handleNoTypeArguments(() + parseArguments(this) + parseArgumentsRest(() + listener: beginArguments(() + allowedToShortcutParseExpression() + parseExpression(() + looksLikeOuterPatternEquals(() + skipOuterPattern(() + skipObjectPatternRest(x) + parsePrecedenceExpression((, 1, true, ConstantPatternContext.none) + parseUnaryExpression((, true, ConstantPatternContext.none) + parsePrimary((, expression, ConstantPatternContext.none) + parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none) + parseSend((, expression, ConstantPatternContext.none) + ensureIdentifier((, expression) + listener: handleIdentifier(x, expression) + listener: handleNoTypeArguments(-) + parseArgumentsOpt(x) + listener: handleNoArguments(-) + listener: handleSend(x, x) + listener: beginBinaryExpression(-) + parsePrecedenceExpression(-, 14, true, ConstantPatternContext.none) + parseUnaryExpression(-, true, ConstantPatternContext.none) + parsePrimary(-, expression, ConstantPatternContext.none) + parseLiteralInt(-) + listener: handleLiteralInt(1) + listener: endBinaryExpression(-, 1) + listener: endArguments(1, (, )) + listener: handleSend(this, )) + listener: beginBinaryExpression(+) + parsePrecedenceExpression(+, 14, true, ConstantPatternContext.none) + parseUnaryExpression(+, true, ConstantPatternContext.none) + parsePrimary(+, expression, ConstantPatternContext.none) + parseLiteralInt(+) + listener: handleLiteralInt(1) + listener: endBinaryExpression(+, 1) + ensureSemicolon(1) + listener: endReturnStatement(true, return, ;) + inGenerator() + notEofOrType(CLOSE_CURLY_BRACKET, }) + listener: endBlockFunctionBody(2, {, }) + listener: endClassMethod(null, int, (, null, }) + listener: endMember() notEofOrType(CLOSE_CURLY_BRACKET, int) parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass) parseMetadataStar(}) @@ -11333,7 +11308,7 @@ parseUnit(class) listener: endClassMethod(null, int, (, null, }) listener: endMember() notEofOrType(CLOSE_CURLY_BRACKET, }) - listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 71, {, }) + listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 70, {, }) listener: endClassDeclaration(class, }) listener: endTopLevelDeclaration(}) reportAllErrorTokens(class) diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.parser.expect index 777511a5353..02b4683341a 100644 --- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.parser.expect +++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods_2.dart.parser.expect @@ -296,7 +296,7 @@ if (x == 0) return 42; return sync(x-1) + 1; } -int this;*synthetic*(int x) { +int this(int x) { if (x == 0) return 42; return this(x-1) + 1; } @@ -644,7 +644,7 @@ if[KeywordToken] ([BeginToken]x[StringToken] ==[SimpleToken] 0[StringToken])[Sim return[KeywordToken] sync[KeywordToken]([BeginToken]x[StringToken]-[SimpleToken]1[StringToken])[SimpleToken] +[SimpleToken] 1[StringToken];[SimpleToken] }[SimpleToken] -int[StringToken] this[KeywordToken];[SyntheticToken][SyntheticStringToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] +int[StringToken] this[KeywordToken]([BeginToken]int[StringToken] x[StringToken])[SimpleToken] {[BeginToken] if[KeywordToken] ([BeginToken]x[StringToken] ==[SimpleToken] 0[StringToken])[SimpleToken] return[KeywordToken] 42[StringToken];[SimpleToken] return[KeywordToken] this[KeywordToken]([BeginToken]x[StringToken]-[SimpleToken]1[StringToken])[SimpleToken] +[SimpleToken] 1[StringToken];[SimpleToken] }[SimpleToken] diff --git a/pkg/front_end/test/parser/parser_ast_test.dart b/pkg/front_end/test/parser/parser_ast_test.dart index d001c0bd8f2..0995e2ca10e 100644 --- a/pkg/front_end/test/parser/parser_ast_test.dart +++ b/pkg/front_end/test/parser/parser_ast_test.dart @@ -704,6 +704,15 @@ List processItem(ParserAstNode item, List data) { decl.endToken.offset + decl.endToken.length, ), ]; + } else if (item.isPrimaryConstructorBody()) { + PrimaryConstructorBodyEnd decl = item.getPrimaryConstructorBody(); + return [ + getCutContent( + data, + decl.beginToken.offset, + decl.endToken.offset + decl.endToken.length, + ), + ]; } else { if (item.type == ParserAstType.BEGIN) return const []; if (item.type == ParserAstType.HANDLE) return const []; diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart index a8d0faf9947..e6a144a0145 100644 --- a/pkg/front_end/test/parser_test_listener.dart +++ b/pkg/front_end/test/parser_test_listener.dart @@ -596,6 +596,34 @@ class ParserTestListener implements Listener { ); } + @override + void beginPrimaryConstructorBody(Token token) { + seen(token); + doPrint( + 'beginPrimaryConstructorBody(' + '$token)', + ); + indent++; + } + + @override + void endPrimaryConstructorBody( + Token beginToken, + Token? beginInitializers, + Token endToken, + ) { + indent--; + seen(beginToken); + seen(beginInitializers); + seen(endToken); + doPrint( + 'endPrimaryConstructorBody(' + '$beginToken, ' + '$beginInitializers, ' + '$endToken)', + ); + } + @override void beginCombinators(Token token) { seen(token); diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart index 34ddf6ff447..22912ff6861 100644 --- a/pkg/front_end/test/parser_test_parser.dart +++ b/pkg/front_end/test/parser_test_parser.dart @@ -1235,6 +1235,18 @@ class TestParser extends Parser { return result; } + @override + Token parsePrimaryConstructorBody(Token token) { + doPrint( + 'parsePrimaryConstructorBody(' + '$token)', + ); + indent++; + var result = super.parsePrimaryConstructorBody(token); + indent--; + return result; + } + @override Token parseExtensionTypeDeclaration( Token beginToken, diff --git a/pkg/front_end/testcases/general/issue43363.dart.strong.expect b/pkg/front_end/testcases/general/issue43363.dart.strong.expect index d16ec615e3d..2d3100c72b6 100644 --- a/pkg/front_end/testcases/general/issue43363.dart.strong.expect +++ b/pkg/front_end/testcases/general/issue43363.dart.strong.expect @@ -2,45 +2,91 @@ library; // // Problems in library: // -// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: 'this' can't be used as an identifier because it's a keyword. +// Try renaming this to be an identifier that isn't a keyword. // this.y = 2; // ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: A method declaration needs an explicit list of parameters. +// Try adding a parameter list to the method declaration. // this.y = 2; -// ^ +// ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name. -// Try adding the name of the type of the variable or the keyword 'var'. +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Only factory constructor can specify '=' redirection. +// Try making this a factory constructor, or remove the redirection. // this.y = 2; -// ^ +// ^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope. +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected an identifier, but got '2'. +// Try inserting an identifier before '2'. // this.y = 2; -// ^ -// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'. -// final int y; -// ^ +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Expected ';' after this. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: The name of a constructor must match the name of the enclosing class. +// this.y = 2; +// ^^^^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected a class member, but got '2'. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:19: Error: Expected a class member, but got ';'. +// this.y = 2; +// ^ // // pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers. // this.x = 1; // ^ // +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Expected a function body or '=>'. +// Try adding {}. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Constructors can't have a return type. +// Try removing the return type. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Final field 'x' is not initialized by this constructor. +// Try to initialize the field using an initializing formal or a field initializer. +// this.y = 2; +// ^ +// pkg/front_end/testcases/general/issue43363.dart:6:13: Context: 'x' is defined here. +// final int x; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Final field 'y' is not initialized by this constructor. +// Try to initialize the field using an initializing formal or a field initializer. +// this.y = 2; +// ^ +// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: 'y' is defined here. +// final int y; +// ^ +// import self as self; import "dart:core" as core; class E extends core::Object { final field core::int x; final field core::int y; + erroneous constructor y() → self::E + : self::E::y = null, self::E::x = null, super core::Object::•() + invalid-expression "pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Constructors can't have a return type. +Try removing the return type. + this.y = 2; + ^"; erroneous constructor •() → self::E : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers. this.x = 1; ^", this self::E::named() ; constructor named() → self::E - : self::E::x = 5, final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once. - this.y = 6; - ^" + : self::E::x = 5, self::E::y = 6, super core::Object::•() ; } static method main() → dynamic {} diff --git a/pkg/front_end/testcases/general/issue43363.dart.strong.modular.expect b/pkg/front_end/testcases/general/issue43363.dart.strong.modular.expect index d16ec615e3d..2d3100c72b6 100644 --- a/pkg/front_end/testcases/general/issue43363.dart.strong.modular.expect +++ b/pkg/front_end/testcases/general/issue43363.dart.strong.modular.expect @@ -2,45 +2,91 @@ library; // // Problems in library: // -// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: 'this' can't be used as an identifier because it's a keyword. +// Try renaming this to be an identifier that isn't a keyword. // this.y = 2; // ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: A method declaration needs an explicit list of parameters. +// Try adding a parameter list to the method declaration. // this.y = 2; -// ^ +// ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name. -// Try adding the name of the type of the variable or the keyword 'var'. +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Only factory constructor can specify '=' redirection. +// Try making this a factory constructor, or remove the redirection. // this.y = 2; -// ^ +// ^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope. +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected an identifier, but got '2'. +// Try inserting an identifier before '2'. // this.y = 2; -// ^ -// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'. -// final int y; -// ^ +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Expected ';' after this. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: The name of a constructor must match the name of the enclosing class. +// this.y = 2; +// ^^^^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected a class member, but got '2'. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:19: Error: Expected a class member, but got ';'. +// this.y = 2; +// ^ // // pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers. // this.x = 1; // ^ // +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Expected a function body or '=>'. +// Try adding {}. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Constructors can't have a return type. +// Try removing the return type. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Final field 'x' is not initialized by this constructor. +// Try to initialize the field using an initializing formal or a field initializer. +// this.y = 2; +// ^ +// pkg/front_end/testcases/general/issue43363.dart:6:13: Context: 'x' is defined here. +// final int x; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Final field 'y' is not initialized by this constructor. +// Try to initialize the field using an initializing formal or a field initializer. +// this.y = 2; +// ^ +// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: 'y' is defined here. +// final int y; +// ^ +// import self as self; import "dart:core" as core; class E extends core::Object { final field core::int x; final field core::int y; + erroneous constructor y() → self::E + : self::E::y = null, self::E::x = null, super core::Object::•() + invalid-expression "pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Constructors can't have a return type. +Try removing the return type. + this.y = 2; + ^"; erroneous constructor •() → self::E : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers. this.x = 1; ^", this self::E::named() ; constructor named() → self::E - : self::E::x = 5, final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once. - this.y = 6; - ^" + : self::E::x = 5, self::E::y = 6, super core::Object::•() ; } static method main() → dynamic {} diff --git a/pkg/front_end/testcases/general/issue43363.dart.strong.outline.expect b/pkg/front_end/testcases/general/issue43363.dart.strong.outline.expect index 21d01c4e03c..00476c25fd3 100644 --- a/pkg/front_end/testcases/general/issue43363.dart.strong.outline.expect +++ b/pkg/front_end/testcases/general/issue43363.dart.strong.outline.expect @@ -2,25 +2,41 @@ library; // // Problems in library: // -// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: 'this' can't be used as an identifier because it's a keyword. +// Try renaming this to be an identifier that isn't a keyword. // this.y = 2; // ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: A method declaration needs an explicit list of parameters. +// Try adding a parameter list to the method declaration. // this.y = 2; -// ^ +// ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name. -// Try adding the name of the type of the variable or the keyword 'var'. +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Only factory constructor can specify '=' redirection. +// Try making this a factory constructor, or remove the redirection. // this.y = 2; -// ^ +// ^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope. +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected an identifier, but got '2'. +// Try inserting an identifier before '2'. // this.y = 2; -// ^ -// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'. -// final int y; -// ^ +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Expected ';' after this. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: The name of a constructor must match the name of the enclosing class. +// this.y = 2; +// ^^^^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected a class member, but got '2'. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:19: Error: Expected a class member, but got ';'. +// this.y = 2; +// ^ // import self as self; import "dart:core" as core; @@ -28,6 +44,8 @@ import "dart:core" as core; class E extends core::Object { final field core::int x; final field core::int y; + constructor y() → self::E + ; constructor •() → self::E ; constructor named() → self::E diff --git a/pkg/front_end/testcases/general/issue43363.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue43363.dart.strong.transformed.expect index d16ec615e3d..2d3100c72b6 100644 --- a/pkg/front_end/testcases/general/issue43363.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/general/issue43363.dart.strong.transformed.expect @@ -2,45 +2,91 @@ library; // // Problems in library: // -// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: 'this' can't be used as an identifier because it's a keyword. +// Try renaming this to be an identifier that isn't a keyword. // this.y = 2; // ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'. +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: A method declaration needs an explicit list of parameters. +// Try adding a parameter list to the method declaration. // this.y = 2; -// ^ +// ^^^^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name. -// Try adding the name of the type of the variable or the keyword 'var'. +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Only factory constructor can specify '=' redirection. +// Try making this a factory constructor, or remove the redirection. // this.y = 2; -// ^ +// ^ // -// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope. +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected an identifier, but got '2'. +// Try inserting an identifier before '2'. // this.y = 2; -// ^ -// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'. -// final int y; -// ^ +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Expected ';' after this. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: The name of a constructor must match the name of the enclosing class. +// this.y = 2; +// ^^^^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Expected a class member, but got '2'. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:19: Error: Expected a class member, but got ';'. +// this.y = 2; +// ^ // // pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers. // this.x = 1; // ^ // +// pkg/front_end/testcases/general/issue43363.dart:10:16: Error: Expected a function body or '=>'. +// Try adding {}. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Constructors can't have a return type. +// Try removing the return type. +// this.y = 2; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Final field 'x' is not initialized by this constructor. +// Try to initialize the field using an initializing formal or a field initializer. +// this.y = 2; +// ^ +// pkg/front_end/testcases/general/issue43363.dart:6:13: Context: 'x' is defined here. +// final int x; +// ^ +// +// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Final field 'y' is not initialized by this constructor. +// Try to initialize the field using an initializing formal or a field initializer. +// this.y = 2; +// ^ +// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: 'y' is defined here. +// final int y; +// ^ +// import self as self; import "dart:core" as core; class E extends core::Object { final field core::int x; final field core::int y; + erroneous constructor y() → self::E + : self::E::y = null, self::E::x = null, super core::Object::•() + invalid-expression "pkg/front_end/testcases/general/issue43363.dart:10:18: Error: Constructors can't have a return type. +Try removing the return type. + this.y = 2; + ^"; erroneous constructor •() → self::E : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers. this.x = 1; ^", this self::E::named() ; constructor named() → self::E - : self::E::x = 5, final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once. - this.y = 6; - ^" + : self::E::x = 5, self::E::y = 6, super core::Object::•() ; } static method main() → dynamic {} diff --git a/pkg/front_end/testcases/general/issue43363.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue43363.dart.textual_outline.expect index 789eed9966f..b80822e14d6 100644 --- a/pkg/front_end/testcases/general/issue43363.dart.textual_outline.expect +++ b/pkg/front_end/testcases/general/issue43363.dart.textual_outline.expect @@ -2,8 +2,8 @@ class E { final int x; final int y; E() : this.named(), this.x = 1; - this. - y = 2; + this.y ()= ; + 2; E.named() : this.x = 5, this.y = 6; }