Index: pkg/analyzer/lib/src/generated/element_handle.dart |
diff --git a/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart |
index 735a61ea11425226d97f6f978d0d0d08fe5a6550..d6d567c38da84e01bc24a9c5542226283045e05c 100644 |
--- a/pkg/analyzer/lib/src/generated/element_handle.dart |
+++ b/pkg/analyzer/lib/src/generated/element_handle.dart |
@@ -25,7 +25,9 @@ class ClassElementHandle extends ElementHandle implements ClassElement { |
* |
* @param element the element being represented |
*/ |
- ClassElementHandle(ClassElement element) : super(element); |
+ ClassElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
List<PropertyAccessorElement> get accessors => actualElement.accessors; |
@@ -167,7 +169,9 @@ class CompilationUnitElementHandle extends ElementHandle |
* |
* @param element the element being represented |
*/ |
- CompilationUnitElementHandle(CompilationUnitElement element) : super(element); |
+ CompilationUnitElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
List<PropertyAccessorElement> get accessors => actualElement.accessors; |
@@ -241,7 +245,9 @@ class ConstructorElementHandle extends ExecutableElementHandle |
* |
* @param element the element being represented |
*/ |
- ConstructorElementHandle(ConstructorElement element) : super(element); |
+ ConstructorElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
ConstructorElement get actualElement => |
@@ -287,32 +293,29 @@ abstract class ElementHandle implements Element { |
final int id = 0; |
/** |
- * The context in which the element is defined. |
+ * The [ElementResynthesizer] which will be used to resynthesize elements on |
+ * demand. |
*/ |
- AnalysisContext _context; |
+ final ElementResynthesizer _resynthesizer; |
/** |
* The location of this element, used to reconstitute the element if it has been garbage |
* collected. |
*/ |
- ElementLocation _location; |
+ final ElementLocation _location; |
/** |
* A reference to the element being referenced by this handle, or `null` if the element has |
* been garbage collected. |
*/ |
- WeakReference<Element> _elementReference; |
+ Element _elementReference; |
/** |
- * Initialize a newly created element handle to represent the given element. |
- * |
- * @param element the element being represented |
+ * Initialize a newly created element handle to represent the element at the |
+ * given [_location]. [_resynthesizer] will be used to resynthesize the |
+ * element when needed. |
*/ |
- ElementHandle(Element element) { |
- _context = element.context; |
- _location = element.location; |
- _elementReference = new WeakReference<Element>(element); |
- } |
+ ElementHandle(this._resynthesizer, this._location); |
/** |
* Return the element being represented by this handle, reconstituting the element if the |
@@ -321,16 +324,14 @@ abstract class ElementHandle implements Element { |
* @return the element being represented by this handle |
*/ |
Element get actualElement { |
- Element element = _elementReference.get(); |
- if (element == null) { |
- element = _context.getElement(_location); |
- _elementReference = new WeakReference<Element>(element); |
+ if (_elementReference == null) { |
+ _elementReference = _resynthesizer.getElement(_location); |
} |
- return element; |
+ return _elementReference; |
} |
@override |
- AnalysisContext get context => _context; |
+ AnalysisContext get context => _resynthesizer.context; |
@override |
String get displayName => actualElement.displayName; |
@@ -414,82 +415,19 @@ abstract class ElementHandle implements Element { |
void visitChildren(ElementVisitor visitor) { |
actualElement.visitChildren(visitor); |
} |
+} |
- /** |
- * Return a handle on the given element. If the element is already a handle, then it will be |
- * returned directly, otherwise a handle of the appropriate class will be constructed. |
- * |
- * @param element the element for which a handle is to be constructed |
- * @return a handle on the given element |
- */ |
- static Element forElement(Element element) { |
- if (element is ElementHandle) { |
- return element; |
- } |
- while (true) { |
- if (element.kind == ElementKind.CLASS) { |
- return new ClassElementHandle(element as ClassElement); |
- } else if (element.kind == ElementKind.COMPILATION_UNIT) { |
- return new CompilationUnitElementHandle( |
- element as CompilationUnitElement); |
- } else if (element.kind == ElementKind.CONSTRUCTOR) { |
- return new ConstructorElementHandle(element as ConstructorElement); |
- } else if (element.kind == ElementKind.EXPORT) { |
- return new ExportElementHandle(element as ExportElement); |
- } else if (element.kind == ElementKind.FIELD) { |
- return new FieldElementHandle(element as FieldElement); |
- } else if (element.kind == ElementKind.FUNCTION) { |
- return new FunctionElementHandle(element as FunctionElement); |
- } else if (element.kind == ElementKind.GETTER) { |
- return new PropertyAccessorElementHandle( |
- element as PropertyAccessorElement); |
- } else if (element.kind == ElementKind.IMPORT) { |
- return new ImportElementHandle(element as ImportElement); |
- } else if (element.kind == ElementKind.LABEL) { |
- return new LabelElementHandle(element as LabelElement); |
- } else if (element.kind == ElementKind.LIBRARY) { |
- return new LibraryElementHandle(element as LibraryElement); |
- } else if (element.kind == ElementKind.LOCAL_VARIABLE) { |
- return new LocalVariableElementHandle(element as LocalVariableElement); |
- } else if (element.kind == ElementKind.METHOD) { |
- return new MethodElementHandle(element as MethodElement); |
- } else if (element.kind == ElementKind.PARAMETER) { |
- return new ParameterElementHandle(element as ParameterElement); |
- } else if (element.kind == ElementKind.PREFIX) { |
- return new PrefixElementHandle(element as PrefixElement); |
- } else if (element.kind == ElementKind.SETTER) { |
- return new PropertyAccessorElementHandle( |
- element as PropertyAccessorElement); |
- } else if (element.kind == ElementKind.TOP_LEVEL_VARIABLE) { |
- return new TopLevelVariableElementHandle( |
- element as TopLevelVariableElement); |
- } else if (element.kind == ElementKind.FUNCTION_TYPE_ALIAS) { |
- return new FunctionTypeAliasElementHandle( |
- element as FunctionTypeAliasElement); |
- } else if (element.kind == ElementKind.TYPE_PARAMETER) { |
- return new TypeParameterElementHandle(element as TypeParameterElement); |
- } else { |
- throw new UnsupportedOperationException(); |
- } |
- break; |
- } |
- } |
+/** |
+ * Interface which allows an [Element] handle to be resynthesized based on an |
+ * [ElementLocation]. The concrete classes implementing element handles use |
+ * this interface to retrieve the underlying elements when queried. |
+ */ |
+abstract class ElementResynthesizer { |
+ final AnalysisContext context; |
- /** |
- * Return an array of the same size as the given array where each element of the returned array is |
- * a handle for the corresponding element of the given array. |
- * |
- * @param elements the elements for which handles are to be created |
- * @return an array of handles to the given elements |
- */ |
- static List<Element> forElements(List<Element> elements) { |
- int length = elements.length; |
- List<Element> handles = new List<Element>.from(elements); |
- for (int i = 0; i < length; i++) { |
- handles[i] = forElement(elements[i]); |
- } |
- return handles; |
- } |
+ ElementResynthesizer(this.context); |
+ |
+ Element getElement(ElementLocation location); |
} |
/** |
@@ -503,7 +441,9 @@ abstract class ExecutableElementHandle extends ElementHandle |
* |
* @param element the element being represented |
*/ |
- ExecutableElementHandle(ExecutableElement element) : super(element); |
+ ExecutableElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
ExecutableElement get actualElement => |
@@ -565,7 +505,9 @@ class ExportElementHandle extends ElementHandle implements ExportElement { |
* |
* @param element the element being represented |
*/ |
- ExportElementHandle(ExportElement element) : super(element); |
+ ExportElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
ExportElement get actualElement => super.actualElement as ExportElement; |
@@ -599,7 +541,9 @@ class FieldElementHandle extends PropertyInducingElementHandle |
* |
* @param element the element being represented |
*/ |
- FieldElementHandle(FieldElement element) : super(element); |
+ FieldElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
FieldElement get actualElement => super.actualElement as FieldElement; |
@@ -628,7 +572,9 @@ class FunctionElementHandle extends ExecutableElementHandle |
* |
* @param element the element being represented |
*/ |
- FunctionElementHandle(FunctionElement element) : super(element); |
+ FunctionElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
FunctionElement get actualElement => super.actualElement as FunctionElement; |
@@ -657,8 +603,9 @@ class FunctionTypeAliasElementHandle extends ElementHandle |
* |
* @param element the element being represented |
*/ |
- FunctionTypeAliasElementHandle(FunctionTypeAliasElement element) |
- : super(element); |
+ FunctionTypeAliasElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
FunctionTypeAliasElement get actualElement => |
@@ -697,7 +644,9 @@ class ImportElementHandle extends ElementHandle implements ImportElement { |
* |
* @param element the element being represented |
*/ |
- ImportElementHandle(ImportElement element) : super(element); |
+ ImportElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
ImportElement get actualElement => super.actualElement as ImportElement; |
@@ -739,7 +688,9 @@ class LabelElementHandle extends ElementHandle implements LabelElement { |
* |
* @param element the element being represented |
*/ |
- LabelElementHandle(LabelElement element) : super(element); |
+ LabelElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
ExecutableElement get enclosingElement => |
@@ -759,7 +710,9 @@ class LibraryElementHandle extends ElementHandle implements LibraryElement { |
* |
* @param element the element being represented |
*/ |
- LibraryElementHandle(LibraryElement element) : super(element); |
+ LibraryElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
LibraryElement get actualElement => super.actualElement as LibraryElement; |
@@ -787,6 +740,9 @@ class LibraryElementHandle extends ElementHandle implements LibraryElement { |
bool get hasLoadLibraryFunction => actualElement.hasLoadLibraryFunction; |
@override |
+ String get identifier => location.components.last; |
+ |
+ @override |
List<LibraryElement> get importedLibraries => actualElement.importedLibraries; |
@override |
@@ -844,7 +800,9 @@ class LocalVariableElementHandle extends VariableElementHandle |
* |
* @param element the element being represented |
*/ |
- LocalVariableElementHandle(LocalVariableElement element) : super(element); |
+ LocalVariableElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
LocalVariableElement get actualElement => |
@@ -870,7 +828,9 @@ class MethodElementHandle extends ExecutableElementHandle |
* |
* @param element the element being represented |
*/ |
- MethodElementHandle(MethodElement element) : super(element); |
+ MethodElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
MethodElement get actualElement => super.actualElement as MethodElement; |
@@ -900,7 +860,9 @@ class ParameterElementHandle extends VariableElementHandle |
* |
* @param element the element being represented |
*/ |
- ParameterElementHandle(ParameterElement element) : super(element); |
+ ParameterElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
ParameterElement get actualElement => super.actualElement as ParameterElement; |
@@ -936,7 +898,9 @@ class PrefixElementHandle extends ElementHandle implements PrefixElement { |
* |
* @param element the element being represented |
*/ |
- PrefixElementHandle(PrefixElement element) : super(element); |
+ PrefixElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
PrefixElement get actualElement => super.actualElement as PrefixElement; |
@@ -963,8 +927,9 @@ class PropertyAccessorElementHandle extends ExecutableElementHandle |
* |
* @param element the element being represented |
*/ |
- PropertyAccessorElementHandle(PropertyAccessorElement element) |
- : super(element); |
+ PropertyAccessorElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
PropertyAccessorElement get actualElement => |
@@ -1008,8 +973,9 @@ abstract class PropertyInducingElementHandle extends VariableElementHandle |
* |
* @param element the element being represented |
*/ |
- PropertyInducingElementHandle(PropertyInducingElement element) |
- : super(element); |
+ PropertyInducingElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
PropertyInducingElement get actualElement => |
@@ -1036,8 +1002,9 @@ class TopLevelVariableElementHandle extends PropertyInducingElementHandle |
* |
* @param element the element being represented |
*/ |
- TopLevelVariableElementHandle(TopLevelVariableElement element) |
- : super(element); |
+ TopLevelVariableElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE; |
@@ -1054,7 +1021,9 @@ class TypeParameterElementHandle extends ElementHandle |
* |
* @param element the element being represented |
*/ |
- TypeParameterElementHandle(TypeParameterElement element) : super(element); |
+ TypeParameterElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
TypeParameterElement get actualElement => |
@@ -1081,7 +1050,9 @@ abstract class VariableElementHandle extends ElementHandle |
* |
* @param element the element being represented |
*/ |
- VariableElementHandle(VariableElement element) : super(element); |
+ VariableElementHandle( |
+ ElementResynthesizer resynthesizer, ElementLocation location) |
+ : super(resynthesizer, location); |
@override |
VariableElement get actualElement => super.actualElement as VariableElement; |