Chromium Code Reviews| Index: editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/index/util/ElementFactory.java |
| diff --git a/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/index/util/ElementFactory.java b/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/index/util/ElementFactory.java |
| index 7f553b035a2f7f0c5bcbb5e576fd35ba24501416..feaf6c56578f7ac9597919e0a8a4ceecfbe6534f 100644 |
| --- a/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/index/util/ElementFactory.java |
| +++ b/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/index/util/ElementFactory.java |
| @@ -13,6 +13,7 @@ |
| */ |
| package com.google.dart.tools.core.internal.index.util; |
| +import com.google.common.collect.MapMaker; |
| import com.google.dart.compiler.resolver.ClassElement; |
| import com.google.dart.compiler.resolver.ConstructorElement; |
| import com.google.dart.compiler.resolver.EnclosingElement; |
| @@ -28,6 +29,8 @@ import com.google.dart.tools.core.model.DartLibrary; |
| import com.google.dart.tools.core.model.DartModelException; |
| import com.google.dart.tools.core.utilities.bindings.BindingUtils; |
| +import java.util.Map; |
| + |
| /** |
| * The class <code>ElementFactory</code> defines utility methods used to create {@link Element |
| * elements}. |
| @@ -37,6 +40,8 @@ public final class ElementFactory { |
| * The element id used for library elements. |
| */ |
| public static final String LIBRARY_ELEMENT_ID = "#library"; |
| + private static final Map<com.google.dart.compiler.resolver.Element, Element> compilerToModelElement = new MapMaker().weakKeys().softValues().makeMap(); |
| + private static final Map<com.google.dart.compiler.resolver.FieldElement, Element[]> compilerToModelFieldElement = new MapMaker().weakKeys().softValues().makeMap(); |
| /** |
| * Compose the element id of the given parent element and the name of a child element into an |
| @@ -78,16 +83,14 @@ public final class ElementFactory { |
| if (element.isDynamic()) { |
| return null; |
| } |
| - LibraryElement libraryElement = getLibraryElement(element); |
| -// long start = System.currentTimeMillis(); |
| - CompilationUnitElement dartType = BindingUtils.getDartElement( |
| - BindingUtils.getDartElement(libraryElement), |
| - element); |
| -// bindingTime += (System.currentTimeMillis() - start); |
| - if (dartType == null) { |
| - return null; |
| + Element result = compilerToModelElement.get(element); |
| + if (result == null) { |
| + result = getElement0(element); |
| + if (result != null) { |
| + compilerToModelElement.put(element, result); |
| + } |
| } |
| - return new Element(ResourceFactory.getResource(dartType), composeElementId(element.getName())); |
| + return result; |
| } |
| /** |
| @@ -100,17 +103,23 @@ public final class ElementFactory { |
| */ |
| public static Element getElement(com.google.dart.compiler.resolver.Element element) |
| throws DartModelException { |
| - if (element instanceof ClassElement) { |
| - return getElement((ClassElement) element); |
| - } else if (element instanceof FieldElement) { |
| - return getElement((FieldElement) element); |
| - } else if (element instanceof LibraryElement) { |
| - return getElement((LibraryElement) element); |
| - } else if (element instanceof MethodElement) { |
| - return getElement((MethodElement) element); |
| + Element result = compilerToModelElement.get(element); |
|
Brian Wilkerson
2012/07/13 15:00:08
This looks wrong to me. Each of the more specific
scheglov
2012/07/13 16:48:10
Done.
Well, actually for FieldElement we would ca
|
| + if (result == null) { |
| + if (element instanceof ClassElement) { |
| + result = getElement((ClassElement) element); |
| + } else if (element instanceof FieldElement) { |
| + result = getElement((FieldElement) element); |
|
Brian Wilkerson
2012/07/13 15:00:08
nit: this could be getElement((FieldElement) eleme
scheglov
2012/07/13 16:48:10
Done.
|
| + } else if (element instanceof LibraryElement) { |
| + result = getElement((LibraryElement) element); |
| + } else if (element instanceof MethodElement) { |
| + result = getElement((MethodElement) element); |
| + } else { |
| + DartCore.logInformation("Could not getElement for " + element.getClass().getName()); |
| + return null; |
| + } |
| + compilerToModelElement.put(element, result); |
| } |
| - DartCore.logInformation("Could not getElement for " + element.getClass().getName()); |
| - return null; |
| + return result; |
| } |
| /** |
| @@ -137,24 +146,21 @@ public final class ElementFactory { |
| */ |
| public static Element getElement(FieldElement element, boolean allowGetter, boolean allowSetter) |
| throws DartModelException { |
| -// long start = System.currentTimeMillis(); |
| - CompilationUnitElement field = BindingUtils.getDartElement( |
| - BindingUtils.getDartElement(BindingUtils.getLibrary(element)), |
| - element, |
| - allowGetter, |
| - allowSetter); |
| -// bindingTime += (System.currentTimeMillis() - start); |
| - if (field == null) { |
| - DartCore.logInformation("Could not getElement for field " + pathTo(element)); |
| - return null; |
| + int index = (allowGetter ? 2 : 0) + (allowSetter ? 1 : 0); |
| + // prepare array for getter/setter |
| + Element[] resultArray = compilerToModelFieldElement.get(element); |
| + if (resultArray == null) { |
| + resultArray = new Element[4]; |
| + compilerToModelFieldElement.put(element, resultArray); |
| } |
| - EnclosingElement parentElement = element.getEnclosingElement(); |
| - if (parentElement instanceof LibraryElement) { |
| - return new Element(ResourceFactory.getResource(field), composeElementId(element.getName())); |
| + // prepare single array element |
| + Element result = resultArray[index]; |
| + if (result == null) { |
| + result = getElement0(element, allowGetter, allowSetter); |
| + resultArray[index] = result; |
| } |
| - return new Element(ResourceFactory.getResource(field), composeElementId( |
| - getElement(parentElement), |
| - element.getName())); |
| + // done |
| + return result; |
| } |
| /** |
| @@ -192,14 +198,56 @@ public final class ElementFactory { |
| * containing the method |
| */ |
| public static Element getElement(MethodElement element) throws DartModelException { |
| -// long start = System.currentTimeMillis(); |
| + Element result = compilerToModelElement.get(element); |
| + if (result == null) { |
| + result = getElement0(element); |
| + if (result != null) { |
| + compilerToModelElement.put(element, result); |
| + } |
| + } |
| + return result; |
| + } |
| + |
| + private static Element getElement0(ClassElement element) throws DartModelException { |
| + Element result; |
| + LibraryElement libraryElement = getLibraryElement(element); |
| + CompilationUnitElement dartType = BindingUtils.getDartElement( |
| + BindingUtils.getDartElement(libraryElement), |
| + element); |
| + if (dartType == null) { |
| + return null; |
| + } |
| + result = new Element(ResourceFactory.getResource(dartType), composeElementId(element.getName())); |
| + return result; |
| + } |
| + |
| + private static Element getElement0(FieldElement element, boolean allowGetter, boolean allowSetter) |
| + throws DartModelException { |
| + CompilationUnitElement field = BindingUtils.getDartElement( |
| + BindingUtils.getDartElement(BindingUtils.getLibrary(element)), |
| + element, |
| + allowGetter, |
| + allowSetter); |
| + if (field == null) { |
| + DartCore.logInformation("Could not getElement for field " + pathTo(element)); |
| + return null; |
| + } |
| + EnclosingElement parentElement = element.getEnclosingElement(); |
| + if (parentElement instanceof LibraryElement) { |
| + return new Element(ResourceFactory.getResource(field), composeElementId(element.getName())); |
| + } |
| + return new Element(ResourceFactory.getResource(field), composeElementId( |
| + getElement(parentElement), |
| + element.getName())); |
| + } |
| + |
| + private static Element getElement0(MethodElement element) throws DartModelException { |
| DartLibrary library = BindingUtils.getDartElement(BindingUtils.getLibrary(element)); |
| if (library == null) { |
| DartCore.logInformation("Could not getElement for method " + pathTo(element)); |
| return null; |
| } |
| CompilationUnitElement method = BindingUtils.getDartElement(library, element); |
| -// bindingTime += (System.currentTimeMillis() - start); |
| if (method == null) { |
| DartCore.logInformation("Could not getElement for method " + pathTo(element)); |
| return null; |