Skip to content

Commit 34c2959

Browse files
scheglovCommit Bot
authored andcommitted
Add granular enum / extension member signatures, tests.
Change-Id: If50b860f194b1ee9bbda7132933176cdd3169bb4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/240480 Reviewed-by: Samuel Rawlins <srawlins@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
1 parent 53c04ff commit 34c2959

File tree

2 files changed

+376
-44
lines changed

2 files changed

+376
-44
lines changed

pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart

Lines changed: 71 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analyzer/dart/ast/ast.dart';
88
import 'package:analyzer/dart/ast/token.dart';
99
import 'package:analyzer/src/dart/ast/token.dart';
1010
import '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

Comments
 (0)