]> source.dussan.org Git - aspectj.git/commitdiff
added a cache by handle to avoid terrible performance on larger projects
authoracolyer <acolyer>
Sat, 23 Aug 2003 11:57:20 +0000 (11:57 +0000)
committeracolyer <acolyer>
Sat, 23 Aug 2003 11:57:20 +0000 (11:57 +0000)
asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java
asm/src/org/aspectj/asm/internal/ProgramElement.java

index e8d2f99028b1c3b3b71f1bee98ee2f1ade1259c5..f33a5b9c83c05a49f537d684c2334febe29f8e05 100644 (file)
@@ -17,7 +17,6 @@ import java.io.*;
 import java.util.*;
 
 import org.aspectj.asm.*;
-import org.aspectj.asm.IProgramElement.Kind;
 import org.aspectj.bridge.*;
 
 /**
@@ -29,6 +28,7 @@ public class AspectJElementHierarchy implements IHierarchy {
     protected String configFile = null;
 
     private Map fileMap = null;
+    private Map handleMap = null;
     
        public IProgramElement getElement(String handle) {
                throw new RuntimeException("unimplemented");
@@ -40,6 +40,7 @@ public class AspectJElementHierarchy implements IHierarchy {
 
     public void setRoot(IProgramElement root) {
         this.root = root;
+        handleMap = new HashMap();
     }
 
        public void addToFileMap( Object key, Object value ){
@@ -270,12 +271,20 @@ public class AspectJElementHierarchy implements IHierarchy {
        
        // TODO: optimize this lookup
        public IProgramElement findElementForHandle(String handle) {
+               // try the cache first...
+               IProgramElement ret = (IProgramElement) handleMap.get(handle);
+               if (ret != null) return ret;
+               
                StringTokenizer st = new StringTokenizer(handle, ProgramElement.ID_DELIM);
                String file = st.nextToken();
                int line = new Integer(st.nextToken()).intValue();
                int col = new Integer(st.nextToken()).intValue();
                // TODO: use column number when available
-               return findElementForSourceLine(file, line);
+               ret = findElementForSourceLine(file, line);
+               if (ret != null) { 
+                       cache(handle,(ProgramElement)ret);
+               }
+               return ret;
                
 //             IProgramElement parent = findElementForType(packageName, typeName);
 //             if (parent == null) return null;
@@ -305,5 +314,9 @@ public class AspectJElementHierarchy implements IHierarchy {
 //             }
 //             return null;
 //     }
+
+       protected void cache(String handle, ProgramElement pe) {
+               handleMap.put(handle,pe);
+       }
 }
 
index fb89d06c3f750146ca09bde670d8ba380835d8ac..ecf1c862d32a9526ef671b967d1edef8daac1d95 100644 (file)
@@ -88,6 +88,7 @@ public class ProgramElement implements IProgramElement {
                this.formalComment = formalComment;
                this.modifiers = genModifiers(modifiers);
                this.accessibility = genAccessibility(modifiers);
+               cacheByHandle();
        }
        
        /**
@@ -115,6 +116,7 @@ public class ProgramElement implements IProgramElement {
                this.packageName = packageName;
                this.formalComment = formalComment;
                this.relations = relations;
+               cacheByHandle();
        }
 
        public List getModifiers() {
@@ -395,7 +397,7 @@ public class ProgramElement implements IProgramElement {
                        } else {
                                label = parent.getName() + '.'; 
                        }
-               } else if (kind == Kind.CLASS || kind == kind.ASPECT) {
+               } else if (kind == Kind.CLASS || kind == Kind.ASPECT) {
                        label = "";
                } else {
                        label = parent.getName() + '.';
@@ -469,5 +471,15 @@ public class ProgramElement implements IProgramElement {
        public void setDetails(String string) {
                details = string;
        }
+       
+       /** AMC added to speed up findByHandle lookups in AspectJElementHierarchy */
+       private void cacheByHandle() {
+               String handle = getHandleIdentifier();
+               if (handle != null) {
+                       AspectJElementHierarchy hierarchy = (AspectJElementHierarchy) 
+                               AsmManager.getDefault().getHierarchy();
+                       hierarchy.cache(handle,this);
+               }
+       }
 }