]> source.dussan.org Git - aspectj.git/commitdiff
231396: refactoring AspectJ: simplifying resolvedmember hierarchy and removing unused...
authoraclement <aclement>
Thu, 5 Jun 2008 15:10:36 +0000 (15:10 +0000)
committeraclement <aclement>
Thu, 5 Jun 2008 15:10:36 +0000 (15:10 +0000)
weaver/src/org/aspectj/weaver/AbstractReferenceTypeDelegate.java
weaver/src/org/aspectj/weaver/Member.java
weaver/src/org/aspectj/weaver/MemberImpl.java
weaver/src/org/aspectj/weaver/ResolvedMember.java
weaver/src/org/aspectj/weaver/ResolvedMemberImpl.java
weaver/src/org/aspectj/weaver/World.java
weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
weaver/testsrc/org/aspectj/weaver/TestUtils.java

index ee6b7a057518f19d261246b546aa4d315abbc9c7..70bb851eb014295e1a4907443baeb95e311840b9 100644 (file)
 package org.aspectj.weaver;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
 import java.util.List;
 
 import org.aspectj.apache.bcel.classfile.GenericSignatureParser;
 import org.aspectj.apache.bcel.classfile.Signature;
 import org.aspectj.apache.bcel.classfile.Signature.ClassSignature;
 import org.aspectj.bridge.ISourceLocation;
