Version 2.13.0-127.0.dev
Merge commit '14998dfa5a0bd51d03fca8554e17da4f5c772b04' into 'dev'
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 b9658e1..e99dbf6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -20,11 +20,38 @@
static const int _kindConstructorDeclaration = 1;
static const int _kindFieldDeclaration = 2;
static const int _kindMethodDeclaration = 3;
+ static const int _nullNode = 0;
+ static const int _nullToken = 0;
final ApiSignature signature = ApiSignature();
- void addClassOrMixin(ClassOrMixinDeclaration node) {
- addTokens(node.beginToken, node.leftBracket);
+ void compute(CompilationUnit unit) {
+ signature.addFeatureSet(unit.featureSet);
+
+ signature.addInt(unit.directives.length);
+ unit.directives.forEach(_addNode);
+
+ signature.addInt(unit.declarations.length);
+ for (var declaration in unit.declarations) {
+ if (declaration is ClassOrMixinDeclaration) {
+ _addClassOrMixin(declaration);
+ } else if (declaration is FunctionDeclaration) {
+ var functionExpression = declaration.functionExpression;
+ _addTokens(
+ declaration.beginToken,
+ (functionExpression.parameters ?? declaration.name).endToken,
+ );
+ _addFunctionBodyModifiers(functionExpression.body);
+ } else if (declaration is TopLevelVariableDeclaration) {
+ _topLevelVariableDeclaration(declaration);
+ } else {
+ _addNode(declaration);
+ }
+ }
+ }
+
+ void _addClassOrMixin(ClassOrMixinDeclaration node) {
+ _addTokens(node.beginToken, node.leftBracket);
bool hasConstConstructor = node.members
.any((m) => m is ConstructorDeclaration && m.constKeyword != null);
@@ -33,67 +60,68 @@
for (var member in node.members) {
if (member is ConstructorDeclaration) {
signature.addInt(_kindConstructorDeclaration);
- addTokens(member.beginToken, member.parameters.endToken);
+ _addTokens(member.beginToken, member.parameters.endToken);
if (member.constKeyword != null) {
- addNodeList(member.initializers);
+ _addNodeList(member.initializers);
}
- addNode(member.redirectedConstructor);
+ _addNode(member.redirectedConstructor);
} else if (member is FieldDeclaration) {
signature.addInt(_kindFieldDeclaration);
- var variableList = member.fields;
- addVariables(
- member,
- variableList,
- !member.isStatic && variableList.isFinal && hasConstConstructor,
- );
+ _fieldDeclaration(member, hasConstConstructor);
} else if (member is MethodDeclaration) {
signature.addInt(_kindMethodDeclaration);
- addTokens(
+ _addTokens(
member.beginToken,
(member.parameters ?? member.name).endToken,
);
signature.addBool(member.body is EmptyFunctionBody);
- addFunctionBodyModifiers(member.body);
+ _addFunctionBodyModifiers(member.body);
} else {
throw UnimplementedError('(${member.runtimeType}) $member');
}
}
- addToken(node.rightBracket);
+ _addToken(node.rightBracket);
}
- void addFunctionBodyModifiers(FunctionBody? node) {
+ void _addFunctionBodyModifiers(FunctionBody? node) {
if (node != null) {
signature.addBool(node.isSynchronous);
signature.addBool(node.isGenerator);
}
}
- void addNode(AstNode? node) {
+ void _addNode(AstNode? node) {
if (node != null) {
- addTokens(node.beginToken, node.endToken);
+ _addTokens(node.beginToken, node.endToken);
+ } else {
+ signature.addInt(_nullNode);
}
}
- void addNodeList(List<AstNode> nodes) {
+ void _addNodeList(List<AstNode> nodes) {
for (var node in nodes) {
- addNode(node);
+ _addNode(node);
}
}
- void addToken(Token token) {
- signature.addString(token.lexeme);
+ void _addToken(Token? token) {
+ if (token != null) {
+ signature.addString(token.lexeme);
+ } else {
+ signature.addInt(_nullToken);
+ }
}
/// Appends tokens from [begin] (including), to [end] (also including).
- void addTokens(Token begin, Token end) {
+ void _addTokens(Token begin, Token end) {
if (begin is CommentToken) {
begin = begin.parent!;
}
Token? token = begin;
while (token != null) {
- addToken(token);
+ _addToken(token);
if (token == end) {
break;
@@ -110,48 +138,42 @@
}
}
- void addVariables(
- AstNode node,
- VariableDeclarationList variableList,
- bool includeInitializers,
- ) {
- if (variableList.type == null ||
- variableList.isConst ||
- includeInitializers) {
- addTokens(node.beginToken, node.endToken);
- } else {
- addTokens(node.beginToken, variableList.type!.endToken);
+ void _fieldDeclaration(FieldDeclaration node, bool hasConstConstructor) {
+ _addToken(node.abstractKeyword);
+ _addToken(node.covariantKeyword);
+ _addToken(node.externalKeyword);
+ _addToken(node.staticKeyword);
+ _addNodeList(node.metadata);
- signature.addInt(variableList.variables.length);
- for (var variable in variableList.variables) {
- addTokens(variable.beginToken, variable.name.endToken);
- signature.addBool(variable.initializer != null);
- addToken(variable.endToken.next!); // `,` or `;`
- }
- }
+ var variableList = node.fields;
+ var includeInitializers = variableList.type == null ||
+ variableList.isConst ||
+ hasConstConstructor && !node.isStatic && variableList.isFinal;
+ _variableList(variableList, includeInitializers);
}
- void compute(CompilationUnit unit) {
- signature.addFeatureSet(unit.featureSet);
+ void _topLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+ _addToken(node.externalKeyword);
+ _addNodeList(node.metadata);
- signature.addInt(unit.directives.length);
- unit.directives.forEach(addNode);
+ var variableList = node.variables;
+ var includeInitializers = variableList.type == null || variableList.isConst;
+ _variableList(variableList, includeInitializers);
+ }
- signature.addInt(unit.declarations.length);
- for (var declaration in unit.declarations) {
- if (declaration is ClassOrMixinDeclaration) {
- addClassOrMixin(declaration);
- } else if (declaration is FunctionDeclaration) {
- var functionExpression = declaration.functionExpression;
- addTokens(
- declaration.beginToken,
- (functionExpression.parameters ?? declaration.name).endToken,
- );
- addFunctionBodyModifiers(functionExpression.body);
- } else if (declaration is TopLevelVariableDeclaration) {
- addVariables(declaration, declaration.variables, false);
- } else {
- addNode(declaration);
+ void _variableList(VariableDeclarationList node, bool includeInitializers) {
+ _addToken(node.keyword);
+ _addToken(node.lateKeyword);
+ _addNode(node.type);
+
+ var variables = node.variables;
+ signature.addInt(variables.length);
+
+ for (var variable in variables) {
+ _addNode(variable.name);
+ signature.addBool(variable.initializer != null);
+ if (includeInitializers) {
+ _addNode(variable.initializer);
}
}
}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
index 736bc62..45ff977 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
@@ -39,6 +39,22 @@
''');
}
+ test_change_field_outOfOrderStaticConst() async {
+ await resolveTestCode(r'''
+class A {
+ static f = Object();
+}
+''');
+
+ driverFor(testFilePath).changeFile(testFilePath);
+ await resolveTestCode(r'''
+class A {
+ const
+ static f = Object();
+}
+''');
+ }
+
test_change_field_staticFinal_hasConstConstructor_changeInitializer() async {
useEmptyByteStore();
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 cb996f9..48bc6b5 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
@@ -261,6 +261,32 @@
''');
}
+ test_class_field_const_add_outOfOrder() {
+ assertNotSameSignature(r'''
+class A {
+ static f = Object();
+}
+''', r'''
+class A {
+ const
+ static f = Object();
+}
+''');
+ }
+
+ test_class_field_const_add_outOfOrder_hasFinal() {
+ assertNotSameSignature(r'''
+class A {
+ static final f = Object();
+}
+''', r'''
+class A {
+ const
+ static final f = Object();
+}
+''');
+ }
+
test_class_field_final_add() {
assertNotSameSignature(r'''
class C {
diff --git a/tools/VERSION b/tools/VERSION
index c6ee983..719303b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 13
PATCH 0
-PRERELEASE 126
+PRERELEASE 127
PRERELEASE_PATCH 0
\ No newline at end of file