Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: pkg/analyzer/lib/src/generated/incremental_resolver.dart

Issue 1605263002: Issue 25514. Harden parents validation in incremental resolver. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/lib/src/generated/incremental_resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 914b3ffd5be48b8c52392f1247c154a846825255..111561e39d518aa70e5002b4868f343210fbc286 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -1475,27 +1475,44 @@ class PoorMansIncrementalResolver {
for (int i = 0; i < length; i++) {
AstNode oldParent = oldParents[i];
AstNode newParent = newParents[i];
- if (oldParent is ConstructorInitializer ||
- newParent is ConstructorInitializer) {
- logger.log('Failure: changes in constant constructor initializers'
- ' may cause external changes in constant objects.');
- return false;
- }
- if (oldParent is FunctionDeclaration &&
+ if (oldParent is CompilationUnit && newParent is CompilationUnit) {
+ int oldLength = oldParent.declarations.length;
+ int newLength = newParent.declarations.length;
+ if (oldLength != newLength) {
+ logger.log(
+ 'Failure: unit declarations mismatch $oldLength vs. $newLength');
+ return false;
+ }
+ } else if (oldParent is ClassDeclaration &&
+ newParent is ClassDeclaration) {
+ int oldLength = oldParent.members.length;
+ int newLength = newParent.members.length;
+ if (oldLength != newLength) {
+ logger.log(
+ 'Failure: class declarations mismatch $oldLength vs. $newLength');
+ return false;
+ }
+ } else if (oldParent is FunctionDeclaration &&
newParent is FunctionDeclaration ||
- oldParent is MethodDeclaration &&
- newParent is MethodDeclaration ||
oldParent is ConstructorDeclaration &&
- newParent is ConstructorDeclaration) {
+ newParent is ConstructorDeclaration ||
+ oldParent is MethodDeclaration &&
+ newParent is MethodDeclaration) {
Element oldElement = (oldParent as Declaration).element;
if (new DeclarationMatcher().matches(newParent, oldElement) ==
DeclarationMatchKind.MATCH) {
oldNode = oldParent;
newNode = newParent;
found = true;
+ } else {
+ return false;
}
- }
- if (oldParent is FunctionBody || newParent is FunctionBody) {
+ } else if (oldParent is ConstructorInitializer ||
+ newParent is ConstructorInitializer) {
+ logger.log('Failure: changes in constant constructor initializers'
+ ' may cause external changes in constant objects.');
+ return false;
+ } else if (oldParent is FunctionBody && newParent is FunctionBody) {
if (oldParent is BlockFunctionBody &&
newParent is BlockFunctionBody) {
oldNode = oldParent;
@@ -1505,6 +1522,17 @@ class PoorMansIncrementalResolver {
}
logger.log('Failure: not a block function body.');
return false;
+ } else if (oldParent is FieldDeclaration &&
+ newParent is FieldDeclaration ||
+ oldParent is FunctionExpression &&
+ newParent is FunctionExpression ||
+ oldParent is VariableDeclaration &&
+ newParent is VariableDeclaration) {
+ // skip
+ } else {
+ logger.log('Failure: old and new parent mismatch'
+ ' ${oldParent.runtimeType} vs. ${newParent.runtimeType}');
+ return false;
}
}
if (!found) {

Powered by Google App Engine
This is Rietveld 408576698