@@ -8,6 +8,7 @@ import 'package:analyzer/dart/ast/ast.dart';
88import 'package:analyzer/dart/ast/token.dart' ;
99import 'package:analyzer/src/dart/ast/token.dart' ;
1010import 'package:analyzer/src/summary/api_signature.dart' ;
11+ import 'package:collection/collection.dart' ;
1112
1213/// Return the bytes of the unlinked API signature of the given [unit] .
1314///
@@ -39,6 +40,10 @@ class _UnitApiSignatureComputer {
3940 for (var declaration in unit.declarations) {
4041 if (declaration is ClassOrMixinDeclaration ) {
4142 _addClassOrMixin (declaration);
43+ } else if (declaration is EnumDeclaration ) {
44+ _addEnum (declaration);
45+ } else if (declaration is ExtensionDeclaration ) {
46+ _addExtension (declaration);
4247 } else if (declaration is FunctionDeclaration ) {
4348 var functionExpression = declaration.functionExpression;
4449 _addTokens (
@@ -54,36 +59,70 @@ class _UnitApiSignatureComputer {
5459 }
5560 }
5661
57- void _addClassOrMixin (ClassOrMixinDeclaration node) {
58- _addTokens (node.beginToken, node.leftBracket);
59-
60- bool hasConstConstructor = node.members
61- .any ((m) => m is ConstructorDeclaration && m.constKeyword != null );
62-
63- signature.addInt (node.members.length);
64- for (var member in node.members) {
62+ void _addClassMembers (List <ClassMember > members, bool hasConstConstructor) {
63+ signature.addInt (members.length);
64+ for (var member in members) {
6565 if (member is ConstructorDeclaration ) {
66- signature.addInt (_kindConstructorDeclaration);
67- _addTokens (member.beginToken, member.parameters.endToken);
68- _addNodeList (member.initializers);
69- _addNode (member.redirectedConstructor);
66+ _addConstructorDeclaration (member);
7067 } else if (member is FieldDeclaration ) {
71- signature.addInt (_kindFieldDeclaration);
72- _fieldDeclaration (member, hasConstConstructor);
68+ _addFieldDeclaration (member, hasConstConstructor);
7369 } else if (member is MethodDeclaration ) {
74- signature.addInt (_kindMethodDeclaration);
75- _addTokens (
76- member.beginToken,
77- (member.parameters ?? member.name).endToken,
78- );
79- signature.addBool (member.body is EmptyFunctionBody );
80- _addFunctionBodyModifiers (member.body);
70+ _addMethodDeclaration (member);
8171 } else {
8272 throw UnimplementedError ('(${member .runtimeType }) $member ' );
8373 }
8474 }
75+ }
76+
77+ void _addClassOrMixin (ClassOrMixinDeclaration node) {
78+ _addTokens (node.beginToken, node.leftBracket);
79+
80+ bool hasConstConstructor = node.members
81+ .any ((m) => m is ConstructorDeclaration && m.constKeyword != null );
82+
83+ _addClassMembers (node.members, hasConstConstructor);
84+ }
85+
86+ void _addConstructorDeclaration (ConstructorDeclaration node) {
87+ signature.addInt (_kindConstructorDeclaration);
88+ _addTokens (node.beginToken, node.parameters.endToken);
89+ _addNodeList (node.initializers);
90+ _addNode (node.redirectedConstructor);
91+ }
92+
93+ void _addEnum (EnumDeclaration node) {
94+ var members = node.members;
95+
96+ // If not enhanced, include the whole node.
97+ var firstMember = members.firstOrNull;
98+ if (firstMember == null ) {
99+ _addNode (node);
100+ return ;
101+ }
85102
86- _addToken (node.rightBracket);
103+ _addTokens (node.beginToken, firstMember.beginToken);
104+ _addClassMembers (members, true );
105+ }
106+
107+ void _addExtension (ExtensionDeclaration node) {
108+ _addTokens (node.beginToken, node.leftBracket);
109+ _addClassMembers (node.members, false );
110+ }
111+
112+ void _addFieldDeclaration (FieldDeclaration node, bool hasConstConstructor) {
113+ signature.addInt (_kindFieldDeclaration);
114+
115+ _addToken (node.abstractKeyword);
116+ _addToken (node.covariantKeyword);
117+ _addToken (node.externalKeyword);
118+ _addToken (node.staticKeyword);
119+ _addNodeList (node.metadata);
120+
121+ var variableList = node.fields;
122+ var includeInitializers = variableList.type == null ||
123+ variableList.isConst ||
124+ hasConstConstructor && ! node.isStatic && variableList.isFinal;
125+ _variableList (variableList, includeInitializers);
87126 }
88127
89128 void _addFunctionBodyModifiers (FunctionBody ? node) {
@@ -93,6 +132,16 @@ class _UnitApiSignatureComputer {
93132 }
94133 }
95134
135+ void _addMethodDeclaration (MethodDeclaration node) {
136+ signature.addInt (_kindMethodDeclaration);
137+ _addTokens (
138+ node.beginToken,
139+ (node.parameters ?? node.name).endToken,
140+ );
141+ signature.addBool (node.body is EmptyFunctionBody );
142+ _addFunctionBodyModifiers (node.body);
143+ }
144+
96145 void _addNode (AstNode ? node) {
97146 if (node != null ) {
98147 signature.addInt (_notNullNode);
@@ -142,20 +191,6 @@ class _UnitApiSignatureComputer {
142191 }
143192 }
144193
145- void _fieldDeclaration (FieldDeclaration node, bool hasConstConstructor) {
146- _addToken (node.abstractKeyword);
147- _addToken (node.covariantKeyword);
148- _addToken (node.externalKeyword);
149- _addToken (node.staticKeyword);
150- _addNodeList (node.metadata);
151-
152- var variableList = node.fields;
153- var includeInitializers = variableList.type == null ||
154- variableList.isConst ||
155- hasConstConstructor && ! node.isStatic && variableList.isFinal;
156- _variableList (variableList, includeInitializers);
157- }
158-
159194 void _topLevelVariableDeclaration (TopLevelVariableDeclaration node) {
160195 _addToken (node.externalKeyword);
161196 _addNodeList (node.metadata);
0 commit comments