-import org.aspectj.weaver.patterns.Declare;
 
 public abstract class AbstractReferenceTypeDelegate implements ReferenceTypeDelegate {
        
@@ -43,8 +38,6 @@ public abstract class AbstractReferenceTypeDelegate implements ReferenceTypeDele
        public final boolean isClass() {
        return !isAspect() && !isInterface();
     }
-       
-       
 
        /**
         * Designed to be overriden by EclipseType to disable collection of shadow mungers
@@ -62,187 +55,7 @@ public abstract class AbstractReferenceTypeDelegate implements ReferenceTypeDele
                return resolvedTypeX;
        }
        
-    /**
-     * Create the string representation for a delegate, allowing us to 
-     * more easily compare delegate implementations.
-     */
-    public String stringifyDelegate() {
-       
-       StringBuffer result = new StringBuffer();
-       result.append("=== Delegate for "+getResolvedTypeX().getName()+"\n");
-       
-       result.append("isAspect?"+isAspect()+"\n");
-       result.append("isAnnotationStyleAspect?"+isAnnotationStyleAspect()+"\n");
-       result.append("isInterface?"+isInterface()+"\n");
-       result.append("isEnum?"+isEnum()+"\n");
-       result.append("isClass?"+isClass()+"\n");
-       result.append("-\n");
-       result.append("isAnnotation?"+isAnnotation()+"\n");
-       result.append("retentionPolicy="+getRetentionPolicy()+"\n");
-       result.append("canAnnotationTargetType?"+canAnnotationTargetType()+"\n");
-       AnnotationTargetKind[] kinds = getAnnotationTargetKinds();
-       if (kinds!=null && kinds.length>0) {
-               result.append("annotationTargetKinds:[");
-               for (int i = 0; i < kinds.length; i++) {
-                               AnnotationTargetKind kind = kinds[i];
-                               result.append(kind);
-                               if ((i+1)<kinds.length) result.append(" ");
-                       }
-               result.append("]\n");
-       }
-       result.append("isAnnotationWithRuntimeRetention?"+isAnnotationWithRuntimeRetention()+"\n");
-       result.append("-\n");
-       
-       result.append("isAnonymous?"+isAnonymous()+"\n");
-       result.append("isNested?"+isNested()+"\n");
-       result.append("-\n");
-
-       result.append("isGeneric?"+isGeneric()+"\n");
-       result.append("declaredGenericSignature="+getDeclaredGenericSignature()+"\n");
-       result.append("-\n");
-       
-       AnnotationX[] axs = getAnnotations();
-       if (axs!=null && axs.length>0) {
-               result.append("getAnnotations() returns: "+axs.length+" annotations\n");
-               for (int i = 0; i < axs.length; i++) {
-                               AnnotationX annotationX = axs[i];
-                               result.append("  #"+i+") "+annotationX+"\n");
-               }
-               } else {
-                       result.append("getAnnotations() returns nothing\n");
-               }
-       ResolvedType[] axtypes = getAnnotationTypes();
-       if (axtypes!=null && axtypes.length>0) {
-               result.append("getAnnotationTypes() returns: "+axtypes.length+" annotations\n");
-               for (int i = 0; i < axtypes.length; i++) {
-                               ResolvedType annotation = axtypes[i];
-                               result.append("  #"+i+") "+annotation+":"+annotation.getClass()+"\n");
-                       }
-       } else {
-                       result.append("getAnnotationTypes() returns nothing\n");
-               }
-       
-       result.append("isExposedToWeaver?"+isExposedToWeaver()+"\n");
-       result.append("getSuperclass?"+getSuperclass()+"\n");
-       result.append("getResolvedTypeX?"+getResolvedTypeX()+"\n");
-       result.append("--\n");
-       
-       ResolvedMember[] fields = getDeclaredFields();
-       if (fields!=null && fields.length>0) {
-               result.append("The fields: "+fields.length+"\n");
-               for (int i = 0; i < fields.length; i++) {
-                               ResolvedMember member = fields[i];
-                               result.append("f"+i+") "+member.toDebugString()+"\n");
-                       }
-       }
-       ResolvedMember[] methods = getDeclaredMethods();
-       if (methods!=null && methods.length>0) {
-               result.append("The methods: "+methods.length+"\n");
-               for (int i = 0; i < methods.length; i++) {
-                               ResolvedMember member = methods[i];
-                               result.append("m"+i+") "+member.toDebugString()+"\n");
-                       }
-       }
-       ResolvedType[] interfaces = getDeclaredInterfaces();
-       if (interfaces!=null && interfaces.length>0) {
-               result.append("The interfaces: "+interfaces.length+"\n");
-               for (int i = 0; i < interfaces.length; i++) {
-                       ResolvedType member = interfaces[i];
-                               result.append("i"+i+") "+member+"\n");
-                       }
-       }
-
-       result.append("getModifiers?"+getModifiers()+"\n");
-       
-       result.append("perclause="+getPerClause()+"\n");
-       
-       result.append("aj:weaverstate="+getWeaverState()+"\n");
-       
-       ResolvedMember[] pointcuts = getDeclaredPointcuts();
-       if (pointcuts!=null && pointcuts.length>0) {
-               result.append("The pointcuts: "+pointcuts.length+"\n");
-               
-               // Sort the damn things
-               List sortedSetOfPointcuts = new ArrayList();
-               for (int i = 0; i < pointcuts.length; i++) {sortedSetOfPointcuts.add(pointcuts[i]);}
-               Collections.sort(sortedSetOfPointcuts);
-               
-               int i =0;
-               for (Iterator iter = sortedSetOfPointcuts.iterator(); iter.hasNext();) {
-                               ResolvedMember member = (ResolvedMember) iter.next();
-                               result.append("p"+i+") "+member.toDebugString()+"\n");
-                               i++;
-                       }
-       }
-       
-       Collection declares = getDeclares();
-       if (declares.size()>0) {
-               result.append("The declares: "+declares.size()+"\n");
-               
-//             // Sort the damn things
-//             List sortedSetOfPointcuts = new ArrayList();
-//             for (int i = 0; i < pointcuts.length; i++) {sortedSetOfPointcuts.add(pointcuts[i]);}
-//             Collections.sort(sortedSetOfPointcuts);
-               
-               int i=0;
-               for (Iterator iter = declares.iterator(); iter.hasNext();) {
-                               Declare dec = (Declare) iter.next();
-                               result.append("d"+i+") "+dec.toString()+"\n");
-                               i++;
-                       }
-       }
-       
-       TypeVariable[] tv = getTypeVariables();
-       if (tv!=null && tv.length>0) {
-               result.append("The type variables: "+tv.length+"\n");
-               for (int i = 0; i < tv.length; i++) {
-                               result.append("tv"+i+") "+tv[i]+"\n");
-                       }
-       }
-       
-       Collection tmungers = getTypeMungers();
-       if (tmungers.size()>0) {
-               List sorted = new ArrayList();
-               sorted.addAll(tmungers);
-               Collections.sort(sorted,new Comparator() {
-                       public int compare(Object arg0, Object arg1) {
-                                return arg0.toString().compareTo(arg1.toString());
-                       }
-               });
-               result.append("The type mungers: "+tmungers.size()+"\n");
-               int i=0;
-               for (Iterator iter = sorted.iterator(); iter.hasNext();) {
-                               ConcreteTypeMunger mun = (ConcreteTypeMunger) iter.next();
-                               result.append("tm"+i+") "+mun.toString()+"\n");
-                               i++;
-                       }
-       }
-
-       result.append("doesNotExposeShadowMungers?"+doesNotExposeShadowMungers()+"\n");
-       
-       Collection pas = getPrivilegedAccesses();
-       if (pas!=null && pas.size()>0) {
-//             List sorted = new ArrayList();
-//             sorted.addAll(tmungers);
-//             Collections.sort(sorted,new Comparator() {
-//                     public int compare(Object arg0, Object arg1) {
-//                              return arg0.toString().compareTo(arg1.toString());
-//                     }
-//             });
-               result.append("The privileged accesses: "+pas.size()+"\n");
-               int i=0;
-               for (Iterator iter = pas.iterator(); iter.hasNext();) {
-                               ResolvedMember mun = (ResolvedMember) iter.next();
-                               result.append("tm"+i+") "+mun.toDebugString()+"\n");
-                               i++;
-                       }
-       }
-
-//     public Collection getPrivilegedAccesses();
-//      public boolean hasAnnotation(UnresolvedType ofType);   
-       result.append("===");
-       return result.toString();
-    }
+  
     
     public final String getSourcefilename() {
        return sourcefilename;
index 3f4605e78968d69aa0401b8f5783385767adfe24..36dcfe3a9c3190c163c98411535f8b735844e5ce 100644 (file)
@@ -72,8 +72,6 @@ public interface Member extends Comparable {
         */
        public String getParameterSignature();
 
-       public boolean isCompatibleWith(Member am);
-
        public int getModifiers(World world);
        
        public int getModifiers();
index 66c0dc7b099bcfc78605e1ab80461768c53df4df..9acb8a12b29ae5c3800dcb4ddc1a7be1195bd3b0 100644 (file)
@@ -386,30 +386,9 @@ public class MemberImpl implements Member {
        return paramSignature;
     }
     
-    /* (non-Javadoc)
-        * @see org.aspectj.weaver.Member#isCompatibleWith(org.aspectj.weaver.Member)
-        */
-    public boolean isCompatibleWith(Member am) {
-        if (kind != METHOD || am.getKind() != METHOD) return true;
-        if (! name.equals(am.getName())) return true;
-        if (! equalTypes(getParameterTypes(), am.getParameterTypes())) return true;
-        return getReturnType().equals(am.getReturnType());
-    }
-    
-    private static boolean equalTypes(UnresolvedType[] a, UnresolvedType[] b) {
-        int len = a.length;
-        if (len != b.length) return false;
-        for (int i = 0; i < len; i++) {
-            if (!a[i].equals(b[i])) return false;
-        }
-        return true;
-    }
-    
+    // OPTIMIZE see next line. Why the hell are they in here if we only know it once resolution has occurred...
     // ---- things we know only with resolution
     
-    /* (non-Javadoc)
-        * @see org.aspectj.weaver.Member#getModifiers(org.aspectj.weaver.World)
-        */
     public int getModifiers(World world) {
        ResolvedMember resolved = resolve(world);
        if (resolved == null) {
@@ -419,9 +398,6 @@ public class MemberImpl implements Member {
                return resolved.getModifiers();
     }
     
-    /* (non-Javadoc)
-        * @see org.aspectj.weaver.Member#getExceptions(org.aspectj.weaver.World)
-        */
     public UnresolvedType[] getExceptions(World world) {
        ResolvedMember resolved = resolve(world);
        if (resolved == null) {
index 2edeba6f26e41fb4e23b56c56a928ed473bf952b..c61d3666e5231a43aeaffb2c13f3204e9d364a81 100644 (file)
@@ -34,10 +34,10 @@ public interface ResolvedMember extends Member, AnnotatedElement, TypeVariableDe
 
        public ShadowMunger getAssociatedShadowMunger();
        
-       //OPTIMIZE have param annotation (and anno default value) related stuff here rather than above
-       // ??? true or false?
        public boolean isAjSynthetic();
 
+       public boolean isCompatibleWith(Member am);
+       
        public boolean hasAnnotations();
 
        public boolean hasAnnotation(UnresolvedType ofType);
index a4db3746f3d7c2cb3d3ce2afec0f9c9234d1431c..473f11f6667c51bcfc6a8da52ef2619cb3985c8e 100644 (file)
@@ -1031,7 +1031,22 @@ public class ResolvedMemberImpl extends MemberImpl implements IHasPosition, Anno
        return buf.toString();          
     }
 
+   public boolean isCompatibleWith(Member am) {
+       if (kind != METHOD || am.getKind() != METHOD) return true;
+       if (! name.equals(am.getName())) return true;
+       if (! equalTypes(getParameterTypes(), am.getParameterTypes())) return true;
+       return getReturnType().equals(am.getReturnType());
+   }
 
+   private static boolean equalTypes(UnresolvedType[] a, UnresolvedType[] b) {
+       int len = a.length;
+       if (len != b.length) return false;
+       for (int i = 0; i < len; i++) {
+           if (!a[i].equals(b[i])) return false;
+       }
+       return true;
+   }
+   
     
        public TypeVariable getTypeVariableNamed(String name) {
                // Check locally...
index 7bf7b6f8b5f0c7f0a9fb83b67207b52a64aa50cf..80139039a8d6a4b26bde2cf42c133b00c280b4f1 100644 (file)
@@ -838,6 +838,7 @@ public abstract class World implements Dump.INode {
                return targetAspectjRuntimeLevel;
        }
        
+       // OPTIMIZE are users falling foul of not supplying -1.5 and so targetting the old runtime?
        public boolean isTargettingAspectJRuntime12() {
                boolean b = false; // pr116679
                if (!isInJava5Mode()) b=true;
index a8ec574ebf09ad16339ce29e877bf7771d36d14d..0b63b479960d3ff56dca508730ee6d9ac2131f39 100644 (file)
@@ -53,26 +53,24 @@ import org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.GenericSigna
 
 public final class BcelMethod extends ResolvedMemberImpl {
 
-
        private Method method;
+
+       // these fields are not set for many BcelMethods...
        private ShadowMunger associatedShadowMunger;
        private ResolvedPointcutDefinition preResolvedPointcut;  // used when ajc has pre-resolved the pointcut of some @Advice
+       private AjAttribute.EffectiveSignatureAttribute effectiveSignature;
+       
        
-//    private ResolvedType[] annotationTypes = null;
+       private AjAttribute.MethodDeclarationLineNumberAttribute declarationLineNumber; 
     private AnnotationX[] annotations = null;
     private AnnotationX[][] parameterAnnotations = null;
-       
-       private AjAttribute.EffectiveSignatureAttribute effectiveSignature;
-       private AjAttribute.MethodDeclarationLineNumberAttribute declarationLineNumber;
        private BcelObjectType bcelObjectType;
        
-       private boolean parameterNamesInitialized = false;
-       
        private int bitflags;
-       private static final int KNOW_IF_SYNTHETIC           = 0x0001;
-       private static final int PARAMETER_NAMES_INITIALIZED = 0x0002;
-       private static final int CAN_BE_PARAMETERIZED        = 0x0004;
-       private static final int UNPACKED_GENERIC_SIGNATURE  = 0x0008;
+       private static final int KNOW_IF_SYNTHETIC           = 0x0001; // used
+       private static final int PARAMETER_NAMES_INITIALIZED = 0x0002; // used
+       private static final int CAN_BE_PARAMETERIZED        = 0x0004; // used
+       private static final int UNPACKED_GENERIC_SIGNATURE  = 0x0008; // used
        private static final int HAS_EFFECTIVE_SIGNATURE     = 0x0010;
        private static final int HAS_PRERESOLVED_POINTCUT    = 0x0020;
        private static final int IS_AJ_SYNTHETIC             = 0x0040;
@@ -80,14 +78,12 @@ public final class BcelMethod extends ResolvedMemberImpl {
        private static final int IS_SYNTHETIC_INVERSE        = 0x7f7f; // all bits but IS_SYNTHETIC (and topmost bit)
        private static final int HAS_ASSOCIATED_SHADOWMUNGER = 0x0100;
        private static final int HAS_GENERIC_RETPARAM_TYPES  = 0x0200;
-       private static final int HAS_ANNOTATIONS             = 0x0400;
-       private static final int HAVE_DETERMINED_ANNOTATIONS = 0x0800;
+       private static final int HAS_ANNOTATIONS             = 0x0400; // used
+       private static final int HAVE_DETERMINED_ANNOTATIONS = 0x0800; // used
        private static final int HAS_MD_LINE_NUMBER_ATTRIBUTE= 0x1000;
        
 
-        private boolean canBeParameterized = false;
         // genericized version of return and parameter types
-        private boolean unpackedGenericSignature = false;
         private UnresolvedType genericReturnType = null;
         private UnresolvedType[] genericParameterTypes = null;
 
@@ -132,8 +128,8 @@ public final class BcelMethod extends ResolvedMemberImpl {
     }
        
        public void determineParameterNames() {
-               if (parameterNamesInitialized) return;
-               parameterNamesInitialized=true;
+               if ((bitflags&PARAMETER_NAMES_INITIALIZED)!=0) { return; }
+               bitflags|=PARAMETER_NAMES_INITIALIZED;
                LocalVariableTable varTable = method.getLocalVariableTable();
                int len = getArity();
                if (varTable == null) {
@@ -431,7 +427,7 @@ public final class BcelMethod extends ResolvedMemberImpl {
          */
         public boolean canBeParameterized() {
                 unpackGenericSignature();
-               return canBeParameterized;
+               return (bitflags & CAN_BE_PARAMETERIZED)!=0;
        }
         
         
@@ -452,8 +448,8 @@ public final class BcelMethod extends ResolvedMemberImpl {
         public Method getMethod() { return method; }
         
         private void unpackGenericSignature() {
-                if (unpackedGenericSignature) return;
-                unpackedGenericSignature = true;
+               if ((bitflags&UNPACKED_GENERIC_SIGNATURE)!=0) { return; }
+               bitflags|=UNPACKED_GENERIC_SIGNATURE;
                 if (!bcelObjectType.getWorld().isInJava5Mode()) { 
                         this.genericReturnType = getReturnType();
                         this.genericParameterTypes = getParameterTypes();
@@ -464,7 +460,7 @@ public final class BcelMethod extends ResolvedMemberImpl {
                         Signature.MethodTypeSignature mSig = new GenericSignatureParser().parseAsMethodSignature(gSig);//method.getGenericSignature());
                         if (mSig.formalTypeParameters.length > 0) {
                                // generic method declaration
-                               canBeParameterized = true;
+                               bitflags|=CAN_BE_PARAMETERIZED;
                         }
                         
                        typeVariables = new TypeVariable[mSig.formalTypeParameters.length];
@@ -517,7 +513,7 @@ public final class BcelMethod extends ResolvedMemberImpl {
                                                        + e.getMessage());
                                }
                                if (paramTypeSigs[i] instanceof TypeVariableSignature) {
-                                       canBeParameterized = true;
+                                       bitflags|=CAN_BE_PARAMETERIZED;
                                }
                         }
                 } else {
@@ -549,10 +545,8 @@ public final class BcelMethod extends ResolvedMemberImpl {
        private void workOutIfSynthetic() {
                if ((bitflags&KNOW_IF_SYNTHETIC)!=0) return;
                bitflags|=KNOW_IF_SYNTHETIC;
-//             knowIfSynthetic=true;
                JavaClass jc = bcelObjectType.getJavaClass();
            bitflags&=IS_SYNTHETIC_INVERSE; // unset the bit
-//             isSynthetic=false;
                if (jc==null) return; // what the hell has gone wrong?
                if (jc.getMajor()<49/*Java5*/) {
                        // synthetic is an attribute
@@ -561,7 +555,6 @@ public final class BcelMethod extends ResolvedMemberImpl {
                                for (int i = 0; i < synthetics.length; i++) {
                                        if (synthetics[i].equals("Synthetic")) {
                                                bitflags|=IS_SYNTHETIC;
-//                                             isSynthetic=true;
                                                break;}
                                }
                        }
@@ -570,7 +563,6 @@ public final class BcelMethod extends ResolvedMemberImpl {
                        if ((modifiers&4096)!=0) {
                                bitflags|=IS_SYNTHETIC;
                        }
-//                     isSynthetic = (modifiers&4096)!=0;
                }
        }
 
index 48bbe5b443523e82f3678b6be1274ea339eb508a..ca3bb4e6c2857ab38d2a0182a7043c07f9d72ee9 100644 (file)
@@ -24,6 +24,189 @@ import org.aspectj.weaver.patterns.SimpleScope;
 public class TestUtils {
     private static final String[] ZERO_STRINGS = new String[0];
 
+    // For stringifying a delegate - extracted from AbstractReferenceTypeDelegate, not fixed up
+//    /**
+//     * Create the string representation for a delegate, allowing us to 
+//     * more easily compare delegate implementations.
+//     */
+//    public String stringifyDelegate() {
+//     
+//     StringBuffer result = new StringBuffer();
+//     result.append("=== Delegate for "+getResolvedTypeX().getName()+"\n");
+//     
+//     result.append("isAspect?"+isAspect()+"\n");
+//     result.append("isAnnotationStyleAspect?"+isAnnotationStyleAspect()+"\n");
+//     result.append("isInterface?"+isInterface()+"\n");
+//     result.append("isEnum?"+isEnum()+"\n");
+//     result.append("isClass?"+isClass()+"\n");
+//     result.append("-\n");
+//     result.append("isAnnotation?"+isAnnotation()+"\n");
+//     result.append("retentionPolicy="+getRetentionPolicy()+"\n");
+//     result.append("canAnnotationTargetType?"+canAnnotationTargetType()+"\n");
+//     AnnotationTargetKind[] kinds = getAnnotationTargetKinds();
+//     if (kinds!=null && kinds.length>0) {
+//             result.append("annotationTargetKinds:[");
+//             for (int i = 0; i < kinds.length; i++) {
+//                             AnnotationTargetKind kind = kinds[i];
+//                             result.append(kind);
+//                             if ((i+1)<kinds.length) result.append(" ");
+//                     }
+//             result.append("]\n");
+//     }
+//     result.append("isAnnotationWithRuntimeRetention?"+isAnnotationWithRuntimeRetention()+"\n");
+//     result.append("-\n");
+//     
+//     result.append("isAnonymous?"+isAnonymous()+"\n");
+//     result.append("isNested?"+isNested()+"\n");
+//     result.append("-\n");
+//
+//     result.append("isGeneric?"+isGeneric()+"\n");
+//     result.append("declaredGenericSignature="+getDeclaredGenericSignature()+"\n");
+//     result.append("-\n");
+//     
+//     AnnotationX[] axs = getAnnotations();
+//     if (axs!=null && axs.length>0) {
+//             result.append("getAnnotations() returns: "+axs.length+" annotations\n");
+//             for (int i = 0; i < axs.length; i++) {
+//                             AnnotationX annotationX = axs[i];
+//                             result.append("  #"+i+") "+annotationX+"\n");
+//             }
+//             } else {
+//                     result.append("getAnnotations() returns nothing\n");
+//             }
+//     ResolvedType[] axtypes = getAnnotationTypes();
+//     if (axtypes!=null && axtypes.length>0) {
+//             result.append("getAnnotationTypes() returns: "+axtypes.length+" annotations\n");
+//             for (int i = 0; i < axtypes.length; i++) {
+//                             ResolvedType annotation = axtypes[i];
+//                             result.append("  #"+i+") "+annotation+":"+annotation.getClass()+"\n");
+//                     }
+//     } else {
+//                     result.append("getAnnotationTypes() returns nothing\n");
+//             }
+//     
+//     result.append("isExposedToWeaver?"+isExposedToWeaver()+"\n");
+//     result.append("getSuperclass?"+getSuperclass()+"\n");
+//     result.append("getResolvedTypeX?"+getResolvedTypeX()+"\n");
+//     result.append("--\n");
+//     
+//     ResolvedMember[] fields = getDeclaredFields();
+//     if (fields!=null && fields.length>0) {
+//             result.append("The fields: "+fields.length+"\n");
+//             for (int i = 0; i < fields.length; i++) {
+//                             ResolvedMember member = fields[i];
+//                             result.append("f"+i+") "+member.toDebugString()+"\n");
+//                     }
+//     }
+//     ResolvedMember[] methods = getDeclaredMethods();
+//     if (methods!=null && methods.length>0) {
+//             result.append("The methods: "+methods.length+"\n");
+//             for (int i = 0; i < methods.length; i++) {
+//                             ResolvedMember member = methods[i];
+//                             result.append("m"+i+") "+member.toDebugString()+"\n");
+//                     }
+//     }
+//     ResolvedType[] interfaces = getDeclaredInterfaces();
+//     if (interfaces!=null && interfaces.length>0) {
+//             result.append("The interfaces: "+interfaces.length+"\n");
+//             for (int i = 0; i < interfaces.length; i++) {
+//                     ResolvedType member = interfaces[i];
+//                             result.append("i"+i+") "+member+"\n");
+//                     }
+//     }
+//
+//     result.append("getModifiers?"+getModifiers()+"\n");
+//     
+//     result.append("perclause="+getPerClause()+"\n");
+//     
+//     result.append("aj:weaverstate="+getWeaverState()+"\n");
+//     
+//     ResolvedMember[] pointcuts = getDeclaredPointcuts();
+//     if (pointcuts!=null && pointcuts.length>0) {
+//             result.append("The pointcuts: "+pointcuts.length+"\n");
+//             
+//             // Sort the damn things
+//             List sortedSetOfPointcuts = new ArrayList();
+//             for (int i = 0; i < pointcuts.length; i++) {sortedSetOfPointcuts.add(pointcuts[i]);}
+//             Collections.sort(sortedSetOfPointcuts);
+//             
+//             int i =0;
+//             for (Iterator iter = sortedSetOfPointcuts.iterator(); iter.hasNext();) {
+//                             ResolvedMember member = (ResolvedMember) iter.next();
+//                             result.append("p"+i+") "+member.toDebugString()+"\n");
+//                             i++;
+//                     }
+//     }
+//     
+//     Collection declares = getDeclares();
+//     if (declares.size()>0) {
+//             result.append("The declares: "+declares.size()+"\n");
+//             
+////                   // Sort the damn things
+////           List sortedSetOfPointcuts = new ArrayList();
+////           for (int i = 0; i < pointcuts.length; i++) {sortedSetOfPointcuts.add(pointcuts[i]);}
+////           Collections.sort(sortedSetOfPointcuts);
+//             
+//             int i=0;
+//             for (Iterator iter = declares.iterator(); iter.hasNext();) {
+//                             Declare dec = (Declare) iter.next();
+//                             result.append("d"+i+") "+dec.toString()+"\n");
+//                             i++;
+//                     }
+//     }
+//     
+//     TypeVariable[] tv = getTypeVariables();
+//     if (tv!=null && tv.length>0) {
+//             result.append("The type variables: "+tv.length+"\n");
+//             for (int i = 0; i < tv.length; i++) {
+//                             result.append("tv"+i+") "+tv[i]+"\n");
+//                     }
+//     }
+//     
+//     Collection tmungers = getTypeMungers();
+//     if (tmungers.size()>0) {
+//             List sorted = new ArrayList();
+//             sorted.addAll(tmungers);
+//             Collections.sort(sorted,new Comparator() {
+//                     public int compare(Object arg0, Object arg1) {
+//                              return arg0.toString().compareTo(arg1.toString());
+//                     }
+//             });
+//             result.append("The type mungers: "+tmungers.size()+"\n");
+//             int i=0;
+//             for (Iterator iter = sorted.iterator(); iter.hasNext();) {
+//                             ConcreteTypeMunger mun = (ConcreteTypeMunger) iter.next();
+//                             result.append("tm"+i+") "+mun.toString()+"\n");
+//                             i++;
+//                     }
+//     }
+//
+//     result.append("doesNotExposeShadowMungers?"+doesNotExposeShadowMungers()+"\n");
+//     
+//     Collection pas = getPrivilegedAccesses();
+//     if (pas!=null && pas.size()>0) {
+////                   List sorted = new ArrayList();
+////                   sorted.addAll(tmungers);
+////                   Collections.sort(sorted,new Comparator() {
+////                           public int compare(Object arg0, Object arg1) {
+////                                    return arg0.toString().compareTo(arg1.toString());
+////                           }
+////                   });
+//             result.append("The privileged accesses: "+pas.size()+"\n");
+//             int i=0;
+//             for (Iterator iter = pas.iterator(); iter.hasNext();) {
+//                             ResolvedMember mun = (ResolvedMember) iter.next();
+//                             result.append("tm"+i+") "+mun.toDebugString()+"\n");
+//                             i++;
+//                     }
+//     }
+//
+////           public Collection getPrivilegedAccesses();
+////      public boolean hasAnnotation(UnresolvedType ofType); 
+//     result.append("===");
+//     return result.toString();
+//    }
+    
     /**
      * Build a member from a string representation:
      * <blockquote><pre>