Index: dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java |
=================================================================== |
--- dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java (revision 29808) |
+++ dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java (working copy) |
@@ -173,20 +173,6 @@ |
} |
/** |
- * Checks if the given expression is the reference to the type. |
- * |
- * @param expr the expression to evaluate |
- * @return {@code true} if the given expression is the reference to the type |
- */ |
- private static boolean isTypeReference(Expression expr) { |
- if (expr instanceof Identifier) { |
- Identifier identifier = (Identifier) expr; |
- return identifier.getStaticElement() instanceof ClassElement; |
- } |
- return false; |
- } |
- |
- /** |
* The error reporter by which errors will be reported. |
*/ |
private ErrorReporter errorReporter; |
@@ -828,9 +814,11 @@ |
public Void visitMethodInvocation(MethodInvocation node) { |
Expression target = node.getRealTarget(); |
SimpleIdentifier methodName = node.getMethodName(); |
- checkForStaticAccessToInstanceMember(target, methodName); |
- checkForInstanceAccessToStaticMember(target, methodName); |
- if (target == null) { |
+ if (target != null) { |
+ ClassElement typeReference = ElementResolver.getTypeReference(target); |
+ checkForStaticAccessToInstanceMember(typeReference, methodName); |
+ checkForInstanceAccessToStaticMember(typeReference, methodName); |
+ } else { |
checkForUnqualifiedReferenceToNonLocalStaticMember(methodName); |
} |
return super.visitMethodInvocation(node); |
@@ -861,8 +849,10 @@ |
@Override |
public Void visitPrefixedIdentifier(PrefixedIdentifier node) { |
if (!(node.getParent() instanceof Annotation)) { |
- checkForStaticAccessToInstanceMember(node.getPrefix(), node.getIdentifier()); |
- checkForInstanceAccessToStaticMember(node.getPrefix(), node.getIdentifier()); |
+ ClassElement typeReference = ElementResolver.getTypeReference(node.getPrefix()); |
+ SimpleIdentifier name = node.getIdentifier(); |
+ checkForStaticAccessToInstanceMember(typeReference, name); |
+ checkForInstanceAccessToStaticMember(typeReference, name); |
} |
return super.visitPrefixedIdentifier(node); |
} |
@@ -882,10 +872,10 @@ |
@Override |
public Void visitPropertyAccess(PropertyAccess node) { |
- Expression target = node.getRealTarget(); |
+ ClassElement typeReference = ElementResolver.getTypeReference(node.getRealTarget()); |
SimpleIdentifier propertyName = node.getPropertyName(); |
- checkForStaticAccessToInstanceMember(target, propertyName); |
- checkForInstanceAccessToStaticMember(target, propertyName); |
+ checkForStaticAccessToInstanceMember(typeReference, propertyName); |
+ checkForInstanceAccessToStaticMember(typeReference, propertyName); |
return super.visitPropertyAccess(node); |
} |
@@ -3324,23 +3314,26 @@ |
} |
/** |
- * This checks that if the given "target" is not a type reference then the "name" is reference to |
- * an instance member. |
+ * This checks the given "typeReference" is not a type reference and that then the "name" is |
+ * reference to an instance member. |
* |
- * @param target the target of the name access to evaluate |
+ * @param typeReference the resolved {@link ClassElement} of the left hand side of the expression, |
+ * or {@code null}, aka, the class element of 'C' in 'C.x', see |
+ * {@link #getTypeReference(Expression)} |
* @param name the accessed name to evaluate |
* @return {@code true} if and only if an error code is generated on the passed node |
* @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER |
*/ |
- private boolean checkForInstanceAccessToStaticMember(Expression target, SimpleIdentifier name) { |
- // OK, no target |
- if (target == null) { |
- return false; |
- } |
+ private boolean checkForInstanceAccessToStaticMember(ClassElement typeReference, |
+ SimpleIdentifier name) { |
// OK, in comment |
if (isInComment) { |
return false; |
} |
+ // OK, target is a type |
+ if (typeReference != null) { |
+ return false; |
+ } |
// prepare member Element |
Element element = name.getStaticElement(); |
if (!(element instanceof ExecutableElement)) { |
@@ -3355,10 +3348,6 @@ |
if (!executableElement.isStatic()) { |
return false; |
} |
- // OK, target is a type |
- if (isTypeReference(target)) { |
- return false; |
- } |
// report problem |
errorReporter.reportError( |
StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, |
@@ -4578,15 +4567,22 @@ |
} |
/** |
- * This checks that if the given "target" is the type reference then the "name" is not the |
- * reference to a instance member. |
+ * This checks the given "typeReference" and that the "name" is not the reference to an instance |
+ * member. |
* |
- * @param target the target of the name access to evaluate |
+ * @param typeReference the resolved {@link ClassElement} of the left hand side of the expression, |
+ * or {@code null}, aka, the class element of 'C' in 'C.x', see |
+ * {@link #getTypeReference(Expression)} |
* @param name the accessed name to evaluate |
* @return {@code true} if and only if an error code is generated on the passed node |
* @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER |
*/ |
- private boolean checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name) { |
+ private boolean checkForStaticAccessToInstanceMember(ClassElement typeReference, |
+ SimpleIdentifier name) { |
+ // OK, target is not a type |
+ if (typeReference == null) { |
+ return false; |
+ } |
// prepare member Element |
Element element = name.getStaticElement(); |
if (!(element instanceof ExecutableElement)) { |
@@ -4597,10 +4593,6 @@ |
if (memberElement.isStatic()) { |
return false; |
} |
- // OK, target is not a type |
- if (!isTypeReference(target)) { |
- return false; |
- } |
// report problem |
errorReporter.reportError( |
StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, |