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 ?? [], ); } }