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

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

Issue 1679433003: Check that all elements are associated with nodes when resolving using an existing element model (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/utilities.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index c0ecccd3949a14f59e541d42112a979d16761a8d..ecfe2049c611843dc861a4ce6229e8b30173263d 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -15,6 +15,7 @@ import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/utilities.dart';
import 'package:analyzer/src/generated/constant.dart';
import 'package:analyzer/src/generated/element_resolver.dart';
import 'package:analyzer/src/generated/engine.dart';
@@ -2035,6 +2036,12 @@ class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
*/
class DeclarationResolver extends RecursiveAstVisitor<Object> {
/**
+ * The elements that are reachable from the compilation unit element. When a
+ * compilation unit has been resolved, this set should be empty.
+ */
+ Set<Element> _expectedElements;
+
+ /**
* The compilation unit containing the AST nodes being visited.
*/
CompilationUnitElement _enclosingUnit;
@@ -2069,9 +2076,14 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
* if the element model and compilation unit do not match each other.
*/
void resolve(CompilationUnit unit, CompilationUnitElement element) {
+ ElementGatherer gatherer = new ElementGatherer();
+ element.accept(gatherer);
+ _expectedElements = gatherer.elements;
_enclosingUnit = element;
+ _expectedElements.remove(element);
unit.element = element;
unit.accept(this);
+ _validateResolution();
}
@override
@@ -2137,6 +2149,7 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
}
constructorName.staticElement = _enclosingExecutable;
}
+ _expectedElements.remove(_enclosingExecutable);
node.element = _enclosingExecutable as ConstructorElement;
super.visitConstructorDeclaration(node);
_resolveMetadata(node.metadata, _enclosingExecutable);
@@ -2269,6 +2282,7 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
} else if ((property as KeywordToken).keyword == Keyword.SET) {
accessor = _findWithNameAndOffset(accessors, functionName,
functionName.name + '=', functionName.offset);
+ _expectedElements.remove(accessor);
functionName.staticElement = accessor;
}
_enclosingExecutable = accessor;
@@ -2379,6 +2393,7 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
if (property == null) {
_enclosingExecutable = _findWithNameAndOffset(_enclosingClass.methods,
methodName, nameOfMethod, methodName.offset);
+ _expectedElements.remove(_enclosingExecutable);
methodName.staticElement = _enclosingExecutable;
} else {
PropertyAccessorElement accessor;
@@ -2387,6 +2402,7 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
} else if ((property as KeywordToken).keyword == Keyword.SET) {
accessor = _findWithNameAndOffset(_enclosingClass.accessors,
methodName, methodName.name + '=', methodName.offset);
+ _expectedElements.remove(accessor);
methodName.staticElement = accessor;
}
_enclosingExecutable = accessor;
@@ -2564,6 +2580,7 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
Element element = _findWithNameAndOffset(
elements, identifier, identifier.name, identifier.offset,
required: required);
+ _expectedElements.remove(element);
identifier.staticElement = element;
return element;
}
@@ -2738,6 +2755,23 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
}
}
}
+
+ /**
+ * Throw an exception if there are non-synthetic elements in the element model
+ * that were not associated with an AST node.
+ */
+ void _validateResolution() {
+ if (_expectedElements.isNotEmpty) {
+ StringBuffer buffer = new StringBuffer();
+ buffer.write(_expectedElements.length);
+ buffer.writeln(' unmatched elements found:');
+ for (Element element in _expectedElements) {
+ buffer.write(' ');
+ buffer.writeln(element);
+ }
+ throw new ElementMismatchException(buffer.toString());
+ }
+ }
}
/**
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/utilities.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698