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

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

Issue 718323002: Report HintCode.UNUSED_ELEMENT for unused methods. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month 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 | « no previous file | pkg/analyzer/test/generated/resolver_test.dart » ('j') | 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 863e4be20c82f8f4e112ed5b3027088d3c142d84..391a5c281126f966b786694ad8d489dc114fd388 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -15542,11 +15542,27 @@ class HtmlTagInfo {
}
+class _UsedElements {
+ /**
+ * Resolved, locally defined elements that are used or potentially can be
+ * used.
+ */
+ final HashSet<Element> elements = new HashSet<Element>();
+
+ /**
+ * Names of resolved or unresolved class members that are referenced in the
+ * library.
+ */
+ final HashSet<String> members = new HashSet<String>();
+}
+
+
class _GatherUsedElementsVisitor extends RecursiveAstVisitor {
- final Set<Element> usedElements = new HashSet<Element>();
+ final _UsedElements usedElements = new _UsedElements();
final LibraryElement _enclosingLibrary;
ClassElement _enclosingClass;
+ ExecutableElement _enclosingExec;
_GatherUsedElementsVisitor(this._enclosingLibrary);
@@ -15569,12 +15585,23 @@ class _GatherUsedElementsVisitor extends RecursiveAstVisitor {
}
@override
+ visitMethodDeclaration(MethodDeclaration node) {
+ ExecutableElement enclosingExecOld = _enclosingExec;
+ try {
+ _enclosingExec = node.element;
+ super.visitMethodDeclaration(node);
+ } finally {
+ _enclosingExec = enclosingExecOld;
+ }
+ }
+
+ @override
visitSimpleIdentifier(SimpleIdentifier node) {
if (node.inDeclarationContext()) {
return;
}
- Element staticElement = node.staticElement;
- if (staticElement is LocalVariableElement) {
+ Element element = node.staticElement;
+ if (element is LocalVariableElement) {
AstNode parent = node.parent;
if (node.inGetterContext()) {
if (parent.parent is ExpressionStatement &&
@@ -15585,14 +15612,18 @@ class _GatherUsedElementsVisitor extends RecursiveAstVisitor {
// ++v;
// v += 2;
} else {
- _useElement(staticElement);
+ _useElement(element);
}
}
if (parent is MethodInvocation && parent.methodName == node) {
- _useElement(staticElement);
+ _useElement(element);
}
} else {
_useIdentifierElement(node);
+ if (element == null ||
+ element is! LocalElement && !identical(element, _enclosingExec)) {
+ usedElements.members.add(node.name);
+ }
}
}
@@ -15617,6 +15648,9 @@ class _GatherUsedElementsVisitor extends RecursiveAstVisitor {
if (identical(element, _enclosingClass)) {
return;
}
+ if (identical(element, _enclosingExec)) {
+ return;
+ }
// ignore places where the element is not actually used
if (node.parent is TypeName) {
AstNode parent2 = node.parent.parent;
@@ -15633,7 +15667,7 @@ class _GatherUsedElementsVisitor extends RecursiveAstVisitor {
_useElement(Element element) {
if (element != null) {
- usedElements.add(element);
+ usedElements.elements.add(element);
}
}
@@ -15659,7 +15693,7 @@ class _UnusedElementsVerifier extends RecursiveElementVisitor {
/**
* The elements know to be used.
*/
- final Set<Element> _usedElements;
+ final _UsedElements _usedElements;
/**
* Create a new instance of the [_UnusedElementsVerifier].
@@ -15668,18 +15702,18 @@ class _UnusedElementsVerifier extends RecursiveElementVisitor {
@override
visitClassElement(ClassElement element) {
- if (!_isUsed(element)) {
+ if (!_isUsedElement(element)) {
_reportErrorForElement(
HintCode.UNUSED_ELEMENT,
element,
[element.kind.displayName, element.displayName]);
}
- element.visitChildren(this);
+ super.visitClassElement(element);
}
@override
visitLocalVariableElement(LocalVariableElement element) {
- if (!_isUsed(element)) {
+ if (!_isUsedElement(element)) {
_reportErrorForElement(
HintCode.UNUSED_LOCAL_VARIABLE,
element,
@@ -15687,13 +15721,34 @@ class _UnusedElementsVerifier extends RecursiveElementVisitor {
}
}
- bool _isUsed(Element element) {
+ @override
+ visitMethodElement(MethodElement element) {
+ if (!_isUsedMember(element)) {
+ _reportErrorForElement(
+ HintCode.UNUSED_ELEMENT,
+ element,
+ [element.kind.displayName, element.displayName]);
+ }
+ super.visitMethodElement(element);
+ }
+
+ bool _isUsedElement(Element element) {
if (element is! LocalVariableElement) {
if (element.isPublic) {
return true;
}
}
- return _usedElements.contains(element);
+ return _usedElements.elements.contains(element);
+ }
+
+ bool _isUsedMember(Element element) {
+ if (element.isPublic) {
+ return true;
+ }
+ if (_usedElements.members.contains(element.displayName)) {
+ return true;
+ }
+ return _usedElements.elements.contains(element);
}
void _reportErrorForElement(ErrorCode errorCode, Element element, List<Object> arguments) {
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/resolver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698