From e9d8109258e78079bcbfe05c8567cb408e436da7 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Mon, 16 Mar 2026 08:56:11 -0700 Subject: [PATCH] DeCo. Support empty bodies in membered declarations Allow enums, extensions, and mixins to use `;` as their body and represent that form explicitly in the AST. The parser now produces `EmptyEnumBody` or `EmptyClassBody` for the empty form. Also replace `LibraryIdentifier` with token-based `DottedName` and store the full token sequence for dotted names. This preserves periods and source offsets directly in the AST, which keeps printing, selection, and directive name handling working with the new shape. See https://github.com/dart-lang/sdk/issues/62819 See https://github.com/dart-lang/language/issues/4645 Google3 presubmit looks green: https://fusion2.corp.google.com/presubmit/884063020/OCL:884063020:BASE:884079610:1773618867493:b2110d76 Change-Id: I2d023cd03b6423da634c3e14742e02a61dc3b403 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/486080 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov Reviewed-by: Johnni Winther --- DEPS | 4 +- .../lib/src/parser/forwarding_listener.dart | 15 + .../lib/src/parser/listener.dart | 15 + .../lib/src/parser/parser_impl.dart | 106 ++-- .../lib/src/parser/token_stream_rewriter.dart | 18 + .../lib/src/computer/computer_folding.dart | 24 +- .../lib/src/computer/computer_highlights.dart | 23 +- .../lib/src/computer/computer_outline.dart | 37 +- .../lib/src/computer/computer_overrides.dart | 8 +- .../lsp/handlers/handler_format_on_type.dart | 2 +- .../lib/src/operation/operation_analysis.dart | 7 +- .../completion/dart/declaration_helper.dart | 10 +- .../dart/in_scope_completion_pass.dart | 143 +++-- .../correction/dart/add_enum_constant.dart | 26 +- .../dart/add_field_formal_parameters.dart | 2 +- .../correction/dart/bind_to_field.dart | 17 +- .../dart/convert_to_declaring_parameter.dart | 7 +- .../dart/convert_to_primary_constructor.dart | 9 +- .../convert_to_secondary_constructor.dart | 13 +- .../create_constructor_for_final_fields.dart | 2 +- .../correction/dart/encapsulate_field.dart | 2 +- .../correction/dart/make_field_public.dart | 2 +- .../correction/dart/remove_constructor.dart | 23 +- .../correction/dart/remove_library_name.dart | 2 +- .../correction/dart/remove_on_clause.dart | 10 +- .../correction/dart/remove_unused.dart | 7 +- .../src/services/correction/sort_members.dart | 6 +- .../lib/src/services/correction/util.dart | 2 +- .../refactoring/legacy/extract_method.dart | 4 +- .../refactoring/legacy/refactoring.dart | 2 + .../snippets/dart_snippet_request.dart | 5 +- .../lib/src/utilities/extensions/ast.dart | 26 +- .../test/src/utilities/selection_test.dart | 15 +- .../tool/code_completion/code_metrics.dart | 15 +- .../code_completion/relevance_metrics.dart | 35 +- .../relevance_table_generator.dart | 60 +- pkg/analysis_server_plugin/CHANGELOG.md | 5 + .../lib/src/utilities/selection.dart | 32 +- pkg/analysis_server_plugin/pubspec.yaml | 6 +- pkg/analyzer/CHANGELOG.md | 15 +- pkg/analyzer/api.txt | 60 +- .../rule_visitor_registry.g.dart | 8 +- pkg/analyzer/lib/dart/ast/ast.dart | 3 +- pkg/analyzer/lib/dart/ast/visitor.g.dart | 102 ++-- .../lib/src/dart/analysis/defined_names.dart | 16 +- .../lib/src/dart/analysis/file_state.dart | 6 +- pkg/analyzer/lib/src/dart/analysis/index.dart | 10 +- .../dart/analysis/unlinked_api_signature.dart | 12 +- pkg/analyzer/lib/src/dart/ast/ast.dart | 562 ++++++++---------- pkg/analyzer/lib/src/dart/ast/ast.g.dart | 8 +- .../lib/src/dart/ast/element_locator.dart | 13 +- .../lib/src/dart/ast/to_source_visitor.dart | 32 +- pkg/analyzer/lib/src/dart/ast/utilities.dart | 43 +- pkg/analyzer/lib/src/dart/micro/utils.dart | 5 +- .../src/dart/resolver/resolution_visitor.dart | 9 +- .../src/dartdoc/dartdoc_directive_info.dart | 10 +- .../member_duplicate_definition_verifier.dart | 1 - pkg/analyzer/lib/src/fasta/ast_builder.dart | 130 ++-- .../lib/src/generated/error_verifier.dart | 6 +- pkg/analyzer/lib/src/generated/resolver.dart | 22 +- .../lib/src/lint/linter_visitor.g.dart | 52 +- .../lib/src/summary2/ast_binary_reader.dart | 10 +- .../lib/src/summary2/ast_binary_writer.dart | 5 +- .../lib/src/summary2/element_builder.dart | 28 +- .../lib/src/summary2/informative_data.dart | 10 +- .../lib/src/summary2/library_builder.dart | 2 +- .../lib/src/summary2/metadata_resolver.dart | 17 +- .../lib/src/summary2/reference_resolver.dart | 13 +- .../lib/src/test_utilities/find_node.dart | 10 +- .../lib/src/utilities/extensions/ast.dart | 9 +- pkg/analyzer/pubspec.yaml | 2 +- .../generated/class_member_parser_test.dart | 2 +- .../test/generated/error_parser_test.dart | 10 - .../test/generated/simple_parser_test.dart | 56 +- .../test/generated/top_level_parser_test.dart | 221 +++---- .../test/generated/utilities_test.dart | 14 +- .../src/dart/analysis/defined_names_test.dart | 24 + .../test/src/dart/analysis/index_test.dart | 36 +- .../analysis/unlinked_api_signature_test.dart | 48 +- .../src/dart/ast/element_locator_test.dart | 18 +- .../src/dart/ast/to_source_visitor_test.dart | 52 +- .../test/src/dart/parser/enum_test.dart | 123 ++-- .../dart/parser/export_directive_test.dart | 13 +- .../test/src/dart/parser/extension_test.dart | 43 ++ .../dart/parser/import_directive_test.dart | 13 +- .../test/src/dart/parser/mixin_test.dart | 111 ++-- .../dart/parser/part_of_directive_test.dart | 22 +- .../test/src/dart/resolution/enum_test.dart | 67 ++- .../src/dart/resolution/extension_test.dart | 265 +++++++++ .../resolution/library_directive_test.dart | 17 +- .../dart/resolution/library_export_test.dart | 114 ++-- .../dart/resolution/library_import_test.dart | 142 ++--- .../test/src/dart/resolution/mixin_test.dart | 37 ++ .../test/src/dart/resolution/test_all.dart | 2 + .../test/src/fasta/ast_builder_test.dart | 54 +- .../src/fasta/recovery/code_order_test.dart | 28 +- .../partial_code/annotation_test.dart | 2 +- .../partial_code/class_declaration_test.dart | 44 +- .../partial_code/enum_declaration_test.dart | 238 ++++---- .../partial_code/export_directive_test.dart | 26 +- .../extension_declaration_test.dart | 8 +- .../partial_code/import_directive_test.dart | 395 +++++------- .../partial_code/library_directive_test.dart | 548 ++++++++--------- .../partial_code/mixin_declaration_test.dart | 30 +- .../partial_code/part_directive_test.dart | 6 +- .../partial_code/part_of_directive_test.dart | 395 ++++++------ .../partial_code/top_level_variable_test.dart | 30 +- .../recovery/partial_code/typedef_test.dart | 8 +- .../test/src/summary/elements/const_test.dart | 9 +- .../test/src/summary/elements/enum_test.dart | 122 +++- .../src/summary/elements/extension_test.dart | 45 ++ .../test/src/summary/elements/mixin_test.dart | 45 ++ .../src/summary/resolved_ast_printer.dart | 102 ++-- pkg/analyzer/test/util/ast_type_matchers.dart | 2 - .../tool/generators/ast_generator.dart | 4 +- pkg/analyzer_plugin/CHANGELOG.md | 4 + .../change_builder/change_builder_dart.dart | 71 ++- .../lib/src/utilities/completion/optype.dart | 58 +- .../visitors/local_declaration_visitor.dart | 8 +- pkg/analyzer_plugin/pubspec.yaml | 4 +- pkg/analyzer_testing/CHANGELOG.md | 4 + pkg/analyzer_testing/pubspec.yaml | 4 +- .../lib/src/source/diet_listener.dart | 46 ++ .../lib/src/source/outline_builder.dart | 22 + pkg/front_end/lib/src/util/parser_ast.dart | 26 +- .../lib/src/util/parser_ast_helper.dart | 98 +++ .../inline_class/no_body.dart.expect | 47 +- .../no_body.dart.intertwined.expect | 58 +- .../inline_class/no_body.dart.parser.expect | 10 +- .../crashing_test_case_minimizer_impl.dart | 37 +- .../test/parser/parser_ast_test.dart | 23 +- pkg/front_end/test/parser_test_listener.dart | 27 + ...52119.dart.textual_outline_modelled.expect | 2 + ...53212.dart.textual_outline_modelled.expect | 2 + .../testcases/textual_outline.status | 2 - pkg/linter/lib/src/extensions.dart | 9 + .../rules/avoid_setters_without_getters.dart | 4 +- .../library_private_types_in_public_api.dart | 12 +- .../lib/src/rules/public_member_api_docs.dart | 12 +- .../src/rules/sort_constructors_first.dart | 4 +- .../sort_unnamed_constructors_first.dart | 4 +- .../lib/src/rules/unreachable_from_main.dart | 6 +- 142 files changed, 3489 insertions(+), 2684 deletions(-) create mode 100644 pkg/analyzer/test/src/dart/resolution/extension_test.dart diff --git a/DEPS b/DEPS index 048f03b1e3f..2f1f17d1409 100644 --- a/DEPS +++ b/DEPS @@ -129,14 +129,14 @@ vars = { # and land the review. # # For more details, see https://github.com/dart-lang/sdk/issues/30164. - "dart_style_rev": "a6b10dcc3db33597d058cdd602c6059137550b9b", # rolled manually + "dart_style_rev": "9b302dd20b4b38979352f21cf515b44617d344ce", # rolled manually ### /third_party/pkg dependencies # 'tools/rev_sdk_deps.dart' will rev pkg dependencies to their latest; put an # EOL comment after a dependency to instead pin at the current revision. "ai_rev": "a619d4bba99e736b0fbabd3e8b94b0538e013f46", "core_rev": "1ce6453c52f498e24fe769b1eba10565a3a61c6b", - "dartdoc_rev": "3b019e40d6365af9456bea886da0476e5b7fdff4", + "dartdoc_rev": "e3484b5adb4b0316667c7b07cd16ec4cfc877887", "ecosystem_rev": "b305b11424f712d174f767369739f9a11ded6a1e", "flute_rev": "b84119fba67016a80c3eb80765762bcc4d0d0b8d", "http_rev": "9aa867e97717dc1b80ffb4abc670b7855e0a7554", 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 4dddcec1d2c..31d34ac059a 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart @@ -1216,6 +1216,11 @@ class ForwardingListener implements Listener { listener?.endMetadataStar(count); } + @override + void handleNoMixinBody(Token semicolonToken) { + listener?.handleNoMixinBody(semicolonToken); + } + @override void endMixinDeclaration(Token beginToken, Token endToken) { listener?.endMixinDeclaration(beginToken, endToken); @@ -1556,11 +1561,21 @@ class ForwardingListener implements Listener { listener?.handleClassNoWithClause(); } + @override + void handleNoExtensionBody(Token semicolonToken) { + listener?.handleNoExtensionBody(semicolonToken); + } + @override void handleEnumNoWithClause() { listener?.handleEnumNoWithClause(); } + @override + void handleNoEnumBody(Token semicolonToken) { + listener?.handleNoEnumBody(semicolonToken); + } + @override void handleImplements(Token? implementsKeyword, int interfacesCount) { listener?.handleImplements(implementsKeyword, interfacesCount); diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart index 8c05d60aba1..9695a16c485 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart @@ -256,6 +256,11 @@ abstract class Listener implements UnescapeErrorListener { logEvent("RecoverMixinHeader"); } + /// Handle `;` as a mixin body. + void handleNoMixinBody(Token semicolonToken) { + logEvent("NoMixinBody"); + } + /// Handle the end of a mixin declaration. Substructures: /// - mixin header /// - class or mixin body @@ -300,6 +305,11 @@ abstract class Listener implements UnescapeErrorListener { logEvent('ExtensionDeclaration'); } + /// Handle `;` as an extension body. + void handleNoExtensionBody(Token semicolonToken) { + logEvent("NoExtensionBody"); + } + /// Handle the beginning of an extension type declaration. Substructures: /// - type variables /// @@ -495,6 +505,11 @@ abstract class Listener implements UnescapeErrorListener { /// Handle the end of an enum body. void endEnumBody(Token beginToken, Token endToken) {} + /// Handle `;` as an enum body. + void handleNoEnumBody(Token semicolonToken) { + logEvent("NoEnumBody"); + } + /// Handle the enum element. Substructures: /// - Metadata /// - Enum value (identifier) 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 0d5c055e92c..3d26d5d70e3 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart @@ -2613,7 +2613,18 @@ class Parser { Token leftBrace = token.next!; int elementCount = 0; int memberCount = 0; - if (leftBrace.isA(TokenType.OPEN_CURLY_BRACKET)) { + if (leftBrace.isA(TokenType.SEMICOLON)) { + if (!isPrimaryConstructorsFeatureEnabled) { + reportExperimentNotEnabled( + ExperimentalFlag.primaryConstructors, + leftBrace, + leftBrace, + ); + } + listener.handleEnumHeader(augmentToken, enumKeyword, leftBrace); + listener.handleNoEnumBody(leftBrace); + token = leftBrace; + } else if (leftBrace.isA(TokenType.OPEN_CURLY_BRACKET)) { listener.handleEnumHeader(augmentToken, enumKeyword, leftBrace); listener.beginEnumBody(leftBrace); token = leftBrace; @@ -2682,7 +2693,10 @@ class Parser { token = leftBrace.endGroup!; listener.endEnumBody(leftBrace, token); } - assert(token.isA(TokenType.CLOSE_CURLY_BRACKET)); + assert( + token.isA(TokenType.CLOSE_CURLY_BRACKET) || + token.isA(TokenType.SEMICOLON), + ); listener.endEnumDeclaration( beginToken, enumKeyword, @@ -3369,16 +3383,28 @@ class Parser { name, ); Token token = parseMixinHeaderOpt(headerStart, mixinKeyword); - if (!token.next!.isA(TokenType.OPEN_CURLY_BRACKET)) { - // Recovery - token = parseMixinHeaderRecovery(token, mixinKeyword, headerStart); - ensureBlock(token, BlockKind.mixinDeclaration); + if (token.next!.isA(TokenType.SEMICOLON)) { + Token semicolonToken = token = token.next!; + if (!isPrimaryConstructorsFeatureEnabled) { + reportExperimentNotEnabled( + ExperimentalFlag.primaryConstructors, + semicolonToken, + semicolonToken, + ); + } + listener.handleNoMixinBody(semicolonToken); + } else { + if (!token.next!.isA(TokenType.OPEN_CURLY_BRACKET)) { + // Recovery + token = parseMixinHeaderRecovery(token, mixinKeyword, headerStart); + ensureBlock(token, BlockKind.mixinDeclaration); + } + token = parseClassOrMixinOrExtensionBody( + token, + DeclarationKind.Mixin, + name.lexeme, + ); } - token = parseClassOrMixinOrExtensionBody( - token, - DeclarationKind.Mixin, - name.lexeme, - ); listener.endMixinDeclaration(beginToken, token); return token; } @@ -3620,35 +3646,47 @@ class Parser { token = typeInfo.ensureTypeOrVoid(onKeyword, this); } - if (!token.next!.isA(TokenType.OPEN_CURLY_BRACKET)) { - // Recovery - Token next = token.next!; - while (!next.isEof) { - if (next.isA(TokenType.COMMA) || - next.isA(Keyword.EXTENDS) || - next.isA(Keyword.IMPLEMENTS) || - next.isA(Keyword.ON) || - next.isA(Keyword.WITH)) { - // Report an error and skip `,` or specific keyword - // optionally followed by an identifier - reportRecoverableErrorWithToken(next, diag.unexpectedToken); - token = next; - next = token.next!; - if (next.isIdentifier) { + if (token.next!.isA(TokenType.SEMICOLON)) { + Token semicolonToken = token = token.next!; + if (!isPrimaryConstructorsFeatureEnabled) { + reportExperimentNotEnabled( + ExperimentalFlag.primaryConstructors, + semicolonToken, + semicolonToken, + ); + } + listener.handleNoExtensionBody(semicolonToken); + } else { + if (!token.next!.isA(TokenType.OPEN_CURLY_BRACKET)) { + // Recovery + Token next = token.next!; + while (!next.isEof) { + if (next.isA(TokenType.COMMA) || + next.isA(Keyword.EXTENDS) || + next.isA(Keyword.IMPLEMENTS) || + next.isA(Keyword.ON) || + next.isA(Keyword.WITH)) { + // Report an error and skip `,` or specific keyword + // optionally followed by an identifier + reportRecoverableErrorWithToken(next, diag.unexpectedToken); token = next; next = token.next!; + if (next.isIdentifier) { + token = next; + next = token.next!; + } + } else { + break; } - } else { - break; } + ensureBlock(token, BlockKind.extensionDeclaration); } - ensureBlock(token, BlockKind.extensionDeclaration); + token = parseClassOrMixinOrExtensionBody( + token, + DeclarationKind.Extension, + name?.lexeme, + ); } - token = parseClassOrMixinOrExtensionBody( - token, - DeclarationKind.Extension, - name?.lexeme, - ); listener.endExtensionDeclaration( beginToken, extensionKeyword, diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/token_stream_rewriter.dart b/pkg/_fe_analyzer_shared/lib/src/parser/token_stream_rewriter.dart index 5b1152968e8..4382c3add06 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/token_stream_rewriter.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/token_stream_rewriter.dart @@ -63,6 +63,24 @@ abstract class TokenStreamRewriter { return leftParen; } + /// Insert a synthetic `{` and `}` after [previousToken] and return them. + (Token, Token) insertBlock(Token previousToken) { + Token followingToken = previousToken.next!; + int offset = followingToken.charOffset; + BeginToken leftBracket = new SyntheticBeginToken( + TokenType.OPEN_CURLY_BRACKET, + offset, + ); + Token rightBracket = new SyntheticToken( + TokenType.CLOSE_CURLY_BRACKET, + offset, + ); + insertToken(previousToken, leftBracket); + insertToken(leftBracket, rightBracket); + _setEndGroup(leftBracket, rightBracket); + return (leftBracket, rightBracket); + } + /// Insert [newToken] after [token] and return [newToken]. Token insertToken(Token token, Token newToken) { // Throw if the token is eof, though allow an eof-token if the offset diff --git a/pkg/analysis_server/lib/src/computer/computer_folding.dart b/pkg/analysis_server/lib/src/computer/computer_folding.dart index d632318add0..c97a2b00d9f 100644 --- a/pkg/analysis_server/lib/src/computer/computer_folding.dart +++ b/pkg/analysis_server/lib/src/computer/computer_folding.dart @@ -302,11 +302,13 @@ class _DartUnitFoldingComputerVisitor extends RecursiveAstVisitor { @override void visitEnumDeclaration(EnumDeclaration node) { _computer._addRegionForAnnotations(node.metadata); - _computer._addRegion( - node.body.leftBracket.end, - node.body.rightBracket.offset, - FoldingKind.CLASS_BODY, - ); + if (node.body case BlockEnumBody body) { + _computer._addRegion( + body.leftBracket.end, + body.rightBracket.offset, + FoldingKind.CLASS_BODY, + ); + } super.visitEnumDeclaration(node); } @@ -319,11 +321,13 @@ class _DartUnitFoldingComputerVisitor extends RecursiveAstVisitor { @override void visitExtensionDeclaration(ExtensionDeclaration node) { _computer._addRegionForAnnotations(node.metadata); - _computer._addRegion( - node.body.leftBracket.end, - node.body.rightBracket.offset, - FoldingKind.CLASS_BODY, - ); + if (node.body case BlockClassBody body) { + _computer._addRegion( + body.leftBracket.end, + body.rightBracket.offset, + FoldingKind.CLASS_BODY, + ); + } super.visitExtensionDeclaration(node); } diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart index 9f2ab46bb8f..55a44dbeadf 100644 --- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart +++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart @@ -1038,6 +1038,23 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { } } + @override + void visitDottedName(DottedName node) { + if (node.parent is Configuration) { + for (var token in node.tokens) { + if (token.type != TokenType.PERIOD) { + computer._addRegion_token( + token, + HighlightRegionType.IDENTIFIER_DEFAULT, + ); + } + } + } else { + computer._addRegion_node(node, HighlightRegionType.LIBRARY_NAME); + } + super.visitDottedName(node); + } + @override void visitDoubleLiteral(DoubleLiteral node) { computer._addRegion_node(node, HighlightRegionType.LITERAL_DOUBLE); @@ -1423,12 +1440,6 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { super.visitLibraryDirective(node); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - computer._addRegion_node(node, HighlightRegionType.LIBRARY_NAME); - null; - } - @override void visitListLiteral(ListLiteral node) { computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST); diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart index 4ab2d4cbe78..05f54e5ae2a 100644 --- a/pkg/analysis_server/lib/src/computer/computer_outline.dart +++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart @@ -33,35 +33,34 @@ class DartUnitOutlineComputer { ); } else if (unitMember is MixinDeclaration) { unitContents.add( - _newMixinOutline( - unitMember, - _outlinesForMembers(unitMember.body.members), - ), + _newMixinOutline(unitMember, [ + if (unitMember.body case BlockClassBody body) + ..._outlinesForMembers(body.members), + ]), ); } else if (unitMember is EnumDeclaration) { unitContents.add( _newEnumOutline(unitMember, [ - for (var constant in unitMember.body.constants) - _newEnumConstant(constant), - ..._outlinesForMembers(unitMember.body.members), + if (unitMember.body case BlockEnumBody body) ...[ + for (var constant in body.constants) _newEnumConstant(constant), + ..._outlinesForMembers(body.members), + ], ]), ); } else if (unitMember is ExtensionDeclaration) { unitContents.add( - _newExtensionOutline( - unitMember, - _outlinesForMembers(unitMember.body.members), - ), + _newExtensionOutline(unitMember, [ + if (unitMember.body case BlockClassBody body) + ..._outlinesForMembers(body.members), + ]), ); } else if (unitMember is ExtensionTypeDeclaration) { - if (unitMember.body case BlockClassBody body) { - unitContents.add( - _newExtensionTypeOutline( - unitMember, - _outlinesForMembers(body.members), - ), - ); - } + unitContents.add( + _newExtensionTypeOutline(unitMember, [ + if (unitMember.body case BlockClassBody body) + ..._outlinesForMembers(body.members), + ]), + ); } else if (unitMember is TopLevelVariableDeclaration) { var fieldDeclaration = unitMember; var fields = fieldDeclaration.variables; diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart index a07cc760a4d..f1e965c8aa2 100644 --- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart +++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart @@ -32,13 +32,17 @@ class DartUnitOverridesComputer { _classMembers(body.members); } } else if (unitMember is EnumDeclaration) { - _classMembers(unitMember.body.members); + if (unitMember.body case BlockEnumBody body) { + _classMembers(body.members); + } } else if (unitMember is ExtensionTypeDeclaration) { if (unitMember.body case BlockClassBody body) { _classMembers(body.members); } } else if (unitMember is MixinDeclaration) { - _classMembers(unitMember.body.members); + if (unitMember.body case BlockClassBody body) { + _classMembers(body.members); + } } } return _overrides; diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart index 083cbdb9a9f..b2d6c6262a0 100644 --- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart +++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart @@ -146,7 +146,7 @@ class FormatOnTypeHandler '}' => switch (node) { Block(:var rightBracket) || BlockClassBody(:var rightBracket) || - EnumBody(:var rightBracket) || + BlockEnumBody(:var rightBracket) || ListLiteral(:var rightBracket) || SetOrMapLiteral(:var rightBracket) || SwitchExpression(:var rightBracket) || diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart index 41889662162..aa586233a09 100644 --- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart +++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart @@ -172,15 +172,12 @@ void sendAnalysisNotificationOverrides( String? _computeLibraryName(CompilationUnit unit) { for (var directive in unit.directives) { if (directive is LibraryDirective) { - return directive.name?.name; + return directive.name?.tokens.join(); } } for (var directive in unit.directives) { if (directive is PartOfDirective) { - var libraryName = directive.libraryName; - if (libraryName != null) { - return libraryName.name; - } + return directive.libraryName?.tokens.join(); } } return null; diff --git a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart index e76dcc59f60..7ed766e1449 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart @@ -429,9 +429,8 @@ class DeclarationHelper { } switch (parent) { case BlockClassBody(): - parent = parent.parent; - case EnumBody(): - parent = parent.parent; + case BlockEnumBody(): + parent = parent?.parent; } if (parent is EnumConstantDeclaration) { assert(node is CommentReference); @@ -446,9 +445,8 @@ class DeclarationHelper { } switch (parent) { case BlockClassBody(): - parent = parent.parent; - case EnumBody(): - parent = parent.parent; + case BlockEnumBody(): + parent = parent?.parent; } CompilationUnitMember? topLevelMember; if (parent is CompilationUnitMember) { diff --git a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart index c6bb6a2c4fb..a491114583a 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart @@ -566,6 +566,11 @@ class InScopeCompletionPass extends SimpleAstVisitor { _forStatement(node); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + node.parent?.accept(this); + } + @override void visitBooleanLiteral(BooleanLiteral node) { _forExpression(node); @@ -1088,27 +1093,30 @@ class InScopeCompletionPass extends SimpleAstVisitor { keywordHelper.addKeyword(Keyword.ENUM); return; } - if (offset <= node.namePart.typeName.end) { - var hasSyntheticBody = - node.body.leftBracket.isSynthetic && - node.body.rightBracket.isSynthetic; - identifierHelper( - includePrivateIdentifiers: false, - ).addTopLevelName(includeBody: hasSyntheticBody); - return; - } - if (offset <= node.body.leftBracket.offset) { - keywordHelper.addEnumDeclarationKeywords(node); - return; - } - var rightBracket = node.body.rightBracket; - if (!rightBracket.isSynthetic && offset >= rightBracket.end) { - return; - } - var semicolon = node.body.semicolon; - if (semicolon != null && offset >= semicolon.end) { - collector.completionLocation = 'EnumDeclaration_member'; - _forEnumMember(node); + + if (node.body case BlockEnumBody body) { + if (offset <= node.namePart.typeName.end) { + identifierHelper(includePrivateIdentifiers: false).addTopLevelName( + includeBody: + body.leftBracket.isSynthetic && body.rightBracket.isSynthetic, + ); + return; + } + + if (offset <= body.leftBracket.offset) { + keywordHelper.addEnumDeclarationKeywords(node); + return; + } + + if (!body.rightBracket.isSynthetic && offset >= body.rightBracket.end) { + return; + } + + var semicolon = body.semicolon; + if (semicolon != null && offset >= semicolon.end) { + collector.completionLocation = 'EnumDeclaration_member'; + _forEnumMember(node); + } } } @@ -1283,19 +1291,22 @@ class InScopeCompletionPass extends SimpleAstVisitor { includePrivateIdentifiers: false, ).addTopLevelName(includeBody: false); } - if (offset <= node.body.leftBracket.offset) { - collector.completionLocation = 'ExtensionDeclaration_onClause'; - if (node.onClause case var onClause?) { - if (onClause.onKeyword.isSynthetic) { - keywordHelper.addExtensionDeclarationKeywords(node); + + if (node.body case BlockClassBody body) { + if (offset <= body.leftBracket.offset) { + collector.completionLocation = 'ExtensionDeclaration_onClause'; + if (node.onClause case var onClause?) { + if (onClause.onKeyword.isSynthetic) { + keywordHelper.addExtensionDeclarationKeywords(node); + } } + return; + } + if (offset >= body.leftBracket.end && + offset <= body.rightBracket.offset) { + collector.completionLocation = 'ExtensionDeclaration_member'; + _forExtensionMember(node); } - return; - } - if (offset >= node.body.leftBracket.end && - offset <= node.body.rightBracket.offset) { - collector.completionLocation = 'ExtensionDeclaration_member'; - _forExtensionMember(node); } } @@ -2122,35 +2133,39 @@ class InScopeCompletionPass extends SimpleAstVisitor { keywordHelper.addKeyword(Keyword.MIXIN); return; } - if (offset <= node.name.end) { - var hasSyntheticBody = - node.body.leftBracket.isSynthetic && - node.body.rightBracket.isSynthetic; - identifierHelper( - includePrivateIdentifiers: false, - ).addTopLevelName(includeBody: hasSyntheticBody); - return; - } - if (offset <= node.body.leftBracket.offset) { - keywordHelper.addMixinDeclarationKeywords(node); - return; - } - if (offset >= node.body.leftBracket.end && - offset <= node.body.rightBracket.offset) { - collector.completionLocation = 'MixinDeclaration_member'; - if (_tryAnnotationAtEndOfClassBody(node)) { + + if (node.body case BlockClassBody body) { + if (offset <= node.name.end) { + var hasSyntheticBody = + body.leftBracket.isSynthetic && body.rightBracket.isSynthetic; + identifierHelper( + includePrivateIdentifiers: false, + ).addTopLevelName(includeBody: hasSyntheticBody); return; } - _forMixinMember(node); - var element = node.body.members.elementBefore(offset); - if (element is MethodDeclaration) { - var body = element.body; - if (body.isEmpty) { - keywordHelper.addFunctionBodyModifiers(body); - } + + if (offset <= body.leftBracket.offset) { + keywordHelper.addMixinDeclarationKeywords(node); + return; + } + + if (offset >= body.leftBracket.end && + offset <= body.rightBracket.offset) { + collector.completionLocation = 'MixinDeclaration_member'; + if (_tryAnnotationAtEndOfClassBody(node)) { + return; + } + _forMixinMember(node); + var element = body.members.elementBefore(offset); + if (element is MethodDeclaration) { + var body = element.body; + if (body.isEmpty) { + keywordHelper.addFunctionBodyModifiers(body); + } + } + // TODO(brianwilkerson): Consider enabling the generation of overrides in + // this location. } - // TODO(brianwilkerson): Consider enabling the generation of overrides in - // this location. } } @@ -4550,6 +4565,8 @@ extension on AstNode { ArgumentList(:var arguments) => arguments.contains(child), Block(:var statements) => statements.contains(child), BlockClassBody(:var members) => members.contains(child), + BlockEnumBody(:var constants, :var members) => + constants.contains(child) || members.contains(child), CascadeExpression(:var cascadeSections) => cascadeSections.contains( child, ), @@ -4561,10 +4578,7 @@ extension on AstNode { ConstructorDeclaration(:var initializers, :var metadata) => initializers.contains(child) || metadata.contains(child), DeclaredIdentifier(:var metadata) => metadata.contains(child), - DottedName(:var components) => components.contains(child), EnumConstantDeclaration(:var metadata) => metadata.contains(child), - EnumBody(:var constants, :var members) => - constants.contains(child) || members.contains(child), EnumDeclaration(:var metadata) => metadata.contains(child), ExportDirective(:var combinators, :var configurations, :var metadata) => combinators.contains(child) || @@ -4588,7 +4602,6 @@ extension on AstNode { metadata.contains(child), LabeledStatement(:var labels) => labels.contains(child), LibraryDirective(:var metadata) => metadata.contains(child), - LibraryIdentifier(:var components) => components.contains(child), ListLiteral(:var elements) => elements.contains(child), ListPattern(:var elements) => elements.contains(child), MapPattern(:var elements) => elements.contains(child), @@ -4646,10 +4659,10 @@ extension on ClassMember { var parent = this.parent?.parent; var members = switch (parent) { ClassDeclaration(:BlockClassBody body) => body.members, - EnumDeclaration() => parent.body.members, - ExtensionDeclaration() => parent.body.members, + EnumDeclaration(:BlockEnumBody body) => body.members, + ExtensionDeclaration(:BlockClassBody body) => body.members, ExtensionTypeDeclaration(:BlockClassBody body) => body.members, - MixinDeclaration() => parent.body.members, + MixinDeclaration(:BlockClassBody body) => body.members, _ => null, }; if (members == null) { diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart index 97c01ccc644..69f6e223400 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart @@ -6,9 +6,11 @@ import 'package:analysis_server/src/services/correction/fix.dart'; import 'package:analysis_server/src/services/correction/util.dart'; import 'package:analysis_server_plugin/edit/dart/correction_producer.dart'; import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; import 'package:analyzer_plugin/utilities/fixes/fixes.dart'; +import 'package:analyzer_plugin/utilities/range_factory.dart'; class AddEnumConstant extends ResolvedCorrectionProducer { /// The name of the constant to be created. @@ -67,7 +69,17 @@ class AddEnumConstant extends ResolvedCorrectionProducer { } } - var lastConstant = targetNode.body.constants.lastOrNull; + EnumConstantDeclaration? lastConstant; + Token? rightBracket; + Token? semicolon; + switch (targetNode.body) { + case BlockEnumBody body: + lastConstant = body.constants.lastOrNull; + rightBracket = body.rightBracket; + case EmptyEnumBody body: + semicolon = body.semicolon; + } + var targetFile = targetFragment.libraryFragment.source.fullName; await builder.addDartFileEdit(targetFile, (builder) { @@ -77,11 +89,19 @@ class AddEnumConstant extends ResolvedCorrectionProducer { builder.write(_constantName); if (constructorName != null) builder.write('.$constructorName()'); }); - } else { - builder.addInsertion(targetNode.body.rightBracket.offset, (builder) { + } else if (rightBracket != null) { + // If has a block body. + builder.addInsertion(rightBracket.offset, (builder) { builder.write(_constantName); if (constructorName != null) builder.write('.$constructorName()'); }); + } else if (semicolon != null) { + builder.addReplacement(range.token(semicolon), (builder) { + builder.write(' { '); + builder.write(_constantName); + if (constructorName != null) builder.write('.$constructorName()'); + builder.write(' }'); + }); } }); } diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart index 81c9e05c109..439b351f5f9 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart @@ -39,7 +39,7 @@ class AddFieldFormalParameters extends ResolvedCorrectionProducer { var parent = node.parent; if (parent case ConstructorDeclarationImpl constructor) { var parent = constructor.parent; - if (parent is! BlockClassBody && parent is! EnumBody) { + if (parent is! BlockClassBody && parent is! BlockEnumBody) { return; } await _computeFromPieces( diff --git a/pkg/analysis_server/lib/src/services/correction/dart/bind_to_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/bind_to_field.dart index bd63b10bbd6..22d8811973a 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/bind_to_field.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/bind_to_field.dart @@ -9,6 +9,7 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/source/source_range.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; +import 'package:analyzer/src/utilities/extensions/object.dart'; import 'package:analyzer_plugin/utilities/assist/assist.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; import 'package:analyzer_plugin/utilities/range_factory.dart'; @@ -115,12 +116,16 @@ class BindToField extends ResolvedCorrectionProducer { // Parameter is already a method. return; } - if (container is EnumDeclaration && - container.body.constants.any( - (constant) => constant.name.lexeme == parameter.name?.lexeme, - )) { - // Parameter is already a constant. - return; + if (container is EnumDeclaration) { + var constants = + container.body.tryCast()?.constants ?? + []; + if (constants.any( + (constant) => constant.name.lexeme == parameter.name?.lexeme, + )) { + // Parameter is already a constant. + return; + } } await builder.addDartFileEdit(file, (builder) { diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart index 57abdb413d3..5276c7fdf23 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart @@ -8,11 +8,12 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/source_range.dart'; -import 'package:analyzer/src/utilities/extensions/ast.dart'; import 'package:analyzer_plugin/utilities/assist/assist.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; import 'package:analyzer_plugin/utilities/range_factory.dart'; +import '../../../utilities/extensions/ast.dart'; + typedef _RefactorData = ({ FieldElement fieldElement, ConstructorFieldInitializer? initializer, @@ -268,8 +269,8 @@ class ConvertToDeclaringParameter extends ResolvedCorrectionProducer { (node) => node is ClassDeclaration || node is EnumDeclaration, ); return switch (declaration) { - ClassDeclaration() => declaration.body.classMembers, - EnumDeclaration() => declaration.body.members, + ClassDeclaration() => declaration.members2, + EnumDeclaration() => declaration.members2, _ => null, }; } diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart index 9ba6b5c8494..cb02a59025f 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart @@ -97,10 +97,11 @@ class ConvertToPrimaryConstructor extends ResolvedCorrectionProducer { int nonRedirectingGenerativeConstructorCount; bool isEnum = false; var parent = constructor.parent; - if (parent is BlockClassBody) { - parent = parent.parent; - } else if (parent is EnumBody) { - parent = parent.parent; + switch (parent) { + case BlockClassBody body: + parent = body.parent; + case BlockEnumBody body: + parent = body.parent; } switch (parent) { case ClassDeclaration(:var namePart): diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_secondary_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_secondary_constructor.dart index e170d117624..281bca732fc 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_secondary_constructor.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_secondary_constructor.dart @@ -76,7 +76,13 @@ class ConvertToSecondaryConstructor extends ResolvedCorrectionProducer { EnumDeclaration enumDeclaration, ) async { var containerBody = enumDeclaration.body; - if (containerBody.constants.isEmpty) return; + if (containerBody is! BlockEnumBody) { + return; + } + + var constants = containerBody.constants; + if (constants.isEmpty) return; + var namePart = enumDeclaration.namePart; if (namePart is! PrimaryConstructorDeclaration) return; @@ -114,10 +120,11 @@ class ConvertToSecondaryConstructor extends ResolvedCorrectionProducer { var parent = declaration.parent; if (parent is EnumDeclaration) { var body = parent.body; - var semicolon = body.semicolon; + var semicolon = body is BlockEnumBody ? body.semicolon : null; if (semicolon == null) { needsSemicolon = true; - fieldOffset = body.constants.endToken?.end ?? fieldOffset; + var constants = body is BlockEnumBody ? body.constants : null; + fieldOffset = constants?.endToken?.end ?? fieldOffset; } else { fieldOffset = semicolon.end; } diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart index 31211ded787..d722e56182d 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart @@ -82,7 +82,7 @@ class CreateConstructorForFinalFields extends ResolvedCorrectionProducer { builder: builder, containerName: container.namePart.typeName.lexeme, superType: superType, - variableLists: container.body.members.interestingVariableLists, + variableLists: container.members2.interestingVariableLists, ); case _: return; diff --git a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart index 5aa1e8c8161..49ac1e7aea3 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart @@ -69,7 +69,7 @@ class EncapsulateField extends ResolvedCorrectionProducer { classMembers = parent.members2; parentElement = parent.declaredFragment!.element; case MixinDeclaration(): - classMembers = parent.body.members; + classMembers = parent.members2; parentElement = parent.declaredFragment!.element; default: return; diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart index cd216cb3612..68e38e2ea49 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart @@ -42,7 +42,7 @@ class MakeFieldPublic extends ResolvedCorrectionProducer { if (container is ClassDeclaration) { members = container.members2; } else if (container is MixinDeclaration) { - members = container.body.members; + members = container.members2; } else { return; } diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_constructor.dart index 3156529da23..d2097677075 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/remove_constructor.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_constructor.dart @@ -65,18 +65,23 @@ class RemoveConstructor extends ResolvedCorrectionProducer { _Container? _findContainer() { switch (node.parent) { case ExtensionDeclaration extension: - return _Container( - leftBracket: extension.body.leftBracket, - members: extension.body.members, - ); + if (extension.body case BlockClassBody body) { + return _Container( + leftBracket: body.leftBracket, + members: body.members, + ); + } case MixinDeclaration mixin: - return _Container( - leftBracket: mixin.body.leftBracket, - members: mixin.body.members, - ); + if (mixin.body case BlockClassBody body) { + return _Container( + leftBracket: body.leftBracket, + members: body.members, + ); + } default: - return null; + break; } + return null; } } diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_library_name.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_library_name.dart index 21058520c3d..bd98c992a80 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/remove_library_name.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_library_name.dart @@ -22,7 +22,7 @@ class RemoveLibraryName extends ResolvedCorrectionProducer { @override Future compute(ChangeBuilder builder) async { var libraryName = node; - if (libraryName is SimpleIdentifier || libraryName is LibraryIdentifier) { + if (libraryName is SimpleIdentifier || libraryName is DottedName) { await builder.addDartFileEdit(file, (builder) { builder.addDeletion( range.endStart( diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_on_clause.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_on_clause.dart index fc6f26e93da..d6b9d4f579f 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/remove_on_clause.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_on_clause.dart @@ -29,11 +29,13 @@ class RemoveOnClause extends ResolvedCorrectionProducer { if (extensionDeclaration == null) return; await builder.addDartFileEdit(file, (builder) { + var body = extensionDeclaration.body; + var endToken = switch (body) { + BlockClassBody() => body.leftBracket, + EmptyClassBody() => body.semicolon, + }; builder.addDeletion( - range.startStart( - extensionDeclaration.onClause!, - extensionDeclaration.body.leftBracket, - ), + range.startStart(extensionDeclaration.onClause!, endToken), ); }); } diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart index 055bb5053e0..6a5c497d8fc 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart @@ -88,7 +88,12 @@ class RemoveUnusedElement extends _RemoveUnused { return; } case EnumDeclaration enumDeclaration: - members = enumDeclaration.body.members; + switch (enumDeclaration.body) { + case BlockEnumBody body: + members = body.members; + default: + return; + } case _: return; } diff --git a/pkg/analysis_server/lib/src/services/correction/sort_members.dart b/pkg/analysis_server/lib/src/services/correction/sort_members.dart index e3974c463f7..c60d245782e 100644 --- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart +++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart @@ -103,13 +103,13 @@ class MemberSorter { if (unitMember is ClassDeclaration) { _sortClassMembers(unitMember.members2); } else if (unitMember is EnumDeclaration) { - _sortClassMembers(unitMember.body.members); + _sortClassMembers(unitMember.members2); } else if (unitMember is ExtensionDeclaration) { - _sortClassMembers(unitMember.body.members); + _sortClassMembers(unitMember.members2); } else if (unitMember is ExtensionTypeDeclaration) { _sortClassMembers(unitMember.members2); } else if (unitMember is MixinDeclaration) { - _sortClassMembers(unitMember.body.members); + _sortClassMembers(unitMember.members2); } } } diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart index 4370c27feef..5af69139f44 100644 --- a/pkg/analysis_server/lib/src/services/correction/util.dart +++ b/pkg/analysis_server/lib/src/services/correction/util.dart @@ -132,8 +132,8 @@ AstNode? getEnclosingClassOrUnitMember(AstNode input) { for (var node in input.withAncestors) { switch (node) { case BlockClassBody _: + case BlockEnumBody _: case CompilationUnit _: - case EnumBody _: return member; } member = node; diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart index 4beafcf97c6..ffed23b2660 100644 --- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart +++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart @@ -635,11 +635,11 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl var libraryElement = parent.declaredFragment!.element; return validateCreateFunction(_searchEngine, libraryElement, name); } - // Stop up through BlockClassBody or EnumBody. + // Stop up through BlockClassBody or BlockEnumBody. switch (parent) { case BlockClassBody(): parent = parent.parent!; - case EnumBody(): + case BlockEnumBody(): parent = parent.parent!; } // method of class diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart index 09163e5c521..69dab498018 100644 --- a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart +++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart @@ -555,6 +555,8 @@ abstract class RenameRefactoring implements Refactoring { nameNode = node.name; } else if (node is DeclaredVariablePattern) { nameNode = node.name; + } else if (node is DottedName) { + nameNode = node; } else if (node is EnumConstantDeclaration) { nameNode = node.name; } else if (node is ExtensionDeclaration) { diff --git a/pkg/analysis_server/lib/src/services/snippets/dart_snippet_request.dart b/pkg/analysis_server/lib/src/services/snippets/dart_snippet_request.dart index 4e0c03a8a57..3ace092259c 100644 --- a/pkg/analysis_server/lib/src/services/snippets/dart_snippet_request.dart +++ b/pkg/analysis_server/lib/src/services/snippets/dart_snippet_request.dart @@ -192,7 +192,10 @@ class DartSnippetRequest { } if (node is EnumDeclaration) { - var semicolon = node.body.semicolon; + var semicolon = switch (node.body) { + BlockEnumBody body => body.semicolon, + EmptyEnumBody body => body.semicolon, + }; return semicolon == null || target.offset <= semicolon.offset ? SnippetContext.inEnumConstants : SnippetContext.inEnumMembers; diff --git a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart index 9b7297890df..47d0f8a243b 100644 --- a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart +++ b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart @@ -180,10 +180,7 @@ extension AstNodeExtension on AstNode { /// Returns `null` if `this` is `null` or doesn't have an element. Element? getElement({bool useMockForImport = false}) { AstNode? node = this; - if (node is SimpleIdentifier && node.parent is LibraryIdentifier) { - node = node.parent; - } - if (node is LibraryIdentifier) { + if (node is DottedName) { node = node.parent; } if (node is StringLiteral && node.parent is UriBasedDirective) { @@ -331,6 +328,13 @@ extension DirectiveExtension on Directive { } } +extension EnumDeclarationExtension on EnumDeclaration { + List get members2 { + var body = this.body; + return body is BlockEnumBody ? body.members : const []; + } +} + extension ExpressionExtension on Expression { /// Whether this [Expression] should be wrapped with parentheses when we want /// to use it as operand of a logical and-expression. @@ -344,6 +348,13 @@ extension ExpressionExtension on Expression { } } +extension ExtensionDeclarationExtension on ExtensionDeclaration { + List get members2 { + var body = this.body; + return body is BlockClassBody ? body.members : const []; + } +} + extension ExtensionTypeDeclarationExtension on ExtensionTypeDeclaration { List get members2 { switch (body) { @@ -393,6 +404,13 @@ extension MethodInvocationExtension on MethodInvocation { } } +extension MixinDeclarationExtension on MixinDeclaration { + List get members2 { + var body = this.body; + return body is BlockClassBody ? body.members : const []; + } +} + extension NamedTypeExtension on NamedType { String get qualifiedName { var importPrefix = this.importPrefix; diff --git a/pkg/analysis_server/test/src/utilities/selection_test.dart b/pkg/analysis_server/test/src/utilities/selection_test.dart index 704b97c433a..219f31f214f 100644 --- a/pkg/analysis_server/test/src/utilities/selection_test.dart +++ b/pkg/analysis_server/test/src/utilities/selection_test.dart @@ -495,14 +495,12 @@ int x = 0]) {} ); } - Future test_dottedName_components() async { + Future test_dottedName_tokens() async { var selection = await _computeSelection(''' library a.[!b.c!].d; '''); _assertSelection(selection, r''' nodesInRange - SimpleIdentifierImpl: b - SimpleIdentifierImpl: c '''); } @@ -859,17 +857,6 @@ library l; ); } - Future test_libraryIdentifier_components() async { - var selection = await _computeSelection(''' -library a.[!b.c!].d; -'''); - _assertSelection(selection, r''' -nodesInRange - SimpleIdentifierImpl: b - SimpleIdentifierImpl: c -'''); - } - Future test_listLiteral_elements() async { var selection = await _computeSelection(''' var l = ['0', [!1, 2.0!], '3']; diff --git a/pkg/analysis_server/tool/code_completion/code_metrics.dart b/pkg/analysis_server/tool/code_completion/code_metrics.dart index f40e9c5976e..781ce461914 100644 --- a/pkg/analysis_server/tool/code_completion/code_metrics.dart +++ b/pkg/analysis_server/tool/code_completion/code_metrics.dart @@ -14,6 +14,7 @@ import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/file_system/physical_file_system.dart'; import 'package:analyzer/src/util/file_paths.dart' as file_paths; import 'package:analyzer/src/utilities/extensions/diagnostic.dart'; +import 'package:analyzer/src/utilities/extensions/object.dart'; import 'package:args/args.dart'; /// Compute and print lexical and semantic information about a package. @@ -431,7 +432,7 @@ class CodeShapeDataCollector extends RecursiveAstVisitor { @override void visitDottedName(DottedName node) { - _visitChildren(node, {'components': node.components}); + _visitChildren(node, {}); super.visitDottedName(node); } @@ -469,7 +470,7 @@ class CodeShapeDataCollector extends RecursiveAstVisitor { 'documentationComment': node.documentationComment, 'metadata': node.metadata, 'name': node.namePart.typeName, - 'constants': node.body.constants, + 'constants': node.body.tryCast()?.constants, }); super.visitEnumDeclaration(node); } @@ -514,7 +515,7 @@ class CodeShapeDataCollector extends RecursiveAstVisitor { 'name': node.name, 'typeParameters': node.typeParameters, 'onClause': node.onClause, - 'member': node.body.members, + 'member': node.body.tryCast()?.members, }); super.visitExtensionDeclaration(node); } @@ -827,12 +828,6 @@ class CodeShapeDataCollector extends RecursiveAstVisitor { super.visitLibraryDirective(node); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - _visitChildren(node, {'components': node.components}); - super.visitLibraryIdentifier(node); - } - @override void visitListLiteral(ListLiteral node) { _visitChildren(node, { @@ -885,7 +880,7 @@ class CodeShapeDataCollector extends RecursiveAstVisitor { 'typeParameters': node.typeParameters, 'onClause': node.onClause, 'implementsClause': node.implementsClause, - 'members': node.body.members, + 'members': node.body.tryCast()?.members, }); super.visitMixinDeclaration(node); } diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart index 9e6d9fe4955..fb2fe46fbc7 100644 --- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart +++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart @@ -741,12 +741,14 @@ class RelevanceDataCollector extends RecursiveAstVisitor { node.typeParameters != null, ); _recordDataForNode('ExtensionDeclaration (onClause)', node.onClause); - for (var member in node.body.members) { - _recordDataForNode( - 'ExtensionDeclaration (member)', - member, - allowedKeywords: memberKeywords, - ); + if (node.body case BlockClassBody body) { + for (var member in body.members) { + _recordDataForNode( + 'ExtensionDeclaration (member)', + member, + allowedKeywords: memberKeywords, + ); + } } super.visitExtensionDeclaration(node); inGenericContext = wasInGenericContext; @@ -1089,12 +1091,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { super.visitLibraryDirective(node); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - // There are no completions. - super.visitLibraryIdentifier(node); - } - @override void visitListLiteral(ListLiteral node) { for (var element in node.elements) { @@ -1201,13 +1197,16 @@ class RelevanceDataCollector extends RecursiveAstVisitor { allowedKeywords: [Keyword.IMPLEMENTS], ); - for (var member in node.body.members) { - _recordDataForNode( - 'MixinDeclaration (member)', - member, - allowedKeywords: memberKeywords, - ); + if (node.body case BlockClassBody body) { + for (var member in body.members) { + _recordDataForNode( + 'MixinDeclaration (member)', + member, + allowedKeywords: memberKeywords, + ); + } } + super.visitMixinDeclaration(node); inGenericContext = wasInGenericContext; } diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart index 46fb1b58c62..ae08f5a779a 100644 --- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart +++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart @@ -683,8 +683,8 @@ class RelevanceDataCollector extends RecursiveAstVisitor { void visitConfiguration(Configuration node) { // The list of valid names is short, so we don't use the relevance tables to // try to sort them by frequency. - for (var id in node.name.components) { - _identifiersAndKeywords.remove(id.token); + for (var token in node.name.tokens) { + _identifiersAndKeywords.remove(token); } super.visitConfiguration(node); } @@ -828,12 +828,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { super.visitDotShorthandPropertyAccess(node); } - @override - void visitDottedName(DottedName node) { - // The components are always identifiers. - super.visitDottedName(node); - } - @override void visitDoubleLiteral(DoubleLiteral node) { // There are no completions. @@ -858,19 +852,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { super.visitEmptyStatement(node); } - @override - void visitEnumBody(EnumBody node) { - // TODO(brianwilkerson): Record data for the enum constants. - for (var member in node.members) { - _recordDataForNode( - 'EnumDeclaration_member', - member, - allowedKeywords: memberKeywords, - ); - } - super.visitEnumBody(node); - } - @override void visitEnumConstantArguments(EnumConstantArguments node) { // There are no completions. @@ -976,12 +957,14 @@ class RelevanceDataCollector extends RecursiveAstVisitor { _recordDeclaration(name); } _recordDataForNode('ExtensionDeclaration_onClause', node.onClause); - for (var member in node.body.members) { - _recordDataForNode( - 'ExtensionDeclaration_member', - member, - allowedKeywords: memberKeywords, - ); + if (node.body case BlockClassBody body) { + for (var member in body.members) { + _recordDataForNode( + 'ExtensionDeclaration_member', + member, + allowedKeywords: memberKeywords, + ); + } } super.visitExtensionDeclaration(node); } @@ -1421,15 +1404,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { super.visitLibraryDirective(node); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - // There are no completions. - for (var id in node.components) { - _recordDeclaration(id.token); - } - super.visitLibraryIdentifier(node); - } - @override void visitListLiteral(ListLiteral node) { for (var element in node.elements) { @@ -1550,12 +1524,14 @@ class RelevanceDataCollector extends RecursiveAstVisitor { allowedKeywords: [Keyword.IMPLEMENTS], ); - for (var member in node.body.members) { - _recordDataForNode( - 'MixinDeclaration_member', - member, - allowedKeywords: memberKeywords, - ); + if (node.body case BlockClassBody body) { + for (var member in body.members) { + _recordDataForNode( + 'MixinDeclaration_member', + member, + allowedKeywords: memberKeywords, + ); + } } super.visitMixinDeclaration(node); } diff --git a/pkg/analysis_server_plugin/CHANGELOG.md b/pkg/analysis_server_plugin/CHANGELOG.md index 7b7c63de15c..ee625c9040c 100644 --- a/pkg/analysis_server_plugin/CHANGELOG.md +++ b/pkg/analysis_server_plugin/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.13-dev + +- Require version `^12.0.0-0` of the `analyzer` package. +- Require version `0.14.7-dev` of the `analyzer_plugin` package. + ## 0.3.12-dev - Require version `11.1.0-dev` of the `analyzer` package. diff --git a/pkg/analysis_server_plugin/lib/src/utilities/selection.dart b/pkg/analysis_server_plugin/lib/src/utilities/selection.dart index 7d8608a46de..546f2f171dc 100644 --- a/pkg/analysis_server_plugin/lib/src/utilities/selection.dart +++ b/pkg/analysis_server_plugin/lib/src/utilities/selection.dart @@ -83,6 +83,11 @@ class _ChildrenFinder extends SimpleAstVisitor { _fromList(node.members); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + _fromList(node.constants) || _fromList(node.members); + } + @override void visitCascadeExpression(CascadeExpression node) { _fromList(node.cascadeSections); @@ -91,9 +96,6 @@ class _ChildrenFinder extends SimpleAstVisitor { @override void visitClassDeclaration(ClassDeclaration node) { _fromList(node.metadata); - if (node.body case BlockClassBody body) { - _fromList(body.members); - } } @override @@ -122,16 +124,6 @@ class _ChildrenFinder extends SimpleAstVisitor { _fromList(node.metadata); } - @override - void visitDottedName(DottedName node) { - _fromList(node.components); - } - - @override - void visitEnumBody(EnumBody node) { - _fromList(node.constants) || _fromList(node.members); - } - @override void visitEnumConstantDeclaration(EnumConstantDeclaration node) { _fromList(node.metadata); @@ -151,7 +143,12 @@ class _ChildrenFinder extends SimpleAstVisitor { @override void visitExtensionDeclaration(ExtensionDeclaration node) { - _fromList(node.metadata) || _fromList(node.body.members); + _fromList(node.metadata); + } + + @override + void visitExtensionTypeDeclaration(ExtensionTypeDeclaration node) { + _fromList(node.metadata); } @override @@ -239,11 +236,6 @@ class _ChildrenFinder extends SimpleAstVisitor { _fromList(node.metadata); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - _fromList(node.components); - } - @override void visitListLiteral(ListLiteral node) { _fromList(node.elements); @@ -266,7 +258,7 @@ class _ChildrenFinder extends SimpleAstVisitor { @override void visitMixinDeclaration(MixinDeclaration node) { - _fromList(node.metadata) || _fromList(node.body.members); + _fromList(node.metadata); } @override diff --git a/pkg/analysis_server_plugin/pubspec.yaml b/pkg/analysis_server_plugin/pubspec.yaml index 66294dd0a5c..9ecf5f8d5c6 100644 --- a/pkg/analysis_server_plugin/pubspec.yaml +++ b/pkg/analysis_server_plugin/pubspec.yaml @@ -1,6 +1,6 @@ name: analysis_server_plugin description: A framework and support code for building plugins for the analysis server. -version: 0.3.12-dev +version: 0.3.13-dev repository: https://github.com/dart-lang/sdk/tree/main/pkg/analysis_server_plugin environment: @@ -11,8 +11,8 @@ resolution: workspace dependencies: # See the release policy for managing this dependency at # pkg/analyzer/doc/implementation/releasing.md. - analyzer: 11.1.0-dev - analyzer_plugin: 0.14.6-dev + analyzer: ^12.0.0-0 + analyzer_plugin: 0.14.7-dev meta: ^1.16.0 yaml: ^3.1.0 yaml_edit: ^2.2.0 diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md index f87cc96c62e..ea1acb4fdb4 100644 --- a/pkg/analyzer/CHANGELOG.md +++ b/pkg/analyzer/CHANGELOG.md @@ -1,6 +1,19 @@ -## 11.1.0-dev +## 12.0.0-dev * Added `InstantiatedTypeAliasElement.nullabilitySuffix`. +* Support empty bodies (`;`) in enums, extensions, and mixins, representing + them in the AST with `EmptyEnumBody` and `EmptyClassBody`. +* **Breaking Change:** `ClassBody` is now a `sealed class` with subclasses + `BlockClassBody` and `EmptyClassBody`. Getters like `.members`, `.leftBracket`, + and `.rightBracket` are available on `BlockClassBody`. This affects + `ClassDeclaration`, `ExtensionDeclaration`, and `MixinDeclaration` bodies. +* **Breaking Change:** `EnumBody` is now a `sealed class` with subclasses + `BlockEnumBody` and `EmptyEnumBody`. Getters like `.members`, `.leftBracket`, + and `.rightBracket` are available on `BlockEnumBody`. +* **Breaking Change:** Remove `LibraryIdentifier`. `LibraryDirective.name` and + `PartOfDirective.libraryName` now return `DottedName?`. +* **Breaking Change:** `DottedName.components` (NodeList) is + replaced with `DottedName.tokens` (List). ## 11.0.0 diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt index 17551381d17..c3079235cb7 100644 --- a/pkg/analyzer/api.txt +++ b/pkg/analyzer/api.txt @@ -138,6 +138,7 @@ package:analyzer/analysis_rule/rule_visitor_registry.dart: addBinaryExpression (method: void Function(AbstractAnalysisRule, AstVisitor)) addBlock (method: void Function(AbstractAnalysisRule, AstVisitor)) addBlockClassBody (method: void Function(AbstractAnalysisRule, AstVisitor)) + addBlockEnumBody (method: void Function(AbstractAnalysisRule, AstVisitor)) addBlockFunctionBody (method: void Function(AbstractAnalysisRule, AstVisitor)) addBooleanLiteral (method: void Function(AbstractAnalysisRule, AstVisitor)) addBreakStatement (method: void Function(AbstractAnalysisRule, AstVisitor)) @@ -170,9 +171,9 @@ package:analyzer/analysis_rule/rule_visitor_registry.dart: addDottedName (method: void Function(AbstractAnalysisRule, AstVisitor)) addDoubleLiteral (method: void Function(AbstractAnalysisRule, AstVisitor)) addEmptyClassBody (method: void Function(AbstractAnalysisRule, AstVisitor)) + addEmptyEnumBody (method: void Function(AbstractAnalysisRule, AstVisitor)) addEmptyFunctionBody (method: void Function(AbstractAnalysisRule, AstVisitor)) addEmptyStatement (method: void Function(AbstractAnalysisRule, AstVisitor)) - addEnumBody (method: void Function(AbstractAnalysisRule, AstVisitor)) addEnumConstantArguments (method: void Function(AbstractAnalysisRule, AstVisitor)) addEnumConstantDeclaration (method: void Function(AbstractAnalysisRule, AstVisitor)) addEnumDeclaration (method: void Function(AbstractAnalysisRule, AstVisitor)) @@ -221,7 +222,6 @@ package:analyzer/analysis_rule/rule_visitor_registry.dart: addLabel (method: void Function(AbstractAnalysisRule, AstVisitor)) addLabeledStatement (method: void Function(AbstractAnalysisRule, AstVisitor)) addLibraryDirective (method: void Function(AbstractAnalysisRule, AstVisitor)) - addLibraryIdentifier (method: void Function(AbstractAnalysisRule, AstVisitor)) addListLiteral (method: void Function(AbstractAnalysisRule, AstVisitor)) addListPattern (method: void Function(AbstractAnalysisRule, AstVisitor)) addLogicalAndPattern (method: void Function(AbstractAnalysisRule, AstVisitor)) @@ -659,6 +659,7 @@ package:analyzer/dart/ast/ast.dart: visitBinaryExpression (method: R? Function(BinaryExpression)) visitBlock (method: R? Function(Block)) visitBlockClassBody (method: R? Function(BlockClassBody)) + visitBlockEnumBody (method: R? Function(BlockEnumBody)) visitBlockFunctionBody (method: R? Function(BlockFunctionBody)) visitBooleanLiteral (method: R? Function(BooleanLiteral)) visitBreakStatement (method: R? Function(BreakStatement)) @@ -691,9 +692,9 @@ package:analyzer/dart/ast/ast.dart: visitDottedName (method: R? Function(DottedName)) visitDoubleLiteral (method: R? Function(DoubleLiteral)) visitEmptyClassBody (method: R? Function(EmptyClassBody)) + visitEmptyEnumBody (method: R? Function(EmptyEnumBody)) visitEmptyFunctionBody (method: R? Function(EmptyFunctionBody)) visitEmptyStatement (method: R? Function(EmptyStatement)) - visitEnumBody (method: R? Function(EnumBody)) visitEnumConstantArguments (method: R? Function(EnumConstantArguments)) visitEnumConstantDeclaration (method: R? Function(EnumConstantDeclaration)) visitEnumDeclaration (method: R? Function(EnumDeclaration)) @@ -742,7 +743,6 @@ package:analyzer/dart/ast/ast.dart: visitLabel (method: R? Function(Label)) visitLabeledStatement (method: R? Function(LabeledStatement)) visitLibraryDirective (method: R? Function(LibraryDirective)) - visitLibraryIdentifier (method: R? Function(LibraryIdentifier)) visitListLiteral (method: R? Function(ListLiteral)) visitListPattern (method: R? Function(ListPattern)) visitLogicalAndPattern (method: R? Function(LogicalAndPattern)) @@ -841,6 +841,12 @@ package:analyzer/dart/ast/ast.dart: leftBracket (getter: Token) members (getter: NodeList) rightBracket (getter: Token) + BlockEnumBody (class extends Object implements EnumBody, abstract, final): + constants (getter: NodeList) + leftBracket (getter: Token) + members (getter: NodeList) + rightBracket (getter: Token) + semicolon (getter: Token?) BlockFunctionBody (class extends Object implements FunctionBody, abstract, final): block (getter: Block) BooleanLiteral (class extends Object implements Literal, abstract, final): @@ -1040,22 +1046,19 @@ package:analyzer/dart/ast/ast.dart: period (getter: Token) propertyName (getter: SimpleIdentifier) DottedName (class extends Object implements AstNode, abstract, final): - components (getter: NodeList) + tokens (getter: List) DoubleLiteral (class extends Object implements Literal, abstract, final): literal (getter: Token) value (getter: double) EmptyClassBody (class extends Object implements ClassBody, sealed (immediate subtypes: EmptyClassBodyImpl)): semicolon (getter: Token) + EmptyEnumBody (class extends Object implements EnumBody, abstract, final): + semicolon (getter: Token) EmptyFunctionBody (class extends Object implements FunctionBody, abstract, final): semicolon (getter: Token) EmptyStatement (class extends Object implements Statement, abstract, final): semicolon (getter: Token) - EnumBody (class extends Object implements AstNode, sealed (immediate subtypes: EnumBodyImpl)): - constants (getter: NodeList) - leftBracket (getter: Token) - members (getter: NodeList) - rightBracket (getter: Token) - semicolon (getter: Token?) + EnumBody (class extends Object implements AstNode, sealed (immediate subtypes: BlockEnumBody, EmptyEnumBody, EnumBodyImpl)) EnumConstantArguments (class extends Object implements AstNode, abstract, final): argumentList (getter: ArgumentList) constructorSelector (getter: ConstructorSelector?) @@ -1100,7 +1103,7 @@ package:analyzer/dart/ast/ast.dart: superclass (getter: NamedType) ExtensionDeclaration (class extends Object implements CompilationUnitMember, abstract, final): augmentKeyword (getter: Token?) - body (getter: BlockClassBody) + body (getter: ClassBody) declaredFragment (getter: ExtensionFragment?) extensionKeyword (getter: Token) name (getter: Token?) @@ -1262,7 +1265,7 @@ package:analyzer/dart/ast/ast.dart: whenClause (getter: WhenClause?) HideCombinator (class extends Object implements Combinator, abstract, final): hiddenNames (getter: NodeList) - Identifier (class extends Object implements Expression, CommentReferableExpression, sealed (immediate subtypes: IdentifierImpl, LibraryIdentifier, PrefixedIdentifier, SimpleIdentifier)): + Identifier (class extends Object implements Expression, CommentReferableExpression, sealed (immediate subtypes: IdentifierImpl, PrefixedIdentifier, SimpleIdentifier)): isPrivateName (static method: bool Function(String)) element (getter: Element?) name (getter: String) @@ -1352,10 +1355,8 @@ package:analyzer/dart/ast/ast.dart: LibraryDirective (class extends Object implements Directive, abstract, final): element (getter: LibraryElement?) libraryKeyword (getter: Token) - name (getter: LibraryIdentifier?) + name (getter: DottedName?) semicolon (getter: Token) - LibraryIdentifier (class extends Object implements Identifier, abstract, final): - components (getter: NodeList) ListLiteral (class extends Object implements TypedLiteral, abstract, final): elements (getter: NodeList) leftBracket (getter: Token) @@ -1422,7 +1423,7 @@ package:analyzer/dart/ast/ast.dart: MixinDeclaration (class extends Object implements CompilationUnitMember, abstract, final): augmentKeyword (getter: Token?) baseKeyword (getter: Token?) - body (getter: BlockClassBody) + body (getter: ClassBody) declaredFragment (getter: MixinFragment?) implementsClause (getter: ImplementsClause?) mixinKeyword (getter: Token) @@ -1497,7 +1498,7 @@ package:analyzer/dart/ast/ast.dart: partKeyword (getter: Token) semicolon (getter: Token) PartOfDirective (class extends Object implements Directive, abstract, final): - libraryName (getter: LibraryIdentifier?) + libraryName (getter: DottedName?) ofKeyword (getter: Token) partKeyword (getter: Token) semicolon (getter: Token) @@ -2182,6 +2183,7 @@ package:analyzer/dart/ast/visitor.dart: visitBinaryExpression (method: R? Function(BinaryExpression)) visitBlock (method: R? Function(Block)) visitBlockClassBody (method: R? Function(BlockClassBody)) + visitBlockEnumBody (method: R? Function(BlockEnumBody)) visitBlockFunctionBody (method: R? Function(BlockFunctionBody)) visitBooleanLiteral (method: R? Function(BooleanLiteral)) visitBreakStatement (method: R? Function(BreakStatement)) @@ -2225,6 +2227,7 @@ package:analyzer/dart/ast/visitor.dart: visitDottedName (method: R? Function(DottedName)) visitDoubleLiteral (method: R? Function(DoubleLiteral)) visitEmptyClassBody (method: R? Function(EmptyClassBody)) + visitEmptyEnumBody (method: R? Function(EmptyEnumBody)) visitEmptyFunctionBody (method: R? Function(EmptyFunctionBody)) visitEmptyStatement (method: R? Function(EmptyStatement)) visitEnumBody (method: R? Function(EnumBody)) @@ -2285,7 +2288,6 @@ package:analyzer/dart/ast/visitor.dart: visitLabel (method: R? Function(Label)) visitLabeledStatement (method: R? Function(LabeledStatement)) visitLibraryDirective (method: R? Function(LibraryDirective)) - visitLibraryIdentifier (method: R? Function(LibraryIdentifier)) visitListLiteral (method: R? Function(ListLiteral)) visitListPattern (method: R? Function(ListPattern)) visitLiteral (method: R? Function(Literal)) @@ -2399,6 +2401,7 @@ package:analyzer/dart/ast/visitor.dart: visitBinaryExpression (method: R? Function(BinaryExpression)) visitBlock (method: R? Function(Block)) visitBlockClassBody (method: R? Function(BlockClassBody)) + visitBlockEnumBody (method: R? Function(BlockEnumBody)) visitBlockFunctionBody (method: R? Function(BlockFunctionBody)) visitBooleanLiteral (method: R? Function(BooleanLiteral)) visitBreakStatement (method: R? Function(BreakStatement)) @@ -2431,9 +2434,9 @@ package:analyzer/dart/ast/visitor.dart: visitDottedName (method: R? Function(DottedName)) visitDoubleLiteral (method: R? Function(DoubleLiteral)) visitEmptyClassBody (method: R? Function(EmptyClassBody)) + visitEmptyEnumBody (method: R? Function(EmptyEnumBody)) visitEmptyFunctionBody (method: R? Function(EmptyFunctionBody)) visitEmptyStatement (method: R? Function(EmptyStatement)) - visitEnumBody (method: R? Function(EnumBody)) visitEnumConstantArguments (method: R? Function(EnumConstantArguments)) visitEnumConstantDeclaration (method: R? Function(EnumConstantDeclaration)) visitEnumDeclaration (method: R? Function(EnumDeclaration)) @@ -2482,7 +2485,6 @@ package:analyzer/dart/ast/visitor.dart: visitLabel (method: R? Function(Label)) visitLabeledStatement (method: R? Function(LabeledStatement)) visitLibraryDirective (method: R? Function(LibraryDirective)) - visitLibraryIdentifier (method: R? Function(LibraryIdentifier)) visitListLiteral (method: R? Function(ListLiteral)) visitListPattern (method: R? Function(ListPattern)) visitLogicalAndPattern (method: R? Function(LogicalAndPattern)) @@ -2582,6 +2584,7 @@ package:analyzer/dart/ast/visitor.dart: visitBinaryExpression (method: R? Function(BinaryExpression)) visitBlock (method: R? Function(Block)) visitBlockClassBody (method: R? Function(BlockClassBody)) + visitBlockEnumBody (method: R? Function(BlockEnumBody)) visitBlockFunctionBody (method: R? Function(BlockFunctionBody)) visitBooleanLiteral (method: R? Function(BooleanLiteral)) visitBreakStatement (method: R? Function(BreakStatement)) @@ -2614,9 +2617,9 @@ package:analyzer/dart/ast/visitor.dart: visitDottedName (method: R? Function(DottedName)) visitDoubleLiteral (method: R? Function(DoubleLiteral)) visitEmptyClassBody (method: R? Function(EmptyClassBody)) + visitEmptyEnumBody (method: R? Function(EmptyEnumBody)) visitEmptyFunctionBody (method: R? Function(EmptyFunctionBody)) visitEmptyStatement (method: R? Function(EmptyStatement)) - visitEnumBody (method: R? Function(EnumBody)) visitEnumConstantArguments (method: R? Function(EnumConstantArguments)) visitEnumConstantDeclaration (method: R? Function(EnumConstantDeclaration)) visitEnumDeclaration (method: R? Function(EnumDeclaration)) @@ -2665,7 +2668,6 @@ package:analyzer/dart/ast/visitor.dart: visitLabel (method: R? Function(Label)) visitLabeledStatement (method: R? Function(LabeledStatement)) visitLibraryDirective (method: R? Function(LibraryDirective)) - visitLibraryIdentifier (method: R? Function(LibraryIdentifier)) visitListLiteral (method: R? Function(ListLiteral)) visitListPattern (method: R? Function(ListPattern)) visitLogicalAndPattern (method: R? Function(LogicalAndPattern)) @@ -2765,6 +2767,7 @@ package:analyzer/dart/ast/visitor.dart: visitBinaryExpression (method: R? Function(BinaryExpression)) visitBlock (method: R? Function(Block)) visitBlockClassBody (method: R? Function(BlockClassBody)) + visitBlockEnumBody (method: R? Function(BlockEnumBody)) visitBlockFunctionBody (method: R? Function(BlockFunctionBody)) visitBooleanLiteral (method: R? Function(BooleanLiteral)) visitBreakStatement (method: R? Function(BreakStatement)) @@ -2797,9 +2800,9 @@ package:analyzer/dart/ast/visitor.dart: visitDottedName (method: R? Function(DottedName)) visitDoubleLiteral (method: R? Function(DoubleLiteral)) visitEmptyClassBody (method: R? Function(EmptyClassBody)) + visitEmptyEnumBody (method: R? Function(EmptyEnumBody)) visitEmptyFunctionBody (method: R? Function(EmptyFunctionBody)) visitEmptyStatement (method: R? Function(EmptyStatement)) - visitEnumBody (method: R? Function(EnumBody)) visitEnumConstantArguments (method: R? Function(EnumConstantArguments)) visitEnumConstantDeclaration (method: R? Function(EnumConstantDeclaration)) visitEnumDeclaration (method: R? Function(EnumDeclaration)) @@ -2848,7 +2851,6 @@ package:analyzer/dart/ast/visitor.dart: visitLabel (method: R? Function(Label)) visitLabeledStatement (method: R? Function(LabeledStatement)) visitLibraryDirective (method: R? Function(LibraryDirective)) - visitLibraryIdentifier (method: R? Function(LibraryIdentifier)) visitListLiteral (method: R? Function(ListLiteral)) visitListPattern (method: R? Function(ListPattern)) visitLogicalAndPattern (method: R? Function(LogicalAndPattern)) @@ -2949,6 +2951,7 @@ package:analyzer/dart/ast/visitor.dart: visitBinaryExpression (method: T? Function(BinaryExpression)) visitBlock (method: T? Function(Block)) visitBlockClassBody (method: T? Function(BlockClassBody)) + visitBlockEnumBody (method: T? Function(BlockEnumBody)) visitBlockFunctionBody (method: T? Function(BlockFunctionBody)) visitBooleanLiteral (method: T? Function(BooleanLiteral)) visitBreakStatement (method: T? Function(BreakStatement)) @@ -2981,9 +2984,9 @@ package:analyzer/dart/ast/visitor.dart: visitDottedName (method: T? Function(DottedName)) visitDoubleLiteral (method: T? Function(DoubleLiteral)) visitEmptyClassBody (method: T? Function(EmptyClassBody)) + visitEmptyEnumBody (method: T? Function(EmptyEnumBody)) visitEmptyFunctionBody (method: T? Function(EmptyFunctionBody)) visitEmptyStatement (method: T? Function(EmptyStatement)) - visitEnumBody (method: T? Function(EnumBody)) visitEnumConstantArguments (method: T? Function(EnumConstantArguments)) visitEnumConstantDeclaration (method: T? Function(EnumConstantDeclaration)) visitEnumDeclaration (method: T? Function(EnumDeclaration)) @@ -3032,7 +3035,6 @@ package:analyzer/dart/ast/visitor.dart: visitLabel (method: T? Function(Label)) visitLabeledStatement (method: T? Function(LabeledStatement)) visitLibraryDirective (method: T? Function(LibraryDirective)) - visitLibraryIdentifier (method: T? Function(LibraryIdentifier)) visitListLiteral (method: T? Function(ListLiteral)) visitListPattern (method: T? Function(ListPattern)) visitLogicalAndPattern (method: T? Function(LogicalAndPattern)) @@ -3132,6 +3134,7 @@ package:analyzer/dart/ast/visitor.dart: visitBinaryExpression (method: R? Function(BinaryExpression)) visitBlock (method: R? Function(Block)) visitBlockClassBody (method: R? Function(BlockClassBody)) + visitBlockEnumBody (method: R? Function(BlockEnumBody)) visitBlockFunctionBody (method: R? Function(BlockFunctionBody)) visitBooleanLiteral (method: R? Function(BooleanLiteral)) visitBreakStatement (method: R? Function(BreakStatement)) @@ -3164,9 +3167,9 @@ package:analyzer/dart/ast/visitor.dart: visitDottedName (method: R? Function(DottedName)) visitDoubleLiteral (method: R? Function(DoubleLiteral)) visitEmptyClassBody (method: R? Function(EmptyClassBody)) + visitEmptyEnumBody (method: R? Function(EmptyEnumBody)) visitEmptyFunctionBody (method: R? Function(EmptyFunctionBody)) visitEmptyStatement (method: R? Function(EmptyStatement)) - visitEnumBody (method: R? Function(EnumBody)) visitEnumConstantArguments (method: R? Function(EnumConstantArguments)) visitEnumConstantDeclaration (method: R? Function(EnumConstantDeclaration)) visitEnumDeclaration (method: R? Function(EnumDeclaration)) @@ -3215,7 +3218,6 @@ package:analyzer/dart/ast/visitor.dart: visitLabel (method: R? Function(Label)) visitLabeledStatement (method: R? Function(LabeledStatement)) visitLibraryDirective (method: R? Function(LibraryDirective)) - visitLibraryIdentifier (method: R? Function(LibraryIdentifier)) visitListLiteral (method: R? Function(ListLiteral)) visitListPattern (method: R? Function(ListPattern)) visitLogicalAndPattern (method: R? Function(LogicalAndPattern)) diff --git a/pkg/analyzer/lib/analysis_rule/rule_visitor_registry.g.dart b/pkg/analyzer/lib/analysis_rule/rule_visitor_registry.g.dart index 238b90fa304..7a3ed66a98e 100644 --- a/pkg/analyzer/lib/analysis_rule/rule_visitor_registry.g.dart +++ b/pkg/analyzer/lib/analysis_rule/rule_visitor_registry.g.dart @@ -58,6 +58,8 @@ abstract class RuleVisitorRegistry { void addBlockClassBody(AbstractAnalysisRule rule, AstVisitor visitor); + void addBlockEnumBody(AbstractAnalysisRule rule, AstVisitor visitor); + void addBlockFunctionBody(AbstractAnalysisRule rule, AstVisitor visitor); void addBooleanLiteral(AbstractAnalysisRule rule, AstVisitor visitor); @@ -134,12 +136,12 @@ abstract class RuleVisitorRegistry { void addEmptyClassBody(AbstractAnalysisRule rule, AstVisitor visitor); + void addEmptyEnumBody(AbstractAnalysisRule rule, AstVisitor visitor); + void addEmptyFunctionBody(AbstractAnalysisRule rule, AstVisitor visitor); void addEmptyStatement(AbstractAnalysisRule rule, AstVisitor visitor); - void addEnumBody(AbstractAnalysisRule rule, AstVisitor visitor); - void addEnumConstantArguments(AbstractAnalysisRule rule, AstVisitor visitor); void addEnumConstantDeclaration( @@ -269,8 +271,6 @@ abstract class RuleVisitorRegistry { void addLibraryDirective(AbstractAnalysisRule rule, AstVisitor visitor); - void addLibraryIdentifier(AbstractAnalysisRule rule, AstVisitor visitor); - void addListLiteral(AbstractAnalysisRule rule, AstVisitor visitor); void addListPattern(AbstractAnalysisRule rule, AstVisitor visitor); diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart index 9ae40556a9d..69550433c40 100644 --- a/pkg/analyzer/lib/dart/ast/ast.dart +++ b/pkg/analyzer/lib/dart/ast/ast.dart @@ -57,6 +57,7 @@ export 'package:analyzer/src/dart/ast/ast.dart' AwaitExpression, BinaryExpression, Block, + BlockEnumBody, BlockClassBody, BlockFunctionBody, BooleanLiteral, @@ -103,6 +104,7 @@ export 'package:analyzer/src/dart/ast/ast.dart' DottedName, DoubleLiteral, EmptyClassBody, + EmptyEnumBody, EmptyFunctionBody, EmptyStatement, EnumBody, @@ -164,7 +166,6 @@ export 'package:analyzer/src/dart/ast/ast.dart' Label, LabeledStatement, LibraryDirective, - LibraryIdentifier, ListLiteral, ListPattern, ListPatternElement, diff --git a/pkg/analyzer/lib/dart/ast/visitor.g.dart b/pkg/analyzer/lib/dart/ast/visitor.g.dart index 3470c73c925..cee76e6c195 100644 --- a/pkg/analyzer/lib/dart/ast/visitor.g.dart +++ b/pkg/analyzer/lib/dart/ast/visitor.g.dart @@ -88,6 +88,9 @@ class GeneralizingAstVisitor implements AstVisitor { @override R? visitBlockClassBody(BlockClassBody node) => visitClassBody(node); + @override + R? visitBlockEnumBody(BlockEnumBody node) => visitEnumBody(node); + @override R? visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node); @@ -220,13 +223,15 @@ class GeneralizingAstVisitor implements AstVisitor { @override R? visitEmptyClassBody(EmptyClassBody node) => visitClassBody(node); + @override + R? visitEmptyEnumBody(EmptyEnumBody node) => visitEnumBody(node); + @override R? visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node); @override R? visitEmptyStatement(EmptyStatement node) => visitStatement(node); - @override R? visitEnumBody(EnumBody node) => visitNode(node); @override @@ -419,9 +424,6 @@ class GeneralizingAstVisitor implements AstVisitor { @override R? visitLibraryDirective(LibraryDirective node) => visitDirective(node); - @override - R? visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node); - @override R? visitListLiteral(ListLiteral node) => visitTypedLiteral(node); @@ -843,6 +845,12 @@ class RecursiveAstVisitor implements AstVisitor { return null; } + @override + R? visitBlockEnumBody(BlockEnumBody node) { + node.visitChildren(this); + return null; + } + @override R? visitBlockFunctionBody(BlockFunctionBody node) { node.visitChildren(this); @@ -1037,6 +1045,12 @@ class RecursiveAstVisitor implements AstVisitor { return null; } + @override + R? visitEmptyEnumBody(EmptyEnumBody node) { + node.visitChildren(this); + return null; + } + @override R? visitEmptyFunctionBody(EmptyFunctionBody node) { node.visitChildren(this); @@ -1049,12 +1063,6 @@ class RecursiveAstVisitor implements AstVisitor { return null; } - @override - R? visitEnumBody(EnumBody node) { - node.visitChildren(this); - return null; - } - @override R? visitEnumConstantArguments(EnumConstantArguments node) { node.visitChildren(this); @@ -1343,12 +1351,6 @@ class RecursiveAstVisitor implements AstVisitor { return null; } - @override - R? visitLibraryIdentifier(LibraryIdentifier node) { - node.visitChildren(this); - return null; - } - @override R? visitListLiteral(ListLiteral node) { node.visitChildren(this); @@ -1907,6 +1909,9 @@ class SimpleAstVisitor implements AstVisitor { @override R? visitBlockClassBody(BlockClassBody node) => null; + @override + R? visitBlockEnumBody(BlockEnumBody node) => null; + @override R? visitBlockFunctionBody(BlockFunctionBody node) => null; @@ -2005,15 +2010,15 @@ class SimpleAstVisitor implements AstVisitor { @override R? visitEmptyClassBody(EmptyClassBody node) => null; + @override + R? visitEmptyEnumBody(EmptyEnumBody node) => null; + @override R? visitEmptyFunctionBody(EmptyFunctionBody node) => null; @override R? visitEmptyStatement(EmptyStatement node) => null; - @override - R? visitEnumBody(EnumBody node) => null; - @override R? visitEnumConstantArguments(EnumConstantArguments node) => null; @@ -2161,9 +2166,6 @@ class SimpleAstVisitor implements AstVisitor { @override R? visitLibraryDirective(LibraryDirective node) => null; - @override - R? visitLibraryIdentifier(LibraryIdentifier node) => null; - @override R? visitListLiteral(ListLiteral node) => null; @@ -2482,6 +2484,9 @@ class ThrowingAstVisitor implements AstVisitor { @override R? visitBlockClassBody(BlockClassBody node) => _throw(node); + @override + R? visitBlockEnumBody(BlockEnumBody node) => _throw(node); + @override R? visitBlockFunctionBody(BlockFunctionBody node) => _throw(node); @@ -2582,15 +2587,15 @@ class ThrowingAstVisitor implements AstVisitor { @override R? visitEmptyClassBody(EmptyClassBody node) => _throw(node); + @override + R? visitEmptyEnumBody(EmptyEnumBody node) => _throw(node); + @override R? visitEmptyFunctionBody(EmptyFunctionBody node) => _throw(node); @override R? visitEmptyStatement(EmptyStatement node) => _throw(node); - @override - R? visitEnumBody(EnumBody node) => _throw(node); - @override R? visitEnumConstantArguments(EnumConstantArguments node) => _throw(node); @@ -2743,9 +2748,6 @@ class ThrowingAstVisitor implements AstVisitor { @override R? visitLibraryDirective(LibraryDirective node) => _throw(node); - @override - R? visitLibraryIdentifier(LibraryIdentifier node) => _throw(node); - @override R? visitListLiteral(ListLiteral node) => _throw(node); @@ -3153,6 +3155,14 @@ class TimedAstVisitor implements AstVisitor { return result; } + @override + T? visitBlockEnumBody(BlockEnumBody node) { + stopwatch.start(); + T? result = _baseVisitor.visitBlockEnumBody(node); + stopwatch.stop(); + return result; + } + @override T? visitBlockFunctionBody(BlockFunctionBody node) { stopwatch.start(); @@ -3411,6 +3421,14 @@ class TimedAstVisitor implements AstVisitor { return result; } + @override + T? visitEmptyEnumBody(EmptyEnumBody node) { + stopwatch.start(); + T? result = _baseVisitor.visitEmptyEnumBody(node); + stopwatch.stop(); + return result; + } + @override T? visitEmptyFunctionBody(EmptyFunctionBody node) { stopwatch.start(); @@ -3427,14 +3445,6 @@ class TimedAstVisitor implements AstVisitor { return result; } - @override - T? visitEnumBody(EnumBody node) { - stopwatch.start(); - T? result = _baseVisitor.visitEnumBody(node); - stopwatch.stop(); - return result; - } - @override T? visitEnumConstantArguments(EnumConstantArguments node) { stopwatch.start(); @@ -3819,14 +3829,6 @@ class TimedAstVisitor implements AstVisitor { return result; } - @override - T? visitLibraryIdentifier(LibraryIdentifier node) { - stopwatch.start(); - T? result = _baseVisitor.visitLibraryIdentifier(node); - stopwatch.stop(); - return result; - } - @override T? visitListLiteral(ListLiteral node) { stopwatch.start(); @@ -4558,6 +4560,9 @@ class UnifyingAstVisitor implements AstVisitor { @override R? visitBlockClassBody(BlockClassBody node) => visitNode(node); + @override + R? visitBlockEnumBody(BlockEnumBody node) => visitNode(node); + @override R? visitBlockFunctionBody(BlockFunctionBody node) => visitNode(node); @@ -4662,15 +4667,15 @@ class UnifyingAstVisitor implements AstVisitor { @override R? visitEmptyClassBody(EmptyClassBody node) => visitNode(node); + @override + R? visitEmptyEnumBody(EmptyEnumBody node) => visitNode(node); + @override R? visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node); @override R? visitEmptyStatement(EmptyStatement node) => visitNode(node); - @override - R? visitEnumBody(EnumBody node) => visitNode(node); - @override R? visitEnumConstantArguments(EnumConstantArguments node) => visitNode(node); @@ -4828,9 +4833,6 @@ class UnifyingAstVisitor implements AstVisitor { @override R? visitLibraryDirective(LibraryDirective node) => visitNode(node); - @override - R? visitLibraryIdentifier(LibraryIdentifier node) => visitNode(node); - @override R? visitListLiteral(ListLiteral node) => visitNode(node); diff --git a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart index 86b3bc3a78a..c45cdeec4bc 100644 --- a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart +++ b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart @@ -35,13 +35,17 @@ DefinedNames computeDefinedNames(CompilationUnit unit) { } case EnumDeclaration(): appendName(names.topLevelNames, member.namePart.typeName); - for (var constant in member.body.constants) { - appendName(names.classMemberNames, constant.name); + if (member.body case BlockEnumBody body) { + for (var constant in body.constants) { + appendName(names.classMemberNames, constant.name); + } + body.members.forEach(appendClassMemberName); } - member.body.members.forEach(appendClassMemberName); case ExtensionDeclaration(): appendName(names.topLevelNames, member.name); - member.body.members.forEach(appendClassMemberName); + if (member.body case BlockClassBody body) { + body.members.forEach(appendClassMemberName); + } case ExtensionTypeDeclaration(): appendName(names.topLevelNames, member.primaryConstructor.typeName); if (member.body case BlockClassBody body) { @@ -51,7 +55,9 @@ DefinedNames computeDefinedNames(CompilationUnit unit) { appendName(names.topLevelNames, member.name); case MixinDeclaration(): appendName(names.topLevelNames, member.name); - member.body.members.forEach(appendClassMemberName); + if (member.body case BlockClassBody body) { + body.members.forEach(appendClassMemberName); + } case TopLevelVariableDeclaration(): for (VariableDeclaration variable in member.variables.variables) { appendName(names.topLevelNames, variable.name); diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart index 7bed534faf0..249d4d874d7 100644 --- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart +++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart @@ -942,7 +942,7 @@ class FileState { } else if (directive is LibraryDirective) { libraryDirective = UnlinkedLibraryDirective( docImports: buildDocImports(directive), - name: directive.name?.name, + name: directive.name?.tokens.map((e) => e.lexeme).join(), ); } else if (directive is PartDirective) { var unlinked = _serializePart(directive); @@ -953,7 +953,7 @@ class FileState { if (libraryName != null) { partOfNameDirective ??= UnlinkedPartOfNameDirective( docImports: buildDocImports(directive), - name: libraryName.name, + name: libraryName.tokens.map((e) => e.lexeme).join(), nameRange: UnlinkedSourceRange( offset: libraryName.offset, length: libraryName.length, @@ -1074,7 +1074,7 @@ class FileState { List configurations, ) { return configurations.map((configuration) { - var name = configuration.name.components.join('.'); + var name = configuration.name.tokens.map((e) => e.lexeme).join(); var value = configuration.value?.stringValue ?? ''; return UnlinkedNamespaceDirectiveConfiguration( name: name, diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart index 4bb32dc42ba..10130b7738a 100644 --- a/pkg/analyzer/lib/src/dart/analysis/index.dart +++ b/pkg/analyzer/lib/src/dart/analysis/index.dart @@ -11,6 +11,7 @@ import 'package:analyzer/src/dart/ast/extensions.dart'; import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/summary/format.dart'; import 'package:analyzer/src/summary/idl.dart'; +import 'package:analyzer/src/utilities/extensions/object.dart'; import 'package:collection/collection.dart'; Element? declaredParameterElement(SimpleIdentifier node, Element? element) { @@ -898,7 +899,7 @@ class _IndexContributor extends GeneralizingAstVisitor { node.namePart.typeName.lexeme, withClause: node.withClause, implementsClause: node.implementsClause, - memberNodes: node.body.members, + memberNodes: node.body.tryCast()?.members ?? [], ); super.visitEnumDeclaration(node); @@ -994,9 +995,6 @@ class _IndexContributor extends GeneralizingAstVisitor { super.visitIndexExpression(node); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) {} - @override void visitMethodInvocation(MethodInvocation node) { SimpleIdentifier name = node.methodName; @@ -1017,7 +1015,7 @@ class _IndexContributor extends GeneralizingAstVisitor { } @override - void visitMixinDeclaration(MixinDeclaration node) { + void visitMixinDeclaration(covariant MixinDeclarationImpl node) { _addSubtypeForMixinDeclaration(node); super.visitMixinDeclaration(node); } @@ -1325,7 +1323,7 @@ class _IndexContributor extends GeneralizingAstVisitor { } /// Record the given mixin as a subclass of its direct superclasses. - void _addSubtypeForMixinDeclaration(MixinDeclaration node) { + void _addSubtypeForMixinDeclaration(MixinDeclarationImpl node) { _addSubtype( node.name.lexeme, onClause: node.onClause, diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart index bd5a6dd2589..02ac10a1cf3 100644 --- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart +++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart @@ -41,9 +41,9 @@ class _UnitApiSignatureComputer { for (var declaration in unit.declarations) { if (declaration is ClassDeclarationImpl) { _addClass(declaration); - } else if (declaration is EnumDeclaration) { + } else if (declaration is EnumDeclarationImpl) { _addEnum(declaration); - } else if (declaration is ExtensionDeclaration) { + } else if (declaration is ExtensionDeclarationImpl) { _addExtension(declaration); } else if (declaration is FunctionDeclaration) { var functionExpression = declaration.functionExpression; @@ -52,7 +52,7 @@ class _UnitApiSignatureComputer { functionExpression.parameters?.endToken ?? declaration.name, ); _addFunctionBodyModifiers(functionExpression.body); - } else if (declaration is MixinDeclaration) { + } else if (declaration is MixinDeclarationImpl) { _addMixin(declaration); } else if (declaration is TopLevelVariableDeclaration) { _topLevelVariableDeclaration(declaration); @@ -94,7 +94,7 @@ class _UnitApiSignatureComputer { _addNode(node.redirectedConstructor); } - void _addEnum(EnumDeclaration node) { + void _addEnum(EnumDeclarationImpl node) { var members = node.body.members; // If not enhanced, include the whole node. @@ -108,7 +108,7 @@ class _UnitApiSignatureComputer { _addClassMembers(members, true); } - void _addExtension(ExtensionDeclaration node) { + void _addExtension(ExtensionDeclarationImpl node) { _addTokens(node.beginToken, node.body.beginToken); _addClassMembers(node.body.members, false); } @@ -147,7 +147,7 @@ class _UnitApiSignatureComputer { signature.addBool(node.invokesSuperSelf); } - void _addMixin(MixinDeclaration node) { + void _addMixin(MixinDeclarationImpl node) { _addTokens(node.beginToken, node.body.beginToken); _addClassMembers(node.body.members, false); signature.addStringList(node.superInvokedNames); diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart index 2c41a65dce5..9856ad2ad0f 100644 --- a/pkg/analyzer/lib/src/dart/ast/ast.dart +++ b/pkg/analyzer/lib/src/dart/ast/ast.dart @@ -12,7 +12,6 @@ import 'dart:math' as math; import 'package:_fe_analyzer_shared/src/base/analyzer_public_api.dart'; import 'package:_fe_analyzer_shared/src/base/syntactic_entity.dart'; -import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart'; import 'package:_fe_analyzer_shared/src/type_inference/type_analysis_result.dart'; import 'package:_fe_analyzer_shared/src/types/shared_type.dart'; import 'package:analyzer/dart/analysis/features.dart'; @@ -2627,6 +2626,144 @@ final class BlockClassBodyImpl extends ClassBodyImpl implements BlockClassBody { } } +/// The enum declaration body, with constants and members. +@AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart') +abstract final class BlockEnumBody implements EnumBody { + /// The enumeration constants being declared. + NodeList get constants; + + /// The left curly bracket. + Token get leftBracket; + + /// The members declared in the body. + NodeList get members; + + /// The right curly bracket. + Token get rightBracket; + + /// The optional semicolon after the last constant. + Token? get semicolon; +} + +@GenerateNodeImpl( + childEntitiesOrder: [ + GenerateNodeProperty('leftBracket'), + GenerateNodeProperty('constants'), + GenerateNodeProperty('semicolon'), + GenerateNodeProperty('members'), + GenerateNodeProperty('rightBracket'), + ], +) +final class BlockEnumBodyImpl extends EnumBodyImpl implements BlockEnumBody { + @generated + @override + final Token leftBracket; + + @generated + @override + final NodeListImpl constants = NodeListImpl._(); + + @generated + @override + final Token? semicolon; + + @generated + @override + final NodeListImpl members = NodeListImpl._(); + + @generated + @override + final Token rightBracket; + + @generated + BlockEnumBodyImpl({ + required this.leftBracket, + required List constants, + required this.semicolon, + required List members, + required this.rightBracket, + }) { + this.constants._initialize(this, constants); + this.members._initialize(this, members); + } + + @generated + @override + Token get beginToken { + return leftBracket; + } + + @generated + @override + Token get endToken { + return rightBracket; + } + + @generated + @override + ChildEntities get _childEntities => ChildEntities() + ..addToken('leftBracket', leftBracket) + ..addNodeList('constants', constants) + ..addToken('semicolon', semicolon) + ..addNodeList('members', members) + ..addToken('rightBracket', rightBracket); + + @generated + @override + E? accept(AstVisitor visitor) => visitor.visitBlockEnumBody(this); + + @generated + @override + bool isInValueExpressionSlot(AstNode child) { + assert(identical(child.parent, this)); + return false; + } + + @generated + @override + void visitChildren(AstVisitor visitor) { + constants.accept(visitor); + members.accept(visitor); + } + + /// Visits the children of this node. + /// + /// If a specific hook is provided for a child, it is called instead of + /// dispatching the [visitor] to the child. It is the responsibility of the + /// hook to visit the child. + @generated + void visitChildrenWithHooks( + AstVisitor visitor, { + void Function(NodeListImpl)? visitConstants, + void Function(NodeListImpl)? visitMembers, + }) { + if (visitConstants != null) { + visitConstants(constants); + } else { + constants.accept(visitor); + } + if (visitMembers != null) { + visitMembers(members); + } else { + members.accept(visitor); + } + } + + @generated + @override + AstNodeImpl? _childContainingRange(int rangeOffset, int rangeEnd) { + if (constants._elementContainingRange(rangeOffset, rangeEnd) + case var result?) { + return result; + } + if (members._elementContainingRange(rangeOffset, rangeEnd) + case var result?) { + return result; + } + return null; + } +} + /// A function body that consists of a block of statements. /// /// blockFunctionBody ::= @@ -8290,43 +8427,35 @@ final class DotShorthandPropertyAccessImpl extends ExpressionImpl /// [SimpleIdentifier] ('.' [SimpleIdentifier])* @AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart') abstract final class DottedName implements AstNode { - /// The components of the identifier. - NodeList get components; + /// The tokens comprising the identifier (including periods). + List get tokens; } -@GenerateNodeImpl(childEntitiesOrder: [GenerateNodeProperty('components')]) +@GenerateNodeImpl(childEntitiesOrder: [GenerateNodeProperty('tokens')]) final class DottedNameImpl extends AstNodeImpl implements DottedName { @generated @override - final NodeListImpl components = NodeListImpl._(); + final List tokens; @generated - DottedNameImpl({required List components}) { - this.components._initialize(this, components); - } + DottedNameImpl({required this.tokens}); @generated @override Token get beginToken { - if (components.beginToken case var result?) { - return result; - } - throw StateError('Expected at least one non-null'); + return tokens.first; } @generated @override Token get endToken { - if (components.endToken case var result?) { - return result; - } - throw StateError('Expected at least one non-null'); + return tokens[tokens.length - 1]; } @generated @override ChildEntities get _childEntities => - ChildEntities()..addNodeList('components', components); + ChildEntities()..addTokenList('tokens', tokens); @generated @override @@ -8341,34 +8470,15 @@ final class DottedNameImpl extends AstNodeImpl implements DottedName { @generated @override - void visitChildren(AstVisitor visitor) { - components.accept(visitor); - } + void visitChildren(AstVisitor visitor) {} /// Visits the children of this node. - /// - /// If a specific hook is provided for a child, it is called instead of - /// dispatching the [visitor] to the child. It is the responsibility of the - /// hook to visit the child. @generated - void visitChildrenWithHooks( - AstVisitor visitor, { - void Function(NodeListImpl)? visitComponents, - }) { - if (visitComponents != null) { - visitComponents(components); - } else { - components.accept(visitor); - } - } + void visitChildrenWithHooks(AstVisitor visitor) {} @generated @override AstNodeImpl? _childContainingRange(int rangeOffset, int rangeEnd) { - if (components._elementContainingRange(rangeOffset, rangeEnd) - case var result?) { - return result; - } return null; } } @@ -8519,6 +8629,71 @@ final class EmptyClassBodyImpl extends ClassBodyImpl implements EmptyClassBody { } } +/// The empty enum body. +@AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart') +abstract final class EmptyEnumBody implements EnumBody { + /// The semicolon token. + Token get semicolon; +} + +@GenerateNodeImpl(childEntitiesOrder: [GenerateNodeProperty('semicolon')]) +final class EmptyEnumBodyImpl extends EnumBodyImpl implements EmptyEnumBody { + @generated + @override + final Token semicolon; + + @generated + EmptyEnumBodyImpl({required this.semicolon}); + + @generated + @override + Token get beginToken { + return semicolon; + } + + @override + List get constants => const []; + + @generated + @override + Token get endToken { + return semicolon; + } + + @override + List get members => const []; + + @generated + @override + ChildEntities get _childEntities => + ChildEntities()..addToken('semicolon', semicolon); + + @generated + @override + E? accept(AstVisitor visitor) => visitor.visitEmptyEnumBody(this); + + @generated + @override + bool isInValueExpressionSlot(AstNode child) { + assert(identical(child.parent, this)); + return false; + } + + @generated + @override + void visitChildren(AstVisitor visitor) {} + + /// Visits the children of this node. + @generated + void visitChildrenWithHooks(AstVisitor visitor) {} + + @generated + @override + AstNodeImpl? _childContainingRange(int rangeOffset, int rangeEnd) { + return null; + } +} + /// An empty function body. /// /// An empty function body can only appear in constructors or abstract methods. @@ -8654,145 +8829,14 @@ final class EmptyStatementImpl extends StatementImpl implements EmptyStatement { } } -/// The enum declaration body, with constants and members. +/// The body of an enum declaration. @AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart') -sealed class EnumBody implements AstNode { - /// The enumeration constants being declared. - NodeList get constants; +sealed class EnumBody implements AstNode {} - /// The left curly bracket. - Token get leftBracket; +sealed class EnumBodyImpl extends AstNodeImpl implements EnumBody { + List get constants; - /// The members declared in the body. - NodeList get members; - - /// The right curly bracket. - Token get rightBracket; - - /// The optional semicolon after the last constant. - Token? get semicolon; -} - -@GenerateNodeImpl( - childEntitiesOrder: [ - GenerateNodeProperty('leftBracket'), - GenerateNodeProperty('constants'), - GenerateNodeProperty('semicolon'), - GenerateNodeProperty('members'), - GenerateNodeProperty('rightBracket'), - ], -) -final class EnumBodyImpl extends AstNodeImpl implements EnumBody { - @generated - @override - final Token leftBracket; - - @generated - @override - final NodeListImpl constants = NodeListImpl._(); - - @generated - @override - final Token? semicolon; - - @generated - @override - final NodeListImpl members = NodeListImpl._(); - - @generated - @override - final Token rightBracket; - - @generated - EnumBodyImpl({ - required this.leftBracket, - required List constants, - required this.semicolon, - required List members, - required this.rightBracket, - }) { - this.constants._initialize(this, constants); - this.members._initialize(this, members); - } - - @generated - @override - Token get beginToken { - return leftBracket; - } - - @generated - @override - Token get endToken { - return rightBracket; - } - - @generated - @override - ChildEntities get _childEntities => ChildEntities() - ..addToken('leftBracket', leftBracket) - ..addNodeList('constants', constants) - ..addToken('semicolon', semicolon) - ..addNodeList('members', members) - ..addToken('rightBracket', rightBracket); - - @generated - @override - E? accept(AstVisitor visitor) => visitor.visitEnumBody(this); - - @generated - @override - bool isInValueExpressionSlot(AstNode child) { - assert(identical(child.parent, this)); - return false; - } - - @override - dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); - - @generated - @override - void visitChildren(AstVisitor visitor) { - constants.accept(visitor); - members.accept(visitor); - } - - /// Visits the children of this node. - /// - /// If a specific hook is provided for a child, it is called instead of - /// dispatching the [visitor] to the child. It is the responsibility of the - /// hook to visit the child. - @generated - void visitChildrenWithHooks( - AstVisitor visitor, { - void Function(NodeListImpl)? visitConstants, - void Function(NodeListImpl)? visitMembers, - }) { - if (visitConstants != null) { - visitConstants(constants); - } else { - constants.accept(visitor); - } - if (visitMembers != null) { - visitMembers(members); - } else { - members.accept(visitor); - } - } - - @generated - @override - AstNodeImpl? _childContainingRange(int rangeOffset, int rangeEnd) { - if (constants._elementContainingRange(rangeOffset, rangeEnd) - case var result?) { - return result; - } - if (members._elementContainingRange(rangeOffset, rangeEnd) - case var result?) { - return result; - } - return null; - } + List get members; } /// The arguments part of an enum constant. @@ -10201,7 +10245,7 @@ abstract final class ExtensionDeclaration implements CompilationUnitMember { Token? get augmentKeyword; /// The body of the extension declaration. - BlockClassBody get body; + ClassBody get body; @override ExtensionFragment? get declaredFragment; @@ -10260,7 +10304,7 @@ final class ExtensionDeclarationImpl extends CompilationUnitMemberImpl ExtensionOnClauseImpl? _onClause; @generated - BlockClassBodyImpl _body; + ClassBodyImpl _body; @override ExtensionFragmentImpl? declaredFragment; @@ -10277,7 +10321,7 @@ final class ExtensionDeclarationImpl extends CompilationUnitMemberImpl required this.name, required TypeParameterListImpl? typeParameters, required ExtensionOnClauseImpl? onClause, - required BlockClassBodyImpl body, + required ClassBodyImpl body, }) : _typeParameters = typeParameters, _onClause = onClause, _body = body { @@ -10288,10 +10332,10 @@ final class ExtensionDeclarationImpl extends CompilationUnitMemberImpl @generated @override - BlockClassBodyImpl get body => _body; + ClassBodyImpl get body => _body; @generated - set body(BlockClassBodyImpl body) { + set body(ClassBodyImpl body) { _body = _becomeParentOf(body); } @@ -10370,7 +10414,7 @@ final class ExtensionDeclarationImpl extends CompilationUnitMemberImpl AstVisitor visitor, { void Function(TypeParameterListImpl)? visitTypeParameters, void Function(ExtensionOnClauseImpl)? visitOnClause, - void Function(BlockClassBodyImpl)? visitBody, + void Function(ClassBodyImpl)? visitBody, }) { super.visitChildren(visitor); if (typeParameters case var typeParameters?) { @@ -17833,7 +17877,7 @@ abstract final class LibraryDirective implements Directive { Token get libraryKeyword; /// The name of the library being defined. - LibraryIdentifier? get name; + DottedName? get name; /// The semicolon terminating the directive. Token get semicolon; @@ -17853,7 +17897,7 @@ final class LibraryDirectiveImpl extends DirectiveImpl final Token libraryKeyword; @generated - LibraryIdentifierImpl? _name; + DottedNameImpl? _name; @generated @override @@ -17867,7 +17911,7 @@ final class LibraryDirectiveImpl extends DirectiveImpl required super.comment, required super.metadata, required this.libraryKeyword, - required LibraryIdentifierImpl? name, + required DottedNameImpl? name, required this.semicolon, }) : _name = name { _becomeParentOf(name); @@ -17887,10 +17931,10 @@ final class LibraryDirectiveImpl extends DirectiveImpl @generated @override - LibraryIdentifierImpl? get name => _name; + DottedNameImpl? get name => _name; @generated - set name(LibraryIdentifierImpl? name) { + set name(DottedNameImpl? name) { _name = _becomeParentOf(name); } @@ -17927,7 +17971,7 @@ final class LibraryDirectiveImpl extends DirectiveImpl @generated void visitChildrenWithHooks( AstVisitor visitor, { - void Function(LibraryIdentifierImpl)? visitName, + void Function(DottedNameImpl)? visitName, }) { super.visitChildren(visitor); if (name case var name?) { @@ -17954,125 +17998,6 @@ final class LibraryDirectiveImpl extends DirectiveImpl } } -/// The identifier for a library. -/// -/// libraryIdentifier ::= -/// [SimpleIdentifier] ('.' [SimpleIdentifier])* -@AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart') -abstract final class LibraryIdentifier implements Identifier { - /// The components of the identifier. - NodeList get components; -} - -@GenerateNodeImpl(childEntitiesOrder: [GenerateNodeProperty('components')]) -final class LibraryIdentifierImpl extends IdentifierImpl - implements LibraryIdentifier { - @generated - @override - final NodeListImpl components = NodeListImpl._(); - - @generated - LibraryIdentifierImpl({required List components}) { - this.components._initialize(this, components); - } - - @generated - @override - Token get beginToken { - if (components.beginToken case var result?) { - return result; - } - throw StateError('Expected at least one non-null'); - } - - @override - Element? get element => null; - - @generated - @override - Token get endToken { - if (components.endToken case var result?) { - return result; - } - throw StateError('Expected at least one non-null'); - } - - @override - String get name { - StringBuffer buffer = StringBuffer(); - bool needsPeriod = false; - int length = components.length; - for (int i = 0; i < length; i++) { - SimpleIdentifier identifier = components[i]; - if (needsPeriod) { - buffer.write("."); - } else { - needsPeriod = true; - } - buffer.write(identifier.name); - } - return considerCanonicalizeString(buffer.toString()); - } - - @override - Precedence get precedence => Precedence.postfix; - - @generated - @override - ChildEntities get _childEntities => - ChildEntities()..addNodeList('components', components); - - @generated - @override - E? accept(AstVisitor visitor) => visitor.visitLibraryIdentifier(this); - - @generated - @override - bool isInValueExpressionSlot(AstNode child) { - assert(identical(child.parent, this)); - return false; - } - - @generated - @override - void resolveExpression(ResolverVisitor resolver, TypeImpl contextType) { - resolver.visitLibraryIdentifier(this, contextType: contextType); - } - - @generated - @override - void visitChildren(AstVisitor visitor) { - components.accept(visitor); - } - - /// Visits the children of this node. - /// - /// If a specific hook is provided for a child, it is called instead of - /// dispatching the [visitor] to the child. It is the responsibility of the - /// hook to visit the child. - @generated - void visitChildrenWithHooks( - AstVisitor visitor, { - void Function(NodeListImpl)? visitComponents, - }) { - if (visitComponents != null) { - visitComponents(components); - } else { - components.accept(visitor); - } - } - - @generated - @override - AstNodeImpl? _childContainingRange(int rangeOffset, int rangeEnd) { - if (components._elementContainingRange(rangeOffset, rangeEnd) - case var result?) { - return result; - } - return null; - } -} - /// A list literal. /// /// listLiteral ::= @@ -19916,7 +19841,7 @@ abstract final class MixinDeclaration implements CompilationUnitMember { Token? get baseKeyword; /// The body of the mixin declaration. - BlockClassBody get body; + ClassBody get body; @override MixinFragment? get declaredFragment; @@ -19981,7 +19906,7 @@ final class MixinDeclarationImpl extends CompilationUnitMemberImpl ImplementsClauseImpl? _implementsClause; @generated - BlockClassBodyImpl _body; + ClassBodyImpl _body; @override MixinFragmentImpl? declaredFragment; @@ -19999,7 +19924,7 @@ final class MixinDeclarationImpl extends CompilationUnitMemberImpl required TypeParameterListImpl? typeParameters, required MixinOnClauseImpl? onClause, required ImplementsClauseImpl? implementsClause, - required BlockClassBodyImpl body, + required ClassBodyImpl body, }) : _typeParameters = typeParameters, _onClause = onClause, _implementsClause = implementsClause, @@ -20012,10 +19937,10 @@ final class MixinDeclarationImpl extends CompilationUnitMemberImpl @generated @override - BlockClassBodyImpl get body => _body; + ClassBodyImpl get body => _body; @generated - set body(BlockClassBodyImpl body) { + set body(ClassBodyImpl body) { _body = _becomeParentOf(body); } @@ -20108,7 +20033,7 @@ final class MixinDeclarationImpl extends CompilationUnitMemberImpl void Function(TypeParameterListImpl)? visitTypeParameters, void Function(MixinOnClauseImpl)? visitOnClause, void Function(ImplementsClauseImpl)? visitImplementsClause, - void Function(BlockClassBodyImpl)? visitBody, + void Function(ClassBodyImpl)? visitBody, }) { super.visitChildren(visitor); if (typeParameters case var typeParameters?) { @@ -22312,7 +22237,7 @@ abstract final class PartOfDirective implements Directive { /// The name of the library that the containing compilation unit is part of, /// or `null` if no name was given (typically because a library URI was /// provided). - LibraryIdentifier? get libraryName; + DottedName? get libraryName; /// The token representing the `of` keyword. Token get ofKeyword; @@ -22351,7 +22276,7 @@ final class PartOfDirectiveImpl extends DirectiveImpl StringLiteralImpl? _uri; @generated - LibraryIdentifierImpl? _libraryName; + DottedNameImpl? _libraryName; @generated @override @@ -22364,7 +22289,7 @@ final class PartOfDirectiveImpl extends DirectiveImpl required this.partKeyword, required this.ofKeyword, required StringLiteralImpl? uri, - required LibraryIdentifierImpl? libraryName, + required DottedNameImpl? libraryName, required this.semicolon, }) : _uri = uri, _libraryName = libraryName { @@ -22386,10 +22311,10 @@ final class PartOfDirectiveImpl extends DirectiveImpl @generated @override - LibraryIdentifierImpl? get libraryName => _libraryName; + DottedNameImpl? get libraryName => _libraryName; @generated - set libraryName(LibraryIdentifierImpl? libraryName) { + set libraryName(DottedNameImpl? libraryName) { _libraryName = _becomeParentOf(libraryName); } @@ -22439,7 +22364,7 @@ final class PartOfDirectiveImpl extends DirectiveImpl void visitChildrenWithHooks( AstVisitor visitor, { void Function(StringLiteralImpl)? visitUri, - void Function(LibraryIdentifierImpl)? visitLibraryName, + void Function(DottedNameImpl)? visitLibraryName, }) { super.visitChildren(visitor); if (uri case var uri?) { @@ -23943,9 +23868,6 @@ final class PrimaryConstructorDeclarationImpl extends ClassNamePartImpl return false; } - @override - dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); - @generated @override void visitChildren(AstVisitor visitor) { diff --git a/pkg/analyzer/lib/src/dart/ast/ast.g.dart b/pkg/analyzer/lib/src/dart/ast/ast.g.dart index 6d19bf55390..da77af92c08 100644 --- a/pkg/analyzer/lib/src/dart/ast/ast.g.dart +++ b/pkg/analyzer/lib/src/dart/ast/ast.g.dart @@ -54,6 +54,8 @@ abstract class AstVisitor { R? visitBlockClassBody(BlockClassBody node); + R? visitBlockEnumBody(BlockEnumBody node); + R? visitBlockFunctionBody(BlockFunctionBody node); R? visitBooleanLiteral(BooleanLiteral node); @@ -120,12 +122,12 @@ abstract class AstVisitor { R? visitEmptyClassBody(EmptyClassBody node); + R? visitEmptyEnumBody(EmptyEnumBody node); + R? visitEmptyFunctionBody(EmptyFunctionBody node); R? visitEmptyStatement(EmptyStatement node); - R? visitEnumBody(EnumBody node); - R? visitEnumConstantArguments(EnumConstantArguments node); R? visitEnumConstantDeclaration(EnumConstantDeclaration node); @@ -222,8 +224,6 @@ abstract class AstVisitor { R? visitLibraryDirective(LibraryDirective node); - R? visitLibraryIdentifier(LibraryIdentifier node); - R? visitListLiteral(ListLiteral node); R? visitListPattern(ListPattern node); diff --git a/pkg/analyzer/lib/src/dart/ast/element_locator.dart b/pkg/analyzer/lib/src/dart/ast/element_locator.dart index 5e17b23dd88..7e2117fce1d 100644 --- a/pkg/analyzer/lib/src/dart/ast/element_locator.dart +++ b/pkg/analyzer/lib/src/dart/ast/element_locator.dart @@ -106,6 +106,15 @@ class _ElementMapper2 extends GeneralizingAstVisitor { return node.propertyName.element; } + @override + Element? visitDottedName(DottedName node) { + var parent = node.parent; + if (parent is LibraryDirective) { + return parent.element; + } + return null; + } + @override Element? visitEnumConstantDeclaration(EnumConstantDeclaration node) { return node.declaredFragment?.element; @@ -187,7 +196,7 @@ class _ElementMapper2 extends GeneralizingAstVisitor { return parent3.constructorElement; } } - } else if (parent is LibraryIdentifier) { + } else if (parent is DottedName) { var grandParent = parent.parent; if (grandParent is LibraryDirective) { return grandParent.element; @@ -263,7 +272,7 @@ class _ElementMapper2 extends GeneralizingAstVisitor { @override Element? visitPartOfDirective(PartOfDirective node) { - return node.libraryName?.element; + return null; } @override diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart index 389a8dfc5b7..1e17cd26886 100644 --- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart +++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart @@ -136,6 +136,15 @@ class ToSourceVisitor implements AstVisitor { sink.write('}'); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + sink.write(' {'); + _visitNodeList(node.constants, separator: ', '); + _visitToken(node.semicolon); + _visitNodeList(node.members, prefix: ' ', separator: ' '); + sink.write('}'); + } + @override void visitBlockFunctionBody(BlockFunctionBody node) { var keyword = node.keyword; @@ -400,7 +409,9 @@ class ToSourceVisitor implements AstVisitor { @override void visitDottedName(DottedName node) { - _visitNodeList(node.components, separator: '.'); + for (var token in node.tokens) { + sink.write(token.lexeme); + } } @override @@ -413,6 +424,11 @@ class ToSourceVisitor implements AstVisitor { sink.write(';'); } + @override + void visitEmptyEnumBody(EmptyEnumBody node) { + sink.write(';'); + } + @override void visitEmptyFunctionBody(EmptyFunctionBody node) { sink.write(';'); @@ -423,15 +439,6 @@ class ToSourceVisitor implements AstVisitor { sink.write(';'); } - @override - void visitEnumBody(EnumBody node) { - sink.write(' {'); - _visitNodeList(node.constants, separator: ', '); - _visitToken(node.semicolon); - _visitNodeList(node.members, prefix: ' ', separator: ' '); - sink.write('}'); - } - @override void visitEnumConstantArguments(EnumConstantArguments node) { _visitNode(node.typeArguments); @@ -874,11 +881,6 @@ class ToSourceVisitor implements AstVisitor { sink.write(';'); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - sink.write(node.name); - } - @override void visitListLiteral(ListLiteral node) { _visitToken(node.constKeyword, suffix: ' '); diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart index 40a01de107d..df26f56cf86 100644 --- a/pkg/analyzer/lib/src/dart/ast/utilities.dart +++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart @@ -336,6 +336,24 @@ class NodeReplacer extends ThrowingAstVisitor { return visitNode(node); } + @override + bool visitBlockClassBody(covariant BlockClassBodyImpl node) { + if (_replaceInList(node.members)) { + return true; + } + return visitNode(node); + } + + @override + bool visitBlockEnumBody(covariant BlockEnumBodyImpl node) { + if (_replaceInList(node.constants)) { + return true; + } else if (_replaceInList(node.members)) { + return true; + } + return visitNode(node); + } + @override bool visitBlockFunctionBody(covariant BlockFunctionBodyImpl node) { if (identical(node.block, _oldNode)) { @@ -622,9 +640,6 @@ class NodeReplacer extends ThrowingAstVisitor { @override bool visitDottedName(covariant DottedNameImpl node) { - if (_replaceInList(node.components)) { - return true; - } return visitNode(node); } @@ -637,16 +652,6 @@ class NodeReplacer extends ThrowingAstVisitor { @override bool visitEmptyStatement(EmptyStatement node) => visitNode(node); - @override - bool? visitEnumBody(covariant EnumBodyImpl node) { - if (_replaceInList(node.constants)) { - return true; - } else if (_replaceInList(node.members)) { - return true; - } - return super.visitEnumBody(node); - } - @override bool visitEnumConstantArguments(EnumConstantArguments node) { throw UnimplementedError(); @@ -1114,20 +1119,12 @@ class NodeReplacer extends ThrowingAstVisitor { @override bool visitLibraryDirective(covariant LibraryDirectiveImpl node) { if (identical(node.name, _oldNode)) { - node.name = _newNode as LibraryIdentifierImpl; + node.name = _newNode as DottedNameImpl; return true; } return visitAnnotatedNode(node); } - @override - bool visitLibraryIdentifier(covariant LibraryIdentifierImpl node) { - if (_replaceInList(node.components)) { - return true; - } - return visitNode(node); - } - @override bool visitListLiteral(covariant ListLiteralImpl node) { if (_replaceInList(node.elements)) { @@ -1255,7 +1252,7 @@ class NodeReplacer extends ThrowingAstVisitor { @override bool visitPartOfDirective(covariant PartOfDirectiveImpl node) { if (identical(node.libraryName, _oldNode)) { - node.libraryName = _newNode as LibraryIdentifierImpl; + node.libraryName = _newNode as DottedNameImpl; return true; } return visitAnnotatedNode(node); diff --git a/pkg/analyzer/lib/src/dart/micro/utils.dart b/pkg/analyzer/lib/src/dart/micro/utils.dart index 4b2452e1114..cf14da9faab 100644 --- a/pkg/analyzer/lib/src/dart/micro/utils.dart +++ b/pkg/analyzer/lib/src/dart/micro/utils.dart @@ -18,10 +18,7 @@ Element? getElementOfNode2(AstNode? node) { if (node is NameWithTypeParameters) { node = node.parent; } - if (node is SimpleIdentifier && node.parent is LibraryIdentifier) { - node = node.parent; - } - if (node is LibraryIdentifier) { + if (node is DottedName) { node = node.parent; } if (node is StringLiteral && node.parent is UriBasedDirective) { diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart index 37834cd1347..6218ef9254b 100644 --- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart +++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart @@ -367,6 +367,12 @@ class ResolutionVisitor extends RecursiveAstVisitor { node.visitChildrenWithHooks(this, visitPropertyName: (_) {}); } + @override + void visitEmptyClassBody(EmptyClassBody node) {} + + @override + void visitEmptyEnumBody(EmptyEnumBody node) {} + @override void visitEmptyFunctionBody(covariant EmptyFunctionBodyImpl node) { node.localVariableInfo = _localVariableInfo; @@ -653,9 +659,6 @@ class ResolutionVisitor extends RecursiveAstVisitor { super.visitLibraryDirective(node); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) {} - @override void visitMethodDeclaration(covariant MethodDeclarationImpl node) { _scopeContext.visitMethodDeclaration(node, visitor: this); diff --git a/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart b/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart index 71a28c07d92..0db3dc5d0ae 100644 --- a/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart +++ b/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart @@ -220,11 +220,13 @@ class DartdocDirectiveInfo { ClassDeclaration() => declaration.body.tryCast()?.members, EnumDeclaration() => [ - ...declaration.body.constants, - ...declaration.body.members, + ...?declaration.body.tryCast()?.constants, + ...?declaration.body.tryCast()?.members, ], - MixinDeclaration() => declaration.body.members, - ExtensionDeclaration() => declaration.body.members, + MixinDeclaration() => + declaration.body.tryCast()?.members, + ExtensionDeclaration() => + declaration.body.tryCast()?.members, ExtensionTypeDeclaration() => declaration.body.tryCast()?.members, _ => null, diff --git a/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart index fbcf2b4a405..6782efb016f 100644 --- a/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart +++ b/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart @@ -483,7 +483,6 @@ class MemberDuplicateDefinitionVerifier { var elementContext = _getElementContext(firstFragment); var instanceScope = elementContext.instanceScope; - for (var member in node.body.members) { if (member is FieldDeclarationImpl) { if (member.isStatic) { diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart index de2b794e379..a3aa156a673 100644 --- a/pkg/analyzer/lib/src/fasta/ast_builder.dart +++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart @@ -1544,7 +1544,7 @@ class AstBuilder extends StackListener { Token endToken, ) { assert(optional('enum', enumKeyword)); - assert(optional('{', leftBrace)); + assert(optional('{', leftBrace) || optional(';', leftBrace)); debugEvent("Enum"); var builder = _classLikeBuilder as _EnumDeclarationBuilder; @@ -2348,7 +2348,7 @@ class AstBuilder extends StackListener { assert(optional(';', semicolon)); debugEvent("LibraryName"); - var libraryName = hasName ? pop() as List? : null; + var libraryName = hasName ? pop() as List? : null; if (!hasName && !enableUnnamedLibraries) { _reportFeatureNotEnabled( @@ -2356,9 +2356,10 @@ class AstBuilder extends StackListener { startToken: libraryKeyword, ); } - var name = libraryName == null - ? null - : LibraryIdentifierImpl(components: libraryName); + DottedNameImpl? name; + if (libraryName != null) { + name = DottedNameImpl(tokens: libraryName); + } var metadata = pop() as List?; var comment = _findComment(metadata, libraryKeyword); directives.add( @@ -2732,14 +2733,13 @@ class AstBuilder extends StackListener { assert(optional(';', semicolon)); debugEvent("PartOf"); var libraryNameOrUri = pop(); - LibraryIdentifierImpl? name; + DottedNameImpl? name; StringLiteralImpl? uri; if (libraryNameOrUri is StringLiteralImpl) { uri = libraryNameOrUri; } else { - name = LibraryIdentifierImpl( - components: libraryNameOrUri as List, - ); + var libraryName = libraryNameOrUri as List; + name = DottedNameImpl(tokens: libraryName); if (_featureSet.isEnabled(Feature.enhanced_parts)) { diagnosticReporter.diagnosticReporter?.report(diag.partOfName.at(name)); } @@ -4051,8 +4051,21 @@ class AstBuilder extends StackListener { assert(firstIdentifier.isIdentifier); debugEvent("DottedName"); - var components = popTypedList2(count); - push(DottedNameImpl(components: components)); + var identifiers = popTypedList2(count); + var tokens = []; + if (identifiers.isNotEmpty) { + // TODO(scheglov): The parser does not use [handleQualified] for + // [handleDottedName], so no periods in [identifiers]. + // We must walk the token stream. + var t = identifiers.first; + var end = identifiers.last; + while (t != end) { + tokens.add(t); + t = t.next!; + } + tokens.add(end); + } + push(DottedNameImpl(tokens: tokens)); } @override @@ -4161,7 +4174,7 @@ class AstBuilder extends StackListener { Token leftBrace, ) { assert(optional('enum', enumKeyword)); - assert(optional('{', leftBrace)); + assert(optional('{', leftBrace) || optional(';', leftBrace)); debugEvent("EnumHeader"); var implementsClause = @@ -4202,7 +4215,7 @@ class AstBuilder extends StackListener { implementsClause: implementsClause, leftBracket: leftBrace, semicolon: null, - rightBracket: leftBrace.endGroup!, + rightBracket: leftBrace.endGroup ?? leftBrace, ); } @@ -4457,7 +4470,9 @@ class AstBuilder extends StackListener { assert(token.isKeywordOrIdentifier); debugEvent("handleIdentifier"); - if (context.inSymbol) { + if (context.inSymbol || + context == IdentifierContext.dottedName || + context == IdentifierContext.dottedNameContinuation) { push(token); return; } @@ -4465,9 +4480,9 @@ class AstBuilder extends StackListener { var identifier = SimpleIdentifierImpl(token: token); if (context.inLibraryOrPartOfDeclaration) { if (!context.isContinuation) { - push([identifier]); + push([token]); } else { - push(identifier); + push(token); } } else if (context == IdentifierContext.enumValueDeclaration) { var metadata = pop() as List?; @@ -5041,6 +5056,24 @@ class AstBuilder extends StackListener { push(NullValues.ConstructorReferenceContinuationAfterTypeArguments); } + @override + void handleNoEnumBody(Token semicolonToken) { + debugEvent("NoEnumBody"); + var builder = _classLikeBuilder; + if (builder != null) { + builder.emptyClassBodySemicolon = semicolonToken; + } + } + + @override + void handleNoExtensionBody(Token semicolonToken) { + debugEvent("NoExtensionBody"); + var builder = _classLikeBuilder; + if (builder != null) { + builder.emptyClassBodySemicolon = semicolonToken; + } + } + @override void handleNoExtensionTypeBody(Token semicolonToken) { debugEvent("NoExtensionTypeBody"); @@ -5081,6 +5114,15 @@ class AstBuilder extends StackListener { push(NullValues.ConstructorInitializers); } + @override + void handleNoMixinBody(Token semicolonToken) { + debugEvent("NoMixinBody"); + var builder = _classLikeBuilder; + if (builder != null) { + builder.emptyClassBodySemicolon = semicolonToken; + } + } + @override void handleNonNullAssertExpression(Token bang) { debugEvent('NonNullAssertExpression'); @@ -5309,10 +5351,11 @@ class AstBuilder extends StackListener { void handleQualified(Token period) { assert(optional('.', period)); - var identifier = pop() as SimpleIdentifierImpl; + var identifier = pop(); var prefix = pop(); if (prefix is List) { // We're just accumulating components into a list. + prefix.add(period); prefix.add(identifier); push(prefix); } else if (prefix is SimpleIdentifierImpl) { @@ -5322,7 +5365,7 @@ class AstBuilder extends StackListener { PrefixedIdentifierImpl( prefix: prefix, period: period, - identifier: identifier, + identifier: identifier as SimpleIdentifierImpl, ), ); } else { @@ -6020,8 +6063,6 @@ class AstBuilder extends StackListener { typeNameIdentifier = preliminaryName.prefix; period = preliminaryName.period; constructorNameToken = preliminaryName.identifier.token; - default: - throw UnimplementedError(); } var constructor = ConstructorDeclarationImpl( @@ -6555,13 +6596,18 @@ class _EnumDeclarationBuilder extends _ClassLikeDeclarationBuilder { }); EnumDeclarationImpl build() { - var body = EnumBodyImpl( - leftBracket: leftBracket, - constants: constants, - semicolon: semicolon, - members: members, - rightBracket: rightBracket, - ); + EnumBodyImpl body; + if (emptyClassBodySemicolon case var semicolon?) { + body = EmptyEnumBodyImpl(semicolon: semicolon); + } else { + body = BlockEnumBodyImpl( + leftBracket: leftBracket, + constants: constants, + semicolon: semicolon, + members: members, + rightBracket: rightBracket, + ); + } return EnumDeclarationImpl( comment: comment, @@ -6600,11 +6646,16 @@ class _ExtensionDeclarationBuilder extends _ClassLikeDeclarationBuilder { required Token? typeKeyword, required ExtensionOnClauseImpl? onClause, }) { - var body = BlockClassBodyImpl( - leftBracket: leftBracket, - members: members, - rightBracket: rightBracket, - ); + ClassBodyImpl body; + if (emptyClassBodySemicolon case var semicolon?) { + body = EmptyClassBodyImpl(semicolon: semicolon); + } else { + body = BlockClassBodyImpl( + leftBracket: leftBracket, + members: members, + rightBracket: rightBracket, + ); + } return ExtensionDeclarationImpl( comment: comment, @@ -6699,11 +6750,16 @@ class _MixinDeclarationBuilder extends _ClassLikeDeclarationBuilder { }); MixinDeclarationImpl build() { - var body = BlockClassBodyImpl( - leftBracket: leftBracket, - members: members, - rightBracket: rightBracket, - ); + ClassBodyImpl body; + if (emptyClassBodySemicolon case var semicolon?) { + body = EmptyClassBodyImpl(semicolon: semicolon); + } else { + body = BlockClassBodyImpl( + leftBracket: leftBracket, + members: members, + rightBracket: rightBracket, + ); + } return MixinDeclarationImpl( comment: comment, diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart index 5e36ce83eca..b7631c415dd 100644 --- a/pkg/analyzer/lib/src/generated/error_verifier.dart +++ b/pkg/analyzer/lib/src/generated/error_verifier.dart @@ -1412,7 +1412,6 @@ class ErrorVerifier extends RecursiveAstVisitor _enclosingClass = declaredElement; - List members = node.body.members; _checkForBuiltInIdentifierAsName( node.name, diag.builtInIdentifierAsTypeName, @@ -1428,7 +1427,10 @@ class ErrorVerifier extends RecursiveAstVisitor } _checkForConflictingClassMembers(declaredFragment); - _checkForNotInitializedFieldDeclarations(declaredFragment, members); + _checkForNotInitializedFieldDeclarations( + declaredFragment, + node.body.members, + ); _checkForMainFunction1(node.name, firstFragment); _checkForWrongTypeParameterVarianceInSuperinterfaces(); // _checkForBadFunctionUse(node); diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index bb82687f2a4..539025b25b5 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -2184,6 +2184,11 @@ class ResolverVisitor extends ThrowingAstVisitor node.visitChildren(this); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + node.visitChildren(this); + } + @override TypeImpl visitBlockFunctionBody( covariant BlockFunctionBodyImpl node, { @@ -2674,6 +2679,9 @@ class ResolverVisitor extends ThrowingAstVisitor inferenceLogWriter?.exitExpression(node); } + @override + void visitDottedName(DottedName node) {} + @override void visitDoubleLiteral( DoubleLiteral node, { @@ -2689,6 +2697,9 @@ class ResolverVisitor extends ThrowingAstVisitor @override void visitEmptyClassBody(EmptyClassBody node) {} + @override + void visitEmptyEnumBody(EmptyEnumBody node) {} + @override TypeImpl visitEmptyFunctionBody( EmptyFunctionBody node, { @@ -2705,11 +2716,6 @@ class ResolverVisitor extends ThrowingAstVisitor node.visitChildren(this); } - @override - void visitEnumBody(EnumBody node) { - node.visitChildren(this); - } - @override void visitEnumConstantArguments(EnumConstantArguments node) { checkUnreachableNode(node); @@ -3439,12 +3445,6 @@ class ResolverVisitor extends ThrowingAstVisitor elementResolver.visitLibraryDirective(node); } - @override - void visitLibraryIdentifier( - LibraryIdentifier node, { - TypeImpl contextType = UnknownInferredType.instance, - }) {} - @override void visitListLiteral( covariant ListLiteralImpl node, { diff --git a/pkg/analyzer/lib/src/lint/linter_visitor.g.dart b/pkg/analyzer/lib/src/lint/linter_visitor.g.dart index cbe7b0f2fbd..1724d555bf5 100644 --- a/pkg/analyzer/lib/src/lint/linter_visitor.g.dart +++ b/pkg/analyzer/lib/src/lint/linter_visitor.g.dart @@ -115,6 +115,12 @@ class AnalysisRuleVisitor implements AstVisitor { node.visitChildren(this); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + _runSubscriptions(node, _registry._forBlockEnumBody); + node.visitChildren(this); + } + @override void visitBlockFunctionBody(BlockFunctionBody node) { _runSubscriptions(node, _registry._forBlockFunctionBody); @@ -309,6 +315,12 @@ class AnalysisRuleVisitor implements AstVisitor { node.visitChildren(this); } + @override + void visitEmptyEnumBody(EmptyEnumBody node) { + _runSubscriptions(node, _registry._forEmptyEnumBody); + node.visitChildren(this); + } + @override void visitEmptyFunctionBody(EmptyFunctionBody node) { _runSubscriptions(node, _registry._forEmptyFunctionBody); @@ -321,12 +333,6 @@ class AnalysisRuleVisitor implements AstVisitor { node.visitChildren(this); } - @override - void visitEnumBody(EnumBody node) { - _runSubscriptions(node, _registry._forEnumBody); - node.visitChildren(this); - } - @override void visitEnumConstantArguments(EnumConstantArguments node) { _runSubscriptions(node, _registry._forEnumConstantArguments); @@ -615,12 +621,6 @@ class AnalysisRuleVisitor implements AstVisitor { node.visitChildren(this); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - _runSubscriptions(node, _registry._forLibraryIdentifier); - node.visitChildren(this); - } - @override void visitListLiteral(ListLiteral node) { _runSubscriptions(node, _registry._forListLiteral); @@ -1215,6 +1215,8 @@ class RuleVisitorRegistryImpl implements RuleVisitorRegistry { final List<_Subscription> _forBlockClassBody = []; + final List<_Subscription> _forBlockEnumBody = []; + final List<_Subscription> _forBlockFunctionBody = []; final List<_Subscription> _forBlock = []; @@ -1289,12 +1291,12 @@ class RuleVisitorRegistryImpl implements RuleVisitorRegistry { final List<_Subscription> _forEmptyClassBody = []; + final List<_Subscription> _forEmptyEnumBody = []; + final List<_Subscription> _forEmptyFunctionBody = []; final List<_Subscription> _forEmptyStatement = []; - final List<_Subscription> _forEnumBody = []; - final List<_Subscription> _forEnumConstantArguments = []; @@ -1407,8 +1409,6 @@ class RuleVisitorRegistryImpl implements RuleVisitorRegistry { final List<_Subscription> _forLibraryDirective = []; - final List<_Subscription> _forLibraryIdentifier = []; - final List<_Subscription> _forListLiteral = []; final List<_Subscription> _forListPattern = []; @@ -1682,6 +1682,11 @@ class RuleVisitorRegistryImpl implements RuleVisitorRegistry { _forBlockClassBody.add(_Subscription(rule, visitor, _getTimer(rule))); } + @override + void addBlockEnumBody(AbstractAnalysisRule rule, AstVisitor visitor) { + _forBlockEnumBody.add(_Subscription(rule, visitor, _getTimer(rule))); + } + @override void addBlockFunctionBody(AbstractAnalysisRule rule, AstVisitor visitor) { _forBlockFunctionBody.add(_Subscription(rule, visitor, _getTimer(rule))); @@ -1879,6 +1884,11 @@ class RuleVisitorRegistryImpl implements RuleVisitorRegistry { _forEmptyClassBody.add(_Subscription(rule, visitor, _getTimer(rule))); } + @override + void addEmptyEnumBody(AbstractAnalysisRule rule, AstVisitor visitor) { + _forEmptyEnumBody.add(_Subscription(rule, visitor, _getTimer(rule))); + } + @override void addEmptyFunctionBody(AbstractAnalysisRule rule, AstVisitor visitor) { _forEmptyFunctionBody.add(_Subscription(rule, visitor, _getTimer(rule))); @@ -1889,11 +1899,6 @@ class RuleVisitorRegistryImpl implements RuleVisitorRegistry { _forEmptyStatement.add(_Subscription(rule, visitor, _getTimer(rule))); } - @override - void addEnumBody(AbstractAnalysisRule rule, AstVisitor visitor) { - _forEnumBody.add(_Subscription(rule, visitor, _getTimer(rule))); - } - @override void addEnumConstantArguments(AbstractAnalysisRule rule, AstVisitor visitor) { _forEnumConstantArguments.add( @@ -2205,11 +2210,6 @@ class RuleVisitorRegistryImpl implements RuleVisitorRegistry { _forLibraryDirective.add(_Subscription(rule, visitor, _getTimer(rule))); } - @override - void addLibraryIdentifier(AbstractAnalysisRule rule, AstVisitor visitor) { - _forLibraryIdentifier.add(_Subscription(rule, visitor, _getTimer(rule))); - } - @override void addListLiteral(AbstractAnalysisRule rule, AstVisitor visitor) { _forListLiteral.add(_Subscription(rule, visitor, _getTimer(rule))); diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart index 621f3477f0c..30be8bce90e 100644 --- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart +++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart @@ -324,8 +324,14 @@ class AstBinaryReader { } DottedName _readDottedName() { - var components = _readNodeList(); - return DottedNameImpl(components: components); + var count = _readUint32(); + var tokens = []; + for (var i = 0; i < count; i++) { + var lexeme = _readStringReference(); + var type = lexeme == '.' ? TokenType.PERIOD : TokenType.IDENTIFIER; + tokens.add(TokenFactory.tokenFromTypeAndString(type, lexeme)); + } + return DottedNameImpl(tokens: tokens); } DoubleLiteral _readDoubleLiteral() { diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart index 95573285e7c..afea727fc57 100644 --- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart +++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart @@ -240,7 +240,10 @@ class AstBinaryWriter extends ThrowingAstVisitor { @override void visitDottedName(DottedName node) { _writeByte(Tag.DottedName); - _writeNodeList(node.components); + _writeUint32(node.tokens.length); + for (var i = 0; i < node.tokens.length; i++) { + _writeStringReference(node.tokens[i].lexeme); + } } @override diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart index e81915314f4..22cc8411a5e 100644 --- a/pkg/analyzer/lib/src/summary2/element_builder.dart +++ b/pkg/analyzer/lib/src/summary2/element_builder.dart @@ -1171,11 +1171,9 @@ class FragmentBuilder extends ThrowingAstVisitor { var holder = _EnclosingContext(fragment: fragment); _withEnclosing(holder, () { // Build fields for all enum constants. - var constants = node.body.constants; var valuesElements = []; var valuesNames = {}; - for (var i = 0; i < constants.length; ++i) { - var constant = constants[i]; + for (var constant in node.body.constants) { var nameToken = constant.name; var name = nameToken.lexeme; var field = FieldFragmentImpl(name: _getFragmentName(nameToken)) @@ -1208,13 +1206,13 @@ class FragmentBuilder extends ThrowingAstVisitor { ) : null, ), - argumentList: constantArguments != null - ? constantArguments.argumentList - : ArgumentListImpl( - leftParenthesis: Tokens.openParenthesis(), - arguments: [], - rightParenthesis: Tokens.closeParenthesis(), - ), + argumentList: + constantArguments?.argumentList ?? + ArgumentListImpl( + leftParenthesis: Tokens.openParenthesis(), + arguments: [], + rightParenthesis: Tokens.closeParenthesis(), + ), typeArguments: null, ); @@ -1310,7 +1308,9 @@ class FragmentBuilder extends ThrowingAstVisitor { ); node.namePart.accept(this); - node.body.members.accept(this); + for (var member in node.body.members) { + member.accept(this); + } }); fragment.typeParameters = holder.typeParameters; @@ -1346,7 +1346,9 @@ class FragmentBuilder extends ThrowingAstVisitor { var holder = _EnclosingContext(fragment: fragment); _withEnclosing(holder, () { node.typeParameters?.accept(this); - node.body.members.accept(this); + for (var member in node.body.members) { + member.accept(this); + } }); fragment.typeParameters = holder.typeParameters; @@ -1751,7 +1753,7 @@ class FragmentBuilder extends ThrowingAstVisitor { var holder = _EnclosingContext(fragment: fragment); _withEnclosing(holder, () { node.typeParameters?.accept(this); - node.body.members.accept(this); + node.body.accept(this); }); fragment.typeParameters = holder.typeParameters; diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart index b59036604a6..13f939cdf49 100644 --- a/pkg/analyzer/lib/src/summary2/informative_data.dart +++ b/pkg/analyzer/lib/src/summary2/informative_data.dart @@ -582,13 +582,13 @@ class _InfoBuilder { classDeclarations.add(_buildClass(declaration)); } else if (declaration is ClassTypeAlias) { classTypeAliases.add(_buildClassTypeAlias(declaration)); - } else if (declaration is EnumDeclaration) { + } else if (declaration is EnumDeclarationImpl) { enums.add(_buildEnum(declaration)); } else if (declaration is ExtensionDeclaration) { extensions.add(_buildExtension(declaration)); } else if (declaration is ExtensionTypeDeclaration) { extensionTypes.add(_buildExtensionType(declaration)); - } else if (declaration is MixinDeclaration) { + } else if (declaration is MixinDeclarationImpl) { mixinDeclarations.add(_buildMixin(declaration)); } else if (declaration is FunctionDeclaration) { if (declaration.isGetter) { @@ -789,7 +789,7 @@ class _InfoBuilder { ); } - _InfoEnumDeclaration _buildEnum(EnumDeclaration node) { + _InfoEnumDeclaration _buildEnum(EnumDeclarationImpl node) { return _InfoEnumDeclaration( data: _buildInterfaceData( node, @@ -836,7 +836,7 @@ class _InfoBuilder { node, name: node.name, typeParameters: node.typeParameters, - members: node.body.members, + members: node.body.tryCast()?.members ?? [], ), ); } @@ -1066,7 +1066,7 @@ class _InfoBuilder { ); } - _InfoMixinDeclaration _buildMixin(MixinDeclaration node) { + _InfoMixinDeclaration _buildMixin(MixinDeclarationImpl node) { return _InfoMixinDeclaration( data: _buildInterfaceData( node, diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart index 542e966a99f..3c33b0c46f1 100644 --- a/pkg/analyzer/lib/src/summary2/library_builder.dart +++ b/pkg/analyzer/lib/src/summary2/library_builder.dart @@ -771,7 +771,7 @@ class LibraryBuilder { if (directive is ast.LibraryDirectiveImpl) { var nameIdentifier = directive.name; if (nameIdentifier != null) { - name = nameIdentifier.components.map((e) => e.name).join('.'); + name = nameIdentifier.tokens.map((e) => e.lexeme).join(); nameOffset = nameIdentifier.offset; nameLength = nameIdentifier.length; } diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart index 493585a9ee4..b3ec9a29f5d 100644 --- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart +++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart @@ -40,7 +40,12 @@ class MetadataResolver extends ThrowingAstVisitor { @override void visitBlockClassBody(BlockClassBody node) { - node.members.accept(this); + node.visitChildren(this); + } + + @override + void visitBlockEnumBody(BlockEnumBody node) { + node.visitChildren(this); } @override @@ -86,6 +91,9 @@ class MetadataResolver extends ThrowingAstVisitor { @override void visitEmptyClassBody(EmptyClassBody node) {} + @override + void visitEmptyEnumBody(EmptyEnumBody node) {} + @override void visitEnumConstantDeclaration(EnumConstantDeclaration node) { node.metadata.accept(this); @@ -102,8 +110,7 @@ class MetadataResolver extends ThrowingAstVisitor { .tryCast() ?.formalParameters .accept(this); - node.body.constants.accept(this); - node.body.members.accept(this); + node.body.accept(this); } finally { _scope = _containerScope; } @@ -126,7 +133,7 @@ class MetadataResolver extends ThrowingAstVisitor { _scope = node.bodyScope!; try { - node.body.members.accept(this); + node.body.accept(this); } finally { _scope = _containerScope; } @@ -230,7 +237,7 @@ class MetadataResolver extends ThrowingAstVisitor { _scope = node.bodyScope!; try { - node.body.members.accept(this); + node.body.accept(this); } finally { _scope = _containerScope; } diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart index cab50de5e75..d07f5a20353 100644 --- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart +++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart @@ -75,6 +75,12 @@ class ReferenceResolver extends ThrowingAstVisitor { node.members.accept(this); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + node.constants.accept(this); + node.members.accept(this); + } + @override void visitBlockFunctionBody(BlockFunctionBody node) {} @@ -119,13 +125,10 @@ class ReferenceResolver extends ThrowingAstVisitor { void visitEmptyClassBody(EmptyClassBody node) {} @override - void visitEmptyFunctionBody(EmptyFunctionBody node) {} + void visitEmptyEnumBody(EmptyEnumBody node) {} @override - void visitEnumBody(EnumBody node) { - node.constants.accept(this); - node.members.accept(this); - } + void visitEmptyFunctionBody(EmptyFunctionBody node) {} @override void visitEnumConstantDeclaration(EnumConstantDeclaration node) {} diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart index b18945ce3ab..eca313e757d 100644 --- a/pkg/analyzer/lib/src/test_utilities/find_node.dart +++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart @@ -72,6 +72,8 @@ class FindNode { DotShorthandPropertyAccess get singleDotShorthandPropertyAccess => _single(); + DottedName get singleDottedName => _single(); + EnumDeclaration get singleEnumDeclaration => _single(); ExportDirective get singleExportDirective => _single(); @@ -391,6 +393,10 @@ class FindNode { return _node(search, (n) => n is DotShorthandPropertyAccess); } + DottedName dottedName(String search) { + return _node(search, (n) => n is DottedName); + } + DoubleLiteral doubleLiteral(String search) { return _node(search, (n) => n is DoubleLiteral); } @@ -602,10 +608,6 @@ class FindNode { return _node(search, (n) => n is LibraryDirective); } - LibraryIdentifier libraryIdentifier(String search) { - return _node(search, (n) => n is LibraryIdentifier); - } - ListLiteral listLiteral(String search) { return _node(search, (n) => n is ListLiteral); } diff --git a/pkg/analyzer/lib/src/utilities/extensions/ast.dart b/pkg/analyzer/lib/src/utilities/extensions/ast.dart index 3f51d172ec8..165895ca6eb 100644 --- a/pkg/analyzer/lib/src/utilities/extensions/ast.dart +++ b/pkg/analyzer/lib/src/utilities/extensions/ast.dart @@ -124,12 +124,13 @@ extension AstNodeNullableExtension on AstNode? { var self = this; return switch (self) { BlockClassBody() => self.members, + BlockEnumBody() => self.members, ClassDeclarationImpl() => self.body.members, - EnumBody() => self.members, - EnumDeclaration() => self.body.members, - ExtensionDeclaration() => self.body.members, + EnumDeclaration() => self.body.tryCast()?.members ?? [], + ExtensionDeclaration() => + self.body.tryCast()?.members ?? [], ExtensionTypeDeclarationImpl() => self.body.members, - MixinDeclaration() => self.body.members, + MixinDeclaration() => self.body.tryCast()?.members ?? [], _ => throw UnimplementedError('(${self.runtimeType}) $self'), }; } diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml index 69fb5d326fa..338235f28ed 100644 --- a/pkg/analyzer/pubspec.yaml +++ b/pkg/analyzer/pubspec.yaml @@ -1,5 +1,5 @@ name: analyzer -version: 11.1.0-dev +version: 12.0.0-dev description: >- This package provides a library that performs static analysis of Dart code. repository: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer diff --git a/pkg/analyzer/test/generated/class_member_parser_test.dart b/pkg/analyzer/test/generated/class_member_parser_test.dart index 590b8553eeb..e522953070d 100644 --- a/pkg/analyzer/test/generated/class_member_parser_test.dart +++ b/pkg/analyzer/test/generated/class_member_parser_test.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag; import 'package:test_reflective_loader/test_reflective_loader.dart'; diff --git a/pkg/analyzer/test/generated/error_parser_test.dart b/pkg/analyzer/test/generated/error_parser_test.dart index 72eadab4d42..44ce59f95e9 100644 --- a/pkg/analyzer/test/generated/error_parser_test.dart +++ b/pkg/analyzer/test/generated/error_parser_test.dart @@ -2370,16 +2370,6 @@ a; parseResult.assertErrors([error(diag.missingConstFinalVarOrType, 0, 1)]); } - void test_missingEnumBody() { - var parseResult = parseStringWithErrors(r''' -enum E; -'''); - parseResult.assertErrors([ - error(diag.missingEnumBody, 6, 1), - error(diag.unexpectedToken, 6, 1), - ]); - } - void test_missingEnumComma() { var parseResult = parseStringWithErrors(r''' enum E {one two} diff --git a/pkg/analyzer/test/generated/simple_parser_test.dart b/pkg/analyzer/test/generated/simple_parser_test.dart index 5fed848f591..ee7b5532050 100644 --- a/pkg/analyzer/test/generated/simple_parser_test.dart +++ b/pkg/analyzer/test/generated/simple_parser_test.dart @@ -1195,11 +1195,10 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b + tokens + a + . + b rightParenthesis: ) uri: SimpleStringLiteral literal: 'c.dart' @@ -1218,9 +1217,8 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a + tokens + a rightParenthesis: ) uri: SimpleStringLiteral literal: 'b.dart' @@ -1239,11 +1237,10 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b + tokens + a + . + b equalToken: == value: SimpleStringLiteral literal: 'c' @@ -1265,9 +1262,8 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a + tokens + a equalToken: == value: SimpleStringLiteral literal: 'b' @@ -1989,10 +1985,9 @@ library $name; assertParsedNodeText(node, r''' LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: $name + name: DottedName + tokens + $name semicolon: ; '''); } @@ -2035,10 +2030,9 @@ library $name; assertParsedNodeText(node, r''' LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: $name + name: DottedName + tokens + $name semicolon: ; '''); } @@ -2052,10 +2046,9 @@ library $name; assertParsedNodeText(node, r''' LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: $name + name: DottedName + tokens + $name semicolon: ; '''); } @@ -2069,10 +2062,9 @@ library $name; assertParsedNodeText(node, r''' LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: $name + name: DottedName + tokens + $name semicolon: ; '''); } diff --git a/pkg/analyzer/test/generated/top_level_parser_test.dart b/pkg/analyzer/test/generated/top_level_parser_test.dart index 3c46538385b..2eb9ca4e041 100644 --- a/pkg/analyzer/test/generated/top_level_parser_test.dart +++ b/pkg/analyzer/test/generated/top_level_parser_test.dart @@ -1076,10 +1076,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; PartDirective partKeyword: part @@ -1100,10 +1099,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -2457,10 +2455,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -2476,10 +2473,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: a + name: DottedName + tokens + a semicolon: ; '''); } @@ -2495,12 +2491,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b + name: DottedName + tokens + a + . + b semicolon: ; '''); } @@ -2516,14 +2511,13 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b - SimpleIdentifier - token: c + name: DottedName + tokens + a + . + b + . + c semicolon: ; '''); } @@ -2545,10 +2539,9 @@ CompilationUnit name: SimpleIdentifier token: A libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -2570,10 +2563,9 @@ CompilationUnit name: SimpleIdentifier token: A libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -2608,10 +2600,9 @@ CompilationUnit tokens /// Doc libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -2645,10 +2636,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: a + libraryName: DottedName + tokens + a semicolon: ; '''); } @@ -2665,12 +2655,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b + libraryName: DottedName + tokens + a + . + b semicolon: ; '''); } @@ -2687,14 +2676,13 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b - SimpleIdentifier - token: c + libraryName: DottedName + tokens + a + . + b + . + c semicolon: ; '''); } @@ -2715,10 +2703,9 @@ CompilationUnit /// Doc partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: a + libraryName: DottedName + tokens + a semicolon: ; '''); } @@ -2756,10 +2743,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: l + libraryName: DottedName + tokens + l semicolon: ; '''); } @@ -2784,10 +2770,9 @@ CompilationUnit name: SimpleIdentifier token: A libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; ImportDirective metadata @@ -2819,10 +2804,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; declarations ClassDeclaration @@ -2857,10 +2841,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; PartDirective partKeyword: part @@ -2891,10 +2874,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; PartDirective partKeyword: part @@ -2928,10 +2910,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -2968,7 +2949,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2990,7 +2971,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3012,7 +2993,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3040,7 +3021,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3065,7 +3046,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3094,7 +3075,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3129,9 +3110,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a + tokens + a rightParenthesis: ) uri: SimpleStringLiteral literal: 'b.dart' @@ -3140,9 +3120,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: c + tokens + c rightParenthesis: ) uri: SimpleStringLiteral literal: 'd.dart' @@ -3169,11 +3148,10 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b + tokens + a + . + b equalToken: == value: SimpleStringLiteral literal: 'c.dart' @@ -4041,9 +4019,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a + tokens + a rightParenthesis: ) uri: SimpleStringLiteral literal: 'b.dart' @@ -4052,9 +4029,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: c + tokens + c rightParenthesis: ) uri: SimpleStringLiteral literal: 'd.dart' @@ -4081,11 +4057,10 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: a - SimpleIdentifier - token: b + tokens + a + . + b equalToken: == value: SimpleStringLiteral literal: 'c.dart' @@ -4278,10 +4253,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -4607,10 +4581,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: l + libraryName: DottedName + tokens + l semicolon: ; '''); } diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart index 6dc441e9433..ade0da371fa 100644 --- a/pkg/analyzer/test/generated/utilities_test.dart +++ b/pkg/analyzer/test/generated/utilities_test.dart @@ -2,9 +2,9 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/source/source_range.dart'; +import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/dart/ast/utilities.dart'; import 'package:analyzer/src/generated/utilities_collection.dart'; import 'package:analyzer/src/test_utilities/find_node.dart'; @@ -1123,18 +1123,6 @@ library foo; ); } - void test_libraryIdentifier() { - var findNode = _parseStringToFindNode(r''' -library foo.bar; -'''); - var node = findNode.libraryIdentifier('foo'); - _assertReplaceInList( - destination: node, - child: node.components[0], - replacement: node.components[1], - ); - } - void test_listLiteral() { var findNode = _parseStringToFindNode(r''' void f() { diff --git a/pkg/analyzer/test/src/dart/analysis/defined_names_test.dart b/pkg/analyzer/test/src/dart/analysis/defined_names_test.dart index e0c84222f92..fc67c8bd72b 100644 --- a/pkg/analyzer/test/src/dart/analysis/defined_names_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/defined_names_test.dart @@ -38,6 +38,14 @@ class B { ); } + test_classMemberNames_enum_empty() { + DefinedNames names = _computeDefinedNames(''' +enum E; +'''); + expect(names.topLevelNames, unorderedEquals(['E'])); + expect(names.classMemberNames, isEmpty); + } + test_classMemberNames_extension() { DefinedNames names = _computeDefinedNames(''' extension E on int { @@ -51,6 +59,14 @@ extension E on int { expect(names.classMemberNames, unorderedEquals(['a', 'b', 'c', 'd'])); } + test_classMemberNames_extension_empty() { + DefinedNames names = _computeDefinedNames(''' +extension E on int; +'''); + expect(names.topLevelNames, unorderedEquals(['E'])); + expect(names.classMemberNames, isEmpty); + } + test_classMemberNames_extensionType() { DefinedNames names = _computeDefinedNames(''' extension type A.named(int it) { @@ -91,6 +107,14 @@ mixin B { ); } + test_classMemberNames_mixin_empty() { + DefinedNames names = _computeDefinedNames(''' +mixin M; +'''); + expect(names.topLevelNames, unorderedEquals(['M'])); + expect(names.classMemberNames, isEmpty); + } + test_topLevelNames() { DefinedNames names = _computeDefinedNames(''' class A {} diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart index 827d262f87e..a9a055cffe9 100644 --- a/pkg/analyzer/test/src/dart/analysis/index_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart @@ -59,6 +59,13 @@ class IndexTest extends PubPackageResolutionTest with _IndexMixin { expect(actual, expected); } + test_ClassElement_emptyBody() async { + await _indexTestUnit(r''' +class C; +'''); + assertErrorsInResult([]); + } + test_ClassElement_hierarchy_class_extends() async { await _indexTestUnit(r''' import 'test.dart' as p; @@ -1438,6 +1445,13 @@ dynamic f() {} expect(index.usedElementOffsets, isEmpty); } + test_EnumElement_emptyBody() async { + await _indexTestUnit(r''' +enum E; +'''); + assertErrorsInResult([error(diag.enumWithoutConstants, 5, 1)]); + } + test_EnumElement_reference_annotation() async { await _indexTestUnit(r''' import 'test.dart' as p; @@ -1568,6 +1582,13 @@ Prefixes: (unprefixed),p '''); } + test_ExtensionElement_emptyBody() async { + await _indexTestUnit(r''' +extension E on int; +'''); + assertErrorsInResult([]); + } + test_ExtensionElement_reference_memberAccess() async { await _indexTestUnit(r''' import 'test.dart' as p; @@ -3793,6 +3814,13 @@ void useOperator(M m) { '''); } + test_MixinElement_emptyBody() async { + await _indexTestUnit(r''' +mixin M; +'''); + assertErrorsInResult([]); + } + test_MixinElement_hierarchy_class_implements() async { await _indexTestUnit(r''' mixin A {} @@ -4924,7 +4952,7 @@ class _NameIndexAssert { test._assertUsedName( name, kind, - test._expectedLocation(search, false), + test._expectedLocation(search, false, length: name.length), true, ); } @@ -4933,7 +4961,7 @@ class _NameIndexAssert { test._assertUsedName( name, kind, - test._expectedLocation(search, true), + test._expectedLocation(search, true, length: name.length), true, ); } @@ -4942,7 +4970,7 @@ class _NameIndexAssert { test._assertUsedName( name, kind, - test._expectedLocation(search, false), + test._expectedLocation(search, false, length: name.length), false, ); } @@ -4951,7 +4979,7 @@ class _NameIndexAssert { test._assertUsedName( name, kind, - test._expectedLocation(search, true), + test._expectedLocation(search, true, length: name.length), false, ); } diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart index b20233bc277..ecd8aebbd37 100644 --- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart @@ -280,6 +280,17 @@ class C {} ); } + test_class_emptyBody() { + _assertSameSignature( + r''' +class C; +''', + r''' +class C; +''', + ); + } + test_class_extends() { _assertNotSameSignature( r''' @@ -969,6 +980,17 @@ class A {} ); } + test_enum_emptyBody() { + _assertSameSignature( + r''' +enum E; +''', + r''' +enum E; +''', + ); + } + test_enum_enumConstants_add() { _assertNotSameSignature( r''' @@ -1569,6 +1591,17 @@ void foo() {} ); } + test_extension_emptyBody() { + _assertSameSignature( + r''' +extension E on int; +''', + r''' +extension E on int; +''', + ); + } + test_extension_on() { _assertNotSameSignature( r''' @@ -1663,6 +1696,17 @@ Future> bar(int x) {} ); } + test_mixin_emptyBody() { + _assertSameSignature( + r''' +mixin M; +''', + r''' +mixin M; +''', + ); + } + test_mixin_field_withoutType() { _assertNotSameSignature( r''' @@ -2043,8 +2087,8 @@ typedef F = void Function(double); _assertSignature(oldCode, newCode, same: true); } - void _assertSameSignature_classLike(String oldCode, String newCode) { - _assertSignature_classLike(oldCode, newCode, same: true); + void _assertSameSignature_classLike(String code1, String code2) { + _assertSignature_classLike(code1, code2, same: true); } void _assertSameSignature_executable(String oldCode, String newCode) { diff --git a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart index 49b6578405d..f74a981d638 100644 --- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart +++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart @@ -187,6 +187,15 @@ void main() { '''); } + test_locate_DottedName_libraryDirective() async { + await resolveTestCode('library foo.bar;'); + var node = findNode.singleDottedName; + var element = ElementLocator.locate(node); + _assertElement(element, r''' + +'''); + } + test_locate_EnumConstantDeclaration() async { await resolveTestCode(r''' enum E { @@ -351,15 +360,6 @@ void f(int a) { '''); } - test_locate_Identifier_libraryDirective() async { - await resolveTestCode('library foo.bar;'); - var node = findNode.simple('foo'); - var element = ElementLocator.locate(node); - _assertElement(element, r''' - -'''); - } - test_locate_Identifier_propertyAccess() async { await resolveTestCode(r''' void main() { diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart index 2535882e2d2..62ee3cfdb82 100644 --- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart +++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/analysis/features.dart'; -import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/dart/ast/to_source_visitor.dart'; import 'package:analyzer/src/test_utilities/find_node.dart'; import 'package:test/test.dart'; @@ -68,6 +68,12 @@ class ToSourceVisitorTest extends ParserDiagnosticsTest { _assertSource(code, findNode.classDeclaration(code)); } + test_enum_emptyBody() { + var code = 'enum E;'; + var findNode = _parseStringToFindNode(code); + _assertSource(code, findNode.enumDeclaration(code)); + } + test_enum_primaryConstructor_named() { var code = 'enum const E.named(final int a) {}'; var findNode = _parseStringToFindNode(code); @@ -80,6 +86,12 @@ class ToSourceVisitorTest extends ParserDiagnosticsTest { _assertSource(code, findNode.enumDeclaration(code)); } + test_extension_emptyBody() { + var code = 'extension E on C;'; + var findNode = _parseStringToFindNode(code); + _assertSource(code, findNode.extensionDeclaration(code)); + } + test_extensionType_emptyBody() { var code = 'extension type A(int it);'; var findNode = _parseStringToFindNode(code); @@ -98,6 +110,12 @@ class ToSourceVisitorTest extends ParserDiagnosticsTest { _assertSource(code, findNode.extensionTypeDeclaration(code)); } + test_mixin_emptyBody() { + var code = 'mixin M;'; + var findNode = _parseStringToFindNode(code); + _assertSource(code, findNode.mixinDeclaration(code)); + } + void test_visitAdjacentStrings() { var findNode = _parseStringToFindNode(r''' var v = 'a' 'b'; @@ -1080,6 +1098,22 @@ void f () { _assertSource(code, findNode.doStatement(code)); } + void test_visitDottedName_multiple() { + var code = 'a.b.c'; + var findNode = _parseStringToFindNode(''' +library $code; +'''); + _assertSource(code, findNode.singleDottedName); + } + + void test_visitDottedName_single() { + var code = 'my'; + var findNode = _parseStringToFindNode(''' +library $code; +'''); + _assertSource(code, findNode.singleDottedName); + } + void test_visitDoubleLiteral() { var code = '3.14'; var findNode = _parseStringToFindNode(''' @@ -2342,22 +2376,6 @@ $code _assertSource(code, findNode.library(code)); } - void test_visitLibraryIdentifier_multiple() { - var code = 'a.b.c'; - var findNode = _parseStringToFindNode(''' -library $code; -'''); - _assertSource(code, findNode.libraryIdentifier(code)); - } - - void test_visitLibraryIdentifier_single() { - var code = 'my'; - var findNode = _parseStringToFindNode(''' -library $code; -'''); - _assertSource(code, findNode.libraryIdentifier(code)); - } - void test_visitListLiteral_complex() { var code = '[0, for (e in []) 0, if (b) 1, ...[0]]'; var findNode = _parseStringToFindNode(''' diff --git a/pkg/analyzer/test/src/dart/parser/enum_test.dart b/pkg/analyzer/test/src/dart/parser/enum_test.dart index 47f1e5f732f..141b4ed1954 100644 --- a/pkg/analyzer/test/src/dart/parser/enum_test.dart +++ b/pkg/analyzer/test/src/dart/parser/enum_test.dart @@ -30,7 +30,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -54,7 +54,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -79,7 +79,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -112,7 +112,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { semicolon: ; members @@ -131,6 +131,24 @@ EnumDeclaration '''); } + test_blockBody_empty() { + var parseResult = parseStringWithErrors(r''' +enum E {} +'''); + parseResult.assertNoErrors(); + + var node = parseResult.findNode.singleEnumDeclaration; + assertParsedNodeText(node, r''' +EnumDeclaration + enumKeyword: enum + namePart: NameWithTypeParameters + typeName: E + body: BlockEnumBody + leftBracket: { + rightBracket: } +'''); + } + test_constructor_factoryHead_named() { var parseResult = parseStringWithErrors(r''' enum E { @@ -417,24 +435,6 @@ ConstructorDeclaration '''); } - test_declaration_empty() { - var parseResult = parseStringWithErrors(r''' -enum E {} -'''); - parseResult.assertNoErrors(); - - var node = parseResult.findNode.singleEnumDeclaration; - assertParsedNodeText(node, r''' -EnumDeclaration - enumKeyword: enum - namePart: NameWithTypeParameters - typeName: E - body: EnumBody - leftBracket: { - rightBracket: } -'''); - } - test_declaration_noConstants_semicolon() { var parseResult = parseStringWithErrors(r''' enum E {;} @@ -447,7 +447,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { semicolon: ; rightBracket: } @@ -468,7 +468,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { semicolon: ; members @@ -487,6 +487,43 @@ EnumDeclaration '''); } + test_emptyBody() { + var parseResult = parseStringWithErrors(r''' +enum E; +'''); + parseResult.assertNoErrors(); + + var node = parseResult.findNode.singleEnumDeclaration; + assertParsedNodeText(node, r''' +EnumDeclaration + enumKeyword: enum + namePart: NameWithTypeParameters + typeName: E + body: EmptyEnumBody + semicolon: ; +'''); + } + + test_emptyBody_language310() { + var parseResult = parseStringWithErrors(r''' +// @dart = 3.10 +enum E; +'''); + parseResult.assertErrors([ + error(diag.experimentNotEnabledOffByDefault, 22, 1), + ]); + + var node = parseResult.findNode.singleEnumDeclaration; + assertParsedNodeText(node, r''' +EnumDeclaration + enumKeyword: enum + namePart: NameWithTypeParameters + typeName: E + body: EmptyEnumBody + semicolon: ; +'''); + } + test_nameWithTypeParameters_hasTypeParameters() { var parseResult = parseStringWithErrors(r''' enum E {v} @@ -507,7 +544,7 @@ EnumDeclaration TypeParameter name: U rightBracket: > - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -528,7 +565,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -564,7 +601,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -597,7 +634,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -625,7 +662,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -650,7 +687,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -673,7 +710,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -710,7 +747,7 @@ EnumDeclaration literal: 0 rightDelimiter: } rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -753,7 +790,7 @@ EnumDeclaration literal: 0 rightDelimiter: } rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -796,7 +833,7 @@ EnumDeclaration name: x rightParenthesis: ) rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -826,7 +863,7 @@ EnumDeclaration name: int name: a rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -862,7 +899,7 @@ EnumDeclaration name: int name: a rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -893,7 +930,7 @@ EnumDeclaration name: int name: it rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -932,7 +969,7 @@ EnumDeclaration name: int name: it rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -969,7 +1006,7 @@ EnumDeclaration name: int name: it rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1011,7 +1048,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1043,7 +1080,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1070,7 +1107,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1094,7 +1131,7 @@ EnumDeclaration formalParameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/dart/parser/export_directive_test.dart b/pkg/analyzer/test/src/dart/parser/export_directive_test.dart index 4492d0aacfe..9ac67ebeae8 100644 --- a/pkg/analyzer/test/src/dart/parser/export_directive_test.dart +++ b/pkg/analyzer/test/src/dart/parser/export_directive_test.dart @@ -69,13 +69,12 @@ ExportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - SimpleIdentifier - token: library - SimpleIdentifier - token: html + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'foo_html.dart' diff --git a/pkg/analyzer/test/src/dart/parser/extension_test.dart b/pkg/analyzer/test/src/dart/parser/extension_test.dart index 44787d909c6..707893776f6 100644 --- a/pkg/analyzer/test/src/dart/parser/extension_test.dart +++ b/pkg/analyzer/test/src/dart/parser/extension_test.dart @@ -185,6 +185,49 @@ ExtensionDeclaration '''); } + test_declaration_emptyBody() { + var parseResult = parseStringWithErrors(r''' +extension E on int; +'''); + parseResult.assertNoErrors(); + + var node = parseResult.findNode.singleExtensionDeclaration; + assertParsedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + body: EmptyClassBody + semicolon: ; +'''); + } + + test_emptyBody_language310() { + var parseResult = parseStringWithErrors(r''' +// @dart = 3.10 +extension E on int; +'''); + parseResult.assertErrors([ + error(diag.experimentNotEnabledOffByDefault, 34, 1), + ]); + + var node = parseResult.findNode.singleExtensionDeclaration; + assertParsedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + body: EmptyClassBody + semicolon: ; +'''); + } + test_primaryConstructorBody() { var parseResult = parseStringWithErrors(r''' extension A on int { diff --git a/pkg/analyzer/test/src/dart/parser/import_directive_test.dart b/pkg/analyzer/test/src/dart/parser/import_directive_test.dart index 4d0c20da7e7..b953996032f 100644 --- a/pkg/analyzer/test/src/dart/parser/import_directive_test.dart +++ b/pkg/analyzer/test/src/dart/parser/import_directive_test.dart @@ -69,13 +69,12 @@ ImportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - SimpleIdentifier - token: library - SimpleIdentifier - token: html + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'foo_html.dart' diff --git a/pkg/analyzer/test/src/dart/parser/mixin_test.dart b/pkg/analyzer/test/src/dart/parser/mixin_test.dart index 30f9c19aeaf..25d179ee11c 100644 --- a/pkg/analyzer/test/src/dart/parser/mixin_test.dart +++ b/pkg/analyzer/test/src/dart/parser/mixin_test.dart @@ -15,7 +15,28 @@ main() { @reflectiveTest class MixinDeclarationParserTest extends ParserDiagnosticsTest { - test_body_field() { + test_blockBody_constructor_named() { + var parseResult = parseStringWithErrors(r''' +mixin A { + A.named(); +} +'''); + parseResult.assertErrors([error(diag.mixinDeclaresConstructor, 12, 1)]); + + // Mixins cannot have constructors. + // So, we don't put them into AST at all. + var node = parseResult.findNode.singleMixinDeclaration; + assertParsedNodeText(node, r''' +MixinDeclaration + mixinKeyword: mixin + name: A + body: BlockClassBody + leftBracket: { + rightBracket: } +'''); + } + + test_blockBody_field() { var parseResult = parseStringWithErrors(r''' mixin M { static final int F = 0; @@ -47,7 +68,7 @@ MixinDeclaration '''); } - test_body_getter() { + test_blockBody_getter() { var parseResult = parseStringWithErrors(r''' mixin M { int get foo => 0; @@ -76,7 +97,7 @@ MixinDeclaration '''); } - test_body_method() { + test_blockBody_method() { var parseResult = parseStringWithErrors(r''' mixin M { void foo() {} @@ -106,7 +127,31 @@ MixinDeclaration '''); } - test_body_setter() { + test_blockBody_primaryConstructorBody() { + var parseResult = parseStringWithErrors(r''' +mixin A { + this; +} +'''); + parseResult.assertNoErrors(); + + var node = parseResult.findNode.singleMixinDeclaration; + assertParsedNodeText(node, r''' +MixinDeclaration + mixinKeyword: mixin + name: A + body: BlockClassBody + leftBracket: { + members + PrimaryConstructorBody + thisKeyword: this + body: EmptyFunctionBody + semicolon: ; + rightBracket: } +'''); + } + + test_blockBody_setter() { var parseResult = parseStringWithErrors(r''' mixin M { set foo(int _) {} @@ -139,32 +184,9 @@ MixinDeclaration '''); } - test_constructor_named() { + test_emptyBody() { var parseResult = parseStringWithErrors(r''' -mixin A { - A.named(); -} -'''); - parseResult.assertErrors([error(diag.mixinDeclaresConstructor, 12, 1)]); - - // Mixins cannot have constructors. - // So, we don't put them into AST at all. - var node = parseResult.findNode.singleMixinDeclaration; - assertParsedNodeText(node, r''' -MixinDeclaration - mixinKeyword: mixin - name: A - body: BlockClassBody - leftBracket: { - rightBracket: } -'''); - } - - test_primaryConstructorBody() { - var parseResult = parseStringWithErrors(r''' -mixin A { - this; -} +mixin M; '''); parseResult.assertNoErrors(); @@ -172,15 +194,28 @@ mixin A { assertParsedNodeText(node, r''' MixinDeclaration mixinKeyword: mixin - name: A - body: BlockClassBody - leftBracket: { - members - PrimaryConstructorBody - thisKeyword: this - body: EmptyFunctionBody - semicolon: ; - rightBracket: } + name: M + body: EmptyClassBody + semicolon: ; +'''); + } + + test_emptyBody_language310() { + var parseResult = parseStringWithErrors(r''' +// @dart = 3.10 +mixin M; +'''); + parseResult.assertErrors([ + error(diag.experimentNotEnabledOffByDefault, 23, 1), + ]); + + var node = parseResult.findNode.singleMixinDeclaration; + assertParsedNodeText(node, r''' +MixinDeclaration + mixinKeyword: mixin + name: M + body: EmptyClassBody + semicolon: ; '''); } } diff --git a/pkg/analyzer/test/src/dart/parser/part_of_directive_test.dart b/pkg/analyzer/test/src/dart/parser/part_of_directive_test.dart index 728471031c4..f867b19b26e 100644 --- a/pkg/analyzer/test/src/dart/parser/part_of_directive_test.dart +++ b/pkg/analyzer/test/src/dart/parser/part_of_directive_test.dart @@ -26,12 +26,11 @@ part of my.library; PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: my - SimpleIdentifier - token: library + libraryName: DottedName + tokens + my + . + library semicolon: ; '''); } @@ -48,12 +47,11 @@ part of my.library; PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: my - SimpleIdentifier - token: library + libraryName: DottedName + tokens + my + . + library semicolon: ; '''); } diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart index 06624e8cb18..7a4725dced0 100644 --- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart @@ -323,6 +323,49 @@ EnumConstantDeclaration '''); } + test_emptyBody() async { + await assertErrorsInCode( + r''' +enum E; +''', + [error(diag.enumWithoutConstants, 5, 1)], + ); + + var node = findNode.singleEnumDeclaration; + assertResolvedNodeText(node, r''' +EnumDeclaration + enumKeyword: enum + namePart: NameWithTypeParameters + typeName: E + body: EmptyEnumBody + semicolon: ; + declaredFragment: E@5 +'''); + } + + test_emptyBody_language310() async { + var code = r''' +// @dart = 3.10 +enum E; +'''; + + await assertErrorsInCode(code, [ + error(diag.enumWithoutConstants, 21, 1), + error(diag.experimentNotEnabledOffByDefault, 22, 1), + ]); + + var node = findNode.singleEnumDeclaration; + assertResolvedNodeText(node, r''' +EnumDeclaration + enumKeyword: enum + namePart: NameWithTypeParameters + typeName: E + body: EmptyEnumBody + semicolon: ; + declaredFragment: E@21 +'''); + } + test_field() async { await assertNoErrorsInCode(r''' enum E { @@ -592,7 +635,7 @@ EnumDeclaration declaredFragment: T@7 defaultType: int rightBracket: > - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -619,7 +662,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: A - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -670,7 +713,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function({int a}) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -734,7 +777,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function({required int a}) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -803,7 +846,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function(int Function(String)) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -853,7 +896,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function(int) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -906,7 +949,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function(int) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1051,7 +1094,7 @@ EnumDeclaration declaredFragment: named@10 element: ::@enum::A::@constructor::named type: A Function(T) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1116,7 +1159,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function(T) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1170,7 +1213,7 @@ EnumDeclaration declaredFragment: named@7 element: ::@enum::A::@constructor::named type: A Function(int) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1223,7 +1266,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function(int) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1419,7 +1462,7 @@ EnumDeclaration declaredFragment: new@null element: ::@enum::A::@constructor::new type: A Function(bool, bool) - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/dart/resolution/extension_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_test.dart new file mode 100644 index 00000000000..3be512e5a1d --- /dev/null +++ b/pkg/analyzer/test/src/dart/resolution/extension_test.dart @@ -0,0 +1,265 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag; +import 'package:test_reflective_loader/test_reflective_loader.dart'; + +import 'context_collection_resolution.dart'; +import 'node_text_expectations.dart'; + +main() { + defineReflectiveSuite(() { + defineReflectiveTests(ExtensionDeclarationResolutionTest); + defineReflectiveTests(UpdateNodeTextExpectations); + }); +} + +@reflectiveTest +class ExtensionDeclarationResolutionTest extends PubPackageResolutionTest { + test_blockBody_empty() async { + await assertNoErrorsInCode(r''' +extension E on int {} +'''); + + var node = findNode.singleExtensionDeclaration; + assertResolvedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + element: dart:core::@class::int + type: int + body: BlockClassBody + leftBracket: { + rightBracket: } + declaredFragment: E@10 +'''); + } + + test_blockBody_field() async { + await assertNoErrorsInCode(r''' +extension E on int { + static int f = 0; +} +'''); + + var node = findNode.singleExtensionDeclaration; + assertResolvedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + element: dart:core::@class::int + type: int + body: BlockClassBody + leftBracket: { + members + FieldDeclaration + staticKeyword: static + fields: VariableDeclarationList + type: NamedType + name: int + element: dart:core::@class::int + type: int + variables + VariableDeclaration + name: f + equals: = + initializer: IntegerLiteral + literal: 0 + staticType: int + declaredFragment: f@34 + semicolon: ; + declaredFragment: + rightBracket: } + declaredFragment: E@10 +'''); + } + + test_blockBody_getter() async { + await assertNoErrorsInCode(r''' +extension E on int { + int get g => 0; +} +'''); + + var node = findNode.singleExtensionDeclaration; + assertResolvedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + element: dart:core::@class::int + type: int + body: BlockClassBody + leftBracket: { + members + MethodDeclaration + returnType: NamedType + name: int + element: dart:core::@class::int + type: int + propertyKeyword: get + name: g + body: ExpressionFunctionBody + functionDefinition: => + expression: IntegerLiteral + literal: 0 + staticType: int + semicolon: ; + declaredFragment: g@31 + element: ::@extension::E::@getter::g + type: int Function() + rightBracket: } + declaredFragment: E@10 +'''); + } + + test_blockBody_method() async { + await assertNoErrorsInCode(r''' +extension E on int { + void m() {} +} +'''); + + var node = findNode.singleExtensionDeclaration; + assertResolvedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + element: dart:core::@class::int + type: int + body: BlockClassBody + leftBracket: { + members + MethodDeclaration + returnType: NamedType + name: void + element: + type: void + name: m + parameters: FormalParameterList + leftParenthesis: ( + rightParenthesis: ) + body: BlockFunctionBody + block: Block + leftBracket: { + rightBracket: } + declaredFragment: m@28 + element: ::@extension::E::@method::m + type: void Function() + rightBracket: } + declaredFragment: E@10 +'''); + } + + test_blockBody_setter() async { + await assertNoErrorsInCode(r''' +extension E on int { + set s(int v) {} +} +'''); + + var node = findNode.singleExtensionDeclaration; + assertResolvedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + element: dart:core::@class::int + type: int + body: BlockClassBody + leftBracket: { + members + MethodDeclaration + propertyKeyword: set + name: s + parameters: FormalParameterList + leftParenthesis: ( + parameter: SimpleFormalParameter + type: NamedType + name: int + element: dart:core::@class::int + type: int + name: v + declaredFragment: v@33 + element: isPublic + type: int + rightParenthesis: ) + body: BlockFunctionBody + block: Block + leftBracket: { + rightBracket: } + declaredFragment: s@27 + element: ::@extension::E::@setter::s + type: void Function(int) + rightBracket: } + declaredFragment: E@10 +'''); + } + + test_emptyBody() async { + await assertNoErrorsInCode(r''' +extension E on int; +'''); + + var node = findNode.singleExtensionDeclaration; + assertResolvedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + element: dart:core::@class::int + type: int + body: EmptyClassBody + semicolon: ; + declaredFragment: E@10 +'''); + } + + test_emptyBody_language310() async { + await assertErrorsInCode( + r''' +// @dart = 3.10 +extension E on int; +''', + [error(diag.experimentNotEnabledOffByDefault, 34, 1)], + ); + + var node = findNode.singleExtensionDeclaration; + assertResolvedNodeText(node, r''' +ExtensionDeclaration + extensionKeyword: extension + name: E + onClause: ExtensionOnClause + onKeyword: on + extendedType: NamedType + name: int + element: dart:core::@class::int + type: int + body: EmptyClassBody + semicolon: ; + declaredFragment: E@26 +'''); + } +} diff --git a/pkg/analyzer/test/src/dart/resolution/library_directive_test.dart b/pkg/analyzer/test/src/dart/resolution/library_directive_test.dart index faae5264884..701aa3ba910 100644 --- a/pkg/analyzer/test/src/dart/resolution/library_directive_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/library_directive_test.dart @@ -23,18 +23,11 @@ library foo.bar; assertResolvedNodeText(node, r''' LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: foo - element: - staticType: null - SimpleIdentifier - token: bar - element: - staticType: null - element: - staticType: null + name: DottedName + tokens + foo + . + bar semicolon: ; element: '''); diff --git a/pkg/analyzer/test/src/dart/resolution/library_export_test.dart b/pkg/analyzer/test/src/dart/resolution/library_export_test.dart index db123054864..e4611b1f927 100644 --- a/pkg/analyzer/test/src/dart/resolution/library_export_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/library_export_test.dart @@ -153,19 +153,12 @@ ExportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: html - element: - staticType: null + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_html.dart' @@ -175,19 +168,12 @@ ExportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: io - element: - staticType: null + tokens + dart + . + library + . + io rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_io.dart' @@ -227,19 +213,12 @@ ExportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: html - element: - staticType: null + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_html.dart' @@ -249,19 +228,12 @@ ExportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: io - element: - staticType: null + tokens + dart + . + library + . + io rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_io.dart' @@ -301,19 +273,12 @@ ExportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: html - element: - staticType: null + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_html.dart' @@ -323,19 +288,12 @@ ExportDirective ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: io - element: - staticType: null + tokens + dart + . + library + . + io rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_io.dart' diff --git a/pkg/analyzer/test/src/dart/resolution/library_import_test.dart b/pkg/analyzer/test/src/dart/resolution/library_import_test.dart index aecd0fe0d75..bef837e4e66 100644 --- a/pkg/analyzer/test/src/dart/resolution/library_import_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/library_import_test.dart @@ -165,19 +165,12 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: html - element: - staticType: null + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_html.dart' @@ -187,19 +180,12 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: io - element: - staticType: null + tokens + dart + . + library + . + io rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_io.dart' @@ -265,19 +251,12 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: html - element: - staticType: null + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_html.dart' @@ -287,19 +266,12 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: io - element: - staticType: null + tokens + dart + . + library + . + io rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_io.dart' @@ -349,11 +321,8 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: x - element: - staticType: null + tokens + x rightParenthesis: ) uri: SimpleStringLiteral literal: ':net' @@ -377,11 +346,8 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: x - element: - staticType: null + tokens + x rightParenthesis: ) uri: StringInterpolation elements @@ -415,11 +381,8 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: x - element: - staticType: null + tokens + x rightParenthesis: ) uri: SimpleStringLiteral literal: 'foo:bar' @@ -443,11 +406,8 @@ Configuration ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: x - element: - staticType: null + tokens + x rightParenthesis: ) uri: SimpleStringLiteral literal: 'a.dart' @@ -487,19 +447,12 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: html - element: - staticType: null + tokens + dart + . + library + . + html rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_html.dart' @@ -509,19 +462,12 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: dart - element: - staticType: null - SimpleIdentifier - token: library - element: - staticType: null - SimpleIdentifier - token: io - element: - staticType: null + tokens + dart + . + library + . + io rightParenthesis: ) uri: SimpleStringLiteral literal: 'a_io.dart' diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart index 5577ace5081..95d8114d2d1 100644 --- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart @@ -69,6 +69,43 @@ CommentReference '''); } + test_emptyBody() async { + await assertNoErrorsInCode(r''' +mixin M; +'''); + + var node = findNode.singleMixinDeclaration; + assertResolvedNodeText(node, r''' +MixinDeclaration + mixinKeyword: mixin + name: M + body: EmptyClassBody + semicolon: ; + declaredFragment: M@6 +'''); + } + + test_emptyBody_language310() async { + var code = r''' +// @dart = 3.10 +mixin M; +'''; + + await assertErrorsInCode(code, [ + error(diag.experimentNotEnabledOffByDefault, 23, 1), + ]); + + var node = findNode.singleMixinDeclaration; + assertResolvedNodeText(node, r''' +MixinDeclaration + mixinKeyword: mixin + name: M + body: EmptyClassBody + semicolon: ; + declaredFragment: M@22 +'''); + } + test_field() async { await assertNoErrorsInCode(r''' mixin M { diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart index 3a3afd31e6a..8ba4e7d68f2 100644 --- a/pkg/analyzer/test/src/dart/resolution/test_all.dart +++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart @@ -33,6 +33,7 @@ import 'dot_shorthand_property_access_test.dart' import 'enum_test.dart' as enum_resolution; import 'extension_method_test.dart' as extension_method; import 'extension_override_test.dart' as extension_override; +import 'extension_test.dart' as extension_resolution; import 'extension_type_test.dart' as extension_type; import 'field_formal_parameter_test.dart' as field_formal_parameter; import 'field_promotion_test.dart' as field_promotion; @@ -149,6 +150,7 @@ main() { enum_resolution.main(); extension_method.main(); extension_override.main(); + extension_resolution.main(); extension_type.main(); field_formal_parameter.main(); field_promotion.main(); diff --git a/pkg/analyzer/test/src/fasta/ast_builder_test.dart b/pkg/analyzer/test/src/fasta/ast_builder_test.dart index 8fd97db6d74..45bca83e1de 100644 --- a/pkg/analyzer/test/src/fasta/ast_builder_test.dart +++ b/pkg/analyzer/test/src/fasta/ast_builder_test.dart @@ -129,8 +129,7 @@ ClassDeclaration expression: SimpleIdentifier token: String @5 tokens - /** [String] */ - offset: 0 + /** [String] */ @0 abstractKeyword: abstract @16 classKeyword: class @25 namePart: NameWithTypeParameters @@ -165,10 +164,8 @@ ClassDeclaration expression: SimpleIdentifier token: Object @36 tokens - /// See [int] and [String] - offset: 0 - /// and [Object]. - offset: 27 + /// See [int] and [String] @0 + /// and [Object]. @27 metadata Annotation atSign: @ @45 @@ -217,18 +214,12 @@ ClassDeclaration expression: SimpleIdentifier token: Object @240 tokens - /// This dartdoc comment is [included]. - offset: 57 - /// See [int] and [String] but `not [a]` - offset: 134 - /// ``` - offset: 175 - /// This [code] block should be ignored - offset: 183 - /// ``` - offset: 223 - /// and [Object]. - offset: 231 + /// This dartdoc comment is [included]. @57 + /// See [int] and [String] but `not [a]` @134 + /// ``` @175 + /// This [code] block should be ignored @183 + /// ``` @223 + /// and [Object]. @231 codeBlocks MdCodeBlock infoString: @@ -947,7 +938,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1132,7 +1123,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1153,7 +1144,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1174,7 +1165,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1197,7 +1188,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1220,7 +1211,7 @@ EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1290,14 +1281,13 @@ library name.and.dots; assertParsedNodeText(node, r''' LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: name - SimpleIdentifier - token: and - SimpleIdentifier - token: dots + name: DottedName + tokens + name + . + and + . + dots semicolon: ; '''); } diff --git a/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart b/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart index 656a0dfd03a..8efb334b8e0 100644 --- a/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart @@ -420,10 +420,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: foo + libraryName: DottedName + tokens + foo semicolon: ; declarations ClassDeclaration @@ -453,10 +452,9 @@ CompilationUnit semicolon: ; LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -478,10 +476,9 @@ CompilationUnit semicolon: ; LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } @@ -503,10 +500,9 @@ CompilationUnit semicolon: ; LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: l + name: DottedName + tokens + l semicolon: ; '''); } diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart index 37c71e4cd3f..716b6994e05 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart @@ -2163,7 +2163,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart index 06d5485447d..b9dd99cca6d 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart @@ -119,7 +119,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -541,7 +541,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -975,7 +975,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1415,7 +1415,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1845,7 +1845,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2268,7 +2268,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2669,7 +2669,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3070,7 +3070,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3513,7 +3513,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3974,7 +3974,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4435,7 +4435,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4893,7 +4893,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5369,7 +5369,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5890,7 +5890,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -6388,7 +6388,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -6837,7 +6837,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -7250,7 +7250,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -7669,7 +7669,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -8106,7 +8106,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -8521,7 +8521,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -8882,7 +8882,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -9250,7 +9250,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart index f353acd560b..e93723e963c 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart @@ -34,7 +34,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -69,7 +69,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -107,7 +107,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -119,7 +119,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -144,7 +144,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -170,7 +170,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -207,7 +207,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -245,7 +245,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -284,7 +284,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -321,7 +321,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -358,7 +358,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -400,7 +400,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -449,7 +449,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -480,7 +480,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -509,7 +509,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -541,7 +541,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -551,7 +551,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -573,7 +573,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -595,7 +595,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -627,7 +627,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -661,7 +661,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -695,7 +695,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -728,7 +728,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -756,7 +756,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -791,7 +791,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -831,7 +831,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -863,7 +863,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -897,7 +897,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -934,7 +934,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -946,7 +946,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -971,7 +971,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -998,7 +998,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1035,7 +1035,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1074,7 +1074,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1113,7 +1113,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1151,7 +1151,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1184,7 +1184,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1224,7 +1224,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1269,7 +1269,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1300,7 +1300,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1331,7 +1331,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1365,7 +1365,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1377,7 +1377,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1399,7 +1399,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1423,7 +1423,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1457,7 +1457,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1493,7 +1493,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1529,7 +1529,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1564,7 +1564,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1594,7 +1594,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1631,7 +1631,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1673,7 +1673,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1707,7 +1707,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } ClassDeclaration @@ -1739,7 +1739,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: a - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } '''); @@ -1761,14 +1761,14 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1793,7 +1793,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } '''); @@ -1815,7 +1815,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -1844,7 +1844,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: int - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } '''); @@ -1866,7 +1866,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -1897,7 +1897,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: int - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -1928,7 +1928,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } MixinDeclaration @@ -1956,7 +1956,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -1991,7 +1991,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } GenericTypeAlias @@ -2031,7 +2031,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -2060,7 +2060,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2092,7 +2092,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2127,7 +2127,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2137,7 +2137,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2159,7 +2159,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } '''); @@ -2181,7 +2181,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2213,7 +2213,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2248,7 +2248,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2282,7 +2282,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2316,7 +2316,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2348,7 +2348,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2387,7 +2387,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2433,7 +2433,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2462,7 +2462,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } ClassDeclaration @@ -2488,7 +2488,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -2517,14 +2517,14 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2546,7 +2546,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } '''); @@ -2565,7 +2565,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -2594,7 +2594,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -2625,7 +2625,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -2656,7 +2656,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -2686,7 +2686,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } MixinDeclaration @@ -2711,7 +2711,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -2743,7 +2743,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } GenericTypeAlias @@ -2780,7 +2780,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -2806,7 +2806,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } ClassDeclaration @@ -2832,7 +2832,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -2861,14 +2861,14 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2890,7 +2890,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } '''); @@ -2909,7 +2909,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -2938,7 +2938,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -2969,7 +2969,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -3000,7 +3000,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -3030,7 +3030,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } MixinDeclaration @@ -3055,7 +3055,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } FunctionDeclaration @@ -3087,7 +3087,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } GenericTypeAlias @@ -3124,7 +3124,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } TopLevelVariableDeclaration @@ -3150,7 +3150,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3179,7 +3179,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3211,7 +3211,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3221,7 +3221,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3243,7 +3243,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3265,7 +3265,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3297,7 +3297,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3331,7 +3331,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3365,7 +3365,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3398,7 +3398,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3426,7 +3426,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3461,7 +3461,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3501,7 +3501,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3533,7 +3533,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3555,7 +3555,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { rightBracket: } '''); diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart index b1e3c511a24..d696d093a39 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart @@ -89,7 +89,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -513,7 +513,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1041,7 +1041,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1584,7 +1584,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2095,7 +2095,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2606,7 +2606,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3170,7 +3170,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3630,7 +3630,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4158,7 +4158,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4701,7 +4701,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5236,7 +5236,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5809,7 +5809,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -6278,7 +6278,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/extension_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/extension_declaration_test.dart index 6a7e8d9f197..f3612b5fc8b 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/extension_declaration_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/extension_declaration_test.dart @@ -101,7 +101,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -490,7 +490,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -883,7 +883,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1304,7 +1304,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart index 4c27616eb5d..c8b82860d51 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart @@ -107,7 +107,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -566,7 +566,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -963,7 +963,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1310,9 +1310,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1351,9 +1350,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1395,9 +1393,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1408,7 +1405,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1439,9 +1436,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1472,9 +1468,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1510,9 +1505,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1554,9 +1548,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1600,9 +1593,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1646,9 +1638,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1691,9 +1682,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1729,9 +1719,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1769,9 +1758,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1807,9 +1795,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1854,9 +1841,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1906,9 +1892,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1946,9 +1931,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -1986,9 +1970,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2029,9 +2012,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2042,7 +2024,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2072,9 +2054,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2104,9 +2085,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2141,9 +2121,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2184,9 +2163,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2229,9 +2207,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2274,9 +2251,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2318,9 +2294,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2355,9 +2330,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2394,9 +2368,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2431,9 +2404,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2477,9 +2449,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2528,9 +2499,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -2569,9 +2539,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2613,9 +2582,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2660,9 +2628,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2676,7 +2643,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2707,9 +2674,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2743,9 +2709,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2784,9 +2749,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2831,9 +2795,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2880,9 +2843,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2929,9 +2891,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -2977,9 +2938,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -3018,9 +2978,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -3061,9 +3020,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -3102,9 +3060,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -3152,9 +3109,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -3207,9 +3163,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b equalToken: == value: SimpleStringLiteral literal: "" @@ -3251,9 +3206,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3292,9 +3246,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3336,9 +3289,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3349,7 +3301,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3380,9 +3332,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3413,9 +3364,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3451,9 +3401,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3495,9 +3444,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3541,9 +3489,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3587,9 +3534,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3632,9 +3578,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3670,9 +3615,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3710,9 +3654,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3748,9 +3691,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3795,9 +3737,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3847,9 +3788,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: b + tokens + b rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3889,9 +3829,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3931,9 +3870,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3976,9 +3914,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -3989,7 +3926,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4021,9 +3958,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4055,9 +3991,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4094,9 +4029,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4138,9 +4072,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: int + tokens + int rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4183,9 +4116,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4229,9 +4161,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: int + tokens + int rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4273,9 +4204,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4312,9 +4242,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4353,9 +4282,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4391,9 +4319,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: set + tokens + set rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4438,9 +4365,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4491,9 +4417,8 @@ CompilationUnit ifKeyword: if leftParenthesis: ( name: DottedName - components - SimpleIdentifier - token: + tokens + rightParenthesis: ) uri: SimpleStringLiteral literal: "" @@ -4591,7 +4516,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5051,7 +4976,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart index 8f802d44f0a..481f245a132 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart @@ -31,10 +31,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations ClassDeclaration @@ -61,10 +60,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations TopLevelVariableDeclaration @@ -94,17 +92,16 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -127,10 +124,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; '''); } @@ -149,10 +145,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; ExportDirective exportKeyword: export @@ -176,10 +171,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations TopLevelVariableDeclaration @@ -206,10 +200,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: int + name: DottedName + tokens + int semicolon: ; declarations FunctionDeclaration @@ -239,10 +232,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations FunctionDeclaration @@ -271,10 +263,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: int + name: DottedName + tokens + int semicolon: ; declarations FunctionDeclaration @@ -303,10 +294,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; ImportDirective importKeyword: import @@ -330,10 +320,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations MixinDeclaration @@ -359,10 +348,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; PartDirective partKeyword: part @@ -386,10 +374,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations FunctionDeclaration @@ -422,10 +409,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations GenericTypeAlias @@ -463,10 +449,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: + name: DottedName + tokens + semicolon: ; declarations TopLevelVariableDeclaration @@ -490,10 +475,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations ClassDeclaration @@ -517,10 +501,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations TopLevelVariableDeclaration @@ -547,17 +530,16 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -577,10 +559,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; '''); } @@ -596,10 +577,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; ExportDirective exportKeyword: export @@ -620,10 +600,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations TopLevelVariableDeclaration @@ -650,10 +629,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -682,10 +660,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -714,10 +691,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -745,10 +721,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; ImportDirective importKeyword: import @@ -769,10 +744,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations MixinDeclaration @@ -795,10 +769,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; PartDirective partKeyword: part @@ -819,10 +792,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -852,10 +824,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations GenericTypeAlias @@ -890,10 +861,9 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib + name: DottedName + tokens + lib semicolon: ; declarations TopLevelVariableDeclaration @@ -920,12 +890,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations ClassDeclaration @@ -952,12 +921,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations TopLevelVariableDeclaration @@ -987,19 +955,18 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1022,12 +989,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; '''); } @@ -1046,12 +1012,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; ExportDirective exportKeyword: export @@ -1075,12 +1040,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations TopLevelVariableDeclaration @@ -1107,12 +1071,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: int + name: DottedName + tokens + lib + . + int semicolon: ; declarations FunctionDeclaration @@ -1142,12 +1105,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations FunctionDeclaration @@ -1176,12 +1138,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: int + name: DottedName + tokens + lib + . + int semicolon: ; declarations FunctionDeclaration @@ -1210,12 +1171,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; ImportDirective importKeyword: import @@ -1239,12 +1199,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations MixinDeclaration @@ -1270,12 +1229,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; PartDirective partKeyword: part @@ -1299,12 +1257,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations FunctionDeclaration @@ -1337,12 +1294,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations GenericTypeAlias @@ -1380,12 +1336,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + name: DottedName + tokens + lib + . + semicolon: ; declarations TopLevelVariableDeclaration @@ -1409,12 +1364,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations ClassDeclaration @@ -1438,12 +1392,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations TopLevelVariableDeclaration @@ -1470,19 +1423,18 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1502,12 +1454,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; '''); } @@ -1523,12 +1474,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; ExportDirective exportKeyword: export @@ -1549,12 +1499,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations TopLevelVariableDeclaration @@ -1581,12 +1530,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1615,12 +1563,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1649,12 +1596,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1682,12 +1628,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; ImportDirective importKeyword: import @@ -1708,12 +1653,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations MixinDeclaration @@ -1736,12 +1680,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; PartDirective partKeyword: part @@ -1762,12 +1705,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1797,12 +1739,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations GenericTypeAlias @@ -1837,12 +1778,11 @@ CompilationUnit directives LibraryDirective libraryKeyword: library - name: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + name: DottedName + tokens + lib + . + a semicolon: ; declarations TopLevelVariableDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart index 13ff52a3c3a..3bd8e004cc6 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart @@ -116,7 +116,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -542,7 +542,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -965,7 +965,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1366,7 +1366,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1773,7 +1773,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2198,7 +2198,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2594,7 +2594,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2943,7 +2943,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3299,7 +3299,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3700,7 +3700,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4101,7 +4101,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4535,7 +4535,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4960,7 +4960,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5394,7 +5394,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5855,7 +5855,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart index aba4875c4db..8a668fba702 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart @@ -89,7 +89,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -451,7 +451,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -834,7 +834,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart index 77df8c221e2..72b03e26841 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart @@ -92,7 +92,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -444,7 +444,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -521,10 +521,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: int + libraryName: DottedName + tokens + int semicolon: ; declarations FunctionDeclaration @@ -589,10 +588,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: int + libraryName: DottedName + tokens + int semicolon: ; declarations FunctionDeclaration @@ -623,10 +621,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: + libraryName: DottedName + tokens + semicolon: ; declarations MixinDeclaration @@ -654,10 +651,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: + libraryName: DottedName + tokens + semicolon: ; declarations FunctionDeclaration @@ -692,10 +688,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: + libraryName: DottedName + tokens + semicolon: ; declarations GenericTypeAlias @@ -763,10 +758,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations ClassDeclaration @@ -794,10 +788,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations TopLevelVariableDeclaration @@ -828,17 +821,16 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -862,10 +854,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; '''); } @@ -885,10 +876,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations TopLevelVariableDeclaration @@ -919,10 +909,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -955,10 +944,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -991,10 +979,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -1026,10 +1013,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations MixinDeclaration @@ -1056,10 +1042,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations FunctionDeclaration @@ -1093,10 +1078,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations GenericTypeAlias @@ -1135,10 +1119,9 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib + libraryName: DottedName + tokens + lib semicolon: ; declarations TopLevelVariableDeclaration @@ -1167,12 +1150,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations ClassDeclaration @@ -1201,12 +1183,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations TopLevelVariableDeclaration @@ -1238,19 +1219,18 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1275,12 +1255,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; '''); } @@ -1301,12 +1280,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations TopLevelVariableDeclaration @@ -1337,12 +1315,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: int + libraryName: DottedName + tokens + lib + . + int semicolon: ; declarations FunctionDeclaration @@ -1374,12 +1351,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations FunctionDeclaration @@ -1412,12 +1388,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: int + libraryName: DottedName + tokens + lib + . + int semicolon: ; declarations FunctionDeclaration @@ -1448,12 +1423,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations MixinDeclaration @@ -1481,12 +1455,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations FunctionDeclaration @@ -1521,12 +1494,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations GenericTypeAlias @@ -1566,12 +1538,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: + libraryName: DottedName + tokens + lib + . + semicolon: ; declarations TopLevelVariableDeclaration @@ -1599,12 +1570,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations ClassDeclaration @@ -1632,12 +1602,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations TopLevelVariableDeclaration @@ -1668,19 +1637,18 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations EnumDeclaration enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1704,12 +1672,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; '''); } @@ -1729,12 +1696,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations TopLevelVariableDeclaration @@ -1765,12 +1731,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1803,12 +1768,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1841,12 +1805,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1878,12 +1841,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations MixinDeclaration @@ -1910,12 +1872,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations FunctionDeclaration @@ -1949,12 +1910,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations GenericTypeAlias @@ -1993,12 +1953,11 @@ CompilationUnit PartOfDirective partKeyword: part ofKeyword: of - libraryName: LibraryIdentifier - components - SimpleIdentifier - token: lib - SimpleIdentifier - token: a + libraryName: DottedName + tokens + lib + . + a semicolon: ; declarations TopLevelVariableDeclaration @@ -2086,7 +2045,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart index 08847cbac73..6735231d081 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart @@ -91,7 +91,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -422,7 +422,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -781,7 +781,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1166,7 +1166,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1534,7 +1534,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1917,7 +1917,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2326,7 +2326,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -2696,7 +2696,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3017,7 +3017,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3367,7 +3367,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -3735,7 +3735,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4089,7 +4089,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4451,7 +4451,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -4782,7 +4782,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -5557,7 +5557,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart index ed2e53edeb0..2260f756b8e 100644 --- a/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart +++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart @@ -101,7 +101,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -474,7 +474,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -844,7 +844,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration @@ -1229,7 +1229,7 @@ CompilationUnit enumKeyword: enum namePart: NameWithTypeParameters typeName: E - body: EnumBody + body: BlockEnumBody leftBracket: { constants EnumConstantDeclaration diff --git a/pkg/analyzer/test/src/summary/elements/const_test.dart b/pkg/analyzer/test/src/summary/elements/const_test.dart index 4407fa7b868..48ac88bc704 100644 --- a/pkg/analyzer/test/src/summary/elements/const_test.dart +++ b/pkg/analyzer/test/src/summary/elements/const_test.dart @@ -8801,12 +8801,9 @@ library SymbolLiteral poundSign: # @382 components - aaa - offset: 383 - bbb - offset: 387 - ccc - offset: 391 + aaa @383 + bbb @387 + ccc @391 getters #F14 isOriginVariable vNull (nameOffset:) (firstTokenOffset:) (offset:6) element: ::@getter::vNull diff --git a/pkg/analyzer/test/src/summary/elements/enum_test.dart b/pkg/analyzer/test/src/summary/elements/enum_test.dart index 970ca40a9f9..3132b75c5b3 100644 --- a/pkg/analyzer/test/src/summary/elements/enum_test.dart +++ b/pkg/analyzer/test/src/summary/elements/enum_test.dart @@ -178,6 +178,119 @@ library '''); } + test_emptyBody() async { + var library = await buildLibrary(r''' +enum E; +'''); + checkElementText(library, r''' +library + reference: + fragments + #F0 + element: + enums + #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5) + element: ::@enum::E + fields + #F2 isOriginEnumValues values (nameOffset:) (firstTokenOffset:) (offset:5) + element: ::@enum::E::@field::values + initializer: expression_0 + ListLiteral + leftBracket: [ @0 + rightBracket: ] @0 + staticType: List + constructors + #F3 const isOriginImplicitDefault new (nameOffset:) (firstTokenOffset:) (offset:5) + element: ::@enum::E::@constructor::new + typeName: E + getters + #F4 isOriginVariable values (nameOffset:) (firstTokenOffset:) (offset:5) + element: ::@enum::E::@getter::values + enums + enum E + reference: ::@enum::E + firstFragment: #F1 + supertype: Enum + fields + static const isOriginEnumValues values + reference: ::@enum::E::@field::values + firstFragment: #F2 + type: List + constantInitializer + fragment: #F2 + expression: expression_0 + getter: ::@enum::E::@getter::values + constructors + const isOriginImplicitDefault new + reference: ::@enum::E::@constructor::new + firstFragment: #F3 + superConstructor: dart:core::@class::Enum::@constructor::new + getters + static isOriginVariable values + reference: ::@enum::E::@getter::values + firstFragment: #F4 + returnType: List + variable: ::@enum::E::@field::values +'''); + } + + test_emptyBody_language310() async { + var library = await buildLibrary(r''' +// @dart = 3.10 +enum E; +'''); + checkElementText(library, r''' +library + reference: + fragments + #F0 + element: + enums + #F1 enum E (nameOffset:21) (firstTokenOffset:16) (offset:21) + element: ::@enum::E + fields + #F2 isOriginEnumValues values (nameOffset:) (firstTokenOffset:) (offset:21) + element: ::@enum::E::@field::values + initializer: expression_0 + ListLiteral + leftBracket: [ @0 + rightBracket: ] @0 + staticType: List + constructors + #F3 const isOriginImplicitDefault new (nameOffset:) (firstTokenOffset:) (offset:21) + element: ::@enum::E::@constructor::new + typeName: E + getters + #F4 isOriginVariable values (nameOffset:) (firstTokenOffset:) (offset:21) + element: ::@enum::E::@getter::values + enums + enum E + reference: ::@enum::E + firstFragment: #F1 + supertype: Enum + fields + static const isOriginEnumValues values + reference: ::@enum::E::@field::values + firstFragment: #F2 + type: List + constantInitializer + fragment: #F2 + expression: expression_0 + getter: ::@enum::E::@getter::values + constructors + const isOriginImplicitDefault new + reference: ::@enum::E::@constructor::new + firstFragment: #F3 + superConstructor: dart:core::@class::Enum::@constructor::new + getters + static isOriginVariable values + reference: ::@enum::E::@getter::values + firstFragment: #F4 + returnType: List + variable: ::@enum::E::@field::values +'''); + } + test_enum_constant_arguments_symbolLiteral() async { var library = await buildLibrary(r''' enum E { @@ -211,10 +324,8 @@ library SymbolLiteral poundSign: # @13 components - foo - offset: 14 - bar - offset: 18 + foo @14 + bar @18 rightParenthesis: ) @21 staticType: E #F3 isOriginEnumValues values (nameOffset:) (firstTokenOffset:) (offset:5) @@ -18347,7 +18458,6 @@ augment enum A {; augment const A.named(); } '''); - checkElementText(library, r''' library reference: @@ -18565,7 +18675,7 @@ library test_inferTypes_method_ofAugment() async { newFile('$testPackageLibPath/a.dart', r''' -abstract class A { +class A { int foo(String a); } '''); diff --git a/pkg/analyzer/test/src/summary/elements/extension_test.dart b/pkg/analyzer/test/src/summary/elements/extension_test.dart index 12c44e1ffd9..412862a9c15 100644 --- a/pkg/analyzer/test/src/summary/elements/extension_test.dart +++ b/pkg/analyzer/test/src/summary/elements/extension_test.dart @@ -19,6 +19,51 @@ main() { } abstract class ExtensionElementTest extends ElementsBaseTest { + test_emptyBody() async { + var library = await buildLibrary(r''' +extension E on int; +'''); + checkElementText(library, r''' +library + reference: + fragments + #F0 + element: + extensions + #F1 extension E (nameOffset:10) (firstTokenOffset:0) (offset:10) + element: ::@extension::E + extensions + extension E + reference: ::@extension::E + firstFragment: #F1 + extendedType: int + onDeclaration: dart:core::@class::int +'''); + } + + test_emptyBody_language310() async { + var library = await buildLibrary(r''' +// @dart = 3.10 +extension E on int; +'''); + checkElementText(library, r''' +library + reference: + fragments + #F0 + element: + extensions + #F1 extension E (nameOffset:26) (firstTokenOffset:16) (offset:26) + element: ::@extension::E + extensions + extension E + reference: ::@extension::E + firstFragment: #F1 + extendedType: int + onDeclaration: dart:core::@class::int +'''); + } + test_extendedType_recordType() async { var library = await buildLibrary(''' extension E on (int, String) {} diff --git a/pkg/analyzer/test/src/summary/elements/mixin_test.dart b/pkg/analyzer/test/src/summary/elements/mixin_test.dart index 91a34ca7ab2..76fd03fa442 100644 --- a/pkg/analyzer/test/src/summary/elements/mixin_test.dart +++ b/pkg/analyzer/test/src/summary/elements/mixin_test.dart @@ -525,6 +525,51 @@ library '''); } + test_mixin_emptyBody() async { + var library = await buildLibrary(r''' +mixin M; +'''); + checkElementText(library, r''' +library + reference: + fragments + #F0 + element: + mixins + #F1 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6) + element: ::@mixin::M + mixins + mixin M + reference: ::@mixin::M + firstFragment: #F1 + superclassConstraints + Object +'''); + } + + test_mixin_emptyBody_language310() async { + var library = await buildLibrary(r''' +// @dart = 3.10 +mixin M; +'''); + checkElementText(library, r''' +library + reference: + fragments + #F0 + element: + mixins + #F1 mixin M (nameOffset:22) (firstTokenOffset:16) (offset:22) + element: ::@mixin::M + mixins + mixin M + reference: ::@mixin::M + firstFragment: #F1 + superclassConstraints + Object +'''); + } + test_mixin_field_inferredType() async { var library = await buildLibrary(''' mixin M { diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart index f086dc39421..5b859798c5d 100644 --- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart +++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart @@ -163,6 +163,14 @@ class ResolvedAstPrinter extends ThrowingAstVisitor { }); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + _sink.writeln('BlockEnumBody'); + _sink.withIndent(() { + _writeNamedChildEntities(node); + }); + } + @override void visitBlockFunctionBody(BlockFunctionBody node) { _sink.writeln('BlockFunctionBody'); @@ -509,6 +517,14 @@ class ResolvedAstPrinter extends ThrowingAstVisitor { }); } + @override + void visitEmptyEnumBody(EmptyEnumBody node) { + _sink.writeln('EmptyEnumBody'); + _sink.withIndent(() { + _writeNamedChildEntities(node); + }); + } + @override void visitEmptyFunctionBody(EmptyFunctionBody node) { _sink.writeln('EmptyFunctionBody'); @@ -525,14 +541,6 @@ class ResolvedAstPrinter extends ThrowingAstVisitor { }); } - @override - void visitEnumBody(EnumBody node) { - _sink.writeln('EnumBody'); - _sink.withIndent(() { - _writeNamedChildEntities(node); - }); - } - @override void visitEnumConstantArguments(EnumConstantArguments node) { _checkChildrenEntitiesLinking(node); @@ -976,16 +984,6 @@ class ResolvedAstPrinter extends ThrowingAstVisitor { }); } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - _sink.writeln('LibraryIdentifier'); - _sink.withIndent(() { - _writeNamedChildEntities(node); - _writeElement('element', node.element); - _writeType('staticType', node.staticType); - }); - } - @override void visitListLiteral(ListLiteral node) { _sink.writeln('ListLiteral'); @@ -2016,10 +2014,6 @@ Expected parent: (${parent.runtimeType}) $parent } } - void _writeOffset(String name, int offset) { - _sink.writelnWithIndent('$name: $offset'); - } - /// If [node] is at a position where it is an argument for an invocation, /// writes the corresponding parameter element. void _writeParameterElement(Expression node) { @@ -2070,25 +2064,49 @@ Expected parent: (${parent.runtimeType}) $parent _sink.writeIndentedLine(() { _sink.write('$name: '); - if (configuration.withTokenPreviousNext) { - _sink.write(_getTokenId(token)); - _sink.write(' '); - } - _sink.write(token.lexeme.ifNotEmptyOrElse('')); - if (_withOffsets) { - _sink.write(' @${token.offset}'); - } - if (token.isSynthetic) { - _sink.write(' '); - } + _writeTokenItem(token); }); + _writeTokenPreviousNext(token); + } + + void _writeTokenItem(Token token) { + if (configuration.withTokenPreviousNext) { + _sink.write(_getTokenId(token)); + _sink.write(' '); + } + _sink.write(token.lexeme.ifNotEmptyOrElse('')); + if (_withOffsets) { + _sink.write(' @${token.offset}'); + } + if (token.isSynthetic) { + _sink.write(' '); + } + } + + void _writeTokenList(String name, List tokens) { + if (tokens.isNotEmpty) { + _sink.writelnWithIndent(name); + _sink.withIndent(() { + for (var token in tokens) { + _sink.writeIndentedLine(() { + _writeTokenItem(token); + }); + _writeTokenPreviousNext(token); + } + }); + } + } + + void _writeTokenPreviousNext(Token token) { if (configuration.withTokenPreviousNext) { _sink.withIndent(() { if (token.previous case var previous?) { if (!previous.isEof) { if (_tokenIdMap[previous] == null) { - _writeToken('previousX', previous); + _sink.withIndent(() { + _writeToken('previousX', previous); + }); } else { _sink.writelnWithIndent( 'previous: ${_getTokenId(previous)} |${previous.lexeme}|', @@ -2110,22 +2128,6 @@ Expected parent: (${parent.runtimeType}) $parent } } - void _writeTokenList(String name, List tokens) { - if (tokens.isNotEmpty) { - _sink.writelnWithIndent(name); - _sink.withIndent(() { - for (var token in tokens) { - _sink.writelnWithIndent(token.lexeme); - if (_withOffsets) { - _sink.withIndent(() { - _writeOffset('offset', token.offset); - }); - } - } - }); - } - } - void _writeType(String name, DartType? type) { if (_withResolution) { _elementPrinter.writeNamedType(name, type); diff --git a/pkg/analyzer/test/util/ast_type_matchers.dart b/pkg/analyzer/test/util/ast_type_matchers.dart index ce4863f2573..c5cc19d04e5 100644 --- a/pkg/analyzer/test/util/ast_type_matchers.dart +++ b/pkg/analyzer/test/util/ast_type_matchers.dart @@ -169,8 +169,6 @@ const isLabeledStatement = TypeMatcher(); const isLibraryDirective = TypeMatcher(); -const isLibraryIdentifier = TypeMatcher(); - const isListLiteral = TypeMatcher(); const isLiteral = TypeMatcher(); diff --git a/pkg/analyzer/tool/generators/ast_generator.dart b/pkg/analyzer/tool/generators/ast_generator.dart index 18bee120234..dcd7e26105e 100644 --- a/pkg/analyzer/tool/generators/ast_generator.dart +++ b/pkg/analyzer/tool/generators/ast_generator.dart @@ -252,7 +252,9 @@ if (Token.lexicallyFirst($names) case var result?) { break propertiesLoop; } case _PropertyTypeKindTokenList(): - throw UnimplementedError(); + buffer.write('return ${property.name}.first;'); + foundNonNullProperty = true; + break propertiesLoop; case _PropertyTypeKindNode(): if (property.isNullable) { buffer.writeln( diff --git a/pkg/analyzer_plugin/CHANGELOG.md b/pkg/analyzer_plugin/CHANGELOG.md index 0f0cf1e4e7c..2d9af86e177 100644 --- a/pkg/analyzer_plugin/CHANGELOG.md +++ b/pkg/analyzer_plugin/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.14.7-dev + +- Require version `^12.0.0-0` of the `analyzer` package. + ## 0.14.6-dev - Require version `11.1.0-dev` of the `analyzer` package. diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart index 4c74bb6bafa..687a2248312 100644 --- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart +++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart @@ -3086,12 +3086,22 @@ class _InsertionPreparer { final declaration = _declaration; if (declaration is EnumDeclaration) { // After the last enum value. - var semicolon = declaration.body.semicolon; + Token? semicolon; + var hasConstants = false; + EnumConstantDeclaration? lastConstant; + var body = declaration.body; + if (body is BlockEnumBody) { + semicolon = body.semicolon; + hasConstants = body.constants.isNotEmpty; + lastConstant = body.constants.lastOrNull; + } else if (body is EmptyEnumBody) { + semicolon = body.semicolon; + } + if (semicolon != null) { return semicolon.end; - } else if (declaration.body.constants.isNotEmpty) { - var lastConstant = declaration.body.constants.last; - return lastConstant.end; + } else if (hasConstants) { + return lastConstant!.end; } } @@ -3120,17 +3130,29 @@ class _InsertionPreparer { builder.write(' {'); } var declaration = _declaration; - if (declaration is EnumDeclaration && declaration.body.semicolon == null) { + var hasSemicolon = false; + if (declaration is EnumDeclaration) { + var body = declaration.body; + hasSemicolon = + body is BlockEnumBody && body.semicolon != null || + body is EmptyEnumBody; + } + if (declaration is EnumDeclaration && !hasSemicolon) { builder.write(';'); } + var hasConstants = false; + if (declaration is EnumDeclaration) { + var body = declaration.body; + hasConstants = body is BlockEnumBody && body.constants.isNotEmpty; + } + if (_foundTargetMember) { // After the target member, write two newlines. builder.writeln(); builder.writeln(); builder.writeIndent(); - } else if (declaration is EnumDeclaration && - declaration.body.constants.isNotEmpty) { + } else if (declaration is EnumDeclaration && hasConstants) { // After the last constant (and the semicolon), write two newlines. builder.writeln(); builder.writeln(); @@ -3153,8 +3175,12 @@ class _InsertionPreparer { } var declaration = _declaration; - if (declaration is EnumDeclaration && - declaration.body.constants.isNotEmpty) { + var hasConstants = false; + if (declaration is EnumDeclaration) { + var body = declaration.body; + hasConstants = body is BlockEnumBody && body.constants.isNotEmpty; + } + if (declaration is EnumDeclaration && hasConstants) { return; } @@ -3330,15 +3356,18 @@ extension on CompilationUnitMember { return body.leftBracket; } case EnumDeclaration(): - return self.body.leftBracket; + var body = self.body; + return body is BlockEnumBody ? body.leftBracket : null; case ExtensionDeclaration(): - return self.body.leftBracket; + var body = self.body; + return body is BlockClassBody ? body.leftBracket : null; case ExtensionTypeDeclaration(): if (self.body case BlockClassBody body) { return body.leftBracket; } case MixinDeclaration(): - return self.body.leftBracket; + var body = self.body; + return body is BlockClassBody ? body.leftBracket : null; default: } return null; @@ -3357,15 +3386,18 @@ extension on CompilationUnitMember { } case EnumDeclaration(): // Enum constants are handled separately; not considered members. - return self.body.members; + var body = self.body; + return body is BlockEnumBody ? body.members : const []; case ExtensionDeclaration(): - return self.body.members; + var body = self.body; + return body is BlockClassBody ? body.members : const []; case ExtensionTypeDeclaration(): if (self.body case BlockClassBody body) { return body.members; } case MixinDeclaration(): - return self.body.members; + var body = self.body; + return body is BlockClassBody ? body.members : const []; } return null; } @@ -3380,15 +3412,18 @@ extension on CompilationUnitMember { return body.rightBracket; } case EnumDeclaration(): - return self.body.rightBracket; + var body = self.body; + return body is BlockEnumBody ? body.rightBracket : null; case ExtensionDeclaration(): - return self.body.rightBracket; + var body = self.body; + return body is BlockClassBody ? body.rightBracket : null; case ExtensionTypeDeclaration(): if (self.body case BlockClassBody body) { return body.rightBracket; } case MixinDeclaration(): - return self.body.rightBracket; + var body = self.body; + return body is BlockClassBody ? body.rightBracket : null; } return null; } diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart index a792f065ec0..98c5e454231 100644 --- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart +++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart @@ -377,6 +377,11 @@ class _OpTypeAstVisitor extends GeneralizingAstVisitor { node.parent?.accept(this); } + @override + void visitBlockEnumBody(BlockEnumBody node) { + node.parent?.accept(this); + } + @override void visitBreakStatement(BreakStatement node) { if (node.label == null || identical(entity, node.label)) { @@ -634,6 +639,11 @@ class _OpTypeAstVisitor extends GeneralizingAstVisitor { optype.includeReturnValueSuggestions = true; } + @override + void visitEmptyEnumBody(EmptyEnumBody node) { + node.parent?.accept(this); + } + @override void visitEmptyStatement(EmptyStatement node) { optype.includeReturnValueSuggestions = true; @@ -641,18 +651,15 @@ class _OpTypeAstVisitor extends GeneralizingAstVisitor { optype.includeVoidReturnSuggestions = true; } - @override - void visitEnumBody(EnumBody node) { - node.parent?.accept(this); - } - @override void visitEnumDeclaration(EnumDeclaration node) { - if (node.body.semicolon != null) { - if (node.body.members.contains(entity) || - identical(entity, node.body.rightBracket)) { - optype.completionLocation = 'EnumDeclaration_member'; - optype.includeTypeNameSuggestions = true; + if (node.body case BlockEnumBody body) { + if (body.semicolon != null) { + if (body.members.contains(entity) || + identical(entity, body.rightBracket)) { + optype.completionLocation = 'EnumDeclaration_member'; + optype.includeTypeNameSuggestions = true; + } } } } @@ -734,11 +741,18 @@ class _OpTypeAstVisitor extends GeneralizingAstVisitor { if (identical(entity, node.onClause)) { optype.completionLocation = 'ExtensionDeclaration_onClause'; optype.includeTypeNameSuggestions = true; - } else if (node.body.members.contains(entity) || - identical(entity, node.body.rightBracket)) { - // Make suggestions in the body of the extension declaration - optype.completionLocation = 'ExtensionDeclaration_member'; - optype.includeTypeNameSuggestions = true; + } else { + var isMember = false; + if (node.body case BlockClassBody body) { + isMember = + body.members.contains(entity) || + identical(entity, body.rightBracket); + } + if (isMember) { + // Make suggestions in the body of the extension declaration + optype.completionLocation = 'ExtensionDeclaration_member'; + optype.includeTypeNameSuggestions = true; + } } } @@ -1093,11 +1107,6 @@ class _OpTypeAstVisitor extends GeneralizingAstVisitor { optype.completionLocation = 'LabeledStatement_statement'; } - @override - void visitLibraryIdentifier(LibraryIdentifier node) { - // No suggestions. - } - @override void visitListLiteral(ListLiteral node) { if (node.elements.contains(entity)) { @@ -1204,9 +1213,12 @@ class _OpTypeAstVisitor extends GeneralizingAstVisitor { @override void visitMixinDeclaration(MixinDeclaration node) { - // Make suggestions in the body of the mixin declaration - if (node.body.members.contains(entity) || - identical(entity, node.body.rightBracket)) { + var isMember = false; + if (node.body case BlockClassBody body) { + isMember = + body.members.contains(entity) || identical(entity, body.rightBracket); + } + if (isMember) { optype.completionLocation = 'MixinDeclaration_member'; optype.includeTypeNameSuggestions = true; } diff --git a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart index 6ca2ada6a4f..2a8a733fb1f 100644 --- a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart +++ b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart @@ -128,7 +128,9 @@ abstract class LocalDeclarationVisitor extends UnifyingAstVisitor { @override void visitExtensionDeclaration(ExtensionDeclaration node) { - _visitClassOrMixinMembers(node.body.members); + if (node.body case BlockClassBody body) { + _visitClassOrMixinMembers(body.members); + } visitNode(node); } @@ -243,7 +245,9 @@ abstract class LocalDeclarationVisitor extends UnifyingAstVisitor { @override void visitMixinDeclaration(MixinDeclaration node) { - _visitClassOrMixinMembers(node.body.members); + if (node.body case BlockClassBody body) { + _visitClassOrMixinMembers(body.members); + } visitNode(node); } diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml index 2e0d772c8d6..a30b51f4866 100644 --- a/pkg/analyzer_plugin/pubspec.yaml +++ b/pkg/analyzer_plugin/pubspec.yaml @@ -1,6 +1,6 @@ name: analyzer_plugin description: A framework and support code for building plugins for the analysis server. -version: 0.14.6-dev +version: 0.14.7-dev repository: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer_plugin environment: @@ -11,7 +11,7 @@ resolution: workspace dependencies: # See the release policy for managing this dependency at # pkg/analyzer/doc/implementation/releasing.md. - analyzer: 11.1.0-dev + analyzer: ^12.0.0-0 collection: ^1.15.0 dart_style: ^3.0.0 pub_semver: ^2.1.0 diff --git a/pkg/analyzer_testing/CHANGELOG.md b/pkg/analyzer_testing/CHANGELOG.md index 93a1a21434a..21bbd767f9f 100644 --- a/pkg/analyzer_testing/CHANGELOG.md +++ b/pkg/analyzer_testing/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.4-dev + +- Require version `^12.0.0-0` of the `analyzer` package. + ## 0.2.3-dev - Require version `11.1.0-dev` of the `analyzer` package. diff --git a/pkg/analyzer_testing/pubspec.yaml b/pkg/analyzer_testing/pubspec.yaml index 6bcd93f21dd..ebe81df6f5d 100644 --- a/pkg/analyzer_testing/pubspec.yaml +++ b/pkg/analyzer_testing/pubspec.yaml @@ -1,6 +1,6 @@ name: analyzer_testing description: Testing utilities related to the analyzer and analysis_server_plugin packages. -version: 0.2.3-dev +version: 0.2.4-dev repository: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer_testing environment: @@ -11,7 +11,7 @@ resolution: workspace dependencies: # See the release policy for managing this dependency at # pkg/analyzer/doc/implementation/releasing.md. - analyzer: 11.1.0-dev + analyzer: ^12.0.0-0 meta: ^1.10.0 path: ^1.9.0 test: ^1.25.0 diff --git a/pkg/front_end/lib/src/source/diet_listener.dart b/pkg/front_end/lib/src/source/diet_listener.dart index 772dd06a408..68ee3f6ee87 100644 --- a/pkg/front_end/lib/src/source/diet_listener.dart +++ b/pkg/front_end/lib/src/source/diet_listener.dart @@ -1016,6 +1016,22 @@ class DietListener extends StackListenerImpl { pop(); // Annotation begin token. } + @override + // Coverage-ignore(suite): Not run. + void handleNoExtensionBody(Token semicolonToken) { + assert( + checkState(semicolonToken, [ + ValueKinds.Token, + ValueKinds.IdentifierOrParserRecoveryOrNull, + ValueKinds.TokenOrNull, + ]), + ); + debugEvent("NoExtensionBody"); + pop(); // Begin token + pop(); // Name + pop(); // Annotation begin token. + } + @override void handleNoExtensionTypeBody(Token semicolonToken) { assert( @@ -1031,6 +1047,22 @@ class DietListener extends StackListenerImpl { pop(); // Annotation begin token. } + @override + // Coverage-ignore(suite): Not run. + void handleNoMixinBody(Token semicolonToken) { + assert( + checkState(semicolonToken, [ + ValueKinds.Token, + ValueKinds.IdentifierOrParserRecoveryOrNull, + ValueKinds.TokenOrNull, + ]), + ); + debugEvent("NoMixinBody"); + pop(); // Begin token + pop(); // Name + pop(); // Annotation begin token. + } + @override void endClassOrMixinOrExtensionBody( DeclarationKind kind, @@ -1285,6 +1317,20 @@ class DietListener extends StackListenerImpl { debugEvent("EnumHeader"); } + @override + // Coverage-ignore(suite): Not run. + void handleNoEnumBody(Token semicolonToken) { + assert( + checkState(semicolonToken, [ + ValueKinds.IdentifierOrParserRecovery, + ValueKinds.TokenOrNull, + ]), + ); + debugEvent("NoEnumBody"); + pop(); // Name + pop(); // Annotations begin token. + } + @override void endNamedMixinApplication( 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 22a08152e41..2c8885470f8 100644 --- a/pkg/front_end/lib/src/source/outline_builder.dart +++ b/pkg/front_end/lib/src/source/outline_builder.dart @@ -4798,12 +4798,34 @@ class OutlineBuilder extends StackListenerImpl { _builderFactory.beginClassBody(); } + @override + // Coverage-ignore(suite): Not run. + void handleNoEnumBody(Token semicolon) { + debugEvent("handleNoEnumBody"); + _builderFactory.beginEnumBody(); + push(0); // number of enum constants + } + + @override + // Coverage-ignore(suite): Not run. + void handleNoExtensionBody(Token semicolonToken) { + debugEvent("handleNoExtensionBody"); + _builderFactory.beginExtensionBody(); + } + @override void handleNoExtensionTypeBody(Token semicolonToken) { debugEvent("NoExtensionTypeBody"); _builderFactory.beginExtensionTypeBody(); } + @override + // Coverage-ignore(suite): Not run. + void handleNoMixinBody(Token semicolonToken) { + debugEvent("handleNoMixinBody"); + _builderFactory.beginMixinBody(); + } + @override void endClassOrMixinOrExtensionBody( DeclarationKind kind, diff --git a/pkg/front_end/lib/src/util/parser_ast.dart b/pkg/front_end/lib/src/util/parser_ast.dart index 10ed15a4d9d..c7d736dfae6 100644 --- a/pkg/front_end/lib/src/util/parser_ast.dart +++ b/pkg/front_end/lib/src/util/parser_ast.dart @@ -990,13 +990,22 @@ extension TopLevelDeclarationExtension on TopLevelDeclarationEnd { // Coverage-ignore(suite): Not run. extension MixinDeclarationExtension on MixinDeclarationEnd { - ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() { + ClassOrMixinOrExtensionBodyEnd? getClassOrMixinOrExtensionBody() { for (ParserAstNode child in children!) { if (child is ClassOrMixinOrExtensionBodyEnd) { return child; } } - throw "Not found."; + return null; + } + + NoMixinBodyHandle? getNoMixinBody() { + for (ParserAstNode child in children!) { + if (child is NoMixinBodyHandle) { + return child; + } + } + return null; } IdentifierHandle getMixinIdentifier() { @@ -1259,13 +1268,22 @@ extension ExtensionDeclarationExtension on ExtensionDeclarationEnd { return begin.name; } - ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() { + ClassOrMixinOrExtensionBodyEnd? getClassOrMixinOrExtensionBody() { for (ParserAstNode child in children!) { if (child is ClassOrMixinOrExtensionBodyEnd) { return child; } } - throw "Not found."; + return null; + } + + NoExtensionBodyHandle? getNoExtensionBody() { + for (ParserAstNode child in children!) { + if (child is NoExtensionBodyHandle) { + return child; + } + } + return null; } } 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 76ac18d3a7c..5f5623918b0 100644 --- a/pkg/front_end/lib/src/util/parser_ast_helper.dart +++ b/pkg/front_end/lib/src/util/parser_ast_helper.dart @@ -411,6 +411,15 @@ abstract class AbstractParserAstListener implements Listener { seen(data); } + @override + void handleNoMixinBody(Token semicolonToken) { + NoMixinBodyHandle data = new NoMixinBodyHandle( + ParserAstType.HANDLE, + semicolonToken: semicolonToken, + ); + seen(data); + } + @override void endMixinDeclaration(Token beginToken, Token endToken) { MixinDeclarationEnd data = new MixinDeclarationEnd( @@ -473,6 +482,15 @@ abstract class AbstractParserAstListener implements Listener { seen(data); } + @override + void handleNoExtensionBody(Token semicolonToken) { + NoExtensionBodyHandle data = new NoExtensionBodyHandle( + ParserAstType.HANDLE, + semicolonToken: semicolonToken, + ); + seen(data); + } + @override void beginExtensionTypeDeclaration( Token? augmentKeyword, @@ -802,6 +820,15 @@ abstract class AbstractParserAstListener implements Listener { seen(data); } + @override + void handleNoEnumBody(Token semicolonToken) { + NoEnumBodyHandle data = new NoEnumBodyHandle( + ParserAstType.HANDLE, + semicolonToken: semicolonToken, + ); + seen(data); + } + @override void handleEnumElement(Token beginToken, Token? augmentToken) { EnumElementHandle data = new EnumElementHandle( @@ -4646,6 +4673,21 @@ class RecoverMixinHeaderHandle extends ParserAstNode { R accept(ParserAstVisitor v) => v.visitRecoverMixinHeaderHandle(this); } +class NoMixinBodyHandle extends ParserAstNode { + final Token semicolonToken; + + NoMixinBodyHandle(ParserAstType type, {required this.semicolonToken}) + : super("NoMixinBody", type); + + @override + Map get deprecatedArguments => { + "semicolonToken": semicolonToken, + }; + + @override + R accept(ParserAstVisitor v) => v.visitNoMixinBodyHandle(this); +} + class MixinDeclarationEnd extends ParserAstNode implements BeginAndEndTokenParserAstNode { @override @@ -4755,6 +4797,21 @@ class ExtensionDeclarationEnd extends ParserAstNode R accept(ParserAstVisitor v) => v.visitExtensionDeclarationEnd(this); } +class NoExtensionBodyHandle extends ParserAstNode { + final Token semicolonToken; + + NoExtensionBodyHandle(ParserAstType type, {required this.semicolonToken}) + : super("NoExtensionBody", type); + + @override + Map get deprecatedArguments => { + "semicolonToken": semicolonToken, + }; + + @override + R accept(ParserAstVisitor v) => v.visitNoExtensionBodyHandle(this); +} + class ExtensionTypeDeclarationBegin extends ParserAstNode { final Token? augmentKeyword; final Token extensionKeyword; @@ -5287,6 +5344,21 @@ class EnumBodyEnd extends ParserAstNode R accept(ParserAstVisitor v) => v.visitEnumBodyEnd(this); } +class NoEnumBodyHandle extends ParserAstNode { + final Token semicolonToken; + + NoEnumBodyHandle(ParserAstType type, {required this.semicolonToken}) + : super("NoEnumBody", type); + + @override + Map get deprecatedArguments => { + "semicolonToken": semicolonToken, + }; + + @override + R accept(ParserAstVisitor v) => v.visitNoEnumBodyHandle(this); +} + class EnumElementHandle extends ParserAstNode { final Token beginToken; final Token? augmentToken; @@ -10799,6 +10871,7 @@ abstract class ParserAstVisitor { R visitMixinOnHandle(MixinOnHandle node); R visitMixinHeaderHandle(MixinHeaderHandle node); R visitRecoverMixinHeaderHandle(RecoverMixinHeaderHandle node); + R visitNoMixinBodyHandle(NoMixinBodyHandle node); R visitMixinDeclarationEnd(MixinDeclarationEnd node); R visitUncategorizedTopLevelDeclarationBegin( UncategorizedTopLevelDeclarationBegin node, @@ -10808,6 +10881,7 @@ abstract class ParserAstVisitor { ); R visitExtensionDeclarationBegin(ExtensionDeclarationBegin node); R visitExtensionDeclarationEnd(ExtensionDeclarationEnd node); + R visitNoExtensionBodyHandle(NoExtensionBodyHandle node); R visitExtensionTypeDeclarationBegin(ExtensionTypeDeclarationBegin node); R visitExtensionTypeDeclarationEnd(ExtensionTypeDeclarationEnd node); R visitPrimaryConstructorBegin(PrimaryConstructorBegin node); @@ -10837,6 +10911,7 @@ abstract class ParserAstVisitor { R visitEnumHeaderHandle(EnumHeaderHandle node); R visitEnumBodyBegin(EnumBodyBegin node); R visitEnumBodyEnd(EnumBodyEnd node); + R visitNoEnumBodyHandle(NoEnumBodyHandle node); R visitEnumElementHandle(EnumElementHandle node); R visitExportBegin(ExportBegin node); R visitExportEnd(ExportEnd node); @@ -11301,6 +11376,10 @@ class RecursiveParserAstVisitor implements ParserAstVisitor { void visitRecoverMixinHeaderHandle(RecoverMixinHeaderHandle node) => node.visitChildren(this); + @override + void visitNoMixinBodyHandle(NoMixinBodyHandle node) => + node.visitChildren(this); + @override void visitMixinDeclarationEnd(MixinDeclarationEnd node) => node.visitChildren(this); @@ -11323,6 +11402,10 @@ class RecursiveParserAstVisitor implements ParserAstVisitor { void visitExtensionDeclarationEnd(ExtensionDeclarationEnd node) => node.visitChildren(this); + @override + void visitNoExtensionBodyHandle(NoExtensionBodyHandle node) => + node.visitChildren(this); + @override void visitExtensionTypeDeclarationBegin(ExtensionTypeDeclarationBegin node) => node.visitChildren(this); @@ -11433,6 +11516,9 @@ class RecursiveParserAstVisitor implements ParserAstVisitor { @override void visitEnumBodyEnd(EnumBodyEnd node) => node.visitChildren(this); + @override + void visitNoEnumBodyHandle(NoEnumBodyHandle node) => node.visitChildren(this); + @override void visitEnumElementHandle(EnumElementHandle node) => node.visitChildren(this); @@ -12735,6 +12821,10 @@ class RecursiveParserAstVisitorWithDefaultNodeAsync Future visitRecoverMixinHeaderHandle(RecoverMixinHeaderHandle node) => defaultNode(node); + @override + Future visitNoMixinBodyHandle(NoMixinBodyHandle node) => + defaultNode(node); + @override Future visitMixinDeclarationEnd(MixinDeclarationEnd node) => defaultNode(node); @@ -12757,6 +12847,10 @@ class RecursiveParserAstVisitorWithDefaultNodeAsync Future visitExtensionDeclarationEnd(ExtensionDeclarationEnd node) => defaultNode(node); + @override + Future visitNoExtensionBodyHandle(NoExtensionBodyHandle node) => + defaultNode(node); + @override Future visitExtensionTypeDeclarationBegin( ExtensionTypeDeclarationBegin node, @@ -12874,6 +12968,10 @@ class RecursiveParserAstVisitorWithDefaultNodeAsync @override Future visitEnumBodyEnd(EnumBodyEnd node) => defaultNode(node); + @override + Future visitNoEnumBodyHandle(NoEnumBodyHandle node) => + defaultNode(node); + @override Future visitEnumElementHandle(EnumElementHandle node) => defaultNode(node); diff --git a/pkg/front_end/parser_testcases/inline_class/no_body.dart.expect b/pkg/front_end/parser_testcases/inline_class/no_body.dart.expect index 94c313af177..0094892afa0 100644 --- a/pkg/front_end/parser_testcases/inline_class/no_body.dart.expect +++ b/pkg/front_end/parser_testcases/inline_class/no_body.dart.expect @@ -1,21 +1,3 @@ -Problems reported: - -parser/inline_class/no_body:2:7: A mixin declaration must have a body, even if it is empty. -mixin M; - ^ - -parser/inline_class/no_body:2:8: Unexpected token ';'. -mixin M; - ^ - -parser/inline_class/no_body:3:16: An extension declaration must have a body, even if it is empty. -extension E on int; - ^^^ - -parser/inline_class/no_body:3:19: Unexpected token ';'. -extension E on int; - ^ - beginCompilationUnit(class) beginMetadataStar(class) endMetadataStar(0) @@ -41,19 +23,8 @@ beginCompilationUnit(class) handleMixinOn(null, 0) handleImplements(null, 0) handleMixinHeader(mixin) - handleMixinOn(null, 0) - handleImplements(null, 0) - handleRecoverMixinHeader() - handleRecoverableError(ExpectedMixinBody, M, M) - beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {) - endClassOrMixinOrExtensionBody(DeclarationKind.Mixin, 0, {, }) - endMixinDeclaration(mixin, }) - endTopLevelDeclaration(}) - beginMetadataStar(;) - endMetadataStar(0) - beginTopLevelMember(;) - handleRecoverableError(Message[Template(UnexpectedToken), Unexpected token ';'., null, {lexeme: ;}], ;, ;) - handleInvalidTopLevelDeclaration(;) + handleNoMixinBody(;) + endMixinDeclaration(mixin, ;) endTopLevelDeclaration(;) beginMetadataStar(extension) endMetadataStar(0) @@ -63,16 +34,8 @@ beginCompilationUnit(class) handleIdentifier(int, typeReference) handleNoTypeArguments(;) handleType(int, null) - handleRecoverableError(ExpectedExtensionBody, int, int) - beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {) - endClassOrMixinOrExtensionBody(DeclarationKind.Extension, 0, {, }) - endExtensionDeclaration(extension, extension, on, }) - endTopLevelDeclaration(}) - beginMetadataStar(;) - endMetadataStar(0) - beginTopLevelMember(;) - handleRecoverableError(Message[Template(UnexpectedToken), Unexpected token ';'., null, {lexeme: ;}], ;, ;) - handleInvalidTopLevelDeclaration(;) + handleNoExtensionBody(;) + endExtensionDeclaration(extension, extension, on, ;) endTopLevelDeclaration(;) beginMetadataStar(extension) endMetadataStar(0) @@ -149,4 +112,4 @@ beginCompilationUnit(class) handleNoExtensionTypeBody(;) endExtensionTypeDeclaration(extension, null, extension, type, ;) endTopLevelDeclaration(;) -endCompilationUnit(8, ) +endCompilationUnit(6, ) diff --git a/pkg/front_end/parser_testcases/inline_class/no_body.dart.intertwined.expect b/pkg/front_end/parser_testcases/inline_class/no_body.dart.intertwined.expect index f4321552350..5cfe3557b8c 100644 --- a/pkg/front_end/parser_testcases/inline_class/no_body.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/inline_class/no_body.dart.intertwined.expect @@ -45,37 +45,8 @@ parseUnit(class) parseClassOrMixinOrEnumImplementsOpt(M) listener: handleImplements(null, 0) listener: handleMixinHeader(mixin) - parseMixinHeaderRecovery(M, mixin, M) - parseMixinHeaderOpt(M, mixin) - parseMixinOnOpt(M) - parseClassOrMixinOrEnumImplementsOpt(M) - skipUnexpectedTokenOpt(M, [on, implements, {]) - parseMixinOnOpt(M) - listener: handleMixinOn(null, 0) - parseClassOrMixinOrEnumImplementsOpt(M) - listener: handleImplements(null, 0) - listener: handleRecoverMixinHeader() - ensureBlock(M, BlockKind(mixin declaration)) - reportRecoverableError(M, ExpectedMixinBody) - listener: handleRecoverableError(ExpectedMixinBody, M, M) - insertBlock(M) - rewriter() - rewriter() - parseClassOrMixinOrExtensionBody(M, DeclarationKind.Mixin, M) - listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {) - notEofOrType(CLOSE_CURLY_BRACKET, }) - listener: endClassOrMixinOrExtensionBody(DeclarationKind.Mixin, 0, {, }) - listener: endMixinDeclaration(mixin, }) - listener: endTopLevelDeclaration(}) - parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) - parseMetadataStar(}) - listener: beginMetadataStar(;) - listener: endMetadataStar(0) - listener: beginTopLevelMember(;) - parseInvalidTopLevelDeclaration(}) - reportRecoverableErrorWithToken(;, Template(UnexpectedToken)) - listener: handleRecoverableError(Message[Template(UnexpectedToken), Unexpected token ';'., null, {lexeme: ;}], ;, ;) - listener: handleInvalidTopLevelDeclaration(;) + listener: handleNoMixinBody(;) + listener: endMixinDeclaration(mixin, ;) listener: endTopLevelDeclaration(;) parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) parseMetadataStar(;) @@ -90,27 +61,8 @@ parseUnit(class) listener: handleIdentifier(int, typeReference) listener: handleNoTypeArguments(;) listener: handleType(int, null) - ensureBlock(int, BlockKind(extension declaration)) - reportRecoverableError(int, ExpectedExtensionBody) - listener: handleRecoverableError(ExpectedExtensionBody, int, int) - insertBlock(int) - rewriter() - rewriter() - parseClassOrMixinOrExtensionBody(int, DeclarationKind.Extension, E) - listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {) - notEofOrType(CLOSE_CURLY_BRACKET, }) - listener: endClassOrMixinOrExtensionBody(DeclarationKind.Extension, 0, {, }) - listener: endExtensionDeclaration(extension, extension, on, }) - listener: endTopLevelDeclaration(}) - parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations)) - parseMetadataStar(}) - listener: beginMetadataStar(;) - listener: endMetadataStar(0) - listener: beginTopLevelMember(;) - parseInvalidTopLevelDeclaration(}) - reportRecoverableErrorWithToken(;, Template(UnexpectedToken)) - listener: handleRecoverableError(Message[Template(UnexpectedToken), Unexpected token ';'., null, {lexeme: ;}], ;, ;) - listener: handleInvalidTopLevelDeclaration(;) + listener: handleNoExtensionBody(;) + listener: endExtensionDeclaration(extension, extension, on, ;) listener: endTopLevelDeclaration(;) parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations)) parseMetadataStar(;) @@ -224,4 +176,4 @@ parseUnit(class) listener: endExtensionTypeDeclaration(extension, null, extension, type, ;) listener: endTopLevelDeclaration(;) reportAllErrorTokens(class) - listener: endCompilationUnit(8, ) + listener: endCompilationUnit(6, ) diff --git a/pkg/front_end/parser_testcases/inline_class/no_body.dart.parser.expect b/pkg/front_end/parser_testcases/inline_class/no_body.dart.parser.expect index b83a97383da..ba9eb68b347 100644 --- a/pkg/front_end/parser_testcases/inline_class/no_body.dart.parser.expect +++ b/pkg/front_end/parser_testcases/inline_class/no_body.dart.parser.expect @@ -1,15 +1,13 @@ -NOTICE: Stream was rewritten by parser! - class C; -mixin M{}; -extension E on int{}; +mixin M; +extension E on int; extension type ET1(int i); extension type ET2(int i) implements Foo; extension type ET3(int i) implements Foo, Bar; class[KeywordToken] C[StringToken];[SimpleToken] -mixin[KeywordToken] M[StringToken]{[SyntheticBeginToken]}[SyntheticToken];[SimpleToken] -extension[KeywordToken] E[StringToken] on[KeywordToken] int[StringToken]{[SyntheticBeginToken]}[SyntheticToken];[SimpleToken] +mixin[KeywordToken] M[StringToken];[SimpleToken] +extension[KeywordToken] E[StringToken] on[KeywordToken] int[StringToken];[SimpleToken] extension[KeywordToken] type[StringToken] ET1[StringToken]([BeginToken]int[StringToken] i[StringToken])[SimpleToken];[SimpleToken] extension[KeywordToken] type[StringToken] ET2[StringToken]([BeginToken]int[StringToken] i[StringToken])[SimpleToken] implements[KeywordToken] Foo[StringToken];[SimpleToken] extension[KeywordToken] type[StringToken] ET3[StringToken]([BeginToken]int[StringToken] i[StringToken])[SimpleToken] implements[KeywordToken] Foo[StringToken],[SimpleToken] Bar[StringToken];[SimpleToken][SimpleToken] diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart index e412b4d4bda..131e6a667f7 100644 --- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart +++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart @@ -1663,24 +1663,29 @@ worlds: } else if (child.isMixinDeclaration()) { // Also try to remove all content of the mixin. MixinDeclarationEnd decl = child.asMixinDeclaration(); - ClassOrMixinOrExtensionBodyEnd body = decl + ClassOrMixinOrExtensionBodyEnd? body = decl .getClassOrMixinOrExtensionBody(); - if (body.beginToken.offset + 2 < body.endToken.offset) { - helper.replacements.add( - new _Replacement(body.beginToken.offset, body.endToken.offset), - ); - what = "mixin body"; - success = await _tryReplaceAndCompile( - helper, - uri, - initialComponent, - what, - ); - if (helper.shouldQuit) return; - } + if (body != null) { + if (body.beginToken.offset + 2 < body.endToken.offset) { + helper.replacements.add( + new _Replacement( + body.beginToken.offset, + body.endToken.offset, + ), + ); + what = "mixin body"; + success = await _tryReplaceAndCompile( + helper, + uri, + initialComponent, + what, + ); + if (helper.shouldQuit) return; + } - if (!success) { - await _deleteBlocksHelper(body, helper, uri, initialComponent); + if (!success) { + await _deleteBlocksHelper(body, helper, uri, initialComponent); + } } } else if (child.isExtensionType()) { // Also try to remove all content of the extension type. diff --git a/pkg/front_end/test/parser/parser_ast_test.dart b/pkg/front_end/test/parser/parser_ast_test.dart index 361e816bd80..32d146033c5 100644 --- a/pkg/front_end/test/parser/parser_ast_test.dart +++ b/pkg/front_end/test/parser/parser_ast_test.dart @@ -48,15 +48,13 @@ void canParseTopLevelIshOfAllFrontendFiles() { data, ); } else if (child.isMixinDeclaration()) { - splitIntoChunks( - child.asMixinDeclaration().getClassOrMixinOrExtensionBody(), - data, - ); + MixinDeclarationEnd declaration = child.asMixinDeclaration(); + splitIntoChunks(declaration.getClassOrMixinOrExtensionBody(), data); + declaration.getNoMixinBody(); } else if (child.isExtension()) { - splitIntoChunks( - child.asExtension().getClassOrMixinOrExtensionBody(), - data, - ); + ExtensionDeclarationEnd declaration = child.asExtension(); + splitIntoChunks(declaration.getClassOrMixinOrExtensionBody(), data); + declaration.getNoExtensionBody(); } else if (child.isExtensionType()) { splitIntoChunks( child.asExtensionType().getClassOrMixinOrExtensionBody(), @@ -264,17 +262,16 @@ void testMixinStuff() { MixinDeclarationEnd mxn = decl.asMixinDeclaration(); expect("B", decl.getIdentifier().token.lexeme); - List members = mxn.getClassOrMixinOrExtensionBody().getMembers(); + ClassOrMixinOrExtensionBodyEnd? body = mxn.getClassOrMixinOrExtensionBody(); + expect(false, body == null); + List members = body.getMembers(); expect(4, members.length); expect(members[0].isFields(), true); expect(members[1].isMethod(), true); expect(members[2].isFactory(), true); expect(members[3].isConstructor(), true); - List chunks = splitIntoChunks( - mxn.getClassOrMixinOrExtensionBody(), - data, - ); + List chunks = splitIntoChunks(body, data); expect(4, chunks.length); expect("static int staticField = 0;", chunks[0]); expect("""void foo() { diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart index a091402275e..3f81bccacdb 100644 --- a/pkg/front_end/test/parser_test_listener.dart +++ b/pkg/front_end/test/parser_test_listener.dart @@ -438,6 +438,15 @@ class ParserTestListener implements Listener { doPrint('handleRecoverMixinHeader()'); } + @override + void handleNoMixinBody(Token semicolonToken) { + seen(semicolonToken); + doPrint( + 'handleNoMixinBody(' + '$semicolonToken)', + ); + } + @override void endMixinDeclaration(Token beginToken, Token endToken) { indent--; @@ -509,6 +518,15 @@ class ParserTestListener implements Listener { ); } + @override + void handleNoExtensionBody(Token semicolonToken) { + seen(semicolonToken); + doPrint( + 'handleNoExtensionBody(' + '$semicolonToken)', + ); + } + @override void beginExtensionTypeDeclaration( Token? augmentKeyword, @@ -890,6 +908,15 @@ class ParserTestListener implements Listener { ); } + @override + void handleNoEnumBody(Token semicolonToken) { + seen(semicolonToken); + doPrint( + 'handleNoEnumBody(' + '$semicolonToken)', + ); + } + @override void handleEnumElement(Token beginToken, Token? augmentToken) { seen(beginToken); diff --git a/pkg/front_end/testcases/extension_types/issue52119.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue52119.dart.textual_outline_modelled.expect index a2fababcd0c..25a4460cdc3 100644 --- a/pkg/front_end/testcases/extension_types/issue52119.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue52119.dart.textual_outline_modelled.expect @@ -1,3 +1,5 @@ +// @dart = 3.10 + expect(expected, actual) {} extension type Bar._(this.i) { diff --git a/pkg/front_end/testcases/extension_types/issue53212.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53212.dart.textual_outline_modelled.expect index 5161ca68bc5..fe7987b3d80 100644 --- a/pkg/front_end/testcases/extension_types/issue53212.dart.textual_outline_modelled.expect +++ b/pkg/front_end/testcases/extension_types/issue53212.dart.textual_outline_modelled.expect @@ -1,3 +1,5 @@ +// @dart = 3.10 + extension type E1(int foo) { E1.named(this.foo, super.bar); } diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status index fb97452008f..6eb3c9f40f7 100644 --- a/pkg/front_end/testcases/textual_outline.status +++ b/pkg/front_end/testcases/textual_outline.status @@ -8,8 +8,6 @@ # These tests have errors in them which isn't reported by the parser but the # formatter still sees as syntax errors and thus won't format. enhanced_enums/external_constructor: FormatterCrash -extension_types/issue52119: FormatterCrash -extension_types/issue53212: FormatterCrash extension_types/with_dependencies/issue53209_2/main: FormatterCrash general/invalid_operator: FormatterCrash general/invalid_super_initializer: FormatterCrash diff --git a/pkg/linter/lib/src/extensions.dart b/pkg/linter/lib/src/extensions.dart index 6d56cd54a87..7f6c99e0867 100644 --- a/pkg/linter/lib/src/extensions.dart +++ b/pkg/linter/lib/src/extensions.dart @@ -651,6 +651,15 @@ extension MethodDeclarationExtension on MethodDeclaration { } } +extension NullableObjectExtension on Object? { + /// If the target is [T], return it, otherwise `null`. + // TODO(scheglov): consider using the same method from the analyzer. + T? tryCast() => switch (this) { + T value => value, + _ => null, + }; +} + extension SetterElementExtension on SetterElement { /// Return name in a format suitable for string comparison. String? get canonicalName { diff --git a/pkg/linter/lib/src/rules/avoid_setters_without_getters.dart b/pkg/linter/lib/src/rules/avoid_setters_without_getters.dart index d4024e8afdb..73e23209790 100644 --- a/pkg/linter/lib/src/rules/avoid_setters_without_getters.dart +++ b/pkg/linter/lib/src/rules/avoid_setters_without_getters.dart @@ -49,7 +49,9 @@ class _Visitor extends SimpleAstVisitor { @override void visitEnumDeclaration(EnumDeclaration node) { - visitMembers(node.body.members); + if (node.body case BlockEnumBody body) { + visitMembers(body.members); + } } @override diff --git a/pkg/linter/lib/src/rules/library_private_types_in_public_api.dart b/pkg/linter/lib/src/rules/library_private_types_in_public_api.dart index 8f58481a165..fafe13083f3 100644 --- a/pkg/linter/lib/src/rules/library_private_types_in_public_api.dart +++ b/pkg/linter/lib/src/rules/library_private_types_in_public_api.dart @@ -85,7 +85,9 @@ class Validator extends SimpleAstVisitor { return; } node.namePart.typeParameters?.accept(this); - node.body.members.accept(this); + if (node.body case BlockEnumBody body) { + body.members.accept(this); + } } @override @@ -96,7 +98,9 @@ class Validator extends SimpleAstVisitor { } node.typeParameters?.accept(this); node.onClause?.extendedType.accept(this); - node.body.members.accept(this); + if (node.body case BlockClassBody body) { + body.members.accept(this); + } } @override @@ -221,7 +225,9 @@ class Validator extends SimpleAstVisitor { } node.onClause?.superclassConstraints.accept(this); node.typeParameters?.accept(this); - node.body.members.accept(this); + if (node.body case BlockClassBody body) { + body.members.accept(this); + } } @override diff --git a/pkg/linter/lib/src/rules/public_member_api_docs.dart b/pkg/linter/lib/src/rules/public_member_api_docs.dart index af66a8e1b78..41c230d4686 100644 --- a/pkg/linter/lib/src/rules/public_member_api_docs.dart +++ b/pkg/linter/lib/src/rules/public_member_api_docs.dart @@ -200,7 +200,9 @@ class _Visitor extends SimpleAstVisitor { if (node.namePart.typeName.isPrivate) return; check(node); - checkMethods(node.body.members); + if (node.body case BlockEnumBody body) { + checkMethods(body.members); + } } @override @@ -209,7 +211,9 @@ class _Visitor extends SimpleAstVisitor { if (node.isInternal) return; check(node); - checkMethods(node.body.members); + if (node.body case BlockClassBody body) { + checkMethods(body.members); + } } @override @@ -250,7 +254,9 @@ class _Visitor extends SimpleAstVisitor { @override void visitMixinDeclaration(MixinDeclaration node) { - _visitMembers(node, node.name, node.body.members); + if (node.body case BlockClassBody body) { + _visitMembers(node, node.name, body.members); + } } @override diff --git a/pkg/linter/lib/src/rules/sort_constructors_first.dart b/pkg/linter/lib/src/rules/sort_constructors_first.dart index 8c92c83049a..a01d743b07e 100644 --- a/pkg/linter/lib/src/rules/sort_constructors_first.dart +++ b/pkg/linter/lib/src/rules/sort_constructors_first.dart @@ -67,7 +67,9 @@ class _Visitor extends SimpleAstVisitor { @override void visitEnumDeclaration(EnumDeclaration node) { - check(node.body.members); + if (node.body case BlockEnumBody body) { + check(body.members); + } } @override diff --git a/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart b/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart index 3362bb608fc..6d02325ded9 100644 --- a/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart +++ b/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart @@ -68,7 +68,9 @@ class _Visitor extends SimpleAstVisitor { @override void visitEnumDeclaration(EnumDeclaration node) { - check(node.body.members); + if (node.body case BlockEnumBody body) { + check(body.members); + } } @override diff --git a/pkg/linter/lib/src/rules/unreachable_from_main.dart b/pkg/linter/lib/src/rules/unreachable_from_main.dart index 1812adca21c..db087cddfd6 100644 --- a/pkg/linter/lib/src/rules/unreachable_from_main.dart +++ b/pkg/linter/lib/src/rules/unreachable_from_main.dart @@ -73,12 +73,12 @@ class _DeclarationGatherer { } else if (declaration is EnumDeclaration) { _addMembers( containerElement: declaration.declaredFragment?.element, - members: declaration.body.members, + members: declaration.body.tryCast()?.members ?? [], ); } else if (declaration is ExtensionDeclaration) { _addMembers( containerElement: null, - members: declaration.body.members, + members: declaration.body.tryCast()?.members ?? [], ); } else if (declaration is ExtensionTypeDeclaration) { if (declaration.body case BlockClassBody body) { @@ -87,7 +87,7 @@ class _DeclarationGatherer { } else if (declaration is MixinDeclaration) { _addMembers( containerElement: declaration.declaredFragment?.element, - members: declaration.body.members, + members: declaration.body.tryCast()?.members ?? [], ); } }