]> source.dussan.org Git - aspectj.git/commitdiff
Fix for Bugzilla Bug 70241: outline view shows anonymous inner classes in different...
authoraclement <aclement>
Tue, 17 Aug 2004 09:37:46 +0000 (09:37 +0000)
committeraclement <aclement>
Tue, 17 Aug 2004 09:37:46 +0000 (09:37 +0000)
ajde/testdata/extensions/InnerClasses.java [new file with mode: 0644]
ajde/testsrc/org/aspectj/ajde/ExtensionTests.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AsmHierarchyBuilder.java

diff --git a/ajde/testdata/extensions/InnerClasses.java b/ajde/testdata/extensions/InnerClasses.java
new file mode 100644 (file)
index 0000000..f51667d
--- /dev/null
@@ -0,0 +1,35 @@
+public class InnerClasses {
+       
+       public static void main(String[] args) {
+               Runnable r = new Runnable() {
+                       public void run() {
+
+                       }
+               };
+               
+               r.run();
+               
+               new Object() {
+                       public String toString() {
+                               return "a";
+                       }
+               };
+               
+               new Runnable() {
+                       public void run() {
+
+                       }
+               }.run();
+       }
+       
+       
+       static class A {
+               public void method() {
+                       Runnable r = new Runnable() {
+                               public void run() {
+
+                               }
+                       };
+               }
+       }
+}
\ No newline at end of file
index d4659e3a8f68ea229ce9abbf6bce05ee2b6997be..ab492011f79f4a4b329e96470a9de148873ad56d 100644 (file)
  *******************************************************************************/
 package org.aspectj.ajde;
 
+import java.util.Iterator;
 import java.util.List;
+import java.util.Properties;
 import java.io.File;
 
+import org.aspectj.asm.AsmManager;
+import org.aspectj.asm.IProgramElement;
 import org.aspectj.bridge.IMessage;
 import org.aspectj.tools.ajc.AjcTestCase;
 import org.aspectj.tools.ajc.CompilationResult;
@@ -50,6 +54,78 @@ public class ExtensionTests extends AjcTestCase {
                        m.getID()==IProblem.UnusedImport);
        }
        
+       public void testInnerClassesInASM() {
+               String[] args = new String[] {"InnerClasses.java","-emacssym"};
+               CompilationResult result = ajc(baseDir,args);
+               List l = result.getWarningMessages();
+               Properties p = AsmManager.ModelInfo.summarizeModel().getProperties();
+               System.out.println("Structure Model for InnerClasses.java:");
+               walkit(AsmManager.getDefault().getHierarchy().getRoot(),0);
+               foundNode = null;
+               findChild("main",AsmManager.getDefault().getHierarchy().getRoot());
+               assertTrue("Should have found node 'main' in the model",foundNode!=null);
+               IProgramElement runnableChild = getChild(foundNode,"new Runnable() {..}");
+               assertTrue("'main' should have a child 'new Runnable() {..}'",
+                               runnableChild!=null);
+               assertTrue("'new Runnable() {..}' should have a 'run' child",
+                               getChild(runnableChild,"run")!=null);
+               
+               /* Left hand side is before the fix, right hand side is after:
+<root>
+  InnerClasses.java
+    import declarations
+    InnerClasses
+      A                                                        A
+        method                                         method
+        1                                                              new Runnable() {..}
+          run                                                          run
+      main                                             main
+      2                                                                new Runnable() {..}
+         run                                                   run
+      3                                                        new Object() {..}
+        toString                                               toString
+      4                                                                new Runnable
+        run                                                            run
+                */
+
+       }
+       
+       private IProgramElement getChild(IProgramElement parent,String s) {
+               List kids = parent.getChildren();
+               for (Iterator iter = kids.iterator(); iter.hasNext();) {
+                       IProgramElement element = (IProgramElement) iter.next();
+                       if (element.getName().indexOf(s)!=-1) return element;
+               }
+               return null;
+       }
+       
+       private IProgramElement foundNode = null;
+       
+       private void findChild(String s,IProgramElement ipe) {
+               if (ipe == null) return;
+               if (ipe.getName().indexOf(s)!=-1) {foundNode = ipe; return;}
+               if (ipe.getChildren()!=null) {
+                       List kids = ipe.getChildren();
+                       for (Iterator iter = kids.iterator(); iter.hasNext();) {
+                               IProgramElement element = (IProgramElement) iter.next();
+                               findChild(s,element);
+                       }
+               }
+       }
+       
+       public void walkit(IProgramElement ipe,int indent) {
+         if (ipe!=null) {
+               for (int i = 0 ;i<indent;i++) System.out.print(" ");
+               System.out.println(ipe.toLabelString());//getName());
+           if (ipe.getChildren()!=null) {
+               List kids = ipe.getChildren();
+               for (Iterator iter = kids.iterator(); iter.hasNext();) {
+                               IProgramElement element = (IProgramElement) iter.next();
+                               walkit(element,indent+2);
+                       }
+           }
+         }
+       }
        
 
 }
index 5ff6f078c102bf99002a5df27455fde92fcce786..ffe8e37e34c6b777c2c095df789681a1f1aa2379 100644 (file)
@@ -279,11 +279,9 @@ public class AsmHierarchyBuilder extends ASTVisitor {
                String fullName = "<undefined>";
                if (memberTypeDeclaration.binding != null
                        && memberTypeDeclaration.binding.constantPoolName() != null) {
-                       fullName = new String(memberTypeDeclaration.binding.constantPoolName());
+                       // Create a name something like 'new Runnable() {..}'
+                       fullName = "new "+memberTypeDeclaration.allocation.type.toString()+"() {..}";
                }
-                
-               int dollar = fullName.indexOf('$');
-               fullName = fullName.substring(dollar+1);
 
                IProgramElement.Kind kind = IProgramElement.Kind.CLASS;
                if (memberTypeDeclaration.isInterface()) kind = IProgramElement.Kind.INTERFACE;
@@ -298,8 +296,8 @@ public class AsmHierarchyBuilder extends ASTVisitor {
                peNode.setSourceSignature(genSourceSignature(memberTypeDeclaration));
                peNode.setFormalComment(generateJavadocComment(memberTypeDeclaration));
                
-               //??? we add this to the compilation unit
-               findEnclosingClass(stack).addChild(peNode);
+
+               ((IProgramElement)stack.peek()).addChild(peNode);
                stack.push(peNode);
                return true;
        }