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

Unified Diff: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/element/ClassElementImpl.java

Issue 296043003: Fix for issue 14527 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add more tests Created 6 years, 7 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: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/element/ClassElementImpl.java
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/element/ClassElementImpl.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/element/ClassElementImpl.java
index 442f4ffb0ed6c11a2a3091402c3bf910c7d70fe5..fad36aa3387bea45e1ed88e186becd530a2dd3ef 100644
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/element/ClassElementImpl.java
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/element/ClassElementImpl.java
@@ -18,6 +18,7 @@ import com.google.dart.engine.ast.Identifier;
import com.google.dart.engine.context.AnalysisException;
import com.google.dart.engine.element.ClassElement;
import com.google.dart.engine.element.ConstructorElement;
+import com.google.dart.engine.element.Element;
import com.google.dart.engine.element.ElementAnnotation;
import com.google.dart.engine.element.ElementKind;
import com.google.dart.engine.element.ElementVisitor;
@@ -373,31 +374,30 @@ public class ClassElementImpl extends ElementImpl implements ClassElement {
}
@Override
+ public MethodElement lookUpConcreteMethod(String methodName, LibraryElement library) {
+ return internalLookUpConcreteMethod(methodName, library, true);
+ }
+
+ @Override
public PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
- HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
- ClassElement currentElement = this;
- while (currentElement != null && !visitedClasses.contains(currentElement)) {
- visitedClasses.add(currentElement);
- PropertyAccessorElement element = currentElement.getGetter(getterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- for (InterfaceType mixin : currentElement.getMixins()) {
- ClassElement mixinElement = mixin.getElement();
- if (mixinElement != null) {
- element = mixinElement.getGetter(getterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- }
- }
- InterfaceType supertype = currentElement.getSupertype();
- if (supertype == null) {
- return null;
- }
- currentElement = supertype.getElement();
- }
- return null;
+ return internalLookUpGetter(getterName, library, true);
+ }
+
+ @Override
+ public PropertyAccessorElement lookUpInheritedConcreteGetter(String getterName,
+ LibraryElement library) {
+ return internalLookUpConcreteGetter(getterName, library, false);
+ }
+
+ @Override
+ public MethodElement lookUpInheritedConcreteMethod(String methodName, LibraryElement library) {
+ return internalLookUpConcreteMethod(methodName, library, false);
+ }
+
+ @Override
+ public PropertyAccessorElement lookUpInheritedConcreteSetter(String setterName,
+ LibraryElement library) {
+ return internalLookUpConcreteSetter(setterName, library, false);
}
@Override
@@ -412,30 +412,7 @@ public class ClassElementImpl extends ElementImpl implements ClassElement {
@Override
public PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
- HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
- ClassElement currentElement = this;
- while (currentElement != null && !visitedClasses.contains(currentElement)) {
- visitedClasses.add(currentElement);
- PropertyAccessorElement element = currentElement.getSetter(setterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- for (InterfaceType mixin : currentElement.getMixins()) {
- ClassElement mixinElement = mixin.getElement();
- if (mixinElement != null) {
- element = mixinElement.getSetter(setterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- }
- }
- InterfaceType supertype = currentElement.getSupertype();
- if (supertype == null) {
- return null;
- }
- currentElement = supertype.getElement();
- }
- return null;
+ return internalLookUpSetter(setterName, library, true);
}
/**
@@ -632,6 +609,78 @@ public class ClassElementImpl extends ElementImpl implements ClassElement {
}
}
+ private PropertyAccessorElement internalLookUpConcreteGetter(String getterName,
+ LibraryElement library, boolean includeThisClass) {
+ PropertyAccessorElement getter = internalLookUpGetter(getterName, library, includeThisClass);
+ while (getter != null && getter.isAbstract()) {
+ Element definingClass = getter.getEnclosingElement();
+ if (!(definingClass instanceof ClassElementImpl)) {
+ return null;
+ }
+ getter = ((ClassElementImpl) definingClass).internalLookUpGetter(getterName, library, false);
+ }
+ return getter;
+ }
+
+ private MethodElement internalLookUpConcreteMethod(String methodName, LibraryElement library,
+ boolean includeThisClass) {
+ MethodElement method = internalLookUpMethod(methodName, library, includeThisClass);
+ while (method != null && method.isAbstract()) {
+ ClassElement definingClass = method.getEnclosingElement();
+ if (definingClass == null) {
+ return null;
+ }
+ method = definingClass.lookUpInheritedMethod(methodName, library);
+ }
+ return method;
+ }
+
+ private PropertyAccessorElement internalLookUpConcreteSetter(String setterName,
+ LibraryElement library, boolean includeThisClass) {
+ PropertyAccessorElement setter = internalLookUpSetter(setterName, library, includeThisClass);
+ while (setter != null && setter.isAbstract()) {
+ Element definingClass = setter.getEnclosingElement();
+ if (!(definingClass instanceof ClassElementImpl)) {
+ return null;
+ }
+ setter = ((ClassElementImpl) definingClass).internalLookUpSetter(setterName, library, false);
+ }
+ return setter;
+ }
+
+ private PropertyAccessorElement internalLookUpGetter(String getterName, LibraryElement library,
+ boolean includeThisClass) {
+ HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+ ClassElement currentElement = this;
+ if (includeThisClass) {
+ PropertyAccessorElement element = currentElement.getGetter(getterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ }
+ while (currentElement != null && visitedClasses.add(currentElement)) {
+ for (InterfaceType mixin : currentElement.getMixins()) {
+ ClassElement mixinElement = mixin.getElement();
+ if (mixinElement != null) {
+ PropertyAccessorElement element = mixinElement.getGetter(getterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ }
+ }
+ InterfaceType supertype = currentElement.getSupertype();
+ if (supertype == null) {
+ return null;
+ }
+ currentElement = supertype.getElement();
+ PropertyAccessorElement element = currentElement.getGetter(getterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ }
+ return null;
+ }
+
private MethodElement internalLookUpMethod(String methodName, LibraryElement library,
boolean includeThisClass) {
HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
@@ -665,6 +714,39 @@ public class ClassElementImpl extends ElementImpl implements ClassElement {
return null;
}
+ private PropertyAccessorElement internalLookUpSetter(String setterName, LibraryElement library,
+ boolean includeThisClass) {
+ HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+ ClassElement currentElement = this;
+ if (includeThisClass) {
+ PropertyAccessorElement element = currentElement.getSetter(setterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ }
+ while (currentElement != null && visitedClasses.add(currentElement)) {
+ for (InterfaceType mixin : currentElement.getMixins()) {
+ ClassElement mixinElement = mixin.getElement();
+ if (mixinElement != null) {
+ PropertyAccessorElement element = mixinElement.getSetter(setterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ }
+ }
+ InterfaceType supertype = currentElement.getSupertype();
+ if (supertype == null) {
+ return null;
+ }
+ currentElement = supertype.getElement();
+ PropertyAccessorElement element = currentElement.getSetter(setterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ }
+ return null;
+ }
+
private boolean safeIsOrInheritsProxy(ClassElement classElt,
HashSet<ClassElement> visitedClassElts) {
if (visitedClassElts.contains(classElt)) {

Powered by Google App Engine
This is Rietveld 408576698