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

Side by Side Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 704413005: Report HintCode.UNUSED_ELEMENT for classes. (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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library engine.resolver; 5 library engine.resolver;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import "dart:math" as math; 8 import "dart:math" as math;
9 9
10 import 'java_core.dart'; 10 import 'java_core.dart';
(...skipping 1903 matching lines...) Expand 10 before | Expand all | Expand 10 after
1914 */ 1914 */
1915 class UnusedLocalVariableVerifier extends RecursiveElementVisitor { 1915 class UnusedLocalVariableVerifier extends RecursiveElementVisitor {
1916 /** 1916 /**
1917 * The error reporter by which errors will be reported. 1917 * The error reporter by which errors will be reported.
1918 */ 1918 */
1919 final ErrorReporter _errorReporter; 1919 final ErrorReporter _errorReporter;
1920 1920
1921 /** 1921 /**
1922 * Create a new instance of the [UnusedLocalVariableVerifier]. 1922 * Create a new instance of the [UnusedLocalVariableVerifier].
1923 */ 1923 */
1924 UnusedLocalVariableVerifier(this._errorReporter); 1924 UnusedLocalVariableVerifier(this._errorReporter);
Brian Wilkerson 2014/11/10 23:34:47 If the class is checking more than local variables
scheglov 2014/11/11 02:57:06 Done.
1925 1925
1926 @override 1926 @override
1927 visitClassElement(ClassElement element) {
1928 if (element is ClassElementImpl && !element.isUsed) {
1929 _errorReporter.reportErrorForElement(
1930 HintCode.UNUSED_ELEMENT,
1931 element,
1932 [element.kind.displayName, element.displayName]);
1933 }
1934 element.visitChildren(this);
1935 }
1936
1937 @override
1927 visitLocalVariableElement(LocalVariableElement element) { 1938 visitLocalVariableElement(LocalVariableElement element) {
1928 if (element is LocalVariableElementImpl && !element.isUsed) { 1939 if (element is LocalVariableElementImpl && !element.isUsed) {
1929 _errorReporter.reportErrorForElement( 1940 _errorReporter.reportErrorForElement(
1930 HintCode.UNUSED_LOCAL_VARIABLE, 1941 HintCode.UNUSED_LOCAL_VARIABLE,
1931 element, 1942 element,
1932 [element.displayName]); 1943 [element.displayName]);
1933 } 1944 }
1934 } 1945 }
1935 } 1946 }
1936 1947
(...skipping 10537 matching lines...) Expand 10 before | Expand all | Expand 10 after
12474 */ 12485 */
12475 final TypeProvider typeProvider; 12486 final TypeProvider typeProvider;
12476 12487
12477 /** 12488 /**
12478 * The scope used to resolve labels for `break` and `continue` statements, or 12489 * The scope used to resolve labels for `break` and `continue` statements, or
12479 * `null` if no labels have been defined in the current context. 12490 * `null` if no labels have been defined in the current context.
12480 */ 12491 */
12481 LabelScope _labelScope; 12492 LabelScope _labelScope;
12482 12493
12483 /** 12494 /**
12495 * The class containing the AST nodes being visited,
12496 * or `null` if we are not in the scope of a class.
12497 */
12498 ClassElement _enclosingClass;
12499
12500 /**
12484 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 12501 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
12485 * 12502 *
12486 * @param library the library containing the compilation unit being resolved 12503 * @param library the library containing the compilation unit being resolved
12487 * @param source the source representing the compilation unit being visited 12504 * @param source the source representing the compilation unit being visited
12488 * @param typeProvider the object used to access the types from the core libra ry 12505 * @param typeProvider the object used to access the types from the core libra ry
12489 */ 12506 */
12490 ScopedVisitor.con1(Library library, this.source, this.typeProvider) { 12507 ScopedVisitor.con1(Library library, this.source, this.typeProvider) {
12491 this._definingLibrary = library.libraryElement; 12508 this._definingLibrary = library.libraryElement;
12492 LibraryScope libraryScope = library.libraryScope; 12509 LibraryScope libraryScope = library.libraryScope;
12493 this._errorListener = libraryScope.errorListener; 12510 this._errorListener = libraryScope.errorListener;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
12609 Object visitClassDeclaration(ClassDeclaration node) { 12626 Object visitClassDeclaration(ClassDeclaration node) {
12610 ClassElement classElement = node.element; 12627 ClassElement classElement = node.element;
12611 Scope outerScope = _nameScope; 12628 Scope outerScope = _nameScope;
12612 try { 12629 try {
12613 if (classElement == null) { 12630 if (classElement == null) {
12614 AnalysisEngine.instance.logger.logInformation( 12631 AnalysisEngine.instance.logger.logInformation(
12615 "Missing element for class declaration ${node.name.name} in ${defini ngLibrary.source.fullName}", 12632 "Missing element for class declaration ${node.name.name} in ${defini ngLibrary.source.fullName}",
12616 new CaughtException(new AnalysisException(), null)); 12633 new CaughtException(new AnalysisException(), null));
12617 super.visitClassDeclaration(node); 12634 super.visitClassDeclaration(node);
12618 } else { 12635 } else {
12619 _nameScope = new TypeParameterScope(_nameScope, classElement); 12636 ClassElement outerClass = _enclosingClass;
12620 visitClassDeclarationInScope(node); 12637 try {
12621 _nameScope = new ClassScope(_nameScope, classElement); 12638 _enclosingClass = node.element;
12622 visitClassMembersInScope(node); 12639 _nameScope = new TypeParameterScope(_nameScope, classElement);
12640 visitClassDeclarationInScope(node);
12641 _nameScope = new ClassScope(_nameScope, classElement);
12642 visitClassMembersInScope(node);
12643 } finally {
12644 _enclosingClass = outerClass;
12645 }
12623 } 12646 }
12624 } finally { 12647 } finally {
12625 _nameScope = outerScope; 12648 _nameScope = outerScope;
12626 } 12649 }
12627 return null; 12650 return null;
12628 } 12651 }
12629 12652
12630 @override 12653 @override
12631 Object visitClassTypeAlias(ClassTypeAlias node) { 12654 Object visitClassTypeAlias(ClassTypeAlias node) {
12632 Scope outerScope = _nameScope; 12655 Scope outerScope = _nameScope;
(...skipping 2450 matching lines...) Expand 10 before | Expand all | Expand 10 after
15083 types.add(type); 15106 types.add(type);
15084 } 15107 }
15085 } 15108 }
15086 return types; 15109 return types;
15087 } 15110 }
15088 15111
15089 void _setElement(Identifier typeName, Element element) { 15112 void _setElement(Identifier typeName, Element element) {
15090 if (element != null) { 15113 if (element != null) {
15091 if (typeName is SimpleIdentifier) { 15114 if (typeName is SimpleIdentifier) {
15092 typeName.staticElement = element; 15115 typeName.staticElement = element;
15116 _markTypeNameElementUsed(typeName, element);
15093 } else if (typeName is PrefixedIdentifier) { 15117 } else if (typeName is PrefixedIdentifier) {
15094 PrefixedIdentifier identifier = typeName; 15118 PrefixedIdentifier identifier = typeName;
15095 identifier.identifier.staticElement = element; 15119 identifier.identifier.staticElement = element;
15096 SimpleIdentifier prefix = identifier.prefix; 15120 SimpleIdentifier prefix = identifier.prefix;
15097 Element prefixElement = nameScope.lookup(prefix, definingLibrary); 15121 Element prefixElement = nameScope.lookup(prefix, definingLibrary);
15098 if (prefixElement != null) { 15122 if (prefixElement != null) {
15099 prefix.staticElement = prefixElement; 15123 prefix.staticElement = prefixElement;
15100 } 15124 }
15101 } 15125 }
15102 } 15126 }
15103 } 15127 }
15104 15128
15105 /** 15129 /**
15130 * Marks [element] as used in its defining library.
15131 */
15132 void _markTypeNameElementUsed(Identifier typeName, Element element) {
15133 if (identical(element, _enclosingClass)) {
15134 return;
15135 }
15136 // ignore places where the element is not actually used
15137 if (typeName.parent is TypeName) {
15138 AstNode parent2 = typeName.parent.parent;
15139 if (parent2 is IsExpression) {
15140 return;
15141 }
15142 if (parent2 is VariableDeclarationList) {
15143 return;
15144 }
15145 }
15146 // check if the element is a local top-level element
15147 if (element is ElementImpl &&
15148 element.enclosingElement is CompilationUnitElement &&
15149 identical(element.library, definingLibrary)) {
15150 element.markUsed();
15151 }
15152 }
15153
15154 /**
15106 * Given a parameter element, create a function type based on the given return type and parameter 15155 * Given a parameter element, create a function type based on the given return type and parameter
15107 * list and associate the created type with the element. 15156 * list and associate the created type with the element.
15108 * 15157 *
15109 * @param element the parameter element whose type is to be set 15158 * @param element the parameter element whose type is to be set
15110 * @param returnType the (possibly `null`) return type of the function 15159 * @param returnType the (possibly `null`) return type of the function
15111 * @param parameterList the list of parameters to the function 15160 * @param parameterList the list of parameters to the function
15112 */ 15161 */
15113 void _setFunctionTypedParameterType(ParameterElementImpl element, TypeName ret urnType, FormalParameterList parameterList) { 15162 void _setFunctionTypedParameterType(ParameterElementImpl element, TypeName ret urnType, FormalParameterList parameterList) {
15114 List<ParameterElement> parameters = _getElements(parameterList); 15163 List<ParameterElement> parameters = _getElements(parameterList);
15115 FunctionTypeAliasElementImpl aliasElement = new FunctionTypeAliasElementImpl .forNode(null); 15164 FunctionTypeAliasElementImpl aliasElement = new FunctionTypeAliasElementImpl .forNode(null);
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
15527 /** 15576 /**
15528 * Return the tag that has the given identifier, or {@code null} if there is n o such tag (the 15577 * Return the tag that has the given identifier, or {@code null} if there is n o such tag (the
15529 * identifier is not defined). 15578 * identifier is not defined).
15530 * 15579 *
15531 * @return the tag that has the given identifier 15580 * @return the tag that has the given identifier
15532 */ 15581 */
15533 String getTagWithId(String identifier) { 15582 String getTagWithId(String identifier) {
15534 return idToTagMap[identifier]; 15583 return idToTagMap[identifier];
15535 } 15584 }
15536 } 15585 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698