]> source.dussan.org Git - aspectj.git/commitdiff
changed Member to be an interface with impl MemberImpl. changed ResolvedMember to...
authoracolyer <acolyer>
Thu, 4 Aug 2005 13:19:20 +0000 (13:19 +0000)
committeracolyer <acolyer>
Thu, 4 Aug 2005 13:19:20 +0000 (13:19 +0000)
51 files changed:
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/IfMethodDeclaration.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/IfPseudoToken.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeConstructorDeclaration.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeFieldDeclaration.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeMethodDeclaration.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseShadow.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java
weaver/src/org/aspectj/weaver/AjAttribute.java
weaver/src/org/aspectj/weaver/AjcMemberMaker.java
weaver/src/org/aspectj/weaver/CrosscuttingMembers.java
weaver/src/org/aspectj/weaver/Member.java
weaver/src/org/aspectj/weaver/MemberImpl.java [new file with mode: 0644]
weaver/src/org/aspectj/weaver/NewConstructorTypeMunger.java
weaver/src/org/aspectj/weaver/NewFieldTypeMunger.java
weaver/src/org/aspectj/weaver/NewMethodTypeMunger.java
weaver/src/org/aspectj/weaver/ResolvedMember.java
weaver/src/org/aspectj/weaver/ResolvedPointcutDefinition.java
weaver/src/org/aspectj/weaver/ResolvedType.java
weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java
weaver/src/org/aspectj/weaver/WeaverMessages.java
weaver/src/org/aspectj/weaver/bcel/BcelAccessForInlineMunger.java
weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java
weaver/src/org/aspectj/weaver/bcel/BcelField.java
weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
weaver/src/org/aspectj/weaver/bcel/BcelRenderer.java
weaver/src/org/aspectj/weaver/bcel/BcelShadow.java
weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java
weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java
weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java
weaver/src/org/aspectj/weaver/patterns/CflowPointcut.java
weaver/src/org/aspectj/weaver/patterns/ConcreteCflowPointcut.java
weaver/src/org/aspectj/weaver/patterns/IfPointcut.java
weaver/src/org/aspectj/weaver/patterns/PerCflow.java
weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
weaver/src/org/aspectj/weaver/patterns/WithincodePointcut.java
weaver/src/org/aspectj/weaver/weaver-messages.properties
weaver/testsrc/fluffy/Base.java
weaver/testsrc/fluffy/Derived.java
weaver/testsrc/org/aspectj/weaver/MemberTestCase.java
weaver/testsrc/org/aspectj/weaver/ResolvedMemberSignaturesTestCase15.java [new file with mode: 0644]
weaver/testsrc/org/aspectj/weaver/bcel/ArgsWeaveTestCase.java
weaver/testsrc/org/aspectj/weaver/bcel/AroundWeaveTestCase.java
weaver/testsrc/org/aspectj/weaver/bcel/MegaZipTestCase.java
weaver/testsrc/org/aspectj/weaver/bcel/PointcutResidueTestCase.java
weaver/testsrc/org/aspectj/weaver/bcel/TjpWeaveTestCase.java
weaver/testsrc/org/aspectj/weaver/bcel/WeaveOrderTestCase.java
weaver/testsrc/org/aspectj/weaver/bcel/WorldTestCase.java
weaver/testsrc/org/aspectj/weaver/patterns/SignaturePatternTestCase.java
weaver/testsrc/org/aspectj/weaver/patterns/WithinTestCase.java

index b0f406cf9fcd537f9bac0ba1315ffdc525687f25..17c74be76173fb7dae95a15099c1484aac38d82f 100644 (file)
@@ -15,7 +15,7 @@ package org.aspectj.ajdt.internal.compiler.ast;
 
 import org.aspectj.ajdt.internal.compiler.lookup.EclipseFactory;
 import org.aspectj.weaver.Member;
-import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.patterns.IfPointcut;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ClassFile;
@@ -50,7 +50,7 @@ public class IfMethodDeclaration extends AjMethodDeclaration {
                        
                        //XXX this is where we should remove unavailable args if we're in a cflow
                        EclipseFactory factory = EclipseFactory.fromScopeLookupEnvironment(scope);
-                       ifPointcut.testMethod = new ResolvedMember(
+                       ifPointcut.testMethod = new ResolvedMemberImpl(
                                Member.METHOD,
                                factory.fromBinding(binding.declaringClass),
                                this.modifiers, ResolvedType.BOOLEAN,  
index 14f708b5196b9b903c6e0998962f25b88b4a1e1c..58059494918431cee3aabcef42016be82eb6470d 100644 (file)
@@ -16,7 +16,7 @@ package org.aspectj.ajdt.internal.compiler.ast;
 import java.lang.reflect.Modifier;
 
 import org.aspectj.weaver.Member;
-import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.patterns.IfPointcut;
 import org.aspectj.weaver.patterns.Pointcut;
@@ -71,7 +71,7 @@ public class IfPseudoToken extends PseudoToken {
                } else if (expr instanceof TrueLiteral) {
                        return IfPointcut.makeIfTruePointcut(Pointcut.SYMBOLIC);
                } else {
-                 pointcut = new IfPointcut(new ResolvedMember(Member.METHOD, UnresolvedType.OBJECT, 0, "if_", "()V"), 0);
+                 pointcut = new IfPointcut(new ResolvedMemberImpl(Member.METHOD, UnresolvedType.OBJECT, 0, "if_", "()V"), 0);
                }
                return pointcut;
                
index 82dd5cdc3d7b319907febc5010f5366ea290a1ae..d524dcfbd3d73d8172af0007ca7a04f93795cc24 100644 (file)
@@ -221,7 +221,7 @@ public class InterTypeConstructorDeclaration extends InterTypeDeclaration {
                ResolvedMember bindingAsMember = world.makeResolvedMember(binding);
                
                ResolvedMember signature =
-                       new ResolvedMember(Member.CONSTRUCTOR, declaringTypeX, declaredModifiers, 
+                       new ResolvedMemberImpl(Member.CONSTRUCTOR, declaringTypeX, declaredModifiers, 
                                        ResolvedType.VOID, "<init>", bindingAsMember.getParameterTypes(),
                                        world.fromEclipse(binding.thrownExceptions));                   
                ResolvedMember syntheticInterMember =
@@ -253,7 +253,7 @@ public class InterTypeConstructorDeclaration extends InterTypeDeclaration {
                                world.makeResolvedMember(explicitConstructor));
                } else {
                        ((NewConstructorTypeMunger)munger).setExplicitConstructor(
-                               new ResolvedMember(Member.CONSTRUCTOR, 
+                               new ResolvedMemberImpl(Member.CONSTRUCTOR, 
                                        world.fromBinding(onTypeBinding.superclass()),
                                        0, ResolvedType.VOID, "<init>", UnresolvedType.NONE));
                }
index 7b33c9ab1960a3e30073d75e6ed31189d2d7c5ab..464f8f177aeedfd5d719296d8a17f44ab44ecfad 100644 (file)
@@ -174,7 +174,7 @@ public class InterTypeFieldDeclaration extends InterTypeDeclaration {
                        declaringType = declaringType.getGenericType();
                }
                ResolvedMember sig = 
-                       new ResolvedMember(Member.FIELD, declaringType,
+                       new ResolvedMemberImpl(Member.FIELD, declaringType,
                                        declaredModifiers, world.fromBinding(binding.returnType),
                                        new String(declaredSelector), UnresolvedType.NONE);
                
index e868d796b9d7a669ead9087a0f26ca393daa8e7a..f20476fddc5b28cb5a6751ff2cdf6e4b406aaca3 100644 (file)
@@ -23,6 +23,7 @@ import org.aspectj.weaver.Member;
 import org.aspectj.weaver.NameMangler;
 import org.aspectj.weaver.NewMethodTypeMunger;
 import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.UnresolvedType;
@@ -124,7 +125,7 @@ public class InterTypeMethodDeclaration extends InterTypeDeclaration {
                if (isTargetAnnotation(classScope,"method")) return null; // Error message output in isTargetAnnotation
                if (isTargetEnum(classScope,"method")) return null; // Error message output in isTargetEnum
                
-               ResolvedMember sig = new ResolvedMember(Member.METHOD, world.fromBinding(onTypeBinding),
+               ResolvedMemberImpl sig = new ResolvedMemberImpl(Member.METHOD, world.fromBinding(onTypeBinding),
                        declaredModifiers, world.fromBinding(binding.returnType), new String(declaredSelector),
                        world.fromBindings(binding.parameters),
                        world.fromEclipse(binding.thrownExceptions));
index 4ebc962e39ffead835f070d17eb94da433b30798..b853c14a044fc85781490afc3f6dbcfdc5cf340a 100644 (file)
@@ -33,6 +33,7 @@ import org.aspectj.weaver.IHasPosition;
 import org.aspectj.weaver.Member;
 import org.aspectj.weaver.ReferenceType;
 import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.TypeFactory;
@@ -373,7 +374,7 @@ public class EclipseFactory {
                // AMC these next two lines shouldn't be needed once we sort out generic types properly in the world map
                ResolvedType realDeclaringType = world.resolve(fromBinding(declaringType));
                if (realDeclaringType.isRawType()) realDeclaringType = realDeclaringType.getGenericType();
-               ResolvedMember ret =  new ResolvedMember(
+               ResolvedMember ret =  new ResolvedMemberImpl(
                        binding.isConstructor() ? Member.CONSTRUCTOR : Member.METHOD,
                        realDeclaringType,
                        binding.modifiers,
@@ -392,7 +393,7 @@ public class EclipseFactory {
                // AMC these next two lines shouldn't be needed once we sort out generic types properly in the world map
                ResolvedType realDeclaringType = world.resolve(fromBinding(receiverType));
                if (realDeclaringType.isRawType()) realDeclaringType = realDeclaringType.getGenericType();
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.FIELD,
                        realDeclaringType,
                        binding.modifiers,
@@ -671,7 +672,7 @@ public class EclipseFactory {
        }
        
        public ResolvedMember fromBinding(MethodBinding binding) {
-               return new ResolvedMember(Member.METHOD,fromBinding(binding.declaringClass),binding.modifiers,
+               return new ResolvedMemberImpl(Member.METHOD,fromBinding(binding.declaringClass),binding.modifiers,
                                           fromBinding(binding.returnType),CharOperation.charToString(binding.selector),fromBindings(binding.parameters));
        }
 
index f610a80070f6fe611934040d1f4826d2474a5e59..4bb3a5829fbc092aa198e9642a5463e7cbf6e46d 100644 (file)
@@ -65,7 +65,7 @@ public class EclipseShadow extends Shadow {
 
        public Member getEnclosingCodeSignature() {
                if (context instanceof TypeDeclaration) {
-                       return new Member(Member.STATIC_INITIALIZATION, getEnclosingType(), 0, 
+                       return new MemberImpl(Member.STATIC_INITIALIZATION, getEnclosingType(), 0, 
                                                ResolvedType.VOID, "<clinit>", UnresolvedType.NONE);
                } else if (context instanceof AbstractMethodDeclaration) {
                        return world.makeResolvedMember(((AbstractMethodDeclaration)context).binding);
@@ -170,7 +170,7 @@ public class EclipseShadow extends Shadow {
                                        world.makeResolvedMember(e.binding), astNode, context);
                } else if (astNode instanceof TypeDeclaration) {
                        return new EclipseShadow(world, Shadow.StaticInitialization,
-                                                       new Member(Member.STATIC_INITIALIZATION, 
+                                                       new MemberImpl(Member.STATIC_INITIALIZATION, 
                                                                world.fromBinding(((TypeDeclaration)astNode).binding), 0, 
                                                                ResolvedType.VOID, "<clinit>", UnresolvedType.NONE),
                                                        astNode, context);
index 084d6315354b53802d90d3e7fbc7fe9ff929575f..d997cdec705a93143d070809d1b57ddec6cc95ef 100644 (file)
@@ -25,6 +25,7 @@ import org.aspectj.weaver.AjcMemberMaker;
 import org.aspectj.weaver.Lint;
 import org.aspectj.weaver.Member;
 import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.World;
@@ -77,7 +78,7 @@ public class PrivilegedHandler implements IPrivilegedHandler {
        
        public void notePrivilegedTypeAccess(ReferenceBinding type, ASTNode location) {
                ResolvedMember key =
-                       new ResolvedMember(Member.STATIC_INITIALIZATION,
+                       new ResolvedMemberImpl(Member.STATIC_INITIALIZATION,
                                inAspect.factory.fromEclipse(type), 0, ResolvedType.VOID, "", UnresolvedType.NONE);
                
                checkWeaveAccess(key.getDeclaringType(), location);
index 01b60c581213ea3c1dcf1f4e7941efa356e62293..30afb8c6407c870546358ba788fb3bbc61c56937 100644 (file)
@@ -452,7 +452,7 @@ public abstract class AjAttribute {
                                        s.readByte(),
                                        s.readInt(), s.readInt(), context,
                                        s.readBoolean(),
-                                       ResolvedMember.readResolvedMemberArray(s, context),
+                                       ResolvedMemberImpl.readResolvedMemberArray(s, context),
                                        FileUtil.readBooleanArray(s),
                                        UnresolvedType.readArray(s));
                        } else {
@@ -473,7 +473,7 @@ public abstract class AjAttribute {
                        
                        if (kind == AdviceKind.Around) {
                                s.writeBoolean(proceedInInners);
-                               ResolvedMember.writeArray(proceedCallSignatures, s);
+                               ResolvedMemberImpl.writeArray(proceedCallSignatures, s);
                                FileUtil.writeBooleanArray(formalsUnchangedToProceed, s);
                                UnresolvedType.writeArray(declaredExceptions, s);
                        }
@@ -563,7 +563,7 @@ public abstract class AjAttribute {
                        this.accessedMembers = accessedMembers;
                }
                public void write(DataOutputStream s) throws IOException {
-                       ResolvedMember.writeArray(accessedMembers, s);
+                       ResolvedMemberImpl.writeArray(accessedMembers, s);
                }               
                
                public ResolvedMember[] getAccessedMembers() {
@@ -571,7 +571,7 @@ public abstract class AjAttribute {
                }
 
                public static PrivilegedAttribute read(VersionedDataInputStream s, ISourceContext context) throws IOException {
-                       return new PrivilegedAttribute(ResolvedMember.readResolvedMemberArray(s, context));
+                       return new PrivilegedAttribute(ResolvedMemberImpl.readResolvedMemberArray(s, context));
                }
        }       
        
@@ -599,7 +599,7 @@ public abstract class AjAttribute {
 
                public static EffectiveSignatureAttribute read(VersionedDataInputStream s, ISourceContext context) throws IOException {
                        return new EffectiveSignatureAttribute(
-                                       ResolvedMember.readResolvedMember(s, context),
+                                       ResolvedMemberImpl.readResolvedMember(s, context),
                                        Shadow.Kind.read(s),
                                        s.readBoolean());
                }
index dc5db0a71405d1f4f483e60bfac4031a6a6666a8..622ef79b194d84c51214a18e6e07a414e5c8ee6b 100644 (file)
@@ -46,7 +46,7 @@ public class AjcMemberMaker {
                UnresolvedType.forName("org.aspectj.lang.NoAspectBoundException");
 
        public static ResolvedMember ajcPreClinitMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD, 
                        declaringType,
                        PRIVATE_STATIC,
@@ -55,7 +55,7 @@ public class AjcMemberMaker {
        }
 
        public static ResolvedMember ajcPostClinitMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD, 
                        declaringType,
                        PRIVATE_STATIC,
@@ -64,7 +64,7 @@ public class AjcMemberMaker {
        }
 
        public static Member noAspectBoundExceptionInit() {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                                Member.METHOD,
                                NO_ASPECT_BOUND_EXCEPTION,
                                Modifier.PUBLIC,
@@ -73,7 +73,7 @@ public class AjcMemberMaker {
        }
        
        public static Member noAspectBoundExceptionInit2() {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                                Member.METHOD,
                                NO_ASPECT_BOUND_EXCEPTION,
                                Modifier.PUBLIC,
@@ -82,7 +82,7 @@ public class AjcMemberMaker {
        }
 
        public static Member noAspectBoundExceptionInitWithCause() {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                                Member.METHOD,
                                NO_ASPECT_BOUND_EXCEPTION,
                                Modifier.PUBLIC,
@@ -92,7 +92,7 @@ public class AjcMemberMaker {
 
        
        public static ResolvedMember perCflowPush(UnresolvedType declaringType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD, 
                        declaringType,
                        PUBLIC_STATIC,
@@ -101,7 +101,7 @@ public class AjcMemberMaker {
        }
        
        public static ResolvedMember perCflowField(UnresolvedType declaringType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.FIELD, 
                        declaringType,
                        PUBLIC_STATIC_FINAL,
@@ -110,7 +110,7 @@ public class AjcMemberMaker {
        }
 
        public static ResolvedMember perSingletonField(UnresolvedType declaringType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.FIELD, 
                        declaringType,
                        PUBLIC_STATIC_FINAL,
@@ -120,7 +120,7 @@ public class AjcMemberMaker {
        
 
        public static ResolvedMember initFailureCauseField(UnresolvedType declaringType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                                Member.FIELD, 
                                declaringType,
                                PRIVATE_STATIC,
@@ -133,7 +133,7 @@ public class AjcMemberMaker {
                if (!UnresolvedType.SERIALIZABLE.resolve(aspectType.getWorld()).isAssignableFrom(aspectType)) {
                        modifiers |= Modifier.TRANSIENT;
                }
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.FIELD, 
                        declaringType,
                        modifiers,
@@ -148,7 +148,7 @@ public class AjcMemberMaker {
                if (!isSerializableAspect(aspectType)) {
                        modifiers |= Modifier.TRANSIENT;
                }
-               return new ResolvedMember(Member.FIELD, declaringType, modifiers,
+               return new ResolvedMemberImpl(Member.FIELD, declaringType, modifiers,
                        aspectType,     NameMangler.perTypeWithinFieldForTarget(aspectType), UnresolvedType.NONE);
        }
        
@@ -159,7 +159,7 @@ public class AjcMemberMaker {
                if (!isSerializableAspect(aspectType)) {
                        modifiers |= Modifier.TRANSIENT;
                }
-               return new ResolvedMember(Member.FIELD, declaringType, modifiers,
+               return new ResolvedMemberImpl(Member.FIELD, declaringType, modifiers,
                        UnresolvedType.forSignature("Ljava/lang/String;"), NameMangler.PERTYPEWITHIN_WITHINTYPEFIELD, UnresolvedType.NONE);
        }
        
@@ -168,7 +168,7 @@ public class AjcMemberMaker {
        }
 
        public static ResolvedMember perObjectBind(UnresolvedType declaringType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD, 
                        declaringType,
                        PUBLIC_STATIC,
@@ -179,7 +179,7 @@ public class AjcMemberMaker {
        // PTWIMPL ResolvedMember for getInstance() method, declared in aspect
        public static ResolvedMember perTypeWithinGetInstance(UnresolvedType declaringType) {
 //             private static a.X ajc$getInstance(java.lang.Class) throws java/lang/Exception
-               ResolvedMember rm = new ResolvedMember(
+               ResolvedMemberImpl rm = new ResolvedMemberImpl(
                        Member.METHOD, 
                        declaringType,
                        PRIVATE_STATIC,
@@ -193,7 +193,7 @@ public class AjcMemberMaker {
 
        public static ResolvedMember perTypeWithinCreateAspectInstance(UnresolvedType declaringType) {
                // public static a.X ajc$createAspectInstance(java.lang.String)
-               ResolvedMember rm = new ResolvedMember(
+               ResolvedMemberImpl rm = new ResolvedMemberImpl(
                                Member.METHOD, 
                                declaringType,
                                PUBLIC_STATIC,
@@ -210,7 +210,7 @@ public class AjcMemberMaker {
        }
 
        public static ResolvedMember perObjectInterfaceGet(UnresolvedType aspectType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD, 
                        perObjectInterfaceType(aspectType),
                        Modifier.PUBLIC | Modifier.ABSTRACT,
@@ -219,7 +219,7 @@ public class AjcMemberMaker {
        }
 
        public static ResolvedMember perObjectInterfaceSet(UnresolvedType aspectType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD, 
                        perObjectInterfaceType(aspectType),
                        Modifier.PUBLIC | Modifier.ABSTRACT,
@@ -229,7 +229,7 @@ public class AjcMemberMaker {
        
        // PTWIMPL ResolvedMember for localAspectOf() method, declared in matched type
        public static ResolvedMember perTypeWithinLocalAspectOf(UnresolvedType shadowType,UnresolvedType aspectType) {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD, 
                        shadowType,//perTypeWithinInterfaceType(aspectType),
                        Modifier.PUBLIC | Modifier.STATIC,
@@ -239,13 +239,13 @@ public class AjcMemberMaker {
 
        
        public static ResolvedMember perSingletonAspectOfMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        declaringType, PUBLIC_STATIC, "aspectOf", 
                        "()" + declaringType.getSignature());           
        }
        
        public static ResolvedMember perSingletonHasAspectMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        declaringType, PUBLIC_STATIC, "hasAspect", 
                        "()Z");         
        };
@@ -259,27 +259,27 @@ public class AjcMemberMaker {
        };
        
        public static ResolvedMember perObjectAspectOfMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        declaringType, PUBLIC_STATIC, "aspectOf", 
                        "(Ljava/lang/Object;)" + declaringType.getSignature());         
        }
        
        public static ResolvedMember perObjectHasAspectMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        declaringType, PUBLIC_STATIC, "hasAspect", 
                        "(Ljava/lang/Object;)Z");               
        };
        
        // PTWIMPL ResolvedMember for aspectOf(), declared in aspect
        public static ResolvedMember perTypeWithinAspectOfMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                                declaringType, PUBLIC_STATIC, "aspectOf", 
                                "(Ljava/lang/Class;)" + declaringType.getSignature());          
        }
        
        // PTWIMPL ResolvedMember for hasAspect(), declared in aspect
        public static ResolvedMember perTypeWithinHasAspectMethod(UnresolvedType declaringType) {
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        declaringType, PUBLIC_STATIC, "hasAspect", 
                        "(Ljava/lang/Class;)Z");                
        };
@@ -288,7 +288,7 @@ public class AjcMemberMaker {
        
        public static ResolvedMember privilegedAccessMethodForMethod(UnresolvedType aspectType, ResolvedMember method) {
                String sig = method.getDeclaredSignature();
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        method.getDeclaringType(),
                        Modifier.PUBLIC | (method.isStatic() ? Modifier.STATIC : 0),
                        NameMangler.privilegedAccessMethodForMethod(method.getName(),
@@ -305,7 +305,7 @@ public class AjcMemberMaker {
                        sig = "(" + field.getDeclaringType().getSignature() + ")" + field.getReturnType().getSignature();
                }
                
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        field.getDeclaringType(),
                        PUBLIC_STATIC, //Modifier.PUBLIC | (field.isStatic() ? Modifier.STATIC : 0),
                        NameMangler.privilegedAccessMethodForFieldGet(field.getName(),
@@ -321,7 +321,7 @@ public class AjcMemberMaker {
                        sig = "(" + field.getDeclaringType().getSignature() + field.getReturnType().getSignature() + ")V";
                }
                
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        field.getDeclaringType(),
                        PUBLIC_STATIC, //Modifier.PUBLIC | (field.isStatic() ? Modifier.STATIC : 0),
                        NameMangler.privilegedAccessMethodForFieldSet(field.getName(),
@@ -332,7 +332,7 @@ public class AjcMemberMaker {
        // --- inline accessors
        //??? can eclipse handle a transform this weird without putting synthetics into the mix
        public static ResolvedMember superAccessMethod(UnresolvedType baseType, ResolvedMember method) {
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        baseType,
                        Modifier.PUBLIC,
                        method.getReturnType(),
@@ -346,7 +346,7 @@ public class AjcMemberMaker {
                if (!method.isStatic()) {
                        paramTypes = UnresolvedType.insert(method.getDeclaringType(), paramTypes);
                }
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        aspectType,
                        PUBLIC_STATIC, //??? what about privileged and super access
                                                   //???Modifier.PUBLIC | (method.isStatic() ? Modifier.STATIC : 0),
@@ -365,7 +365,7 @@ public class AjcMemberMaker {
                        sig = "(" + field.getDeclaringType().getSignature() + ")" + field.getReturnType().getSignature();
                }
                
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        aspectType,
                        PUBLIC_STATIC, //Modifier.PUBLIC | (field.isStatic() ? Modifier.STATIC : 0),
                        NameMangler.inlineAccessMethodForFieldGet(field.getName(),
@@ -381,7 +381,7 @@ public class AjcMemberMaker {
                        sig = "(" + field.getDeclaringType().getSignature() + field.getReturnType().getSignature() + ")V";
                }
                
-               return new ResolvedMember(Member.METHOD,
+               return new ResolvedMemberImpl(Member.METHOD,
                        aspectType,
                        PUBLIC_STATIC, //Modifier.PUBLIC | (field.isStatic() ? Modifier.STATIC : 0),
                        NameMangler.inlineAccessMethodForFieldSet(field.getName(),
@@ -394,7 +394,7 @@ public class AjcMemberMaker {
        // --- runtimeLibrary api stuff
 
        public static Member cflowStackPeekInstance() {
-               return new Member(
+               return new MemberImpl(
                        Member.METHOD,
                        CFLOW_STACK_TYPE,
                        0,
@@ -403,7 +403,7 @@ public class AjcMemberMaker {
        }
 
        public static Member cflowStackPushInstance() {
-               return new Member(
+               return new MemberImpl(
                        Member.METHOD,
                        CFLOW_STACK_TYPE,
                        0,
@@ -412,7 +412,7 @@ public class AjcMemberMaker {
        }
 
        public static Member cflowStackIsValid() {
-               return new Member(
+               return new MemberImpl(
                        Member.METHOD,
                        CFLOW_STACK_TYPE,
                        0,
@@ -420,7 +420,7 @@ public class AjcMemberMaker {
                        "()Z");
        }
        public static Member cflowStackInit() {
-               return new Member(
+               return new MemberImpl(
                        Member.CONSTRUCTOR,
                        CFLOW_STACK_TYPE,
                        0,
@@ -428,7 +428,7 @@ public class AjcMemberMaker {
                        "()V");
        }
        public static Member aroundClosurePreInitializationField() {
-               return new Member(
+               return new MemberImpl(
                        Member.FIELD,
                        AROUND_CLOSURE_TYPE,
                        0,
@@ -436,7 +436,7 @@ public class AjcMemberMaker {
                        "[Ljava/lang/Object;");
        }
        public static Member aroundClosurePreInitializationGetter() {
-               return new Member(
+               return new MemberImpl(
                        Member.METHOD,
                        AROUND_CLOSURE_TYPE,
                        0,
@@ -450,7 +450,7 @@ public class AjcMemberMaker {
                UnresolvedType targetType,
                UnresolvedType[] paramTypes) 
        {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD,
                        aspectType,
                        PUBLIC_STATIC_FINAL,
@@ -464,7 +464,7 @@ public class AjcMemberMaker {
                UnresolvedType targetType,
                UnresolvedType[] paramTypes) 
        {
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.METHOD,
                        aspectType,
                        PUBLIC_STATIC_FINAL,
@@ -480,7 +480,7 @@ public class AjcMemberMaker {
 //             int modifiers) 
 //     {
                ResolvedMember ret =
-                       new ResolvedMember(
+                       new ResolvedMemberImpl(
                                Member.CONSTRUCTOR,
                                targetType,
                                Modifier.PUBLIC,
@@ -499,7 +499,7 @@ public class AjcMemberMaker {
        }
        
        public static ResolvedMember interFieldInitializer(ResolvedMember field, UnresolvedType aspectType) {
-               return new ResolvedMember(Member.METHOD, aspectType, PUBLIC_STATIC,
+               return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC,
                        NameMangler.interFieldInitializer(aspectType, field.getDeclaringType(), field.getName()),
                        field.isStatic() ? "()V" : "(" + field.getDeclaringType().getSignature() + ")V"
                        );
@@ -518,7 +518,7 @@ public class AjcMemberMaker {
         * This static method goes on the aspect that declares the inter-type field
         */
        public static ResolvedMember interFieldSetDispatcher(ResolvedMember field, UnresolvedType aspectType) {
-               return new ResolvedMember(Member.METHOD, aspectType, PUBLIC_STATIC,
+               return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC,
                        ResolvedType.VOID,
                        NameMangler.interFieldSetDispatcher(aspectType, field.getDeclaringType(), field.getName()),
                        field.isStatic() ? new UnresolvedType[] {field.getReturnType()} 
@@ -530,7 +530,7 @@ public class AjcMemberMaker {
         * This static method goes on the aspect that declares the inter-type field
         */
        public static ResolvedMember interFieldGetDispatcher(ResolvedMember field, UnresolvedType aspectType) {
-               return new ResolvedMember(Member.METHOD, aspectType, PUBLIC_STATIC,
+               return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC,
                        field.getReturnType(),
                        NameMangler.interFieldGetDispatcher(aspectType, field.getDeclaringType(), field.getName()),
                        field.isStatic() ? UnresolvedType.NONE : new UnresolvedType[] {field.getDeclaringType()},
@@ -552,7 +552,7 @@ public class AjcMemberMaker {
         * is declared onto
         */
        public static ResolvedMember interFieldClassField(ResolvedMember field, UnresolvedType aspectType) {
-               return new ResolvedMember(Member.FIELD, field.getDeclaringType(), 
+               return new ResolvedMemberImpl(Member.FIELD, field.getDeclaringType(), 
                        makePublicNonFinal(field.getModifiers()),
                        field.getReturnType(), 
                        NameMangler.interFieldClassField(field.getModifiers(), aspectType, field.getDeclaringType(), field.getName()),
@@ -566,7 +566,7 @@ public class AjcMemberMaker {
         * is declared onto
         */
        public static ResolvedMember interFieldInterfaceField(ResolvedMember field, UnresolvedType onClass, UnresolvedType aspectType) {
-               return new ResolvedMember(Member.FIELD, onClass, makePublicNonFinal(field.getModifiers()),
+               return new ResolvedMemberImpl(Member.FIELD, onClass, makePublicNonFinal(field.getModifiers()),
                        field.getReturnType(), 
                        NameMangler.interFieldInterfaceField(aspectType, field.getDeclaringType(), field.getName()),
                        UnresolvedType.NONE, UnresolvedType.NONE
@@ -580,7 +580,7 @@ public class AjcMemberMaker {
        public static ResolvedMember interFieldInterfaceSetter(ResolvedMember field, ResolvedType onType, UnresolvedType aspectType) {
                int modifiers = Modifier.PUBLIC;
                if (onType.isInterface()) modifiers |= Modifier.ABSTRACT;
-               return new ResolvedMember(Member.METHOD, onType, modifiers,
+               return new ResolvedMemberImpl(Member.METHOD, onType, modifiers,
                        ResolvedType.VOID,
                        NameMangler.interFieldInterfaceSetter(aspectType, field.getDeclaringType(), field.getName()),
                        new UnresolvedType[] {field.getReturnType()}, UnresolvedType.NONE
@@ -594,7 +594,7 @@ public class AjcMemberMaker {
        public static ResolvedMember interFieldInterfaceGetter(ResolvedMember field, ResolvedType onType, UnresolvedType aspectType) {
                int modifiers = Modifier.PUBLIC;
                if (onType.isInterface()) modifiers |= Modifier.ABSTRACT;
-               return new ResolvedMember(Member.METHOD, onType, modifiers,
+               return new ResolvedMemberImpl(Member.METHOD, onType, modifiers,
                        field.getReturnType(), 
                        NameMangler.interFieldInterfaceGetter(aspectType, field.getDeclaringType(), field.getName()),
                        UnresolvedType.NONE, UnresolvedType.NONE
@@ -616,7 +616,7 @@ public class AjcMemberMaker {
                int modifiers = makePublicNonFinal(meth.getModifiers());
                if (onInterface) modifiers |= Modifier.ABSTRACT;
                
-               return new ResolvedMember(Member.METHOD, meth.getDeclaringType(),
+               return new ResolvedMemberImpl(Member.METHOD, meth.getDeclaringType(),
                        modifiers,
                        meth.getReturnType(), 
                        NameMangler.interMethod(meth.getModifiers(), aspectType, meth.getDeclaringType(), meth.getName()),
@@ -634,7 +634,7 @@ public class AjcMemberMaker {
                        paramTypes = UnresolvedType.insert(meth.getDeclaringType(), paramTypes);
                }
                
-               return new ResolvedMember(Member.METHOD, aspectType, PUBLIC_STATIC,
+               return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC,
                        meth.getReturnType(), 
                        NameMangler.interMethodDispatcher(aspectType, meth.getDeclaringType(), meth.getName()),
                        paramTypes, meth.getExceptions());
@@ -657,7 +657,7 @@ public class AjcMemberMaker {
                }
                
                
-               return new ResolvedMember(Member.METHOD, aspectType, modifiers,
+               return new ResolvedMemberImpl(Member.METHOD, aspectType, modifiers,
                        meth.getReturnType(), 
                        NameMangler.interMethodBody(aspectType, meth.getDeclaringType(), meth.getName()),
                        paramTypes, meth.getExceptions());
@@ -670,7 +670,7 @@ public class AjcMemberMaker {
                UnresolvedType[] params = ret.getParameterTypes();
                
                UnresolvedType[] freshParams = UnresolvedType.add(params, aspectType);
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        ret.getKind(),
                        ret.getDeclaringType(),
                        ret.getModifiers(),
@@ -682,7 +682,7 @@ public class AjcMemberMaker {
        public static ResolvedMember toObjectConversionMethod(UnresolvedType fromType) {
                if (fromType.isPrimitiveType()) {
                        String name = fromType.toString() + "Object";
-                       return new ResolvedMember(
+                       return new ResolvedMemberImpl(
                                Member.METHOD,
                                CONVERSIONS_TYPE,
                                PUBLIC_STATIC,
@@ -697,7 +697,7 @@ public class AjcMemberMaker {
                // AMC next two lines should not be needed when sig for generic type is changed
                ResolvedType declaringType = resolvedTypeX;
                if (declaringType.isRawType()) declaringType = declaringType.getGenericType();
-               return new ResolvedMember(
+               return new ResolvedMemberImpl(
                        Member.CONSTRUCTOR,
                        declaringType,
                        Modifier.PUBLIC,
index a57961db9b78cbfb3ecd8ef5eb1cad3020bf81cb..85dfd3664f4c71fbc630325087c6893f959485c3 100644 (file)
@@ -157,7 +157,7 @@ public class CrosscuttingMembers {
                                typeToExpose = UnresolvedType.forSignature(typeToExpose.getErasureSignature());
                        }
                }
-               ResolvedMember member = new ResolvedMember(
+               ResolvedMember member = new ResolvedMemberImpl(
                        Member.STATIC_INITIALIZATION, typeToExpose, 0, ResolvedType.VOID, "", UnresolvedType.NONE);
                addTypeMunger(world.concreteTypeMunger(
                        new PrivilegedAccessMunger(member), inAspect));
index d84947505096616ea5ea8cefc233820b94a951dc..8cdd3dfe8f42edbf443453d4eef375ee50b45c50 100644 (file)
@@ -1,5 +1,6 @@
 /* *******************************************************************
  * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
+ *               2005 Contributors
  * All rights reserved. 
  * This program and the accompanying materials are made available 
  * under the terms of the Common Public License v1.0 
  * http://www.eclipse.org/legal/cpl-v10.html 
  *  
  * Contributors: 
- *     PARC     initial implementation 
+ *     PARC     initial implementation
+ *     AMC      extracted as interface 
  * ******************************************************************/
-
-
 package org.aspectj.weaver;
 
 import java.io.DataInputStream;
 import java.io.IOException;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
 
 import org.aspectj.util.TypeSafeEnum;
 
-public class Member implements Comparable, AnnotatedElement {
-    
-    private final Kind kind;
-    protected UnresolvedType declaringType;
-    protected final int modifiers; // protected because ResolvedMember uses it
-    private final UnresolvedType returnType;
-    private final String name;
-    private final UnresolvedType[] parameterTypes;
-    private final String signature;
-       private final String declaredSignature; // TODO asc Is this redundant? Is it needed for generics?
-    private String paramSignature;
-
-    public Member(
-        Kind kind, 
-        UnresolvedType declaringType,
-        int modifiers,
-        String name,
-        String signature) 
-    {
-        this.kind = kind;
-        this.declaringType = declaringType;
-        this.modifiers = modifiers;
-        this.name = name;
-        this.signature = signature;
-               this.declaredSignature = signature;
-        if (kind == FIELD) {
-            this.returnType = UnresolvedType.forSignature(signature);
-            this.parameterTypes = UnresolvedType.NONE;
-        } else {
-            Object[] returnAndParams = signatureToTypes(signature,false);
-            this.returnType = (UnresolvedType) returnAndParams[0];
-            this.parameterTypes = (UnresolvedType[]) returnAndParams[1];
-                       signature = typesToSignature(returnType,parameterTypes,true);
-        }
-    }
-
-    public  Member(
-        Kind kind, 
-        UnresolvedType declaringType, 
-        int modifiers,
-        UnresolvedType returnType, 
-        String name, 
-        UnresolvedType[] parameterTypes) 
-    {
-        super();
-        this.kind = kind;
-        this.declaringType = declaringType;
-        this.modifiers = modifiers;
-        this.returnType = returnType;
-        this.name = name;
-        this.parameterTypes = parameterTypes;
-        if (kind == FIELD) {
-            this.signature         = returnType.getErasureSignature();
-                       this.declaredSignature = returnType.getSignature();
-        } else {
-            this.signature         = typesToSignature(returnType, parameterTypes,true);
-                       this.declaredSignature = typesToSignature(returnType,parameterTypes,false);
-        }
-    }
-    
-    public ResolvedMember resolve(World world) {
-       return world.resolve(this);
-    }
-
-    // ---- utility methods
-    
-    /** returns an Object[] pair of UnresolvedType, UnresolvedType[] representing return type, 
-     * argument types parsed from the JVM bytecode signature of a method.  Yes,
-     * this should actually return a nice statically-typed pair object, but we
-     * don't have one of those.  
-     *
-     * <blockquote><pre>
-     *   UnresolvedType.signatureToTypes("()[Z")[0].equals(Type.forSignature("[Z"))
-     *   UnresolvedType.signatureToTypes("(JJ)I")[1]
-     *      .equals(UnresolvedType.forSignatures(new String[] {"J", "J"}))
-     * </pre></blockquote>
-     *
-     * @param      signature the JVM bytecode method signature string we want to break apart
-     * @return     a pair of UnresolvedType, UnresolvedType[] representing the return types and parameter types. 
-     */
-    public static String typesToSignature(UnresolvedType returnType, UnresolvedType[] paramTypes, boolean useRawTypes) {
-        StringBuffer buf = new StringBuffer();
-        buf.append("(");
-        for (int i = 0, len = paramTypes.length; i < len; i++) {
-                       if (paramTypes[i].isParameterizedType() && useRawTypes) buf.append(paramTypes[i].getErasureSignature());
-                       else                                                buf.append(paramTypes[i].getSignature());
-        }
-        buf.append(")");
-        if (returnType.isParameterizedType() && useRawTypes) buf.append(returnType.getErasureSignature());
-        else                                                                                    buf.append(returnType.getSignature());
-        return buf.toString();        
-    }
-    
-    /**
-     * Returns "(<signaturesOfParamTypes>,...)" - unlike the other typesToSignature
-     * that also includes the return type, this one just deals with the parameter types.
-     */
-    public static String typesToSignature(UnresolvedType[] paramTypes) {
-        StringBuffer buf = new StringBuffer();
-        buf.append("(");
-        for(int i=0;i<paramTypes.length;i++) {
-         buf.append(paramTypes[i].getSignature());
-        }
-        buf.append(")");
-        return buf.toString();   
-    }
-    
-    /** 
-     * returns an Object[] pair of UnresolvedType, UnresolvedType[] representing return type, 
-     * argument types parsed from the JVM bytecode signature of a method.  Yes,
-     * this should actually return a nice statically-typed pair object, but we
-     * don't have one of those.  
-     *
-     * <blockquote><pre>
-     *   UnresolvedType.signatureToTypes("()[Z")[0].equals(Type.forSignature("[Z"))
-     *   UnresolvedType.signatureToTypes("(JJ)I")[1]
-     *      .equals(UnresolvedType.forSignatures(new String[] {"J", "J"}))
-     * </pre></blockquote>
-     *
-     * @param      signature the JVM bytecode method signature string we want to break apart
-     * @return     a pair of UnresolvedType, UnresolvedType[] representing the return types and parameter types. 
-     */
-    private static Object[] signatureToTypes(String sig,boolean keepParameterizationInfo) {
-        List l = new ArrayList();
-        int i = 1;
-        while (true) {
-            char c = sig.charAt(i);
-            if (c == ')') break; // break out when the hit the ')'
-            int start = i;
-            while (c == '[') c = sig.charAt(++i);
-            if (c == 'L' || c == 'P') {
-                               int nextSemicolon = sig.indexOf(';',start);
-                               int firstAngly = sig.indexOf('<',start);
-                               if (firstAngly == -1 || firstAngly>nextSemicolon) {
-                  i = nextSemicolon + 1;
-                  l.add(UnresolvedType.forSignature(sig.substring(start, i)));
-                               } else {
-                                       // generics generics generics
-                                       // Have to skip to the *correct* ';'
-                                       boolean endOfSigReached = false;
-                                       int posn = firstAngly;
-                                       int genericDepth=0;
-                                       while (!endOfSigReached) {
-                                               switch (sig.charAt(posn)) {
-                                                 case '<': genericDepth++;break;
-                                                 case '>': genericDepth--;break;
-                                                 case ';': if (genericDepth==0) endOfSigReached=true;break;
-                                                 default:
-                                               }
-                                               posn++;
-                                       }
-                                       // posn now points to the correct nextSemicolon :)
-                                       i=posn;
-                                       String toProcess = null;
-                                       toProcess = sig.substring(start,i);
-                                       UnresolvedType tx = UnresolvedType.forSignature(toProcess);
-                                       l.add(tx);                                      
-                               }
-            } else if (c=='T') { // assumed 'reference' to a type variable, so just "Tname;"
-                               int nextSemicolon = sig.indexOf(';',start);
-                               String nextbit = sig.substring(start,nextSemicolon);
-                               l.add(UnresolvedType.forSignature(nextbit));
-                               i=nextSemicolon+1;
-            } else {
-               i++;
-                l.add(UnresolvedType.forSignature(sig.substring(start, i)));
-            }
-        }
-        UnresolvedType[] paramTypes = (UnresolvedType[]) l.toArray(new UnresolvedType[l.size()]);
-        UnresolvedType returnType = UnresolvedType.forSignature(sig.substring(i+1, sig.length()));
-        return new Object[] { returnType, paramTypes };
-    }            
-
-    // ---- factory methods
-    public static Member field(String declaring, int mods, String name, String signature) {
-        return field(declaring, mods, UnresolvedType.forSignature(signature), name);
-    }
-    public static Member field(UnresolvedType declaring, int mods, String name, UnresolvedType type) {
-        return new Member(FIELD, declaring, mods, type, name, UnresolvedType.NONE);
-    }    
-    public static Member method(UnresolvedType declaring, int mods, String name, String signature) {
-        Object[] pair = signatureToTypes(signature,false);
-        return method(declaring, mods, (UnresolvedType) pair[0], name, (UnresolvedType[]) pair[1]);
-    }
-    public static Member pointcut(UnresolvedType declaring, String name, String signature) {
-        Object[] pair = signatureToTypes(signature,false);
-        return pointcut(declaring, 0, (UnresolvedType) pair[0], name, (UnresolvedType[]) pair[1]);
-    }
-
-
-    private static Member field(String declaring, int mods, UnresolvedType ty, String name) {
-        return new Member(
-            FIELD,
-            UnresolvedType.forName(declaring),
-            mods,
-            ty,
-            name,
-            UnresolvedType.NONE);
-    }
-    
-    public static Member method(UnresolvedType declTy, int mods, UnresolvedType rTy, String name, UnresolvedType[] paramTys) {
-        return new Member(
-               //??? this calls <clinit> a method
-            name.equals("<init>") ? CONSTRUCTOR : METHOD,
-            declTy,
-            mods,
-            rTy,
-            name,
-            paramTys);
-    }
-    private static Member pointcut(UnresolvedType declTy, int mods, UnresolvedType rTy, String name, UnresolvedType[] paramTys) {
-        return new Member(
-            POINTCUT,
-            declTy,
-            mods,
-            rTy,
-            name,
-            paramTys);
-    }
-    
-       public static ResolvedMember makeExceptionHandlerSignature(UnresolvedType inType, UnresolvedType catchType) {
-               return new ResolvedMember(
-                       HANDLER,
-                       inType,
-                       Modifier.STATIC,
-                       "<catch>",
-                       "(" + catchType.getSignature() + ")V");
-       }
-    
-    // ---- parsing methods
-    
-    /** Takes a string in this form:
-     * 
-     * <blockquote><pre>
-     * static? TypeName TypeName.Id
-     * </pre></blockquote>
-     * Pretty much just for testing, and as such should perhaps be moved.
-     */
-    
-    public static Member fieldFromString(String str) {
-        str = str.trim();
-        final int len = str.length();
-        int i = 0;
-        int mods = 0;
-        if (str.startsWith("static", i)) {
-            mods = Modifier.STATIC;
-            i += 6;
-            while (Character.isWhitespace(str.charAt(i))) i++;
-        }
-        int start = i;
-        while (! Character.isWhitespace(str.charAt(i))) i++;
-        UnresolvedType retTy = UnresolvedType.forName(str.substring(start, i));
-
-        start = i;
-        i = str.lastIndexOf('.');
-        UnresolvedType declaringTy = UnresolvedType.forName(str.substring(start, i).trim());
-        start = ++i;
-        String name = str.substring(start, len).trim();
-        return new Member(
-            FIELD,
-            declaringTy,
-            mods,
-            retTy,
-            name,
-            UnresolvedType.NONE);
-    }
-
-    /** Takes a string in this form:
-     * 
-     * <blockquote><pre>
-     * (static|interface|private)? TypeName TypeName . Id ( TypeName , ...)
-     * </pre></blockquote>
-     * Pretty much just for testing, and as such should perhaps be moved.
-     */
-    
-    public static Member methodFromString(String str) {
-        str = str.trim();
-        // final int len = str.length();
-        int i = 0;
-
-        int mods = 0;
-        if (str.startsWith("static", i)) {
-            mods = Modifier.STATIC;
-            i += 6;
-        } else if (str.startsWith("interface", i)) {
-            mods = Modifier.INTERFACE;
-            i += 9;
-        } else if (str.startsWith("private", i)) {
-            mods = Modifier.PRIVATE;
-            i += 7;
-        }            
-        while (Character.isWhitespace(str.charAt(i))) i++;
-        
-        int start = i;
-        while (! Character.isWhitespace(str.charAt(i))) i++;
-        UnresolvedType returnTy = UnresolvedType.forName(str.substring(start, i));
-
-        start = i;
-        i = str.indexOf('(', i);
-        i = str.lastIndexOf('.', i);
-        UnresolvedType declaringTy = UnresolvedType.forName(str.substring(start, i).trim());
-        
-        start = ++i;
-        i = str.indexOf('(', i);
-        String name = str.substring(start, i).trim();
-        start = ++i;
-        i = str.indexOf(')', i);
-    
-        String[] paramTypeNames = parseIds(str.substring(start, i).trim());
-
-        return method(declaringTy, mods, returnTy, name, UnresolvedType.forNames(paramTypeNames));
-    }
-
-    private static String[] parseIds(String str) {
-        if (str.length() == 0) return ZERO_STRINGS;
-        List l = new ArrayList();
-        int start = 0;
-        while (true) {
-            int i = str.indexOf(',', start);
-            if (i == -1) {
-                l.add(str.substring(start).trim());
-                break;
-            }
-            l.add(str.substring(start, i).trim());
-            start = i+1;
-        }
-        return (String[]) l.toArray(new String[l.size()]);
-    }
-
-    private static final String[] ZERO_STRINGS = new String[0];
-
-    // ---- things we know without resolution
-    
-    public boolean equals(Object other) {
-        if (! (other instanceof Member)) return false;
-        Member o = (Member) other;
-
-        return (kind == o.kind 
-            && name.equals(o.name) 
-            && signature.equals(o.signature)
-            && declaringType.equals(o.declaringType));
-    }
-    
-    public int compareTo(Object other) {
-       Member o = (Member) other;
-       
-       int i = getName().compareTo(o.getName());
-       if (i != 0) return i;
-       return getSignature().compareTo(o.getSignature());
-    }
-    
-    /** 
-     * Equality is checked based on the underlying signature, so the hash code
-     * of a member is based on its kind, name, signature, and declaring type.  The
-     * algorithm for this was taken from page 38 of effective java.
-     */
-    private volatile int hashCode = 0;
-    public int hashCode() {
-        if (hashCode == 0) {
-            int result = 17;
-            result = 37*result + kind.hashCode();
-            result = 37*result + name.hashCode();
-            result = 37*result + signature.hashCode();
-            result = 37*result + declaringType.hashCode();
-            hashCode = result;
-        } 
-        return hashCode;
-    }
-
-    public String toString() {
-       StringBuffer buf = new StringBuffer();
-       buf.append(returnType.getName());
-       buf.append(' ');
-               buf.append(declaringType.getName());
-        buf.append('.');
-               buf.append(name);
-       if (kind != FIELD) {
-               buf.append("(");
-            if (parameterTypes.length != 0) {
-                buf.append(parameterTypes[0]);
-                       for (int i=1, len = parameterTypes.length; i < len; i++) {
-                    buf.append(", ");
-                           buf.append(parameterTypes[i].getName());
-                       }
-            }
-               buf.append(")");
-       }
-       return buf.toString();
-    }
-    
-    public String toLongString() {
-        StringBuffer buf = new StringBuffer();
-        buf.append(kind);
-        buf.append(' ');
-        if (modifiers != 0) {
-            buf.append(Modifier.toString(modifiers));
-            buf.append(' ');
-        }
-        buf.append(toString());
-        buf.append(" <");
-        buf.append(signature);
-        buf.append(" >");
-        return buf.toString();
-    }        
-
-    public Kind getKind() { return kind; }
-    public UnresolvedType getDeclaringType() { return declaringType; }
-    public UnresolvedType getReturnType() { return returnType; }
-    public UnresolvedType getType() { return returnType; }
-    public String getName() { return name; }
-    public UnresolvedType[]  getParameterTypes() { return parameterTypes; }
-    /**
-     * Return full signature, including return type, e.g. "()LFastCar;" for a signature without the return type,
-     * use getParameterSignature() - it is importnant to choose the right one in the face of covariance.
-     */
-    public String getSignature() { return signature; }
-       
-       /** TODO ASC Should return the non-erased version of the signature... untested */
-       public String getDeclaredSignature() { return declaredSignature;}
-    public int getArity() { return parameterTypes.length; }
-  
-    /**
-     * Return signature without return type, e.g. "()" for a signature *with* the return type,
-     * use getSignature() - it is important to choose the right one in the face of covariance.
-     */
-    public String getParameterSignature() {
-       if (paramSignature != null) return paramSignature;
-       StringBuffer sb = new StringBuffer();
-       sb.append("(");
-       for (int i = 0; i < parameterTypes.length; i++) {
-                       UnresolvedType tx = parameterTypes[i];
-                       sb.append(tx.getSignature());
-               }
-       sb.append(")");
-       paramSignature = sb.toString();
-       return paramSignature;
-    }
-    
-    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;
-    }
-    
-    // ---- things we know only with resolution
-    
-    public int getModifiers(World world) {
-        return resolve(world).getModifiers();
-    }
-    
-    public UnresolvedType[] getExceptions(World world) {
-        return resolve(world).getExceptions();
-    }
-    
-    public final boolean isProtected(World world) {
-        return Modifier.isProtected(resolve(world).getModifiers());
-    }
-    public final boolean isStatic(World world) {
-        return Modifier.isStatic(resolve(world).getModifiers());
-    }
-    public final boolean isStrict(World world) {
-        return Modifier.isStrict(resolve(world).getModifiers());
-    }
-    
-    public final boolean isStatic() {
-        return Modifier.isStatic(modifiers);
-    }    
-    
-    public final boolean isInterface() {
-        return Modifier.isInterface(modifiers);  // this is kinda weird
-    }    
-    
-    public final boolean isPrivate() {
-        return Modifier.isPrivate(modifiers);
-    }    
-    
-    /**
-     * Returns true iff the member is generic (NOT parameterized)
-     * For example, a method declared in a generic type
-     */
-    public boolean canBeParameterized() {
-       return false;
-    }
-
-       public final int getCallsiteModifiers() {
-               return modifiers & ~ Modifier.INTERFACE;
-       }
-
-    public final String getExtractableName() {
-       if (name.equals("<init>")) return "init$";
-       else if (name.equals("<clinit>")) return "clinit$";
-       else return name;
-    }
-
-    /**
-     * If you want a sensible answer, resolve the member and call
-     * hasAnnotation() on the ResolvedMember.
-     */
-       public boolean hasAnnotation(UnresolvedType ofType) {
-               throw new UnsupportedOperationException("You should resolve this member and call hasAnnotation() on the result...");
-       }
-       
-       /* (non-Javadoc)
-        * @see org.aspectj.weaver.AnnotatedElement#getAnnotationTypes()
-        */
-       public ResolvedType[] getAnnotationTypes() {
-               throw new UnsupportedOperationException("You should resolve this member and call hasAnnotation() on the result...");
-       }
-       
-       public AnnotationX[] getAnnotations() {
-               throw new UnsupportedOperationException("You should resolve this member and call getAnnotations() on the result...");
-       }
-
-       // ---- fields 'n' stuff
-
-    public static final Member[] NONE = new Member[0];
+public interface Member {
 
     public static class Kind extends TypeSafeEnum {
         public Kind(String name, int key) { super(name, key); }
@@ -568,310 +38,108 @@ public class Member implements Comparable, AnnotatedElement {
             throw new BCException("weird kind " + key);
         }
     }
-    
-    public static final Kind METHOD        = new Kind("METHOD", 1);
-    public static final Kind FIELD         = new Kind("FIELD", 2);
-    public static final Kind CONSTRUCTOR   = new Kind("CONSTRUCTOR", 3);
-    public static final Kind STATIC_INITIALIZATION   = new Kind("STATIC_INITIALIZATION", 4);  
-    public static final Kind POINTCUT      = new Kind("POINTCUT", 5);
-    public static final Kind ADVICE        = new Kind("ADVICE", 6);
-    public static final Kind HANDLER   = new Kind("HANDLER", 7);    
-  
-    
-
-//    //ATAJ.  Should probably be ajc$, used only for slow impl of Aspects.aspectOf()
-//    public static final Member ajClassField = new Member(
-//            FIELD,
-//            UnresolvedType.OBJECT,//any one
-//            Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL,
-//            "aj$class",
-//            UnresolvedType.JAVA_LANG_CLASS.getSignature()
-//    );
-
-
-    
-       public Collection/*ResolvedType*/ getDeclaringTypes(World world) {
-               ResolvedType myType = getDeclaringType().resolve(world);
-               Collection ret = new HashSet();
-               if (kind == CONSTRUCTOR) {
-                       // this is wrong if the member doesn't exist, but that doesn't matter
-                       ret.add(myType);
-               } else if (isStatic() || kind == FIELD) {
-                       walkUpStatic(ret, myType);
-               } else {
-                       walkUp(ret, myType);
-               }
-               
-               return ret;
-       }
-       
-       private boolean walkUp(Collection acc, ResolvedType curr) {
-               if (acc.contains(curr)) return true;
-               
-               boolean b = false;
-               for (Iterator i = curr.getDirectSupertypes(); i.hasNext(); ) {
-                       b |= walkUp(acc, (ResolvedType)i.next());
-               }
-               
-               if (!b && curr.isParameterizedType()) {
-                       b = walkUp(acc,curr.getGenericType());
-               }
-               
-               if (!b) {
-                       b = curr.lookupMemberNoSupers(this) != null;
-               } 
-               if (b) acc.add(curr);
-               return b;
-       }
-       
-       private boolean walkUpStatic(Collection acc, ResolvedType curr) {
-               if (curr.lookupMemberNoSupers(this) != null) {
-                       acc.add(curr);
-                       return true;
-               } else {
-                       boolean b = false;
-                       for (Iterator i = curr.getDirectSupertypes(); i.hasNext(); ) {
-                               b |= walkUpStatic(acc, (ResolvedType)i.next());
-                       }
-                       if (!b && curr.isParameterizedType()) {
-                               b = walkUpStatic(acc,curr.getGenericType());
-                       }
-                       if (b) acc.add(curr);
-                       return b;
-               }
-       }
 
-       // ---- reflective thisJoinPoint stuff
-    public String getSignatureMakerName() {
-       if (getName().equals("<clinit>")) return "makeInitializerSig";
-       
-       Kind kind = getKind();
-       if (kind == METHOD) {
-               return "makeMethodSig";
-       } else if (kind == CONSTRUCTOR) {
-               return "makeConstructorSig";
-       } else if (kind == FIELD) {
-               return "makeFieldSig";
-       } else if (kind == HANDLER) {
-               return "makeCatchClauseSig";
-       } else if (kind == STATIC_INITIALIZATION) {
-               return "makeInitializerSig";
-       } else if (kind == ADVICE) {
-               return "makeAdviceSig";
-       } else {
-               throw new RuntimeException("unimplemented");
-       }
-    }
-       
-    
-
-
-       public String getSignatureType() {
-       Kind kind = getKind();
-       if (getName().equals("<clinit>")) return "org.aspectj.lang.reflect.InitializerSignature";
-       
-       if (kind == METHOD) {
-               return "org.aspectj.lang.reflect.MethodSignature";
-       } else if (kind == CONSTRUCTOR) {
-               return "org.aspectj.lang.reflect.ConstructorSignature";
-       } else if (kind == FIELD) {
-               return "org.aspectj.lang.reflect.FieldSignature";
-       } else if (kind == HANDLER) {
-               return "org.aspectj.lang.reflect.CatchClauseSignature";
-       } else if (kind == STATIC_INITIALIZATION) {
-               return "org.aspectj.lang.reflect.InitializerSignature";
-       } else if (kind == ADVICE) {
-               return "org.aspectj.lang.reflect.AdviceSignature";
-       } else {
-               throw new RuntimeException("unimplemented");
-       }
-    }
+       public static final Member[] NONE = new Member[0];
+       public static final Kind METHOD = new Kind("METHOD", 1);
+       public static final Kind FIELD = new Kind("FIELD", 2);
+       public static final Kind CONSTRUCTOR = new Kind("CONSTRUCTOR", 3);
+       public static final Kind STATIC_INITIALIZATION = new Kind("STATIC_INITIALIZATION", 4);
+       public static final Kind POINTCUT = new Kind("POINTCUT", 5);
+       public static final Kind ADVICE = new Kind("ADVICE", 6);
+       public static final Kind HANDLER = new Kind("HANDLER", 7);
 
-       public String getSignatureString(World world) {
-               if (getName().equals("<clinit>")) return getStaticInitializationSignatureString(world);
-               
-       Kind kind = getKind();
-       if (kind == METHOD) {
-               return getMethodSignatureString(world);
-       } else if (kind == CONSTRUCTOR) {
-               return getConstructorSignatureString(world);
-       } else if (kind == FIELD) {
-               return getFieldSignatureString(world);
-       } else if (kind == HANDLER) {
-               return getHandlerSignatureString(world);
-       } else if (kind == STATIC_INITIALIZATION) {
-               return getStaticInitializationSignatureString(world);
-       } else if (kind == ADVICE) {
-               return getAdviceSignatureString(world);
-       } else {
-               throw new RuntimeException("unimplemented");
-       }
-    }
+       public ResolvedMember resolve(World world);
 
-       private String getHandlerSignatureString(World world) {
-        StringBuffer buf = new StringBuffer();
-        buf.append(makeString(0));
-        buf.append('-');
-        //buf.append(getName());
-        buf.append('-');
-        buf.append(makeString(getDeclaringType()));
-        buf.append('-');
-        buf.append(makeString(getParameterTypes()[0]));
-        buf.append('-');
-        String pName = "<missing>";
-        String[] names = getParameterNames(world);
-        if (names != null) pName = names[0];
-        buf.append(pName);
-        buf.append('-');
-        return buf.toString();
-       }
-       
-       private String getStaticInitializationSignatureString(World world) {
-        StringBuffer buf = new StringBuffer();
-        buf.append(makeString(getModifiers(world)));
-        buf.append('-');
-        //buf.append(getName());
-        buf.append('-');
-        buf.append(makeString(getDeclaringType()));
-        buf.append('-');
-        return buf.toString();
-       }
-
-
-
-       protected String getAdviceSignatureString(World world) {
-        StringBuffer buf = new StringBuffer();
-        buf.append(makeString(getModifiers(world)));
-        buf.append('-');
-        buf.append(getName());
-        buf.append('-');
-        buf.append(makeString(getDeclaringType()));
-        buf.append('-');
-        buf.append(makeString(getParameterTypes()));
-        buf.append('-');
-        buf.append(makeString(getParameterNames(world)));
-        buf.append('-');
-        buf.append(makeString(getExceptions(world)));
-        buf.append('-');
-        buf.append(makeString(getReturnType()));
-        buf.append('-');
-        return buf.toString();
-       }
-
-
-       protected String getMethodSignatureString(World world) {
-        StringBuffer buf = new StringBuffer();
-        buf.append(makeString(getModifiers(world)));
-        buf.append('-');
-        buf.append(getName());
-        buf.append('-');
-        buf.append(makeString(getDeclaringType()));
-        buf.append('-');
-        buf.append(makeString(getParameterTypes()));
-        buf.append('-');
-        buf.append(makeString(getParameterNames(world)));
-        buf.append('-');
-        buf.append(makeString(getExceptions(world)));
-        buf.append('-');
-        buf.append(makeString(getReturnType()));
-        buf.append('-');
-        return buf.toString();
-       }
-       
+       public int compareTo(Object other);
 
+       public String toLongString();
 
-       protected String getConstructorSignatureString(World world) {
-        StringBuffer buf = new StringBuffer();
-        buf.append(makeString(getModifiers(world)));
-        buf.append('-');
-        buf.append('-');
-        buf.append(makeString(getDeclaringType()));
-        buf.append('-');
-        buf.append(makeString(getParameterTypes()));
-        buf.append('-');
-        buf.append(makeString(getParameterNames(world)));
-        buf.append('-');
-        buf.append(makeString(getExceptions(world)));
-        buf.append('-');
-        return buf.toString();
-    }
+       public Kind getKind();
+
+       public UnresolvedType getDeclaringType();
+
+       public UnresolvedType getReturnType();
+
+       public UnresolvedType getType();
+
+       public String getName();
+
+       public UnresolvedType[] getParameterTypes();
+
+       /**
+        * Return full signature, including return type, e.g. "()LFastCar;" for a signature without the return type,
+        * use getParameterSignature() - it is importnant to choose the right one in the face of covariance.
+        */
+       public String getSignature();
        
+    /**
+     * All the signatures that a join point with this member as its signature has.
+     */
+    public JoinPointSignature[] getJoinPointSignatures(World world);
+
+       /** TODO ASC Should return the non-erased version of the signature... untested */
+       public String getDeclaredSignature();
+
+       public int getArity();
+
+       /**
+        * Return signature without return type, e.g. "()" for a signature *with* the return type,
+        * use getSignature() - it is important to choose the right one in the face of covariance.
+        */
+       public String getParameterSignature();
+
+       public boolean isCompatibleWith(Member am);
+
+       public int getModifiers(World world);
        
+       public int getModifiers();
 
+       public UnresolvedType[] getExceptions(World world);
 
-       protected String getFieldSignatureString(World world) {
-        StringBuffer buf = new StringBuffer();
-        buf.append(makeString(getModifiers(world)));
-        buf.append('-');
-        buf.append(getName());
-        buf.append('-');
-        buf.append(makeString(getDeclaringType()));
-        buf.append('-');
-        buf.append(makeString(getReturnType()));
-        buf.append('-');
-        return buf.toString();
-    }
+       public boolean isProtected(World world);
 
-       protected String makeString(int i) {
-               return Integer.toString(i, 16);  //??? expensive
-       }
+       public boolean isStatic(World world);
 
+       public boolean isStrict(World world);
 
+       public boolean isStatic();
 
+       public boolean isInterface();
 
-       protected String makeString(UnresolvedType t) {
-       // this is the inverse of the odd behavior for Class.forName w/ arrays
-       if (t.isArray()) {
-               // this behavior matches the string used by the eclipse compiler for Foo.class literals
-               return t.getSignature().replace('/', '.');
-       } else {
-               return t.getName();
-       }
-    }
-    
+       public boolean isPrivate();
 
+       /**
+        * Returns true iff the member is generic (NOT parameterized)
+        * For example, a method declared in a generic type
+        */
+       public boolean canBeParameterized();
 
-       protected String makeString(UnresolvedType[] types) {
-       if (types == null) return "";
-        StringBuffer buf = new StringBuffer();
-        for (int i = 0, len=types.length; i < len; i++) {
-            buf.append(makeString(types[i]));
-            buf.append(':');
-        }
-        return buf.toString();
-    }
-    
+       public int getCallsiteModifiers();
 
+       public String getExtractableName();
 
-       protected String makeString(String[] names) {
-       if (names == null) return "";
-        StringBuffer buf = new StringBuffer();
-        for (int i = 0, len=names.length; i < len; i++) {
-            buf.append(names[i]);
-            buf.append(':');
-        }
-        return buf.toString();
-    }
+       /**
+        * If you want a sensible answer, resolve the member and call
+        * hasAnnotation() on the ResolvedMember.
+        */
+       public boolean hasAnnotation(UnresolvedType ofType);
 
-       public String[] getParameterNames(World world) {
-       return resolve(world).getParameterNames();
-    }
-    
-    
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.AnnotatedElement#getAnnotationTypes()
+        */
+       public ResolvedType[] getAnnotationTypes();
 
-    
-    
-    
-    // ----
-    
+       public AnnotationX[] getAnnotations();
 
-       
+       public Collection/*ResolvedType*/getDeclaringTypes(World world);
+
+       // ---- reflective thisJoinPoint stuff
+       public String getSignatureMakerName();
 
+       public String getSignatureType();
 
-       
-    
-    
+       public String getSignatureString(World world);
 
+       public String[] getParameterNames(World world);
 
-}
-   
+}
\ No newline at end of file
diff --git a/weaver/src/org/aspectj/weaver/MemberImpl.java b/weaver/src/org/aspectj/weaver/MemberImpl.java
new file mode 100644 (file)
index 0000000..cf2a165
--- /dev/null
@@ -0,0 +1,922 @@
+/* *******************************************************************
+ * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
+ * All rights reserved. 
+ * This program and the accompanying materials are made available 
+ * under the terms of the Common Public License v1.0 
+ * which accompanies this distribution and is available at 
+ * http://www.eclipse.org/legal/cpl-v10.html 
+ *  
+ * Contributors: 
+ *     PARC     initial implementation 
+ * ******************************************************************/
+
+
+package org.aspectj.weaver;
+
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class MemberImpl implements Comparable, AnnotatedElement, Member {
+    
+    private final Kind kind;
+    protected UnresolvedType declaringType;
+    protected final int modifiers; // protected because ResolvedMember uses it
+    private final UnresolvedType returnType;
+    private final String name;
+    private final UnresolvedType[] parameterTypes;
+    private final String signature;
+       private final String declaredSignature; // TODO asc Is this redundant? Is it needed for generics?
+    private String paramSignature;
+    
+    /**
+     * All the signatures that a join point with this member as its signature has.
+     * The fact that this has to go on MemberImpl and not ResolvedMemberImpl says a lot about
+     * how broken the Member/ResolvedMember distinction currently is.
+     */
+    private JoinPointSignature[] joinPointSignatures = null;
+
+    public MemberImpl(
+        Kind kind, 
+        UnresolvedType declaringType,
+        int modifiers,
+        String name,
+        String signature) 
+    {
+        this.kind = kind;
+        this.declaringType = declaringType;
+        this.modifiers = modifiers;
+        this.name = name;
+        this.signature = signature;
+               this.declaredSignature = signature;
+        if (kind == FIELD) {
+            this.returnType = UnresolvedType.forSignature(signature);
+            this.parameterTypes = UnresolvedType.NONE;
+        } else {
+            Object[] returnAndParams = signatureToTypes(signature,false);
+            this.returnType = (UnresolvedType) returnAndParams[0];
+            this.parameterTypes = (UnresolvedType[]) returnAndParams[1];
+                       signature = typesToSignature(returnType,parameterTypes,true);
+        }
+    }
+
+    public  MemberImpl(
+        Kind kind, 
+        UnresolvedType declaringType, 
+        int modifiers,
+        UnresolvedType returnType, 
+        String name, 
+        UnresolvedType[] parameterTypes) 
+    {
+        super();
+        this.kind = kind;
+        this.declaringType = declaringType;
+        this.modifiers = modifiers;
+        this.returnType = returnType;
+        this.name = name;
+        this.parameterTypes = parameterTypes;
+        if (kind == FIELD) {
+            this.signature         = returnType.getErasureSignature();
+                       this.declaredSignature = returnType.getSignature();
+        } else {
+            this.signature         = typesToSignature(returnType, parameterTypes,true);
+                       this.declaredSignature = typesToSignature(returnType,parameterTypes,false);
+        }
+    }
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#resolve(org.aspectj.weaver.World)
+        */
+    public ResolvedMember resolve(World world) {
+       return world.resolve(this);
+    }
+
+    // ---- utility methods
+    
+    /** returns an Object[] pair of UnresolvedType, UnresolvedType[] representing return type, 
+     * argument types parsed from the JVM bytecode signature of a method.  Yes,
+     * this should actually return a nice statically-typed pair object, but we
+     * don't have one of those.  
+     *
+     * <blockquote><pre>
+     *   UnresolvedType.signatureToTypes("()[Z")[0].equals(Type.forSignature("[Z"))
+     *   UnresolvedType.signatureToTypes("(JJ)I")[1]
+     *      .equals(UnresolvedType.forSignatures(new String[] {"J", "J"}))
+     * </pre></blockquote>
+     *
+     * @param      signature the JVM bytecode method signature string we want to break apart
+     * @return     a pair of UnresolvedType, UnresolvedType[] representing the return types and parameter types. 
+     */
+    public static String typesToSignature(UnresolvedType returnType, UnresolvedType[] paramTypes, boolean useRawTypes) {
+        StringBuffer buf = new StringBuffer();
+        buf.append("(");
+        for (int i = 0, len = paramTypes.length; i < len; i++) {
+                       if (paramTypes[i].isParameterizedType() && useRawTypes) buf.append(paramTypes[i].getErasureSignature());
+                       else                                                buf.append(paramTypes[i].getSignature());
+        }
+        buf.append(")");
+        if (returnType.isParameterizedType() && useRawTypes) buf.append(returnType.getErasureSignature());
+        else                                                                                    buf.append(returnType.getSignature());
+        return buf.toString();        
+    }
+    
+    /**
+     * Returns "(<signaturesOfParamTypes>,...)" - unlike the other typesToSignature
+     * that also includes the return type, this one just deals with the parameter types.
+     */
+    public static String typesToSignature(UnresolvedType[] paramTypes) {
+        StringBuffer buf = new StringBuffer();
+        buf.append("(");
+        for(int i=0;i<paramTypes.length;i++) {
+         buf.append(paramTypes[i].getSignature());
+        }
+        buf.append(")");
+        return buf.toString();   
+    }
+    
+    /** 
+     * returns an Object[] pair of UnresolvedType, UnresolvedType[] representing return type, 
+     * argument types parsed from the JVM bytecode signature of a method.  Yes,
+     * this should actually return a nice statically-typed pair object, but we
+     * don't have one of those.  
+     *
+     * <blockquote><pre>
+     *   UnresolvedType.signatureToTypes("()[Z")[0].equals(Type.forSignature("[Z"))
+     *   UnresolvedType.signatureToTypes("(JJ)I")[1]
+     *      .equals(UnresolvedType.forSignatures(new String[] {"J", "J"}))
+     * </pre></blockquote>
+     *
+     * @param      signature the JVM bytecode method signature string we want to break apart
+     * @return     a pair of UnresolvedType, UnresolvedType[] representing the return types and parameter types. 
+     */
+    private static Object[] signatureToTypes(String sig,boolean keepParameterizationInfo) {
+        List l = new ArrayList();
+        int i = 1;
+        while (true) {
+            char c = sig.charAt(i);
+            if (c == ')') break; // break out when the hit the ')'
+            int start = i;
+            while (c == '[') c = sig.charAt(++i);
+            if (c == 'L' || c == 'P') {
+                               int nextSemicolon = sig.indexOf(';',start);
+                               int firstAngly = sig.indexOf('<',start);
+                               if (firstAngly == -1 || firstAngly>nextSemicolon) {
+                  i = nextSemicolon + 1;
+                  l.add(UnresolvedType.forSignature(sig.substring(start, i)));
+                               } else {
+                                       // generics generics generics
+                                       // Have to skip to the *correct* ';'
+                                       boolean endOfSigReached = false;
+                                       int posn = firstAngly;
+                                       int genericDepth=0;
+                                       while (!endOfSigReached) {
+                                               switch (sig.charAt(posn)) {
+                                                 case '<': genericDepth++;break;
+                                                 case '>': genericDepth--;break;
+                                                 case ';': if (genericDepth==0) endOfSigReached=true;break;
+                                                 default:
+                                               }
+                                               posn++;
+                                       }
+                                       // posn now points to the correct nextSemicolon :)
+                                       i=posn;
+                                       String toProcess = null;
+                                       toProcess = sig.substring(start,i);
+                                       UnresolvedType tx = UnresolvedType.forSignature(toProcess);
+                                       l.add(tx);                                      
+                               }
+            } else if (c=='T') { // assumed 'reference' to a type variable, so just "Tname;"
+                               int nextSemicolon = sig.indexOf(';',start);
+                               String nextbit = sig.substring(start,nextSemicolon);
+                               l.add(UnresolvedType.forSignature(nextbit));
+                               i=nextSemicolon+1;
+            } else {
+               i++;
+                l.add(UnresolvedType.forSignature(sig.substring(start, i)));
+            }
+        }
+        UnresolvedType[] paramTypes = (UnresolvedType[]) l.toArray(new UnresolvedType[l.size()]);
+        UnresolvedType returnType = UnresolvedType.forSignature(sig.substring(i+1, sig.length()));
+        return new Object[] { returnType, paramTypes };
+    }            
+
+    // ---- factory methods
+    public static MemberImpl field(String declaring, int mods, String name, String signature) {
+        return field(declaring, mods, UnresolvedType.forSignature(signature), name);
+    }
+    public static Member field(UnresolvedType declaring, int mods, String name, UnresolvedType type) {
+        return new MemberImpl(FIELD, declaring, mods, type, name, UnresolvedType.NONE);
+    }    
+    public static MemberImpl method(UnresolvedType declaring, int mods, String name, String signature) {
+        Object[] pair = signatureToTypes(signature,false);
+        return method(declaring, mods, (UnresolvedType) pair[0], name, (UnresolvedType[]) pair[1]);
+    }
+    public static Member pointcut(UnresolvedType declaring, String name, String signature) {
+        Object[] pair = signatureToTypes(signature,false);
+        return pointcut(declaring, 0, (UnresolvedType) pair[0], name, (UnresolvedType[]) pair[1]);
+    }
+
+
+    private static MemberImpl field(String declaring, int mods, UnresolvedType ty, String name) {
+        return new MemberImpl(
+            FIELD,
+            UnresolvedType.forName(declaring),
+            mods,
+            ty,
+            name,
+            UnresolvedType.NONE);
+    }
+    
+    public static MemberImpl method(UnresolvedType declTy, int mods, UnresolvedType rTy, String name, UnresolvedType[] paramTys) {
+        return new MemberImpl(
+               //??? this calls <clinit> a method
+            name.equals("<init>") ? CONSTRUCTOR : METHOD,
+            declTy,
+            mods,
+            rTy,
+            name,
+            paramTys);
+    }
+    private static Member pointcut(UnresolvedType declTy, int mods, UnresolvedType rTy, String name, UnresolvedType[] paramTys) {
+        return new MemberImpl(
+            POINTCUT,
+            declTy,
+            mods,
+            rTy,
+            name,
+            paramTys);
+    }
+    
+       public static ResolvedMemberImpl makeExceptionHandlerSignature(UnresolvedType inType, UnresolvedType catchType) {
+               return new ResolvedMemberImpl(
+                       HANDLER,
+                       inType,
+                       Modifier.STATIC,
+                       "<catch>",
+                       "(" + catchType.getSignature() + ")V");
+       }
+    
+    // ---- parsing methods
+    
+    /** Takes a string in this form:
+     * 
+     * <blockquote><pre>
+     * static? TypeName TypeName.Id
+     * </pre></blockquote>
+     * Pretty much just for testing, and as such should perhaps be moved.
+     */
+    
+    public static MemberImpl fieldFromString(String str) {
+        str = str.trim();
+        final int len = str.length();
+        int i = 0;
+        int mods = 0;
+        if (str.startsWith("static", i)) {
+            mods = Modifier.STATIC;
+            i += 6;
+            while (Character.isWhitespace(str.charAt(i))) i++;
+        }
+        int start = i;
+        while (! Character.isWhitespace(str.charAt(i))) i++;
+        UnresolvedType retTy = UnresolvedType.forName(str.substring(start, i));
+
+        start = i;
+        i = str.lastIndexOf('.');
+        UnresolvedType declaringTy = UnresolvedType.forName(str.substring(start, i).trim());
+        start = ++i;
+        String name = str.substring(start, len).trim();
+        return new MemberImpl(
+            FIELD,
+            declaringTy,
+            mods,
+            retTy,
+            name,
+            UnresolvedType.NONE);
+    }
+
+    /** Takes a string in this form:
+     * 
+     * <blockquote><pre>
+     * (static|interface|private)? TypeName TypeName . Id ( TypeName , ...)
+     * </pre></blockquote>
+     * Pretty much just for testing, and as such should perhaps be moved.
+     */
+    
+    public static Member methodFromString(String str) {
+        str = str.trim();
+        // final int len = str.length();
+        int i = 0;
+
+        int mods = 0;
+        if (str.startsWith("static", i)) {
+            mods = Modifier.STATIC;
+            i += 6;
+        } else if (str.startsWith("interface", i)) {
+            mods = Modifier.INTERFACE;
+            i += 9;
+        } else if (str.startsWith("private", i)) {
+            mods = Modifier.PRIVATE;
+            i += 7;
+        }            
+        while (Character.isWhitespace(str.charAt(i))) i++;
+        
+        int start = i;
+        while (! Character.isWhitespace(str.charAt(i))) i++;
+        UnresolvedType returnTy = UnresolvedType.forName(str.substring(start, i));
+
+        start = i;
+        i = str.indexOf('(', i);
+        i = str.lastIndexOf('.', i);
+        UnresolvedType declaringTy = UnresolvedType.forName(str.substring(start, i).trim());
+        
+        start = ++i;
+        i = str.indexOf('(', i);
+        String name = str.substring(start, i).trim();
+        start = ++i;
+        i = str.indexOf(')', i);
+    
+        String[] paramTypeNames = parseIds(str.substring(start, i).trim());
+
+        return method(declaringTy, mods, returnTy, name, UnresolvedType.forNames(paramTypeNames));
+    }
+
+    private static String[] parseIds(String str) {
+        if (str.length() == 0) return ZERO_STRINGS;
+        List l = new ArrayList();
+        int start = 0;
+        while (true) {
+            int i = str.indexOf(',', start);
+            if (i == -1) {
+                l.add(str.substring(start).trim());
+                break;
+            }
+            l.add(str.substring(start, i).trim());
+            start = i+1;
+        }
+        return (String[]) l.toArray(new String[l.size()]);
+    }
+
+    private static final String[] ZERO_STRINGS = new String[0];
+
+    // ---- things we know without resolution
+    
+    public boolean equals(Object other) {
+        if (! (other instanceof Member)) return false;
+        Member o = (Member) other;
+
+        return (kind == o.getKind() 
+            && name.equals(o.getName()) 
+            && signature.equals(o.getSignature())
+            && declaringType.equals(o.getDeclaringType()));
+    }
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#compareTo(java.lang.Object)
+        */
+    public int compareTo(Object other) {
+       Member o = (Member) other;
+       
+       int i = getName().compareTo(o.getName());
+       if (i != 0) return i;
+       return getSignature().compareTo(o.getSignature());
+    }
+    
+    /** 
+     * Equality is checked based on the underlying signature, so the hash code
+     * of a member is based on its kind, name, signature, and declaring type.  The
+     * algorithm for this was taken from page 38 of effective java.
+     */
+    private volatile int hashCode = 0;
+    public int hashCode() {
+        if (hashCode == 0) {
+            int result = 17;
+            result = 37*result + kind.hashCode();
+            result = 37*result + name.hashCode();
+            result = 37*result + signature.hashCode();
+            result = 37*result + declaringType.hashCode();
+            hashCode = result;
+        } 
+        return hashCode;
+    }
+
+    public String toString() {
+       StringBuffer buf = new StringBuffer();
+       buf.append(returnType.getName());
+       buf.append(' ');
+               buf.append(declaringType.getName());
+        buf.append('.');
+               buf.append(name);
+       if (kind != FIELD) {
+               buf.append("(");
+            if (parameterTypes.length != 0) {
+                buf.append(parameterTypes[0]);
+                       for (int i=1, len = parameterTypes.length; i < len; i++) {
+                    buf.append(", ");
+                           buf.append(parameterTypes[i].getName());
+                       }
+            }
+               buf.append(")");
+       }
+       return buf.toString();
+    }
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#toLongString()
+        */
+    public String toLongString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append(kind);
+        buf.append(' ');
+        if (modifiers != 0) {
+            buf.append(Modifier.toString(modifiers));
+            buf.append(' ');
+        }
+        buf.append(toString());
+        buf.append(" <");
+        buf.append(signature);
+        buf.append(" >");
+        return buf.toString();
+    }        
+
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getKind()
+        */
+    public Kind getKind() { return kind; }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getDeclaringType()
+        */
+    public UnresolvedType getDeclaringType() { return declaringType; }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getReturnType()
+        */
+    public UnresolvedType getReturnType() { return returnType; }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getType()
+        */
+    public UnresolvedType getType() { return returnType; }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getName()
+        */
+    public String getName() { return name; }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getParameterTypes()
+        */
+    public UnresolvedType[]  getParameterTypes() { return parameterTypes; }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getSignature()
+        */
+    public String getSignature() { return signature; }
+       
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getDeclaredSignature()
+        */
+       public String getDeclaredSignature() { return declaredSignature;}
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getArity()
+        */
+    public int getArity() { return parameterTypes.length; }
+  
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getParameterSignature()
+        */
+    public String getParameterSignature() {
+       if (paramSignature != null) return paramSignature;
+       StringBuffer sb = new StringBuffer();
+       sb.append("(");
+       for (int i = 0; i < parameterTypes.length; i++) {
+                       UnresolvedType tx = parameterTypes[i];
+                       sb.append(tx.getSignature());
+               }
+       sb.append(")");
+       paramSignature = sb.toString();
+       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;
+    }
+    
+    // ---- things we know only with resolution
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getModifiers(org.aspectj.weaver.World)
+        */
+    public int getModifiers(World world) {
+        return resolve(world).getModifiers();
+    }
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getExceptions(org.aspectj.weaver.World)
+        */
+    public UnresolvedType[] getExceptions(World world) {
+        return resolve(world).getExceptions();
+    }
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#isProtected(org.aspectj.weaver.World)
+        */
+    public final boolean isProtected(World world) {
+        return Modifier.isProtected(resolve(world).getModifiers());
+    }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#isStatic(org.aspectj.weaver.World)
+        */
+    public final boolean isStatic(World world) {
+        return Modifier.isStatic(resolve(world).getModifiers());
+    }
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#isStrict(org.aspectj.weaver.World)
+        */
+    public final boolean isStrict(World world) {
+        return Modifier.isStrict(resolve(world).getModifiers());
+    }
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#isStatic()
+        */
+    public final boolean isStatic() {
+        return Modifier.isStatic(modifiers);
+    }    
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#isInterface()
+        */
+    public final boolean isInterface() {
+        return Modifier.isInterface(modifiers);  // this is kinda weird
+    }    
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#isPrivate()
+        */
+    public final boolean isPrivate() {
+        return Modifier.isPrivate(modifiers);
+    }    
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#canBeParameterized()
+        */
+    public boolean canBeParameterized() {
+       return false;
+    }
+
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getCallsiteModifiers()
+        */
+       public final int getCallsiteModifiers() {
+               return modifiers & ~ Modifier.INTERFACE;
+       }
+       
+       public int getModifiers() {
+               return modifiers;
+       }
+
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getExtractableName()
+        */
+    public final String getExtractableName() {
+       if (name.equals("<init>")) return "init$";
+       else if (name.equals("<clinit>")) return "clinit$";
+       else return name;
+    }
+
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#hasAnnotation(org.aspectj.weaver.UnresolvedType)
+        */
+       public boolean hasAnnotation(UnresolvedType ofType) {
+               throw new UnsupportedOperationException("You should resolve this member and call hasAnnotation() on the result...");
+       }
+       
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.AnnotatedElement#getAnnotationTypes()
+        */
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getAnnotationTypes()
+        */
+       public ResolvedType[] getAnnotationTypes() {
+               throw new UnsupportedOperationException("You should resolve this member and call hasAnnotation() on the result...");
+       }
+       
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getAnnotations()
+        */
+       public AnnotationX[] getAnnotations() {
+               throw new UnsupportedOperationException("You should resolve this member and call getAnnotations() on the result...");
+       }
+
+       // ---- fields 'n' stuff
+
+
+    
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getDeclaringTypes(org.aspectj.weaver.World)
+        */
+       public Collection/*ResolvedType*/ getDeclaringTypes(World world) {
+               ResolvedType myType = getDeclaringType().resolve(world);
+               Collection ret = new HashSet();
+               if (kind == CONSTRUCTOR) {
+                       // this is wrong if the member doesn't exist, but that doesn't matter
+                       ret.add(myType);
+               } else if (isStatic() || kind == FIELD) {
+                       walkUpStatic(ret, myType);
+               } else {
+                       walkUp(ret, myType);
+               }
+               
+               return ret;
+       }
+       
+       private boolean walkUp(Collection acc, ResolvedType curr) {
+               if (acc.contains(curr)) return true;
+               
+               boolean b = false;
+               for (Iterator i = curr.getDirectSupertypes(); i.hasNext(); ) {
+                       b |= walkUp(acc, (ResolvedType)i.next());
+               }
+               
+               if (!b && curr.isParameterizedType()) {
+                       b = walkUp(acc,curr.getGenericType());
+               }
+               
+               if (!b) {
+                       b = curr.lookupMemberNoSupers(this) != null;
+               } 
+               if (b) acc.add(curr);
+               return b;
+       }
+       
+       private boolean walkUpStatic(Collection acc, ResolvedType curr) {
+               if (curr.lookupMemberNoSupers(this) != null) {
+                       acc.add(curr);
+                       return true;
+               } else {
+                       boolean b = false;
+                       for (Iterator i = curr.getDirectSupertypes(); i.hasNext(); ) {
+                               b |= walkUpStatic(acc, (ResolvedType)i.next());
+                       }
+                       if (!b && curr.isParameterizedType()) {
+                               b = walkUpStatic(acc,curr.getGenericType());
+                       }
+                       if (b) acc.add(curr);
+                       return b;
+               }
+       }
+
+       // ---- reflective thisJoinPoint stuff
+    /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getSignatureMakerName()
+        */
+    public String getSignatureMakerName() {
+       if (getName().equals("<clinit>")) return "makeInitializerSig";
+       
+       Kind kind = getKind();
+       if (kind == METHOD) {
+               return "makeMethodSig";
+       } else if (kind == CONSTRUCTOR) {
+               return "makeConstructorSig";
+       } else if (kind == FIELD) {
+               return "makeFieldSig";
+       } else if (kind == HANDLER) {
+               return "makeCatchClauseSig";
+       } else if (kind == STATIC_INITIALIZATION) {
+               return "makeInitializerSig";
+       } else if (kind == ADVICE) {
+               return "makeAdviceSig";
+       } else {
+               throw new RuntimeException("unimplemented");
+       }
+    }
+       
+    
+
+
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getSignatureType()
+        */
+       public String getSignatureType() {
+       Kind kind = getKind();
+       if (getName().equals("<clinit>")) return "org.aspectj.lang.reflect.InitializerSignature";
+       
+       if (kind == METHOD) {
+               return "org.aspectj.lang.reflect.MethodSignature";
+       } else if (kind == CONSTRUCTOR) {
+               return "org.aspectj.lang.reflect.ConstructorSignature";
+       } else if (kind == FIELD) {
+               return "org.aspectj.lang.reflect.FieldSignature";
+       } else if (kind == HANDLER) {
+               return "org.aspectj.lang.reflect.CatchClauseSignature";
+       } else if (kind == STATIC_INITIALIZATION) {
+               return "org.aspectj.lang.reflect.InitializerSignature";
+       } else if (kind == ADVICE) {
+               return "org.aspectj.lang.reflect.AdviceSignature";
+       } else {
+               throw new RuntimeException("unimplemented");
+       }
+    }
+
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getSignatureString(org.aspectj.weaver.World)
+        */
+       public String getSignatureString(World world) {
+               if (getName().equals("<clinit>")) return getStaticInitializationSignatureString(world);
+               
+       Kind kind = getKind();
+       if (kind == METHOD) {
+               return getMethodSignatureString(world);
+       } else if (kind == CONSTRUCTOR) {
+               return getConstructorSignatureString(world);
+       } else if (kind == FIELD) {
+               return getFieldSignatureString(world);
+       } else if (kind == HANDLER) {
+               return getHandlerSignatureString(world);
+       } else if (kind == STATIC_INITIALIZATION) {
+               return getStaticInitializationSignatureString(world);
+       } else if (kind == ADVICE) {
+               return getAdviceSignatureString(world);
+       } else {
+               throw new RuntimeException("unimplemented");
+       }
+    }
+
+       private String getHandlerSignatureString(World world) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(makeString(0));
+        buf.append('-');
+        //buf.append(getName());
+        buf.append('-');
+        buf.append(makeString(getDeclaringType()));
+        buf.append('-');
+        buf.append(makeString(getParameterTypes()[0]));
+        buf.append('-');
+        String pName = "<missing>";
+        String[] names = getParameterNames(world);
+        if (names != null) pName = names[0];
+        buf.append(pName);
+        buf.append('-');
+        return buf.toString();
+       }
+       
+       private String getStaticInitializationSignatureString(World world) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(makeString(getModifiers(world)));
+        buf.append('-');
+        //buf.append(getName());
+        buf.append('-');
+        buf.append(makeString(getDeclaringType()));
+        buf.append('-');
+        return buf.toString();
+       }
+
+
+
+       protected String getAdviceSignatureString(World world) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(makeString(getModifiers(world)));
+        buf.append('-');
+        buf.append(getName());
+        buf.append('-');
+        buf.append(makeString(getDeclaringType()));
+        buf.append('-');
+        buf.append(makeString(getParameterTypes()));
+        buf.append('-');
+        buf.append(makeString(getParameterNames(world)));
+        buf.append('-');
+        buf.append(makeString(getExceptions(world)));
+        buf.append('-');
+        buf.append(makeString(getReturnType()));
+        buf.append('-');
+        return buf.toString();
+       }
+
+
+       protected String getMethodSignatureString(World world) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(makeString(getModifiers(world)));
+        buf.append('-');
+        buf.append(getName());
+        buf.append('-');
+        buf.append(makeString(getDeclaringType()));
+        buf.append('-');
+        buf.append(makeString(getParameterTypes()));
+        buf.append('-');
+        buf.append(makeString(getParameterNames(world)));
+        buf.append('-');
+        buf.append(makeString(getExceptions(world)));
+        buf.append('-');
+        buf.append(makeString(getReturnType()));
+        buf.append('-');
+        return buf.toString();
+       }
+       
+
+
+       protected String getConstructorSignatureString(World world) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(makeString(getModifiers(world)));
+        buf.append('-');
+        buf.append('-');
+        buf.append(makeString(getDeclaringType()));
+        buf.append('-');
+        buf.append(makeString(getParameterTypes()));
+        buf.append('-');
+        buf.append(makeString(getParameterNames(world)));
+        buf.append('-');
+        buf.append(makeString(getExceptions(world)));
+        buf.append('-');
+        return buf.toString();
+    }
+       
+       
+
+
+       protected String getFieldSignatureString(World world) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(makeString(getModifiers(world)));
+        buf.append('-');
+        buf.append(getName());
+        buf.append('-');
+        buf.append(makeString(getDeclaringType()));
+        buf.append('-');
+        buf.append(makeString(getReturnType()));
+        buf.append('-');
+        return buf.toString();
+    }
+
+       protected String makeString(int i) {
+               return Integer.toString(i, 16);  //??? expensive
+       }
+
+
+
+
+       protected String makeString(UnresolvedType t) {
+       // this is the inverse of the odd behavior for Class.forName w/ arrays
+       if (t.isArray()) {
+               // this behavior matches the string used by the eclipse compiler for Foo.class literals
+               return t.getSignature().replace('/', '.');
+       } else {
+               return t.getName();
+       }
+    }
+    
+
+
+       protected String makeString(UnresolvedType[] types) {
+       if (types == null) return "";
+        StringBuffer buf = new StringBuffer();
+        for (int i = 0, len=types.length; i < len; i++) {
+            buf.append(makeString(types[i]));
+            buf.append(':');
+        }
+        return buf.toString();
+    }
+    
+
+
+       protected String makeString(String[] names) {
+       if (names == null) return "";
+        StringBuffer buf = new StringBuffer();
+        for (int i = 0, len=names.length; i < len; i++) {
+            buf.append(names[i]);
+            buf.append(':');
+        }
+        return buf.toString();
+    }
+
+       /* (non-Javadoc)
+        * @see org.aspectj.weaver.Member#getParameterNames(org.aspectj.weaver.World)
+        */
+       public String[] getParameterNames(World world) {
+       return resolve(world).getParameterNames();
+    }
+       
+    /**
+     * All the signatures that a join point with this member as its signature has.
+     */
+       public JoinPointSignature[] getJoinPointSignatures(World inAWorld) {
+               if (joinPointSignatures == null) {
+                       joinPointSignatures = ResolvedMemberImpl.getJoinPointSignatures(this, inAWorld);
+               }
+               return joinPointSignatures;
+       }
+    
+}
+   
index 08d60789e2bd1d23e65f406c60b36e876de879d3..e8808f3331858b2748e91e2b33aa22a248d967e0 100644 (file)
@@ -54,9 +54,9 @@ public class NewConstructorTypeMunger extends ResolvedTypeMunger {
        
        public static ResolvedTypeMunger readConstructor(VersionedDataInputStream s, ISourceContext context) throws IOException {
                ResolvedTypeMunger munger = new NewConstructorTypeMunger(
-                               ResolvedMember.readResolvedMember(s, context),
-                               ResolvedMember.readResolvedMember(s, context),
-                               ResolvedMember.readResolvedMember(s, context),
+                               ResolvedMemberImpl.readResolvedMember(s, context),
+                               ResolvedMemberImpl.readResolvedMember(s, context),
+                               ResolvedMemberImpl.readResolvedMember(s, context),
                                readSuperMethodsCalled(s));
                if (ResolvedTypeMunger.persistSourceLocation) munger.setSourceLocation(readSourceLocation(s));
                return munger;
index 1c82c21c0dc049a0aacb17a58e08a0eefa76125f..a3938ff30151ab8ab6d8b98598f859323a2e1ffa 100644 (file)
@@ -38,7 +38,7 @@ public class NewFieldTypeMunger extends ResolvedTypeMunger {
 
        public static ResolvedTypeMunger readField(VersionedDataInputStream s, ISourceContext context) throws IOException {
                ResolvedTypeMunger munger = new NewFieldTypeMunger(
-                       ResolvedMember.readResolvedMember(s, context),
+                       ResolvedMemberImpl.readResolvedMember(s, context),
                        readSuperMethodsCalled(s));
                if (ResolvedTypeMunger.persistSourceLocation) munger.setSourceLocation(readSourceLocation(s));
                return munger;
index 31543895f663a81041d6d40e4f623d1cbd3b8bfa..961cec9c1c42978148e737980b002d6426709650 100644 (file)
@@ -44,7 +44,7 @@ public class NewMethodTypeMunger extends ResolvedTypeMunger {
        
        public static ResolvedTypeMunger readMethod(VersionedDataInputStream s, ISourceContext context) throws IOException {
                ResolvedTypeMunger munger = new NewMethodTypeMunger(
-                               ResolvedMember.readResolvedMember(s, context),
+                               ResolvedMemberImpl.readResolvedMember(s, context),
                                readSuperMethodsCalled(s));
                if (ResolvedTypeMunger.persistSourceLocation) munger.setSourceLocation(readSourceLocation(s));
                return munger;
index 15b8252ad0d9073fcd5745337f1606a3b8a38226..6fd6c0a7cd7aa3d394bcc22335f2bda3d2b57775 100644 (file)
@@ -1,5 +1,6 @@
 /* *******************************************************************
  * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
+ *               2005 Contributors
  * All rights reserved. 
  * This program and the accompanying materials are made available 
  * under the terms of the Common Public License v1.0 
  * http://www.eclipse.org/legal/cpl-v10.html 
  *  
  * Contributors: 
- *     PARC     initial implementation 
+ *     PARC     initial implementation
+ *     AMC      extracted as interface 
  * ******************************************************************/
-
-
 package org.aspectj.weaver;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
-import java.lang.reflect.Modifier;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
 
 import org.aspectj.bridge.ISourceLocation;
 
-/**
- * This is the declared member, i.e. it will always correspond to an
- * actual method/... declaration
- */
-public class ResolvedMember extends Member implements IHasPosition, AnnotatedElement, TypeVariableDeclaringElement {
-    
-    public String[] parameterNames = null;
-    protected UnresolvedType[] checkedExceptions = UnresolvedType.NONE;
-    /**
-     * if this member is a parameterized version of a member in a generic type,
-     * then this field holds a reference to the member we parameterize.
-     */
-    protected ResolvedMember backingGenericMember = null;
-    private Set annotationTypes = null;
-       // Some members are 'created' to represent other things (for example ITDs).  These
-       // members have their annotations stored elsewhere, and this flag indicates that is
-       // the case.  It is up to the caller to work out where that is!
-       // Once determined the caller may choose to stash the annotations in this member...
-       private boolean isAnnotatedElsewhere = false; // this field is not serialized.
-       private boolean isAjSynthetic = true;
-    
-    // generic methods have type variables
-       private UnresolvedType[] typeVariables;
-    
-    // these three fields hold the source location of this member
-       protected int start, end;
-       protected ISourceContext sourceContext = null;
-    
-    //XXX deprecate this in favor of the constructor below
-       public ResolvedMember(
-               Kind kind,
-               UnresolvedType declaringType,
-               int modifiers,
-               UnresolvedType returnType,
-               String name,
-               UnresolvedType[] parameterTypes)
-       {
-               super(kind, declaringType, modifiers, returnType, name, parameterTypes);
-       }
-
-    
-    
-       public ResolvedMember(
-               Kind kind,
-               UnresolvedType declaringType,
-               int modifiers,
-               UnresolvedType returnType,
-               String name,
-               UnresolvedType[] parameterTypes,
-               UnresolvedType[] checkedExceptions) 
-       {
-               super(kind, declaringType, modifiers, returnType, name, parameterTypes);
-               this.checkedExceptions = checkedExceptions;
-       }
-    
-       public ResolvedMember(
-                       Kind kind,
-                       UnresolvedType declaringType,
-                       int modifiers,
-                       UnresolvedType returnType,
-                       String name,
-                       UnresolvedType[] parameterTypes,
-                       UnresolvedType[] checkedExceptions,
-                       ResolvedMember backingGenericMember) 
-               {
-                       this(kind, declaringType, modifiers, returnType, name, parameterTypes,checkedExceptions);
-                       this.backingGenericMember = backingGenericMember;
-                       this.isAjSynthetic = backingGenericMember.isAjSynthetic();
-               }
-       
-       public ResolvedMember(
-               Kind kind,
-               UnresolvedType declaringType,
-               int modifiers,
-               String name,
-               String signature) 
-       {
-               super(kind, declaringType, modifiers, name, signature);
-       }    
-
-    public static final ResolvedMember[] NONE = new ResolvedMember[0];
-
-       // ----
-
-    public final int getModifiers(World world) {
-        return modifiers;
-    }
-    public final int getModifiers() {
-        return modifiers;
-    }
-
-       // ----
-       
-
-    public final UnresolvedType[] getExceptions(World world) {
-        return getExceptions();
-    }
-    
-    public UnresolvedType[] getExceptions() {
-        return checkedExceptions;
-    }
-    
-    public ShadowMunger getAssociatedShadowMunger() {
-               return null;
-    }
-    
-    // ??? true or false?
-    public boolean isAjSynthetic() {
-       return isAjSynthetic;
-    }
-       
-       public boolean hasAnnotations() {
-               return  (annotationTypes==null);
-       }
-
-    public boolean hasAnnotation(UnresolvedType ofType) {
-        // The ctors don't allow annotations to be specified ... yet - but
-        // that doesn't mean it is an error to call this method.
-        // Normally the weaver will be working with subtypes of 
-        // this type - BcelField/BcelMethod
-        if (annotationTypes==null) return false;
-               return annotationTypes.contains(ofType);
-    }
-    
-    public ResolvedType[] getAnnotationTypes() {
-       // The ctors don't allow annotations to be specified ... yet - but
-       // that doesn't mean it is an error to call this method.
-       // Normally the weaver will be working with subtypes of
-       // this type - BcelField/BcelMethod
-       if (annotationTypes == null) return null;
-               return (ResolvedType[])annotationTypes.toArray(new ResolvedType[]{});
-    }
-    
-       public void setAnnotationTypes(UnresolvedType[] annotationtypes) {
-               if (annotationTypes == null) annotationTypes = new HashSet();
-               for (int i = 0; i < annotationtypes.length; i++) {
-                       UnresolvedType typeX = annotationtypes[i];
-                       annotationTypes.add(typeX);
-               }
-       }
-       
-       public void addAnnotation(AnnotationX annotation) {
-           // FIXME asc only allows for annotation types, not instances - should it?
-               if (annotationTypes == null) annotationTypes = new HashSet();
-               annotationTypes.add(annotation.getSignature());
-       }
-           
-    public boolean isBridgeMethod() {
-       return (modifiers & Constants.ACC_BRIDGE)!=0;
-    }
-    
-    public boolean isVarargsMethod() {
-       return (modifiers & Constants.ACC_VARARGS)!=0;
-    }
-    
-       public boolean isSynthetic() {
-               return false;
-       }
-    
-    public void write(DataOutputStream s) throws IOException {
-       getKind().write(s);
-       getDeclaringType().write(s);
-       s.writeInt(modifiers);
-       s.writeUTF(getName());
-       s.writeUTF(getSignature());
-               UnresolvedType.writeArray(getExceptions(), s);
-
-               s.writeInt(getStart());
-               s.writeInt(getEnd());
-
-               // Write out any type variables...
-               if (typeVariables==null) {
-                       s.writeInt(0);
-               } else {
-                       s.writeInt(typeVariables.length);
-                       for (int i = 0; i < typeVariables.length; i++) {
-                               typeVariables[i].write(s);
-                       }
-               }
-    }
-
-    public static void writeArray(ResolvedMember[] members, DataOutputStream s) throws IOException {
-               s.writeInt(members.length);
-               for (int i = 0, len = members.length; i < len; i++) {
-                       members[i].write(s);
-               }
-    }
-
-    
-    public static ResolvedMember readResolvedMember(VersionedDataInputStream s, ISourceContext sourceContext) throws IOException {
-       ResolvedMember m = new ResolvedMember(Kind.read(s), UnresolvedType.read(s), s.readInt(), s.readUTF(), s.readUTF());
-               m.checkedExceptions = UnresolvedType.readArray(s);
-
-               m.start = s.readInt();
-               m.end = s.readInt();
-               m.sourceContext = sourceContext;
-               
-               // Read in the type variables...
-               if (s.getMajorVersion()>=AjAttribute.WeaverVersionInfo.WEAVER_VERSION_MAJOR_AJ150) {
-                       int tvcount = s.readInt();
-                       if (tvcount!=0) {
-                               m.typeVariables = new UnresolvedType[tvcount];
-                               for (int i=0;i<tvcount;i++) {
-                                       m.typeVariables[i]=UnresolvedType.read(s);
-                               }
-                       }
-               }
-               return m;
-    }
-    
-    public static ResolvedMember[] readResolvedMemberArray(VersionedDataInputStream s, ISourceContext context) throws IOException {
-       int len = s.readInt();
-               ResolvedMember[] members = new ResolvedMember[len];
-               for (int i=0; i < len; i++) {
-                       members[i] = ResolvedMember.readResolvedMember(s, context);
-               }
-               return members;
-    }
-    
-    
-    
-       public ResolvedMember resolve(World world) {
-           // FIXME asc guard with a check on resolution having happened !
-        if (annotationTypes!=null) {
-          Set r = new HashSet();
-          for (Iterator iter = annotationTypes.iterator(); iter.hasNext();) {
-                       UnresolvedType element = (UnresolvedType) iter.next();
-                       r.add(world.resolve(element));
-                 }
-                 annotationTypes = r;
-           }
-        declaringType = declaringType.resolve(world);
-        if (declaringType.isRawType()) declaringType = ((ReferenceType)declaringType).getGenericType();
-               return this;
-       }
-       
-       public ISourceContext getSourceContext(World world) {
-               return getDeclaringType().resolve(world).getSourceContext();
-       }
-
-       public final String[] getParameterNames() {
-               return parameterNames;
-       }
-       public final String[] getParameterNames(World world) {
-               return getParameterNames();
-       }
-       
-       public AjAttribute.EffectiveSignatureAttribute getEffectiveSignature() {
-               return null;
-       }
-       
-    public ISourceLocation getSourceLocation() {
-       //System.out.println("get context: " + this + " is " + sourceContext);
-       if (sourceContext == null) {
-               //System.err.println("no context: " + this);
-               return null;
-       }
-       return sourceContext.makeSourceLocation(this);
-    }
-    
-       public int getEnd() {
-               return end;
-       }
-
-       public ISourceContext getSourceContext() {
-               return sourceContext;
-       }
-
-       public int getStart() {
-               return start;
-       }
-
-       public void setPosition(int sourceStart, int sourceEnd) {
-               this.start = sourceStart;
-               this.end = sourceEnd;
-       }
-
-       public void setSourceContext(ISourceContext sourceContext) {
-               this.sourceContext = sourceContext;
-       }
-       
-       public boolean isAbstract() {
-               return Modifier.isAbstract(modifiers);
-       }
-
-       public boolean isPublic() {
-               return Modifier.isPublic(modifiers);
-       }
-    
-    public boolean isProtected() {
-        return Modifier.isProtected(modifiers);   
-    }
-       
-       public boolean isNative() {
-               return Modifier.isNative(modifiers);
-       }
-    
-    public boolean isDefault() {
-        return !(isPublic() || isProtected() || isPrivate());
-    }
-
-       public boolean isVisible(ResolvedType fromType) {
-               World world = fromType.getWorld();
-               return ResolvedType.isVisible(getModifiers(), getDeclaringType().resolve(world),
-                                       fromType);
-       }
-       public void setCheckedExceptions(UnresolvedType[] checkedExceptions) {
-               this.checkedExceptions = checkedExceptions;
-       }
-
-       public void setAnnotatedElsewhere(boolean b) {
-               isAnnotatedElsewhere = b;
-       }
-
-       public boolean isAnnotatedElsewhere() {
-               return isAnnotatedElsewhere;
-       }
-       
+public interface ResolvedMember extends Member, AnnotatedElement, TypeVariableDeclaringElement {
+
+       public static final ResolvedMember[] NONE = new ResolvedMember[0];
+
+       public int getModifiers(World world);
+
+       public int getModifiers();
+
+       public UnresolvedType[] getExceptions(World world);
+
+       public UnresolvedType[] getExceptions();
+
+       public ShadowMunger getAssociatedShadowMunger();
+
+       // ??? true or false?
+       public boolean isAjSynthetic();
+
+       public boolean hasAnnotations();
+
+       public boolean hasAnnotation(UnresolvedType ofType);
+
+       public ResolvedType[] getAnnotationTypes();
+
+       public void setAnnotationTypes(UnresolvedType[] annotationtypes);
+
+       public void addAnnotation(AnnotationX annotation);
+
+       public boolean isBridgeMethod();
+
+       public boolean isVarargsMethod();
+
+       public boolean isSynthetic();
+
+       public void write(DataOutputStream s) throws IOException;
+
+       public ISourceContext getSourceContext(World world);
+
+       public String[] getParameterNames();
+
+       public String[] getParameterNames(World world);
+
+       public AjAttribute.EffectiveSignatureAttribute getEffectiveSignature();
+
+       public ISourceLocation getSourceLocation();
+
+       public int getEnd();
+
+       public ISourceContext getSourceContext();
+
+       public int getStart();
+
+       public void setPosition(int sourceStart, int sourceEnd);
+
+       public void setSourceContext(ISourceContext sourceContext);
+
+       public boolean isAbstract();
+
+       public boolean isPublic();
+
+       public boolean isProtected();
+
+       public boolean isNative();
+
+       public boolean isDefault();
+
+       public boolean isVisible(ResolvedType fromType);
+
+       public void setCheckedExceptions(UnresolvedType[] checkedExceptions);
+
+       public void setAnnotatedElsewhere(boolean b);
+
+       public boolean isAnnotatedElsewhere();
+
        /**
         * Get the UnresolvedType for the return type, taking generic signature into account
         */
-       public UnresolvedType getGenericReturnType() {
-               return getReturnType();
-       }
-       
+       public UnresolvedType getGenericReturnType();
+
        /**
         * Get the TypeXs of the parameter types, taking generic signature into account
         */
-       public UnresolvedType[] getGenericParameterTypes() {
-               return getParameterTypes();
-       }
-       
+       public UnresolvedType[] getGenericParameterTypes();
+
        // return a resolved member in which all type variables in the signature of this
        // member have been replaced with the given bindings.
        // the isParameterized flag tells us whether we are creating a raw type version or not
        // if isParameterized List<T> will turn into List<String> (for example), 
        // but if !isParameterized List<T> will turn into List.
-       public ResolvedMember parameterizedWith(UnresolvedType[] typeParameters,ResolvedType newDeclaringType, boolean isParameterized) {
-               if (!this.getDeclaringType().isGenericType()) {
-                       throw new IllegalStateException("Can't ask to parameterize a member of a non-generic type");
-               }
-               TypeVariable[] typeVariables = getDeclaringType().getTypeVariables();
-               if (typeVariables.length != typeParameters.length) {
-                       throw new IllegalStateException("Wrong number of type parameters supplied");
-               }
-               Map typeMap = new HashMap();
-               for (int i = 0; i < typeVariables.length; i++) {
-                       typeMap.put(typeVariables[i].getName(), typeParameters[i]);
-               }
-               UnresolvedType parameterizedReturnType = parameterize(getGenericReturnType(),typeMap,isParameterized);
-               UnresolvedType[] parameterizedParameterTypes = new UnresolvedType[getGenericParameterTypes().length];
-               for (int i = 0; i < parameterizedParameterTypes.length; i++) {
-                       parameterizedParameterTypes[i] = 
-                               parameterize(getGenericParameterTypes()[i], typeMap,isParameterized);
-               }
-               return new ResolvedMember(
-                                       getKind(),
-                                       newDeclaringType,
-                                       getModifiers(),
-                                       parameterizedReturnType,
-                                       getName(),
-                                       parameterizedParameterTypes,
-                                       getExceptions(),
-                                       this
-                               );
-       }
-       
-       
-       public void setTypeVariables(UnresolvedType[] types) {
-               typeVariables = types;
-       }
-       
-       public UnresolvedType[] getTypeVariables() {
-               return typeVariables;
-       }
-       
-       private UnresolvedType parameterize(UnresolvedType aType, Map typeVariableMap, boolean inParameterizedType) {
-               if (aType instanceof TypeVariableReferenceType) {
-                       String variableName = ((TypeVariableReferenceType)aType).getTypeVariable().getName();
-                       if (!typeVariableMap.containsKey(variableName)) {
-                               return aType; // if the type variable comes from the method (and not the type) thats OK
-                       }
-                       return (UnresolvedType) typeVariableMap.get(variableName);
-               } else if (aType.isParameterizedType()) {
-                       if (inParameterizedType) {
-                               return aType.parameterize(typeVariableMap);
-                       } else {
-                               return aType.getRawType();
-                       }
-               } 
-               return aType;           
-       }
-       
-       
+       public ResolvedMemberImpl parameterizedWith(
+                       UnresolvedType[] typeParameters, ResolvedType newDeclaringType,
+                       boolean isParameterized);
+
+       public void setTypeVariables(UnresolvedType[] types);
+
+       public UnresolvedType[] getTypeVariables();
+
        /**
         * If this member is defined by a parameterized super-type, return the erasure
         * of that member.
@@ -432,34 +127,13 @@ public class ResolvedMember extends Member implements IHasPosition, AnnotatedEle
         * variable.
         * A type is a supertype of itself.
         */
-       public ResolvedMember getErasure() {
-               if (calculatedMyErasure) return myErasure;
-               calculatedMyErasure = true;
-               ResolvedType resolvedDeclaringType = (ResolvedType) getDeclaringType();
-               // this next test is fast, and the result is cached.
-               if (!resolvedDeclaringType.hasParameterizedSuperType()) {
-                       return null;
-               } else {
-                       // we have one or more parameterized super types.
-                       // this member may be defined by one of them... we need to find out.
-                       Collection declaringTypes = this.getDeclaringTypes(resolvedDeclaringType.getWorld());
-                       for (Iterator iter = declaringTypes.iterator(); iter.hasNext();) {
-                               ResolvedType aDeclaringType = (ResolvedType) iter.next();
-                               if (aDeclaringType.isParameterizedType()) {
-                                       // we've found the (a?) parameterized type that defines this member.
-                                       // now get the erasure of it
-                                       ResolvedMember matchingMember = aDeclaringType.lookupMemberNoSupers(this);
-                                       if (matchingMember != null && matchingMember.backingGenericMember != null) {
-                                               myErasure = matchingMember.backingGenericMember;
-                                               return myErasure;
-                                       }
-                               }
-                       }
-               }
-               return null;
-       }
-       
-       private ResolvedMember myErasure = null;
-       private boolean calculatedMyErasure = false;
-}
-   
+       public ResolvedMember getErasure();
+
+       /**
+        * Returns true if this member matches the other. The matching takes into account
+        * name and parameter types only. When comparing parameter types, we allow any type
+        * variable to match any other type variable regardless of bounds.
+        */
+       public boolean matches(ResolvedMember aCandidateMatch);
+
+}
\ No newline at end of file
index dab7a281a979cc7e6d46b18592af53ff718444fb..382a95bcf71227f6ae9a0707a4c5ec735f4890eb 100644 (file)
@@ -19,7 +19,7 @@ import java.io.IOException;
 import org.aspectj.weaver.patterns.Pointcut;
 
 
-public class ResolvedPointcutDefinition extends ResolvedMember {
+public class ResolvedPointcutDefinition extends ResolvedMemberImpl {
        private Pointcut pointcut;
 
     public ResolvedPointcutDefinition(
index e592f59f511aae72246e9a934213a8ca0c3803f6..a8b942c946b8f2334e79a7f2eb03a1e47c9d3379 100644 (file)
@@ -234,22 +234,32 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl
      * on the superinterfaces.  The getMethods() call above doesn't quite work the same as it will (through the iterator) return methods
      * declared on *this* class twice, once at the start and once at the end - I couldn't debug that problem, so created this alternative.
      */
-    public List getMethodsWithoutIterator() {
+    public List getMethodsWithoutIterator(boolean includeITDs) {
         List methods = new ArrayList();
         Set knowninterfaces = new HashSet();
-        addAndRecurse(knowninterfaces,methods,this);
+        addAndRecurse(knowninterfaces,methods,this,includeITDs);
         return methods;
     }
     
-    private void addAndRecurse(Set knowninterfaces,List collector, ResolvedType rtx) {
+    private void addAndRecurse(Set knowninterfaces,List collector, ResolvedType rtx, boolean includeITDs) {
       collector.addAll(Arrays.asList(rtx.getDeclaredMethods())); // Add the methods declared on this type
-      if (!rtx.equals(ResolvedType.OBJECT)) addAndRecurse(knowninterfaces,collector,rtx.getSuperclass()); // Recurse if we aren't at the top
+      // now add all the inter-typed members too
+      if (includeITDs && rtx.interTypeMungers != null) {
+         for (Iterator i = interTypeMungers.iterator(); i.hasNext();) {
+                               ConcreteTypeMunger tm = (ConcreteTypeMunger) i.next();  
+                               ResolvedMember rm = tm.getSignature();
+                               if (rm != null) {  // new parent type munger can have null signature...
+                                       collector.add(tm.getSignature());
+                               } 
+                       }
+      }
+      if (!rtx.equals(ResolvedType.OBJECT)) addAndRecurse(knowninterfaces,collector,rtx.getSuperclass(),includeITDs); // Recurse if we aren't at the top
       ResolvedType[] interfaces = rtx.getDeclaredInterfaces(); // Go through the interfaces on the way back down
       for (int i = 0; i < interfaces.length; i++) {
                ResolvedType iface = interfaces[i];
                if (!knowninterfaces.contains(iface)) { // Dont do interfaces more than once
           knowninterfaces.add(iface); 
-          addAndRecurse(knowninterfaces,collector,iface);
+          addAndRecurse(knowninterfaces,collector,iface,includeITDs);
         }
          }
     }
@@ -302,12 +312,39 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl
     private ResolvedMember lookupMember(Member m, ResolvedMember[] a) {
                for (int i = 0; i < a.length; i++) {
                        ResolvedMember f = a[i];
-            if (matches(f, m)) return f;               
+            if (matches(f, m)) return f;       
                }
                return null;
     }      
     
     
+    /**
+     * Looks for the first member in the hierarchy matching aMember. This method
+     * differs from lookupMember(Member) in that it takes into account parameters
+     * which are type variables - which clearly an unresolved Member cannot do since
+     * it does not know anything about type variables. 
+     */
+     public ResolvedMember lookupResolvedMember(ResolvedMember aMember) {
+       Iterator toSearch = null;
+       ResolvedMember found = null;
+       if ((aMember.getKind() == Member.METHOD) || (aMember.getKind() == Member.CONSTRUCTOR)) {
+               toSearch = getMethodsWithoutIterator(true).iterator();
+       } else {
+               if (aMember.getKind() != Member.FIELD) 
+                       throw new IllegalStateException("I didn't know you would look for members of kind " + aMember.getKind());
+               toSearch = getFields();
+       }
+       while(toSearch.hasNext()) {
+                       ResolvedMemberImpl candidate = (ResolvedMemberImpl) toSearch.next();                    
+                       if (candidate.matches(aMember)) {
+                               found = candidate;
+                               break;
+                       } 
+               }
+       
+       return found;
+    }
+    
     public static boolean matches(Member m1, Member m2) {
         if (m1 == null) return m2 == null;
         if (m2 == null) return false;
@@ -1459,6 +1496,14 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl
                return parameterizedSuperTypes.length > 0;
        }
        
+       public boolean hasGenericSuperType() {
+               ResolvedType[] superTypes = getDeclaredInterfaces();
+               for (int i = 0; i < superTypes.length; i++) {
+                       if (superTypes[i].isGenericType()) return true;
+               }
+               return false;
+       }
+       
        private ResolvedType[] parameterizedSuperTypes = null;
        /**
         * Similar to the above method, but accumulates the super types
index cb1de23a41c25015e7195ca50f1cbdb3c4c5a0ae..c3bfaa34a3f62aa1f37551812f087dbf50274c5a 100644 (file)
@@ -127,7 +127,7 @@ public abstract class ResolvedTypeMunger {
                Set ret = new HashSet();
                int n = s.readInt();
                for (int i=0; i < n; i++) {
-                       ret.add(ResolvedMember.readResolvedMember(s, null));
+                       ret.add(ResolvedMemberImpl.readResolvedMember(s, null));
                }
                return ret;
        }
index 00d40632d478b4bafe727bda5ec2ca2b414fd66d..a186a36912047b7fc514be90e81262621cb9248f 100644 (file)
@@ -138,6 +138,7 @@ public class WeaverMessages {
        public static final String GET_AND_SET_DONT_SUPPORT_DEC_TYPE_PARAMETERS="noParameterizedTypesInGetAndSet";
        public static final String NO_INIT_JPS_FOR_PARAMETERIZED_TYPES = "noInitJPsForParameterizedTypes";
        public static final String NO_GENERIC_THROWABLES = "noGenericThrowables";
+       public static final String WITHINCODE_DOESNT_SUPPORT_PARAMETERIZED_DECLARING_TYPES="noParameterizedDeclaringTypesWithinCode";
        
        public static String format(String key) {
                return bundle.getString(key);
index df4a06cea0ad9ce4bafeace846cbab11b3ffe82e..a94b73a5d38c93903ba816d1f6fd468d5df28148 100644 (file)
@@ -151,7 +151,7 @@ public class BcelAccessForInlineMunger extends BcelTypeMunger {
                 ResolvedType callee = m_aspectGen.getWorld().resolve(UnresolvedType.forName(invoke.getClassName(cpg)));
 
                 // look in the whole method list and not just declared for super calls and alike
-                List methods = callee.getMethodsWithoutIterator();
+                List methods = callee.getMethodsWithoutIterator(false);
                 for (Iterator iter = methods.iterator(); iter.hasNext();) {
                     ResolvedMember resolvedMember = (ResolvedMember) iter.next();
                     if (invoke.getName(cpg).equals(resolvedMember.getName())
index 53f8e38be848035f1940c356230e3b1ff5029845..c10b2f16d0efce77dcabaceefb72ec7aa23fad3c 100644 (file)
@@ -1435,7 +1435,7 @@ class BcelClassWeaver implements IClassWeaver {
                                InstructionHandle prevHandle = ih.getPrev();
                                Instruction prevI = prevHandle.getInstruction();
                                if (Utility.isConstantPushInstruction(prevI)) {
-                                       Member field = BcelWorld.makeFieldSignature(clazz, (FieldInstruction) i);
+                                       Member field = BcelWorld.makeFieldJoinPointSignature(clazz, (FieldInstruction) i);
                                        ResolvedMember resolvedField = field.resolve(world);
                                        if (resolvedField == null) {
                                                // we can't find the field, so it's not a join point.
@@ -1519,7 +1519,7 @@ class BcelClassWeaver implements IClassWeaver {
                BcelShadow enclosingShadow,
                List shadowAccumulator) {
                FieldInstruction fi = (FieldInstruction) ih.getInstruction();
-               Member field = BcelWorld.makeFieldSignature(clazz, fi);
+               Member field = BcelWorld.makeFieldJoinPointSignature(clazz, fi);
                
                // synthetic fields are never join points
                if (field.getName().startsWith(NameMangler.PREFIX)) return;
@@ -1546,7 +1546,7 @@ class BcelClassWeaver implements IClassWeaver {
 
        private void matchGetInstruction(LazyMethodGen mg, InstructionHandle ih, BcelShadow enclosingShadow, List shadowAccumulator) {
                FieldInstruction fi = (FieldInstruction) ih.getInstruction();
-               Member field = BcelWorld.makeFieldSignature(clazz, fi);
+               Member field = BcelWorld.makeFieldJoinPointSignature(clazz, fi);
                
                // synthetic fields are never join points
                if (field.getName().startsWith(NameMangler.PREFIX)) return;
@@ -1621,15 +1621,15 @@ class BcelClassWeaver implements IClassWeaver {
        {
                String methodName = invoke.getName(cpg);
                if (methodName.startsWith(NameMangler.PREFIX)) {
-                       Member method =
-                               world.makeMethodSignature(clazz, invoke);
-                       ResolvedMember declaredSig = method.resolve(world);
+                       Member jpSig =
+                               world.makeJoinPointSignatureForMethodInvocation(clazz, invoke);
+                       ResolvedMember declaredSig = jpSig.resolve(world);
                        //System.err.println(method + ", declaredSig: "  +declaredSig);
                        if (declaredSig == null) return;
                        
                        if (declaredSig.getKind() == Member.FIELD) {
                                Shadow.Kind kind;
-                               if (method.getReturnType().equals(ResolvedType.VOID)) {
+                               if (jpSig.getReturnType().equals(ResolvedType.VOID)) {
                                        kind = Shadow.FieldSet;
                                } else {
                                        kind = Shadow.FieldGet;
index eff031abc4d1e9a04c456d5f446cfc649c59da21..f8b9451d8c2b4f14cae41d91d8f8b6f6cd2faa3b 100644 (file)
@@ -13,6 +13,7 @@
 
 package org.aspectj.weaver.bcel;
 
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 
@@ -25,17 +26,16 @@ import org.aspectj.apache.bcel.classfile.annotation.Annotation;
 import org.aspectj.weaver.AjAttribute;
 import org.aspectj.weaver.AnnotationX;
 import org.aspectj.weaver.BCException;
-import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.World;
 
-final class BcelField extends ResolvedMember {
+final class BcelField extends ResolvedMemberImpl {
 
        private Field field;
        private boolean isAjSynthetic;
        private boolean isSynthetic = false;
-       private ResolvedType[] annotationTypes;
        private AnnotationX[] annotations;
        private World world;
        private BcelObjectType bcelObjectType;
@@ -90,28 +90,30 @@ final class BcelField extends ResolvedMember {
        }
        
        public boolean hasAnnotation(UnresolvedType ofType) {
-               Annotation[] anns = field.getAnnotations();
-               for (int i = 0; i < anns.length; i++) {
-                       Annotation annotation = anns[i];
-                       if (annotation.getTypeName().equals(ofType.getName())) return true;
+               ensureAnnotationTypesRetrieved();
+               for (Iterator iter = annotationTypes.iterator(); iter.hasNext();) {
+                       ResolvedType aType = (ResolvedType) iter.next();
+                       if (aType.equals(ofType)) return true;          
                }
                return false;
        }
        
        public ResolvedType[] getAnnotationTypes() {
                ensureAnnotationTypesRetrieved();
-               return annotationTypes;
+           ResolvedType[] ret = new ResolvedType[annotationTypes.size()];
+           annotationTypes.toArray(ret);
+           return ret;
     }
     
        private void ensureAnnotationTypesRetrieved() {
                if (annotationTypes == null) {
                Annotation annos[] = field.getAnnotations();
-               annotationTypes = new ResolvedType[annos.length];
+               annotationTypes = new HashSet();
                annotations = new AnnotationX[annos.length];
                for (int i = 0; i < annos.length; i++) {
                                Annotation annotation = annos[i];
                                ResolvedType rtx = world.resolve(UnresolvedType.forName(annotation.getTypeName()));
-                               annotationTypes[i] = rtx;
+                               annotationTypes.add(rtx);
                                annotations[i] = new AnnotationX(annotation,world);
                        }
        }
@@ -127,11 +129,7 @@ final class BcelField extends ResolvedMember {
                annotations = ret;
                
                // Add it to the set of annotation types
-               len = annotationTypes.length;
-               ResolvedType[] ret2 = new ResolvedType[len+1];
-               System.arraycopy(annotationTypes,0,ret2,0,len);
-               ret2[len] =world.resolve(UnresolvedType.forName(annotation.getTypeName()));
-               annotationTypes = ret2;
+               annotationTypes.add(UnresolvedType.forName(annotation.getTypeName()).resolve(world));
                // FIXME asc this call here suggests we are managing the annotations at
                // too many levels, here in BcelField we keep a set and in the lower 'field'
                // object we keep a set - we should think about reducing this to one
index 140de2ea04205468e860fdcc6c6653754d052eb8..e38b6fae8e1b0e2367f9174a262af31aaeecf65a 100644 (file)
@@ -14,6 +14,7 @@
 package org.aspectj.weaver.bcel;
 
 import java.lang.reflect.Modifier;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 
@@ -31,21 +32,21 @@ import org.aspectj.weaver.AjAttribute;
 import org.aspectj.weaver.AnnotationX;
 import org.aspectj.weaver.BCException;
 import org.aspectj.weaver.ISourceContext;
-import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedPointcutDefinition;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.ShadowMunger;
 import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.World;
 
-final class BcelMethod extends ResolvedMember {
+final class BcelMethod extends ResolvedMemberImpl {
 
        private Method method;
        private boolean isAjSynthetic;
        private ShadowMunger associatedShadowMunger;
        private ResolvedPointcutDefinition preResolvedPointcut;  // used when ajc has pre-resolved the pointcut of some @Advice
        
-    private ResolvedType[] annotationTypes = null;
+//    private ResolvedType[] annotationTypes = null;
     private AnnotationX[] annotations = null;
        
        private AjAttribute.EffectiveSignatureAttribute effectiveSignature;
@@ -185,9 +186,9 @@ final class BcelMethod extends ResolvedMember {
        
        public boolean hasAnnotation(UnresolvedType ofType) {
                ensureAnnotationTypesRetrieved();
-               for (int i=0; i<annotationTypes.length; i++) {
-                       ResolvedType aType = annotationTypes[i];
-                       if (aType.equals(ofType)) return true;
+               for (Iterator iter = annotationTypes.iterator(); iter.hasNext();) {
+                       ResolvedType aType = (ResolvedType) iter.next();
+                       if (aType.equals(ofType)) return true;          
                }
                return false;
        }
@@ -199,7 +200,9 @@ final class BcelMethod extends ResolvedMember {
        
         public ResolvedType[] getAnnotationTypes() {
            ensureAnnotationTypesRetrieved();
-           return annotationTypes;
+           ResolvedType[] ret = new ResolvedType[annotationTypes.size()];
+           annotationTypes.toArray(ret);
+           return ret;
      }
         
         public void addAnnotation(AnnotationX annotation) {
@@ -212,11 +215,7 @@ final class BcelMethod extends ResolvedMember {
                annotations = ret;
                
                // Add it to the set of annotation types
-               len = annotationTypes.length;
-               ResolvedType[] ret2 = new ResolvedType[len+1];
-               System.arraycopy(annotationTypes,0,ret2,0,len);
-               ret2[len] =world.resolve(UnresolvedType.forName(annotation.getTypeName()));
-               annotationTypes = ret2;
+               annotationTypes.add(UnresolvedType.forName(annotation.getTypeName()).resolve(world));
                // FIXME asc looks like we are managing two 'bunches' of annotations, one
                // here and one in the real 'method' - should we reduce it to one layer?
                method.addAnnotation(annotation.getBcelAnnotation());
@@ -225,12 +224,12 @@ final class BcelMethod extends ResolvedMember {
         private void ensureAnnotationTypesRetrieved() {
                if (annotationTypes == null || method.getAnnotations().length!=annotations.length) { // sometimes the list changes underneath us!
                Annotation annos[] = method.getAnnotations();
-               annotationTypes = new ResolvedType[annos.length];
+               annotationTypes = new HashSet();
                annotations = new AnnotationX[annos.length];
                for (int i = 0; i < annos.length; i++) {
                                Annotation annotation = annos[i];
                                ResolvedType rtx = world.resolve(UnresolvedType.forName(annotation.getTypeName()));
-                               annotationTypes[i] = rtx;
+                               annotationTypes.add(rtx);
                                annotations[i] = new AnnotationX(annotation,world);
                        }
        }
index 3ca3ac296957e9707fbb459d2c715442862b1cc5..25586fbdd8e187bf233d6985b8a5fb03a439cb48 100644 (file)
@@ -22,6 +22,7 @@ import org.aspectj.apache.bcel.generic.ReferenceType;
 import org.aspectj.apache.bcel.generic.Type;
 import org.aspectj.weaver.BCException;
 import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.ast.And;
 import org.aspectj.weaver.ast.Call;
@@ -186,14 +187,14 @@ public class BcelRenderer implements ITestVisitor, IExprVisitor {
         // ldc_w annotationClass
         // invokevirtual java/lang/Class.isAnnotationPresent:(Ljava/lang/Class;)Z
         InstructionList il = new InstructionList();
-        Member getClass = Member.method(UnresolvedType.OBJECT, 0, "getClass", "()Ljava/lang/Class;");
+        Member getClass = MemberImpl.method(UnresolvedType.OBJECT, 0, "getClass", "()Ljava/lang/Class;");
         il.append(Utility.createInvoke(fact, world, getClass));
         // aload annotationClass
         String s = hasAnnotation.getAnnotationType().getName();
         il.append(fact.createConstant(new ObjectType(hasAnnotation.getAnnotationType().getName())));
 //        int annClassIndex = fact.getConstantPool().addClass(hasAnnotation.getAnnotationType().getSignature());
 //        il.append(new LDC_W(annClassIndex));
-        Member isAnnotationPresent = Member.method(UnresolvedType.forName("java/lang/Class"),0,
+        Member isAnnotationPresent = MemberImpl.method(UnresolvedType.forName("java/lang/Class"),0,
                 "isAnnotationPresent","(Ljava/lang/Class;)Z");
         il.append(Utility.createInvoke(fact,world,isAnnotationPresent));
         il.append(createJumpBasedOnBooleanOnStack());
index 825cc3fbb0775bfe6ade36d84001674cf1fc9a53..afafc943ab1120da599570fc3e771c6c99bf99df 100644 (file)
@@ -61,11 +61,13 @@ import org.aspectj.weaver.AjcMemberMaker;
 import org.aspectj.weaver.BCException;
 import org.aspectj.weaver.IntMap;
 import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.NameMangler;
 import org.aspectj.weaver.NewConstructorTypeMunger;
 import org.aspectj.weaver.NewFieldTypeMunger;
 import org.aspectj.weaver.NewMethodTypeMunger;
 import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.ShadowMunger;
@@ -400,7 +402,7 @@ public class BcelShadow extends Shadow {
                        new BcelShadow(
                                world,
                                ConstructorExecution,
-                               world.makeMethodSignature(enclosingMethod),
+                               world.makeJoinPointSignature(enclosingMethod),
                                enclosingMethod,
                                null);
                ShadowRange r = new ShadowRange(body);
@@ -443,7 +445,7 @@ public class BcelShadow extends Shadow {
             new BcelShadow(
                 world,
                 StaticInitialization,
-                world.makeMethodSignature(enclosingMethod),
+                world.makeJoinPointSignature(enclosingMethod),
                 enclosingMethod,
                 null);
         ShadowRange r = new ShadowRange(body);
@@ -470,10 +472,9 @@ public class BcelShadow extends Shadow {
                UnresolvedType catchType = exceptionRange.getCatchType();
                UnresolvedType inType = enclosingMethod.getEnclosingClass().getType();
                
-               ResolvedMember sig = Member.makeExceptionHandlerSignature(inType, catchType);
-               
-                       
+               ResolvedMemberImpl sig = MemberImpl.makeExceptionHandlerSignature(inType, catchType);                                   
                sig.parameterNames = new String[] {findHandlerParamName(startOfHandler)};
+               
         BcelShadow s =
             new BcelShadow(
                 world,
@@ -594,7 +595,7 @@ public class BcelShadow extends Shadow {
                return new BcelShadow(
                        world,
                        Initialization,
-                       world.makeMethodSignature(constructor),
+                       world.makeJoinPointSignature(constructor),
                        constructor,
                        null);
        }
@@ -606,7 +607,7 @@ public class BcelShadow extends Shadow {
                BcelShadow ret =  new BcelShadow(
                        world,
                        PreInitialization,
-                       world.makeMethodSignature(constructor),
+                       world.makeJoinPointSignature(constructor),
                        constructor,
                        null);
                ret.fallsThrough = true;
@@ -683,7 +684,7 @@ public class BcelShadow extends Shadow {
                        new BcelShadow(
                                world,
                                AdviceExecution,
-                               world.makeMethodSignature(enclosingMethod, Member.ADVICE),
+                               world.makeJoinPointSignatureFromMethod(enclosingMethod, Member.ADVICE),
                                enclosingMethod,
                                null);
                ShadowRange r = new ShadowRange(body);
@@ -705,7 +706,7 @@ public class BcelShadow extends Shadow {
     {
         final InstructionList body = enclosingMethod.getBody();
         
-        Member sig = world.makeMethodSignature(
+        Member sig = world.makeJoinPointSignatureForMethodInvocation(
                        enclosingMethod.getEnclosingClass(),
                        (InvokeInstruction) callHandle.getInstruction());
                     
@@ -736,7 +737,7 @@ public class BcelShadow extends Shadow {
             new BcelShadow(
                 world,
                 MethodCall,
-                world.makeMethodSignature(
+                world.makeJoinPointSignatureForMethodInvocation(
                     enclosingMethod.getEnclosingClass(),
                     (InvokeInstruction) callHandle.getInstruction()),
                 enclosingMethod,
@@ -815,7 +816,7 @@ public class BcelShadow extends Shadow {
             new BcelShadow(
                 world,
                 FieldSet,
-                BcelWorld.makeFieldSignature(
+                BcelWorld.makeFieldJoinPointSignature(
                     enclosingMethod.getEnclosingClass(),
                     (FieldInstruction) setHandle.getInstruction()),
                 enclosingMethod,
@@ -2474,7 +2475,7 @@ public class BcelShadow extends Shadow {
                        getEnclosingClass().getType(),
                        getEnclosingClass().getNewGeneratedNameTag());
                        
-       Member constructorSig = new Member(Member.CONSTRUCTOR, 
+       Member constructorSig = new MemberImpl(Member.CONSTRUCTOR, 
                                                                UnresolvedType.forName(closureClassName), 0, "<init>", 
                                                                "([Ljava/lang/Object;)V");
        
@@ -2546,7 +2547,7 @@ public class BcelShadow extends Shadow {
             closureInstantiation.append(Utility.createInvoke(
                     getFactory(),
                     getWorld(),
-                    new Member(
+                    new MemberImpl(
                             Member.METHOD,
                             UnresolvedType.forName("org.aspectj.runtime.internal.AroundClosure"),
                             Modifier.PUBLIC,
index 790cefee0c52bdf8a48aa6f403862edb7df6eff1..8ea410091dd8c5b1965829515f1c5c513f3d7daa 100644 (file)
@@ -47,9 +47,9 @@ import org.aspectj.weaver.NewFieldTypeMunger;
 import org.aspectj.weaver.NewMethodTypeMunger;
 import org.aspectj.weaver.NewParentTypeMunger;
 import org.aspectj.weaver.PerObjectInterfaceTypeMunger;
+import org.aspectj.weaver.ResolvedMember;
 //import org.aspectj.weaver.PerTypeWithinTargetTypeMunger;
 import org.aspectj.weaver.PrivilegedAccessMunger;
-import org.aspectj.weaver.ResolvedMember;
 import org.aspectj.weaver.ResolvedTypeMunger;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.UnresolvedType;
@@ -178,7 +178,7 @@ public class BcelTypeMunger extends ConcreteTypeMunger {
         cont = enforceDecpRule1_abstractMethodsImplemented(weaver, munger.getSourceLocation(),newParentTarget, newParent);
         cont = enforceDecpRule2_cantExtendFinalClass(weaver,munger.getSourceLocation(),newParentTarget,newParent) && cont;
                 
-        List methods = newParent.getMethodsWithoutIterator();
+        List methods = newParent.getMethodsWithoutIterator(false);
         for (Iterator iter = methods.iterator(); iter.hasNext();) {
                  ResolvedMember    superMethod = (ResolvedMember) iter.next();
           if (!superMethod.getName().equals("<init>")) {
@@ -209,12 +209,12 @@ public class BcelTypeMunger extends ConcreteTypeMunger {
     private boolean enforceDecpRule1_abstractMethodsImplemented(BcelClassWeaver weaver, ISourceLocation mungerLoc,LazyClassGen newParentTarget, ResolvedType newParent) {
         boolean ruleCheckingSucceeded = true;
         if (!(newParentTarget.isAbstract() || newParentTarget.isInterface())) { // Ignore abstract classes or interfaces
-            List methods = newParent.getMethodsWithoutIterator();
+            List methods = newParent.getMethodsWithoutIterator(false);
             for (Iterator i = methods.iterator(); i.hasNext();) {
                 ResolvedMember o = (ResolvedMember)i.next();
                 if (o.isAbstract() && !o.getName().startsWith("ajc$interField")) { // Ignore abstract methods of ajc$interField prefixed methods
                     ResolvedMember discoveredImpl = null;
-                    List newParentTargetMethods = newParentTarget.getType().getMethodsWithoutIterator();
+                    List newParentTargetMethods = newParentTarget.getType().getMethodsWithoutIterator(false);
                     for (Iterator ii = newParentTargetMethods.iterator(); ii.hasNext() && discoveredImpl==null;) {
                         ResolvedMember gen2 = (ResolvedMember) ii.next();
                         if (gen2.getName().equals(o.getName()) && 
index 3cb228677bcb663b79879aa3441acb04ad0cc47d..cc6454f207753b1a66df46477e411454fc6e8bd6 100644 (file)
@@ -44,9 +44,11 @@ import org.aspectj.weaver.AjAttribute;
 import org.aspectj.weaver.ConcreteTypeMunger;
 import org.aspectj.weaver.ICrossReferenceHandler;
 import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.ReferenceType;
 import org.aspectj.weaver.ReferenceTypeDelegate;
 import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedTypeMunger;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.UnresolvedType;
@@ -158,7 +160,7 @@ public class BcelWorld extends World implements Repository {
         start = ++i;        
         i = str.indexOf("->", i);
         Pointcut pointcut = Pointcut.fromString(str.substring(start, i).trim());
-        Member m = Member.methodFromString(str.substring(i+2, str.length()).trim());
+        Member m = MemberImpl.methodFromString(str.substring(i+2, str.length()).trim());
 
         // now, we resolve
         UnresolvedType[] types = m.getParameterTypes();
@@ -298,37 +300,36 @@ public class BcelWorld extends World implements Repository {
                typeMap.remove(ty.getSignature());
        }
 
-    public static Member makeFieldSignature(LazyClassGen cg, FieldInstruction fi) {
+    public static Member makeFieldJoinPointSignature(LazyClassGen cg, FieldInstruction fi) {
        ConstantPoolGen cpg = cg.getConstantPoolGen();
-        return 
-            Member.field(
-                fi.getClassName(cpg),
-                (fi instanceof GETSTATIC || fi instanceof PUTSTATIC)
-                ? Modifier.STATIC
-                : 0, 
-                fi.getName(cpg),
-                fi.getSignature(cpg));
+        return            
+                 MemberImpl.field(
+                               fi.getClassName(cpg),
+                               (fi instanceof GETSTATIC || fi instanceof PUTSTATIC)
+                               ? Modifier.STATIC: 0, 
+                               fi.getName(cpg),
+                               fi.getSignature(cpg));
     }
        
-    public static Member makeFieldSetSignature(LazyClassGen cg, FieldInstruction fi) {
-       ConstantPoolGen cpg = cg.getConstantPoolGen();
-        return 
-            Member.field(
-                fi.getClassName(cpg),
-                (fi instanceof GETSTATIC || fi instanceof PUTSTATIC)
-                ? Modifier.STATIC
-                : 0, 
-                fi.getName(cpg),
-                "(" + fi.getSignature(cpg) + ")" +fi.getSignature(cpg));
-    }
-
-       public Member makeMethodSignature(LazyMethodGen mg) {
-               return makeMethodSignature(mg, null);
+//    public static Member makeFieldSetSignature(LazyClassGen cg, FieldInstruction fi) {
+//     ConstantPoolGen cpg = cg.getConstantPoolGen();
+//        return 
+//            MemberImpl.field(
+//                fi.getClassName(cpg),
+//                (fi instanceof GETSTATIC || fi instanceof PUTSTATIC)
+//                ? Modifier.STATIC
+//                : 0, 
+//                fi.getName(cpg),
+//                "(" + fi.getSignature(cpg) + ")" +fi.getSignature(cpg));
+//    }
+
+       public Member makeJoinPointSignature(LazyMethodGen mg) {
+               return makeJoinPointSignatureFromMethod(mg, null);
        }
 
        
-       public Member makeMethodSignature(LazyMethodGen mg, Member.Kind kind) {
-               ResolvedMember ret = mg.getMemberView();
+       public Member makeJoinPointSignatureFromMethod(LazyMethodGen mg, MemberImpl.Kind kind) {
+               Member ret = mg.getMemberView();
                if (ret == null) {
                int mods = mg.getAccessFlags();
                if (mg.getEnclosingClass().isInterface()) {
@@ -343,7 +344,7 @@ public class BcelWorld extends World implements Repository {
                                kind = Member.METHOD;
                        }
                }
-               return new ResolvedMember(kind,
+               return new ResolvedMemberImpl(kind,
                        UnresolvedType.forName(mg.getClassName()), 
                        mods,
                        fromBcel(mg.getReturnType()),
@@ -356,7 +357,7 @@ public class BcelWorld extends World implements Repository {
         
     }
 
-    public Member makeMethodSignature(LazyClassGen cg, InvokeInstruction ii) {
+    public Member makeJoinPointSignatureForMethodInvocation(LazyClassGen cg, InvokeInstruction ii) {
        ConstantPoolGen cpg = cg.getConstantPoolGen();
         String declaring = ii.getClassName(cpg);
         String name = ii.getName(cpg);
@@ -391,7 +392,7 @@ public class BcelWorld extends World implements Repository {
         }
         //FIXME if not found we ll end up again with the bug.. can this happen?
 
-        return Member.method(UnresolvedType.forName(declaring), modifier, name, signature);
+        return MemberImpl.method(UnresolvedType.forName(declaring), modifier, name, signature);
     }  
 
     public static Member makeMungerMethodSignature(JavaClass javaClass, Method method) {
@@ -399,7 +400,7 @@ public class BcelWorld extends World implements Repository {
         if (method.isStatic()) mods = Modifier.STATIC;
         else if (javaClass.isInterface()) mods = Modifier.INTERFACE;
         else if (method.isPrivate()) mods = Modifier.PRIVATE;
-        return Member.method(
+        return MemberImpl.method(
             UnresolvedType.forName(javaClass.getClassName()), mods, method.getName(), method.getSignature()); 
     }
     
index 2bf207c97e84a6dc7543bf3e89e9bd76eb680801..7c63a0575540dd4526e10377b8e0c772882f0316 100644 (file)
@@ -67,6 +67,7 @@ import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.WeaverMessages;
 import org.aspectj.weaver.WeaverStateInfo;
 import org.aspectj.weaver.World;
+import org.aspectj.weaver.AjAttribute.WeaverVersionInfo;
 
 /**
  * Lazy lazy lazy.
@@ -706,7 +707,7 @@ public final class LazyClassGen {
             LazyMethodGen gen = (LazyMethodGen) iter.next();
             // we skip empty clinits
             if (isEmptyClinit(gen)) continue;
-            gen.print(out);
+            gen.print(out, (myType != null ? myType.getWeaverVersionAttribute() : WeaverVersionInfo.UNKNOWN));
             if (iter.hasNext()) out.println();
         }
 //        out.println("  ATTRIBS: " + Arrays.asList(myGen.getAttributes()));
index 47af560ce8779fc16ee7e5bf26ed4b76033318d0..2c647f0d396ca9bedfc273506a7fb83041544011 100644 (file)
@@ -57,10 +57,11 @@ import org.aspectj.weaver.AjAttribute;
 import org.aspectj.weaver.AnnotationX;
 import org.aspectj.weaver.BCException;
 import org.aspectj.weaver.ISourceContext;
-import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.WeaverMessages;
+import org.aspectj.weaver.AjAttribute.WeaverVersionInfo;
 
 
 /** 
@@ -419,7 +420,8 @@ public final class LazyMethodGen {
     // =============================
 
        public String toString() {
-               return toLongString();
+               WeaverVersionInfo weaverVersion = enclosingClass.getBcelObjectType().getWeaverVersionAttribute();
+               return toLongString(weaverVersion);
        }
 
     public String toShortString() {
@@ -470,19 +472,19 @@ public final class LazyMethodGen {
         return buf.toString();
     }
 
-    public String toLongString() {
+    public String toLongString(WeaverVersionInfo weaverVersion) {
         ByteArrayOutputStream s = new ByteArrayOutputStream();
-        print(new PrintStream(s));
+        print(new PrintStream(s),weaverVersion);
         return new String(s.toByteArray());
     }
 
-    public void print() {
-        print(System.out);
+    public void print(WeaverVersionInfo weaverVersion) {
+        print(System.out,weaverVersion);
     }
 
-    public void print(PrintStream out) {
+    public void print(PrintStream out, WeaverVersionInfo weaverVersion) {
         out.print("  " + toShortString());
-        printAspectAttributes(out);
+        printAspectAttributes(out,weaverVersion);
         
         InstructionList body = getBody();
         if (body == null) {
@@ -495,12 +497,12 @@ public final class LazyMethodGen {
     }
 
 
-       private void printAspectAttributes(PrintStream out) {
+       private void printAspectAttributes(PrintStream out, WeaverVersionInfo weaverVersion) {
                ISourceContext context = null;
                if (enclosingClass != null && enclosingClass.getType() != null) {
                        context = enclosingClass.getType().getSourceContext();
                }
-               List as = BcelAttributes.readAjAttributes(getClassName(),attributes, context,null,AjAttribute.WeaverVersionInfo.UNKNOWN);
+               List as = BcelAttributes.readAjAttributes(getClassName(),attributes, context,null,weaverVersion);
                if (! as.isEmpty()) {
                        out.println("    " + as.get(0)); // XXX assuming exactly one attribute, munger...
                }
@@ -1359,13 +1361,13 @@ public final class LazyMethodGen {
     
        public String getSignature() {
                if (memberView!=null) return memberView.getSignature();
-               return Member.typesToSignature(BcelWorld.fromBcel(getReturnType()), 
+               return MemberImpl.typesToSignature(BcelWorld.fromBcel(getReturnType()), 
                                                                                BcelWorld.fromBcel(getArgumentTypes()),false);
        }
     
     public String getParameterSignature() {
         if (memberView!=null) return memberView.getParameterSignature();
-        return Member.typesToSignature(BcelWorld.fromBcel(getArgumentTypes()));
+        return MemberImpl.typesToSignature(BcelWorld.fromBcel(getArgumentTypes()));
     }
 
        public BcelMethod getMemberView() {
index 3f269e11a5c20b9d358dfc400cc80ed1957f8323..c1edb4b68faab557c5bb4f40c684000611fee43f 100644 (file)
@@ -31,6 +31,7 @@ import org.aspectj.weaver.ISourceContext;
 import org.aspectj.weaver.IntMap;
 import org.aspectj.weaver.Member;
 import org.aspectj.weaver.NameMangler;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedMember;
 import org.aspectj.weaver.ResolvedPointcutDefinition;
 import org.aspectj.weaver.ResolvedType;
@@ -236,7 +237,7 @@ public class CflowPointcut extends Pointcut {
                  } else {
                        
                        // Create a counter field in the aspect
-                       localCflowField = new ResolvedMember(Member.FIELD,concreteAspect,Modifier.STATIC | Modifier.PUBLIC | Modifier.FINAL,
+                       localCflowField = new ResolvedMemberImpl(Member.FIELD,concreteAspect,Modifier.STATIC | Modifier.PUBLIC | Modifier.FINAL,
                                NameMangler.cflowCounter(xcut),UnresolvedType.forName(NameMangler.CFLOW_COUNTER_TYPE).getSignature());
                  
                    // Create type munger to add field to the aspect
@@ -275,7 +276,7 @@ public class CflowPointcut extends Pointcut {
                                localCflowField = (ResolvedMember)field;
                        } else {
                      
-                         localCflowField = new ResolvedMember(
+                         localCflowField = new ResolvedMemberImpl(
                                Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC | Modifier.FINAL,
                                                NameMangler.cflowStack(xcut), 
                                                UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE).getSignature());
index f74061285c9ac27dee9a083d4f7d0d471db9c7f1..88a6c5860240050ff1fff091716c407c74544532 100644 (file)
@@ -22,6 +22,7 @@ import java.util.Set;
 import org.aspectj.util.FuzzyBoolean;
 import org.aspectj.weaver.IntMap;
 import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.NameMangler;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
@@ -134,10 +135,10 @@ public class ConcreteCflowPointcut extends Pointcut {
        }
        
        private static final Member cflowStackIsValidMethod = 
-               Member.method(UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE), 0, "isValid", "()Z");
+               MemberImpl.method(UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE), 0, "isValid", "()Z");
 
        private static final Member cflowCounterIsValidMethod = 
-               Member.method(UnresolvedType.forName(NameMangler.CFLOW_COUNTER_TYPE), 0, "isValid", "()Z");
+               MemberImpl.method(UnresolvedType.forName(NameMangler.CFLOW_COUNTER_TYPE), 0, "isValid", "()Z");
 
        
        public Pointcut concretize1(ResolvedType inAspect, IntMap bindings) {
index 3fcf629a0ebe64e3e63c4052b40fe64f5bc2f99a..c0e5abbdf66cccaa16391746f9e2b0dc2fc17edc 100644 (file)
@@ -27,6 +27,7 @@ import org.aspectj.weaver.Advice;
 import org.aspectj.weaver.ISourceContext;
 import org.aspectj.weaver.IntMap;
 import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedPointcutDefinition;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
@@ -126,7 +127,7 @@ public class IfPointcut extends Pointcut {
        }
        public static Pointcut read(VersionedDataInputStream s, ISourceContext context) throws IOException {
         //FIXME Adrian, read may failt if testMethod happens to be null for @style if() from JDT stuff
-               IfPointcut ret = new IfPointcut(ResolvedMember.readResolvedMember(s, context), s.readByte());
+               IfPointcut ret = new IfPointcut(ResolvedMemberImpl.readResolvedMember(s, context), s.readByte());
                ret.readLocation(context, s);
                return ret;
        }
index 06ebc42147e8377c594ac88786af5af7b67d1970..0c723baed87bc4ded6a24308f306bec45ac81fd7 100644 (file)
@@ -28,7 +28,7 @@ import org.aspectj.weaver.CrosscuttingMembers;
 import org.aspectj.weaver.ISourceContext;
 import org.aspectj.weaver.Member;
 import org.aspectj.weaver.NameMangler;
-import org.aspectj.weaver.ResolvedMember;
+import org.aspectj.weaver.ResolvedMemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.UnresolvedType;
@@ -88,7 +88,7 @@ public class PerCflow extends PerClause {
                ret.inAspect = inAspect;
                if (inAspect.isAbstract()) return ret;
                
-               Member cflowStackField = new ResolvedMember(
+               Member cflowStackField = new ResolvedMemberImpl(
                        Member.FIELD, inAspect, Modifier.STATIC|Modifier.PUBLIC|Modifier.FINAL,
                                                UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE), NameMangler.PERCFLOW_FIELD_NAME, UnresolvedType.NONE);
                                                
index aa13f67269022d692c2f07c4bacae9cd938ddd52..b1aad6e3bce40581cbfcbf4b708618163add72f5 100644 (file)
@@ -33,6 +33,7 @@ import org.aspectj.weaver.AjAttribute;
 import org.aspectj.weaver.AjcMemberMaker;
 import org.aspectj.weaver.Constants;
 import org.aspectj.weaver.ISourceContext;
+import org.aspectj.weaver.JoinPointSignature;
 import org.aspectj.weaver.Member;
 import org.aspectj.weaver.NameMangler;
 import org.aspectj.weaver.NewFieldTypeMunger;
@@ -120,14 +121,159 @@ public class SignaturePattern extends PatternNode {
                }
        }
        
-       public boolean matches(Member member, World world) {
-               return (matchesIgnoringAnnotations(member,world) &&
-                               matchesAnnotations(member,world));
+       public boolean matches(Member joinPointSignature, World world) {
+               // fail (or succeed!) fast tests...
+               if (joinPointSignature == null) return false;
+               if (kind != joinPointSignature.getKind()) return false;
+               if (kind == Member.ADVICE) return true;
+               
+               // do the hard work then...
+               JoinPointSignature[] candidateMatches = joinPointSignature.getJoinPointSignatures(world);
+               for (int i = 0; i < candidateMatches.length; i++) {
+                       if (matchesExactly(candidateMatches[i],world)) return true;
+               }
+               return false;
+       }
+       
+       // Does this pattern match this exact signature (no declaring type mucking about
+       // or chasing up the hierarchy)
+       private boolean matchesExactly(JoinPointSignature aMember, World inAWorld) {
+               // Java5 introduces bridge methods, we don't want to match on them at all...
+               if (aMember.isBridgeMethod()) {
+                       return false;
+               }
+                       
+               if (!modifiers.matches(aMember.getModifiers())) return false;
+               
+               boolean matchesIgnoringAnnotations = true;
+               if (kind == Member.STATIC_INITIALIZATION) {
+                       matchesIgnoringAnnotations = matchesExactlyStaticInitialization(aMember, inAWorld);
+               } else if (kind == Member.FIELD) {
+                       matchesIgnoringAnnotations = matchesExactlyField(aMember,inAWorld);
+               } else if (kind == Member.METHOD) {
+                       matchesIgnoringAnnotations = matchesExactlyMethod(aMember,inAWorld);
+               } else if (kind == Member.CONSTRUCTOR) {
+                       matchesIgnoringAnnotations = matchesExactlyConstructor(aMember, inAWorld);
+               }
+               if (!matchesIgnoringAnnotations) return false;
+               
+               return matchesAnnotations(aMember, inAWorld);
+       }
+       
+       /**
+        * Matches on declaring type
+        */
+       private boolean matchesExactlyStaticInitialization(JoinPointSignature aMember,World world) {
+               return declaringType.matchesStatically(aMember.getDeclaringType().resolve(world));
+       }
+       
+       /**
+        * Matches on name, declaring type, field type
+        */
+       private boolean matchesExactlyField(JoinPointSignature aField, World world) {
+               if (!name.matches(aField.getName())) return false;
+               if (!declaringType.matchesStatically(aField.getDeclaringType().resolve(world))) return false;
+               if (!returnType.matchesStatically(aField.getReturnType().resolve(world))) {
+                       // looking bad, but there might be parameterization to consider...
+                       if (!returnType.matchesStatically(aField.getGenericReturnType().resolve(world))) {
+                               // ok, it's bad.
+                               return false;
+                       }
+               }
+               // passed all the guards...
+               return true;
        }
        
-       public boolean matchesAnnotations(Member member,World world) {
-         ResolvedMember rMember = member.resolve(world);
-         if (rMember == null) {
+       /**
+        * Matches on name, declaring type, return type, parameter types, throws types
+        */
+       private boolean matchesExactlyMethod(JoinPointSignature aMethod, World world) {
+               if (!name.matches(aMethod.getName())) return false;
+               if (!declaringType.matchesStatically(aMethod.getDeclaringType().resolve(world))) return false;
+               if (!returnType.matchesStatically(aMethod.getReturnType().resolve(world))) {
+                       // looking bad, but there might be parameterization to consider...
+                       if (!returnType.matchesStatically(aMethod.getGenericReturnType().resolve(world))) {
+                               // ok, it's bad.
+                               return false;
+                       }
+               }
+               ResolvedType[] resolvedParameters = world.resolve(aMethod.getParameterTypes());
+               if (!parameterTypes.matches(resolvedParameters, TypePattern.STATIC).alwaysTrue()) {
+                       // It could still be a match based on the generic sig parameter types of a parameterized type
+                       if (!parameterTypes.matches(world.resolve(aMethod.getGenericParameterTypes()),TypePattern.STATIC).alwaysTrue()) {
+                               return false;
+                               // It could STILL be a match based on the erasure of the parameter types??
+                               // to be determined via test cases...
+                       }
+               }
+               
+               // check that varargs specifications match
+               if (!matchesVarArgs(aMethod,world)) return false;
+               
+               // Check the throws pattern
+               if (!throwsPattern.matches(aMethod.getExceptions(), world)) return false;
+               
+               // passed all the guards..
+               return true;
+       }
+       
+       /**
+        * match on declaring type, parameter types, throws types
+        */
+       private boolean matchesExactlyConstructor(JoinPointSignature aConstructor, World world) {
+               if (!declaringType.matchesStatically(aConstructor.getDeclaringType().resolve(world))) return false;
+
+               ResolvedType[] resolvedParameters = world.resolve(aConstructor.getParameterTypes());
+               if (!parameterTypes.matches(resolvedParameters, TypePattern.STATIC).alwaysTrue()) {
+                       // It could still be a match based on the generic sig parameter types of a parameterized type
+                       if (!parameterTypes.matches(world.resolve(aConstructor.getGenericParameterTypes()),TypePattern.STATIC).alwaysTrue()) {
+                               return false;
+                               // It could STILL be a match based on the erasure of the parameter types??
+                               // to be determined via test cases...
+                       }
+               }
+               
+               // check that varargs specifications match
+               if (!matchesVarArgs(aConstructor,world)) return false;
+               
+               // Check the throws pattern
+               if (!throwsPattern.matches(aConstructor.getExceptions(), world)) return false;
+               
+               // passed all the guards..
+               return true;            
+       }
+       
+       /**
+        * We've matched against this method or constructor so far, but without considering
+        * varargs (which has been matched as a simple array thus far). Now we do the additional
+        * checks to see if the parties agree on whether the last parameter is varargs or a 
+        * straight array. 
+        */
+       private boolean matchesVarArgs(JoinPointSignature aMethodOrConstructor, World inAWorld) {
+               if (parameterTypes.size() == 0) return true;
+               
+               TypePattern lastPattern = parameterTypes.get(parameterTypes.size()-1);
+               boolean canMatchVarArgsSignature = lastPattern.isStar() || 
+                                                   lastPattern.isVarArgs() ||
+                                                   (lastPattern == TypePattern.ELLIPSIS);
+               
+               if (aMethodOrConstructor.isVarargsMethod()) {
+                       // we have at least one parameter in the pattern list, and the method has a varargs signature
+                       if (!canMatchVarArgsSignature) {
+                               // XXX - Ideally the shadow would be included in the msg but we don't know it...
+                               inAWorld.getLint().cantMatchArrayTypeOnVarargs.signal(aMethodOrConstructor.toString(),getSourceLocation());
+                               return false;
+                       }
+               } else {
+                       // the method ends with an array type, check that we don't *require* a varargs
+                       if (lastPattern.isVarArgs()) return false;
+               }
+
+               return true;
+       }
+               
+       private boolean matchesAnnotations(ResolvedMember member,World world) {
+         if (member == null) {
                if (member.getName().startsWith(NameMangler.PREFIX)) {
                                return false;
                        }
@@ -141,10 +287,10 @@ public class SignaturePattern extends PatternNode {
          
          // fake members represent ITD'd fields - for their annotations we should go and look up the
          // relevant member in the original aspect
-         if (rMember.isAnnotatedElsewhere() && member.getKind()==Member.FIELD) {
+         if (member.isAnnotatedElsewhere() && member.getKind()==Member.FIELD) {
            // FIXME asc duplicate of code in AnnotationPattern.matchInternal()?  same fixmes apply here.
-           ResolvedMember [] mems = rMember.getDeclaringType().resolve(world).getDeclaredFields(); // FIXME asc should include supers with getInterTypeMungersIncludingSupers?
-           List mungers = rMember.getDeclaringType().resolve(world).getInterTypeMungers(); 
+           ResolvedMember [] mems = member.getDeclaringType().resolve(world).getDeclaredFields(); // FIXME asc should include supers with getInterTypeMungersIncludingSupers?
+           List mungers = member.getDeclaringType().resolve(world).getInterTypeMungers(); 
                for (Iterator iter = mungers.iterator(); iter.hasNext();) {
                BcelTypeMunger typeMunger = (BcelTypeMunger) iter.next();
                        if (typeMunger.getMunger() instanceof NewFieldTypeMunger) {
@@ -152,13 +298,13 @@ public class SignaturePattern extends PatternNode {
                          ResolvedMember ajcMethod = AjcMemberMaker.interFieldInitializer(fakerm,typeMunger.getAspectType());
                          ResolvedMember rmm       = findMethod(typeMunger.getAspectType(),ajcMethod);
                          if (fakerm.equals(member)) {
-                               rMember = rmm;
+                               member = rmm;
                          }
                        }
                }
          }
          
-         return annotationPattern.matches(rMember).alwaysTrue();
+         return annotationPattern.matches(member).alwaysTrue();
        }
        
        private ResolvedMember findMethod(ResolvedType aspectType, ResolvedMember ajcMethod) {
@@ -168,137 +314,11 @@ public class SignaturePattern extends PatternNode {
                        if (member.equals(ajcMethod)) return member;
           }
                        return null;
-               }
-       
-       public boolean matchesIgnoringAnnotations(Member member, World world) {
-               //XXX performance gains would come from matching on name before resolving
-               //    to fail fast.  ASC 30th Nov 04 => Not necessarily, it didn't make it faster for me.
-               //    Here is the code I used:
-               //              String n1 = member.getName();
-               //              String n2 = this.getName().maybeGetSimpleName();
-               //              if (n2!=null && !n1.equals(n2)) return false;
-
-               if (member == null) return false;
-               ResolvedMember sig = member.resolve(world);
-               
-               if (sig == null) {
-                       //XXX
-                       if (member.getName().startsWith(NameMangler.PREFIX)) {
-                               return false;
-                       }
-                       world.getLint().unresolvableMember.signal(member.toString(), getSourceLocation());
-                       return false;
-               }
-               
-               // Java5 introduces bridge methods, we don't want to match on them at all...
-               if (sig.isBridgeMethod()) {
-                       return false;
-               }
-               
-               // This check should only matter when used from WithincodePointcut as KindedPointcut
-               // has already effectively checked this with the shadows kind.
-               if (kind != member.getKind()) {
-                       return false;
-               }
-               
-               if (kind == Member.ADVICE) return true;
-               
-               if (!modifiers.matches(sig.getModifiers())) return false;
-               
-               if (kind == Member.STATIC_INITIALIZATION) {
-                       //System.err.println("match static init: " + sig.getDeclaringType() + " with " + this);
-                       return declaringType.matchesStatically(sig.getDeclaringType().resolve(world));
-               } else if (kind == Member.FIELD) {
-                       
-                       if (!returnType.matchesStatically(sig.getReturnType().resolve(world))) {
-                               // looking bad, but there might be parameterization to consider...
-                               if (!returnType.matchesStatically(sig.getGenericReturnType().resolve(world))) {
-                                       // ok, it's bad.
-                                       return false;
-                               }
-                       }
-                       if (!name.matches(sig.getName())) return false;
-                       boolean ret = declaringTypeMatch(member.getDeclaringType(), member, world);
-                       //System.out.println("   ret: " + ret);
-                       return ret;
-               } else if (kind == Member.METHOD) {
-                       // Change all this in the face of covariance...
-                       
-                       // Check the name
-                       if (!name.matches(sig.getName())) return false;
-                       
-                       // Check the parameters
-                       // AMC parameterized types make this more complex. Suppose I have a 
-               // type that implements a parameterized interface. It might declare a method
-                       // foo(Double). If foo is defined in I<T> and the type implements I<Double>,
-                       // then the signature pattern I.foo(Object) (the erasure) *should* match.
-                       // But [Object] does not match [Double] so we have some work to do...
-                       ResolvedType[] resolvedParameters = world.resolve(sig.getParameterTypes());
-                       if (!parameterTypes.matches(resolvedParameters, TypePattern.STATIC).alwaysTrue()) {
-                               // It could still be a match based on the erasure of a parameterized type
-                               // method in our hierarchy - this is only allowed if the declaring type pattern
-                               // is raw.
-                               // We need to find out as cheaply as possible.
-                               if (declaringType.getTypeParameters().size() > 0) return false;
-                               ResolvedMember sigErasure = sig.getErasure();
-                               if (sigErasure != null) {
-                                       ResolvedType[] erasureParameters = world.resolve(sigErasure.getParameterTypes());
-                                       if (!parameterTypes.matches(erasureParameters,TypePattern.STATIC).alwaysTrue()) {
-                                               // fail if we don't match the erasure either
-                                               return false;
-                                       } 
-                               } else {
-                                       // fail if there is no erasure as the params don't match
-                                       // try the true (generic) parameter types then
-                                       if (!parameterTypes.matches(world.resolve(sig.getGenericParameterTypes()),TypePattern.STATIC).alwaysTrue()) {
-                                               return false;
-                                       }
-                               }
-                       }
-                       
-                       // If we have matched on parameters, let's just check it isn't because the last parameter in the pattern
-                       // is an array type and the method is declared with varargs
-                       // XXX - Ideally the shadow would be included in the msg but we don't know it...
-                       if (isNotMatchBecauseOfVarargsIssue(parameterTypes,sig.getModifiers())) { 
-                               world.getLint().cantMatchArrayTypeOnVarargs.signal(sig.toString(),getSourceLocation());
-                               return false;
-                       }
-
-                       if (parameterTypes.size()>0 && (sig.isVarargsMethod()^parameterTypes.get(parameterTypes.size()-1).isVarArgs)) 
-                               return false;
-                       
-                       // Check the throws pattern
-                       if (!throwsPattern.matches(sig.getExceptions(), world)) return false;
-
-                       return declaringTypeMatchAllowingForCovariance(member,world,returnType,sig.getReturnType().resolve(world));
-               } else if (kind == Member.CONSTRUCTOR) {
-                       if (!parameterTypes.matches(world.resolve(sig.getParameterTypes()), TypePattern.STATIC).alwaysTrue()) {
-                               // try generic before giving up
-                               if (!parameterTypes.matches(world.resolve(sig.getGenericParameterTypes()), TypePattern.STATIC).alwaysTrue()) {
-                                       return false;
-                               }
-                       }
-                       
-                       // If we have matched on parameters, let's just check it isn't because the last parameter in the pattern
-                       // is an array type and the method is declared with varargs
-                       // XXX - Ideally the shadow would be included in the msg but we don't know it...
-                       if (isNotMatchBecauseOfVarargsIssue(parameterTypes,sig.getModifiers())) { 
-                               world.getLint().cantMatchArrayTypeOnVarargs.signal(sig.toString(),getSourceLocation());
-                               return false;
-                       }
-                       
-                       if (!throwsPattern.matches(sig.getExceptions(), world)) return false;
-                       return declaringType.matchesStatically(member.getDeclaringType().resolve(world));
-                       //return declaringTypeMatch(member.getDeclaringType(), member, world);                  
-               }
-               
-               return false;
        }
        
-       public boolean declaringTypeMatchAllowingForCovariance(Member member,World world,TypePattern returnTypePattern,ResolvedType sigReturn) {
-               UnresolvedType onTypeUnresolved = member.getDeclaringType();
+       public boolean declaringTypeMatchAllowingForCovariance(Member member, UnresolvedType shadowDeclaringType, World world,TypePattern returnTypePattern,ResolvedType sigReturn) {
                
-               ResolvedType onType = onTypeUnresolved.resolve(world);
+               ResolvedType onType = shadowDeclaringType.resolve(world);
                        
                // fastmatch
                if (declaringType.matchesStatically(onType) && returnTypePattern.matchesStatically(sigReturn)) 
@@ -366,7 +386,7 @@ public class SignaturePattern extends PatternNode {
                        if (!parameterTypes.matches(params, TypePattern.STATIC).alwaysTrue()) {
                                return false;
                        }
-                       if (isNotMatchBecauseOfVarargsIssue(parameterTypes,msig.getModifiers())) { return false; }
+                       if (matchedArrayAgainstVarArgs(parameterTypes,msig.getModifiers())) { return false; }
                        
                        if (!throwsPattern.matches(exceptionTypes)) return false;
                        return declaringTypeMatch(sig); // XXXAJ5 - Need to make this a covariant aware version for dynamic JP matching to work
@@ -377,7 +397,7 @@ public class SignaturePattern extends PatternNode {
                        if (!parameterTypes.matches(params, TypePattern.STATIC).alwaysTrue()) {
                                return false;
                        }
-                       if (isNotMatchBecauseOfVarargsIssue(parameterTypes,csig.getModifiers())) { return false; }
+                       if (matchedArrayAgainstVarArgs(parameterTypes,csig.getModifiers())) { return false; }
                        
                        if (!throwsPattern.matches(exceptionTypes)) return false;
                        return declaringType.matchesStatically(sig.getDeclaringType());
@@ -417,7 +437,7 @@ public class SignaturePattern extends PatternNode {
                        if (!parameterTypes.matches(params, TypePattern.STATIC).alwaysTrue()) {
                                return false;
                        }
-                       if (isNotMatchBecauseOfVarargsIssue(parameterTypes,member.getModifiers())) { return false; }
+                       if (matchedArrayAgainstVarArgs(parameterTypes,member.getModifiers())) { return false; }
                        if (!throwsPattern.matches(exceptionTypes)) return false;
                        return declaringTypeMatch(member.getDeclaringClass()); // XXXAJ5 - Need to make this a covariant aware version for dynamic JP matching to work
                }
@@ -429,29 +449,13 @@ public class SignaturePattern extends PatternNode {
                        if (!parameterTypes.matches(params, TypePattern.STATIC).alwaysTrue()) {
                                return false;
                        }
-                       if (isNotMatchBecauseOfVarargsIssue(parameterTypes,member.getModifiers())) { return false; }
+                       if (matchedArrayAgainstVarArgs(parameterTypes,member.getModifiers())) { return false; }
                        if (!throwsPattern.matches(exceptionTypes)) return false;
                        return declaringType.matchesStatically(declaringClass);
                }
                return false;
        }
        
-// For methods, the above covariant aware version (declaringTypeMatchAllowingForCovariance) is used - this version is still here for fields
-       private boolean declaringTypeMatch(UnresolvedType onTypeUnresolved, Member member, World world) {
-               ResolvedType onType = onTypeUnresolved.resolve(world);
-               
-               // fastmatch
-               if (declaringType.matchesStatically(onType)) return true;
-               
-               Collection declaringTypes = member.getDeclaringTypes(world);
-               
-               for (Iterator i = declaringTypes.iterator(); i.hasNext(); ) {
-                       ResolvedType type = (ResolvedType)i.next();
-                       if (declaringType.matchesStatically(type)) return true;
-               }
-               return false;
-       }
-
        private boolean declaringTypeMatch(Signature sig) {
                Class onType = sig.getDeclaringType();
                if (declaringType.matchesStatically(onType)) return true;
@@ -645,7 +649,7 @@ public class SignaturePattern extends PatternNode {
         * return true if last argument in params is an Object[] but the modifiers say this method
         * was declared with varargs (Object...).  We shouldn't be matching if this is the case.
         */
-       private boolean isNotMatchBecauseOfVarargsIssue(TypePatternList params,int modifiers) {
+       private boolean matchedArrayAgainstVarArgs(TypePatternList params,int modifiers) {
                if (params.size()>0 && (modifiers & Constants.ACC_VARARGS)!=0) {
                        // we have at least one parameter in the pattern list, and the method has a varargs signature
                        TypePattern lastPattern = params.get(params.size()-1);
index 37808a1cee175fd8fcd06ffc49a75f3ad2a1c958..94e897610cb88ffa12892b1e73e1e068ebde5621 100644 (file)
@@ -19,6 +19,7 @@ import java.lang.reflect.Member;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.aspectj.bridge.MessageUtil;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.runtime.reflect.Factory;
 import org.aspectj.util.FuzzyBoolean;
@@ -27,6 +28,7 @@ import org.aspectj.weaver.IntMap;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.VersionedDataInputStream;
+import org.aspectj.weaver.WeaverMessages;
 import org.aspectj.weaver.ast.Literal;
 import org.aspectj.weaver.ast.Test;
 
@@ -108,6 +110,22 @@ public class WithincodePointcut extends Pointcut {
 
        public void resolveBindings(IScope scope, Bindings bindings) {
                signature = signature.resolveBindings(scope, bindings);
+               
+               // look for inappropriate use of parameterized types and tell user...
+               HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor 
+                       visitor = new HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor();
+               signature.getDeclaringType().traverse(visitor, null);
+               if (visitor.wellHasItThen/*?*/()) {
+                       scope.message(MessageUtil.error(WeaverMessages.format(WeaverMessages.WITHINCODE_DOESNT_SUPPORT_PARAMETERIZED_DECLARING_TYPES),
+                                       getSourceLocation()));
+               }                                               
+               
+               visitor = new HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor();
+               signature.getThrowsPattern().traverse(visitor, null);
+               if (visitor.wellHasItThen/*?*/()) {
+                       scope.message(MessageUtil.error(WeaverMessages.format(WeaverMessages.NO_GENERIC_THROWABLES),
+                                       getSourceLocation()));
+               }                                       
        }
        
        public void resolveBindingsFromRTTI() {
index c2a8b29d0de3eb20279a80204a8f61d09aa87b27..411780e559d728b55b2221c0498d6d1edb057982 100644 (file)
@@ -148,4 +148,5 @@ noParameterizedTypePatternInWithin=parameterized type pattern not supported by '
 noParameterizedTypesInThisAndTarget=parameterized types not supported for this and target pointcuts (erasure limitation)
 noParameterizedTypesInGetAndSet=can't use parameterized type patterns for the declaring type of a get or set pointcut expression (use the raw type instead)
 noInitJPsForParameterizedTypes=no [pre]initialization join points for parameterized types, use raw type instead
-noGenericThrowables=invalid throws pattern: a generic class may not be a direct or indirect subclass of Throwable
\ No newline at end of file
+noGenericThrowables=invalid throws pattern: a generic class may not be a direct or indirect subclass of Throwable
+noParameterizedDeclaringTypesWithinCode=can't use parameterized type patterns for the declaring type of a withincode pointcut expression (use the raw type instead)
\ No newline at end of file
index 9aa148d68c6dc266fae9a9a02be6a120aad55a5e..4cdb1f77296342d612e3d1c530d6ce5293fb6f68 100644 (file)
@@ -4,6 +4,9 @@ public class Base {
 
        public static void onlyBase() {}
        public static void both() {}
+       
+       public void onlyBaseNonStatic() {}
+       public void bothNonStatic() {}
 
        public int onlyBase;
        public int both;
index 6c38db40ebc9fc1f2635a1de983784114de93bc7..ad0842c18c771a87f058d4e348a2b5c4076565a3 100644 (file)
@@ -7,6 +7,9 @@ public class Derived extends Base {
        public static void onlyDerived() throws IOException, CloneNotSupportedException {}
        public static void both() {}
        
+       public void onlyDerivedNonStatic() {}
+       public void bothNonStatic() {}
+       
        public int onlyDerived;
        public int both;
        
index d0b8e781279c0e32b533860a77b02fff8703bbc4..cc242c2e44cebf0dffdb4f19fe6d7f1443a8486a 100644 (file)
@@ -30,10 +30,10 @@ public class MemberTestCase extends TestCase {
     }
 
     public void testMethodConstruction() {
-        Member s = Member.methodFromString("void Foo.goo(int)");
-        Member t = Member.method(UnresolvedType.forName("Foo"), 0, "goo", "(I)V");
-        Member u = Member.methodFromString("void Foo1.goo(int)");
-        Member v = Member.methodFromString("int Foo.goo(int)");
+        Member s = MemberImpl.methodFromString("void Foo.goo(int)");
+        Member t = MemberImpl.method(UnresolvedType.forName("Foo"), 0, "goo", "(I)V");
+        Member u = MemberImpl.methodFromString("void Foo1.goo(int)");
+        Member v = MemberImpl.methodFromString("int Foo.goo(int)");
 
         TestUtil.assertCommutativeEquals(s, s, true);
         TestUtil.assertCommutativeEquals(t, t, true);
@@ -46,10 +46,10 @@ public class MemberTestCase extends TestCase {
         TestUtil.assertCommutativeEquals(t, v, false);
         TestUtil.assertCommutativeEquals(u, v, false);
 
-        s = Member.fieldFromString("int Foo.goo");
-        t = Member.field("Foo", 0, "goo", "I");
-        u = Member.fieldFromString("int Foo.goo1");
-        v = Member.fieldFromString("long Foo.goo");
+        s = MemberImpl.fieldFromString("int Foo.goo");
+        t = MemberImpl.field("Foo", 0, "goo", "I");
+        u = MemberImpl.fieldFromString("int Foo.goo1");
+        v = MemberImpl.fieldFromString("long Foo.goo");
 
         TestUtil.assertCommutativeEquals(s, s, true);
         TestUtil.assertCommutativeEquals(t, t, true);
@@ -65,7 +65,7 @@ public class MemberTestCase extends TestCase {
 
 
     public void testMethodContents() {
-        Member m = Member.methodFromString("void Foo.goo(int)");
+        Member m = MemberImpl.methodFromString("void Foo.goo(int)");
         kindTest(m, Member.METHOD);
         declaringTypeTest(m, "Foo");
         nameTest(m, "goo");
@@ -76,7 +76,7 @@ public class MemberTestCase extends TestCase {
         isConstructorTest(m, false);
         isStaticTest(m, false);
 
-        m = Member.methodFromString("interface java.lang.Object java.util.Iterator.next()");
+        m = MemberImpl.methodFromString("interface java.lang.Object java.util.Iterator.next()");
         kindTest(m, Member.METHOD);
         declaringTypeTest(m, "java.util.Iterator");
         nameTest(m, "next");
@@ -87,7 +87,7 @@ public class MemberTestCase extends TestCase {
         isConstructorTest(m, false);
         isStaticTest(m, false);
 
-        m = Member.methodFromString("void Foo.<init>(int, java.lang.Object)");
+        m = MemberImpl.methodFromString("void Foo.<init>(int, java.lang.Object)");
         kindTest(m, Member.CONSTRUCTOR);
         declaringTypeTest(m, "Foo");
         nameTest(m, "<init>");
@@ -98,7 +98,7 @@ public class MemberTestCase extends TestCase {
         isConstructorTest(m, true);
         isStaticTest(m, false);
 
-        m = Member.methodFromString("private double Foo.sqrt(double)");
+        m = MemberImpl.methodFromString("private double Foo.sqrt(double)");
         kindTest(m, Member.METHOD);
         declaringTypeTest(m, "Foo");
         nameTest(m, "sqrt");
@@ -109,7 +109,7 @@ public class MemberTestCase extends TestCase {
         isConstructorTest(m, false);
         isStaticTest(m, false);
 
-        m = Member.methodFromString("static int java.lang.Math.max(int, int)");
+        m = MemberImpl.methodFromString("static int java.lang.Math.max(int, int)");
         kindTest(m, Member.METHOD);
         declaringTypeTest(m, "java.lang.Math");
         nameTest(m, "max");
@@ -122,7 +122,7 @@ public class MemberTestCase extends TestCase {
     }
 
     public void testFieldContents() {
-        Member m = Member.fieldFromString("int Foo.goo");
+        Member m = MemberImpl.fieldFromString("int Foo.goo");
         kindTest(m, Member.FIELD);
         declaringTypeTest(m, "Foo");
         nameTest(m, "goo");
@@ -133,7 +133,7 @@ public class MemberTestCase extends TestCase {
         isConstructorTest(m, false);
         isStaticTest(m, false);
 
-        m = Member.fieldFromString("static java.util.Iterator goo.Bar.i");
+        m = MemberImpl.fieldFromString("static java.util.Iterator goo.Bar.i");
         kindTest(m, Member.FIELD);
         declaringTypeTest(m, "goo.Bar");
         nameTest(m, "i");
@@ -169,7 +169,7 @@ public class MemberTestCase extends TestCase {
     private void declaringTypeTest(Member m, String declaringName) {
         assertEquals(m + " declared in", UnresolvedType.forName(declaringName), m.getDeclaringType());
     }
-    private void kindTest(Member m, Member.Kind kind) {
+    private void kindTest(Member m, MemberImpl.Kind kind) {
         assertEquals(m + " kind", kind, m.getKind());
     }   
    
diff --git a/weaver/testsrc/org/aspectj/weaver/ResolvedMemberSignaturesTestCase15.java b/weaver/testsrc/org/aspectj/weaver/ResolvedMemberSignaturesTestCase15.java
new file mode 100644 (file)
index 0000000..95ce63e
--- /dev/null
@@ -0,0 +1,286 @@
+/* *******************************************************************
+ * Copyright (c) 2005 Contributors.
+ * All rights reserved. 
+ * This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 
+ * which accompanies this distribution and is available at 
+ * http://eclipse.org/legal/epl-v10.html 
+ *  
+ * Contributors: 
+ *   Adrian Colyer                     Initial implementation
+ * ******************************************************************/
+package org.aspectj.weaver;
+
+import java.lang.reflect.Modifier;
+
+import org.aspectj.weaver.bcel.BcelWorld;
+
+import junit.framework.TestCase;
+
+public class ResolvedMemberSignaturesTestCase15 extends TestCase {
+
+       World world;
+       UnresolvedType baseType;
+       UnresolvedType derivedType;
+       
+       // STATIC METHODS
+       
+       public void testBaseOnlyStaticMethod() {
+               Member toFind = new MemberImpl(Member.METHOD,baseType,
+                                                                  (Modifier.PUBLIC | Modifier.STATIC),
+                                                                  UnresolvedType.forSignature("V"),
+                                                                  "onlyBase",
+                                                                  new UnresolvedType[0]
+                                                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 member",1,foundMembers.length);
+               assertEquals("Lfluffy/Base;",foundMembers[0].getDeclaringType().getSignature());
+               
+               toFind = new MemberImpl(Member.METHOD,derivedType,
+                                  (Modifier.PUBLIC | Modifier.STATIC),
+                                  UnresolvedType.forSignature("V"),
+                                  "onlyBase",
+                                  new UnresolvedType[0]
+                                  );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               // this looks odd but we need both because of the way calls to inherited static methods
+               // are rendered in bytecode when written as obj.foo(); - the bytecode says it is a call
+               // to obj.getClass().foo() even if the static method is defined in a super type.
+               assertEquals("found 2 members",2,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());             
+               assertEquals("Lfluffy/Base;",foundMembers[1].getDeclaringType().getSignature());
+       }
+       
+       public void testBothStaticMethod() {
+               Member toFind = new MemberImpl(Member.METHOD,baseType,
+                                  (Modifier.PUBLIC | Modifier.STATIC),
+                                  UnresolvedType.forSignature("V"),
+                                  "both",
+                                  new UnresolvedType[0]
+                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 member",1,foundMembers.length);
+               assertEquals("Lfluffy/Base;",foundMembers[0].getDeclaringType().getSignature());
+               
+               toFind = new MemberImpl(Member.METHOD,derivedType,
+                                                       (Modifier.PUBLIC | Modifier.STATIC),
+                                                       UnresolvedType.forSignature("V"),
+                                                       "both",
+                                                       new UnresolvedType[0]
+                                                       );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 members",1,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());             
+       }
+
+       public void testDerivedStaticMethod() {
+               Member toFind = new MemberImpl(Member.METHOD,baseType,
+                                  (Modifier.PUBLIC | Modifier.STATIC),
+                                  UnresolvedType.forSignature("V"),
+                                  "onlyDerived",
+                                  new UnresolvedType[0]
+                                  );
+               
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found nothing",0,foundMembers.length);
+               
+               toFind = new MemberImpl(Member.METHOD,derivedType,
+                                                       (Modifier.PUBLIC | Modifier.STATIC),
+                                                       UnresolvedType.forSignature("V"),
+                                                       "onlyDerived",
+                                                       new UnresolvedType[0]
+                                                       );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 members",1,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());             
+       }
+       
+       // NON-STATIC METHODS
+       
+       public void testBaseOnlyMethod() {
+               Member toFind = new MemberImpl(Member.METHOD,baseType,
+                                                                  Modifier.PUBLIC,
+                                                                  UnresolvedType.forSignature("V"),
+                                                                  "onlyBaseNonStatic",
+                                                                  new UnresolvedType[0]
+                                                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 member",1,foundMembers.length);
+               assertEquals("Lfluffy/Base;",foundMembers[0].getDeclaringType().getSignature());
+               
+               toFind = new MemberImpl(Member.METHOD,derivedType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("V"),
+                                  "onlyBaseNonStatic",
+                                  new UnresolvedType[0]
+                                  );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 2 members",2,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());
+               assertEquals("Lfluffy/Base;",foundMembers[1].getDeclaringType().getSignature());
+
+       }
+       
+       public void testBothMethod() {
+               Member toFind = new MemberImpl(Member.METHOD,baseType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("V"),
+                                  "bothNonStatic",
+                                  new UnresolvedType[0]
+                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 member",1,foundMembers.length);
+               assertEquals("Lfluffy/Base;",foundMembers[0].getDeclaringType().getSignature());
+               
+               toFind = new MemberImpl(Member.METHOD,derivedType,
+                                                       Modifier.PUBLIC,
+                                                       UnresolvedType.forSignature("V"),
+                                                       "bothNonStatic",
+                                                       new UnresolvedType[0]
+                                                       );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 2 members",2,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());
+               assertEquals("Lfluffy/Base;",foundMembers[1].getDeclaringType().getSignature());
+       }
+
+       public void testDerivedMethod() {
+               Member toFind = new MemberImpl(Member.METHOD,baseType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("V"),
+                                  "onlyDerivedNonStatic",
+                                  new UnresolvedType[0]
+                                  );
+               
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found nothing",0,foundMembers.length);
+               
+               toFind = new MemberImpl(Member.METHOD,derivedType,
+                                                       Modifier.PUBLIC,
+                                                       UnresolvedType.forSignature("V"),
+                                                       "onlyDerivedNonStatic",
+                                                       new UnresolvedType[0]
+                                                       );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 members",1,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());             
+       }
+       
+       public void testChangingThrowsClause() {
+               Member toFind = new MemberImpl(Member.METHOD,derivedType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("V"),
+                                  "m",
+                                  new UnresolvedType[0]
+                                  );
+               
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 2 members",2,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());
+               assertEquals("Lfluffy/Base;",foundMembers[1].getDeclaringType().getSignature());
+               
+               assertEquals("throws CloneNotSupported",1,foundMembers[1].getExceptions().length);
+               assertEquals("doesn't throw anything",0,foundMembers[0].getExceptions().length);
+       }
+       
+       // CONSTRUCTORS
+       
+        public void testNoWalkUpMatchingConstructor() {
+               Member toFind = new MemberImpl(Member.CONSTRUCTOR,derivedType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("V"),
+                                  "<init>",
+                                  new UnresolvedType[0]
+                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 members",1,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());                     
+        }
+        
+        public void testNoWalkUpNoMatchingConstructor() {
+               Member toFind = new MemberImpl(Member.CONSTRUCTOR,derivedType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("V"),
+                                  "<init>",
+                                  new UnresolvedType[] {UnresolvedType.forSignature("I")}
+                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("No matches",0,foundMembers.length);
+        }
+       
+       // FIELDS
+        
+       public void testBaseOnlyField() {
+               Member toFind = new MemberImpl(Member.FIELD,baseType,
+                                                                  Modifier.PUBLIC,
+                                                                  UnresolvedType.forSignature("I"),
+                                                                  "onlyBase",
+                                                                  new UnresolvedType[0]
+                                                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 member",1,foundMembers.length);
+               assertEquals("Lfluffy/Base;",foundMembers[0].getDeclaringType().getSignature());
+               
+               toFind = new MemberImpl(Member.FIELD,derivedType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("I"),
+                                  "onlyBase",
+                                  new UnresolvedType[0]
+                                  );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 2 members",2,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());
+               assertEquals("Lfluffy/Base;",foundMembers[1].getDeclaringType().getSignature());
+       }
+       
+       public void testBothField() {
+               Member toFind = new MemberImpl(Member.FIELD,baseType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("I"),
+                                  "both",
+                                  new UnresolvedType[0]
+                                  );
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 member",1,foundMembers.length);
+               assertEquals("Lfluffy/Base;",foundMembers[0].getDeclaringType().getSignature());
+               
+               toFind = new MemberImpl(Member.FIELD,derivedType,
+                                                       Modifier.PUBLIC,
+                                                       UnresolvedType.forSignature("I"),
+                                                       "both",
+                                                       new UnresolvedType[0]
+                                                       );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 members",1,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());
+       }
+
+       public void testDerivedField() {
+               Member toFind = new MemberImpl(Member.FIELD,baseType,
+                                  Modifier.PUBLIC,
+                                  UnresolvedType.forSignature("I"),
+                                  "onlyDerived",
+                                  new UnresolvedType[0]
+                                  );
+               
+               ResolvedMember[] foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found nothing",0,foundMembers.length);
+               
+               toFind = new MemberImpl(Member.FIELD,derivedType,
+                                                       Modifier.PUBLIC,
+                                                       UnresolvedType.forSignature("I"),
+                                                       "onlyDerived",
+                                                       new UnresolvedType[0]
+                                                       );
+               foundMembers = ResolvedMemberImpl.getJoinPointSignatures(toFind, world);
+               assertEquals("found 1 members",1,foundMembers.length);
+               assertEquals("Lfluffy/Derived;",foundMembers[0].getDeclaringType().getSignature());             
+       }        
+
+       protected void setUp() throws Exception {
+               world = new BcelWorld();
+               baseType = UnresolvedType.forSignature("Lfluffy/Base;");
+               derivedType = UnresolvedType.forSignature("Lfluffy/Derived;");
+       }
+       
+}
index c487d24d766e2e4974f0e7d207d8c2cd21806f5c..722e4a83cfb3819c1e31e4b2643cfdc55fb45b42 100644 (file)
@@ -23,7 +23,7 @@ import org.aspectj.apache.bcel.generic.InstructionHandle;
 import org.aspectj.apache.bcel.generic.InstructionList;
 import org.aspectj.apache.bcel.generic.Type;
 import org.aspectj.weaver.AdviceKind;
-import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.UnresolvedType;
@@ -103,7 +103,7 @@ public class ArgsWeaveTestCase extends WeaveTestCase {
        ResolvedType rtx = world.resolve(UnresolvedType.forName("Aspect"),true);
        assertTrue("Cant find required type Aspect",rtx!=ResolvedType.MISSING);
         return new BcelAdvice(AdviceKind.stringToKind(kindx), makePointcutNoZeroArg(),
-                               Member.method(UnresolvedType.forName("Aspect"), 0, "foo", "()V"), 0, -1, -1, null,
+                               MemberImpl.method(UnresolvedType.forName("Aspect"), 0, "foo", "()V"), 0, -1, -1, null,
                                rtx) {
             public void specializeOn(Shadow shadow) {
                 super.specializeOn(shadow);
index 023005e537912c7818475c473a00a4eb1f968fe3..2e892277d50210bc667420c1627a00dfd0a2d871 100644 (file)
@@ -48,7 +48,7 @@ public class AroundWeaveTestCase extends WeaveTestCase {
     private BcelAdvice makeAroundMunger(final boolean matchOnlyPrintln) {
         BcelWorld world = super.world;
         final Member sig =
-            Member.method(
+            MemberImpl.method(
                 UnresolvedType.forName("Aspect"),
                 Modifier.STATIC,
                 "ajc_around",
index ac57a0ba77e986d75a185db7dc93013afa269d41..fed1ab4cd6ab3fa28c75f7504d253637d6345aa4 100644 (file)
@@ -22,6 +22,7 @@ import java.util.List;
 import org.aspectj.weaver.AdviceKind;
 import org.aspectj.weaver.BcweaverTests;
 import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.UnresolvedType;
 
@@ -46,7 +47,7 @@ public class MegaZipTestCase extends WeaveTestCase {
     private BcelAdvice makeAroundMunger(final boolean matchOnlyPrintln) {
         // BcelWorld world = new BcelWorld();
         final Member sig = 
-            Member.method(
+            MemberImpl.method(
                 UnresolvedType.forName("fluffy.Aspect"),
                 Modifier.STATIC,
                 "aroundFun",
index 428ab5ed255a2cef2abfb46430ac98185d4acf01..3c270124133107054430b0e0532b900983b2d942 100644 (file)
@@ -186,11 +186,11 @@ public class PointcutResidueTestCase extends WeaveTestCase {
             new BcelAdvice(
                 AdviceKind.Before,
                 rp,
-                Member.method(
+                MemberImpl.method(
                     UnresolvedType.forName("Aspect"),
                     Modifier.STATIC,
                     "ajc_before_0",
-                    Member.typesToSignature(
+                    MemberImpl.typesToSignature(
                         ResolvedType.VOID,
                         UnresolvedType.forNames(formalTypes),false)),
                0, -1, -1, null, null);
index 4fe362973b35122b9828610ce300b62af5366474..a028f9a98914684077f492fc50e8fb47012dc3c3 100644 (file)
@@ -18,7 +18,7 @@ import java.util.Arrays;
 
 import org.aspectj.weaver.Advice;
 import org.aspectj.weaver.AdviceKind;
-import org.aspectj.weaver.Member;
+import org.aspectj.weaver.MemberImpl;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.UnresolvedType;
 
@@ -36,7 +36,7 @@ public class TjpWeaveTestCase extends WeaveTestCase {
        BcelAdvice munger = new BcelAdvice(
                AdviceKind.stringToKind("before"),
                makePointcutAll(), 
-               Member.methodFromString("static void Aspect.ajc_before(org.aspectj.lang.JoinPoint$StaticPart)"),
+               MemberImpl.methodFromString("static void Aspect.ajc_before(org.aspectj.lang.JoinPoint$StaticPart)"),
                Advice.ThisJoinPointStaticPart, -1, -1, null, null);
        
         weaveTest("HelloWorld", "StaticTjpBeforeHelloWorld", munger);
@@ -47,7 +47,7 @@ public class TjpWeaveTestCase extends WeaveTestCase {
        BcelAdvice munger = new BcelAdvice(
                AdviceKind.stringToKind("before"),
                makePointcutAll(), 
-               Member.methodFromString("static void Aspect.ajc_before(org.aspectj.lang.JoinPoint$StaticPart)"),
+               MemberImpl.methodFromString("static void Aspect.ajc_before(org.aspectj.lang.JoinPoint$StaticPart)"),
                Advice.ThisEnclosingJoinPointStaticPart, -1, -1, null, null);
        
         weaveTest("HelloWorld", "StaticEnclosingTjpBeforeHelloWorld", munger);
@@ -58,7 +58,7 @@ public class TjpWeaveTestCase extends WeaveTestCase {
        BcelAdvice munger = new BcelAdvice(
                AdviceKind.stringToKind("before"),
                makePointcutAll(), 
-               Member.methodFromString("static void Aspect.ajc_before(org.aspectj.lang.JoinPoint)"),
+               MemberImpl.methodFromString("static void Aspect.ajc_before(org.aspectj.lang.JoinPoint)"),
                Advice.ThisJoinPoint, -1, -1, null, null);
        
         weaveTest("HelloWorld", "TjpBeforeHelloWorld", munger);
@@ -68,7 +68,7 @@ public class TjpWeaveTestCase extends WeaveTestCase {
        BcelAdvice munger = new BcelAdvice(
                AdviceKind.stringToKind("around"),
                makePointcutAll(), 
-               Member.methodFromString("static java.lang.Object Aspect.ajc_around(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint)"),
+               MemberImpl.methodFromString("static java.lang.Object Aspect.ajc_around(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint)"),
                Advice.ThisJoinPoint | Advice.ExtraArgument, -1, -1, null, null);
        
         weaveTest("HelloWorld", "TjpAroundHelloWorld", munger);
@@ -80,14 +80,14 @@ public class TjpWeaveTestCase extends WeaveTestCase {
        BcelAdvice munger1 = new BcelAdvice(
                AdviceKind.stringToKind("around"),
                makePointcutAll(), 
-               Member.methodFromString("static java.lang.Object Aspect.ajc_around(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint)"),
+               MemberImpl.methodFromString("static java.lang.Object Aspect.ajc_around(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint)"),
                Advice.ThisJoinPoint | Advice.ExtraArgument, -1, -1, null, 
                rtx);
        
        BcelAdvice munger2 = new BcelAdvice(
                AdviceKind.stringToKind("around"),
                makePointcutAll(), 
-               Member.methodFromString("static java.lang.Object Aspect.ajc_around(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint)"),
+               MemberImpl.methodFromString("static java.lang.Object Aspect.ajc_around(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint)"),
                Advice.ThisJoinPoint | Advice.ExtraArgument, -1, -1, null, 
                rtx);
        
index 5696a1df529e09d26659481be2e1fd754668520a..5976acd036a16bebc53f590417007e021537e43e 100644 (file)
@@ -138,7 +138,7 @@ public class WeaveOrderTestCase extends WeaveTestCase {
                                UnresolvedType concreteAspect, int lexicalPosition)
        {
                Advice a1 = new BcelAdvice(kind, makeResolvedPointcut("this(*)"),  
-                               Member.method(declaringAspect, 0, "foo", "()V"),
+                               MemberImpl.method(declaringAspect, 0, "foo", "()V"),
                                0, lexicalPosition, lexicalPosition, null, null);
                a1 = (Advice)a1.concretize(concreteAspect.resolve(world), world, null);
                return a1;
index e3cd0e3fa1ce2c817329cf014df0bc32b5bfbd41..cb82a2f5f536b8d04f1e16c7b0c279aeb7c8d10f 100644 (file)
@@ -38,7 +38,7 @@ public class WorldTestCase extends AbstractWorldTestCase {
         ResolvedType trace = world.resolve(UnresolvedType.forName("Trace"),true);
         assertTrue("Couldnt find type Trace",trace!=ResolvedType.MISSING);
         fieldsTest(trace, Member.NONE);
-        /*Member constr = */Member.methodFromString("void Trace.<init>()"); 
+        /*Member constr = */MemberImpl.methodFromString("void Trace.<init>()"); 
         //XXX need attribute fix - 
         //methodsTest(trace, new Member[] { constr });
 
@@ -50,7 +50,7 @@ public class WorldTestCase extends AbstractWorldTestCase {
 
         pointcutsTest(trace, 
             new Member[] {
-                Member.pointcut(trace, "traced", "(Ljava/lang/Object;)V"),
+                MemberImpl.pointcut(trace, "traced", "(Ljava/lang/Object;)V"),
             });
 
         modifiersTest(trace.findPointcut("traced"), 
@@ -83,7 +83,7 @@ public class WorldTestCase extends AbstractWorldTestCase {
 
         pointcutsTest(trace, 
             new Member[] {
-                Member.pointcut(trace, "traced", "(Ljava/lang/Object;)V"),
+                MemberImpl.pointcut(trace, "traced", "(Ljava/lang/Object;)V"),
             });
 
         modifiersTest(myTrace.findPointcut("traced"), 
@@ -102,16 +102,16 @@ public class WorldTestCase extends AbstractWorldTestCase {
         fieldsTest(iter, ResolvedMember.NONE);
         methodsTest(iter, 
             new Member[] {
-                Member.method(iter, 0, "hasNext", "()Z"),
-                Member.method(iter, 0, "remove", "()V"),
-                Member.method(iter, 0, "next", "()Ljava/lang/Object;"),
+                MemberImpl.method(iter, 0, "hasNext", "()Z"),
+                MemberImpl.method(iter, 0, "remove", "()V"),
+                MemberImpl.method(iter, 0, "next", "()Ljava/lang/Object;"),
                 });
-        ResolvedMember remove = iter.lookupMethod(Member.method(iter, 0, "remove", "()V"));
+        ResolvedMember remove = iter.lookupMethod(MemberImpl.method(iter, 0, "remove", "()V"));
         assertNotNull("iterator doesn't have remove" , remove);
         modifiersTest(remove, abstractPublic | Modifier.INTERFACE);
         exceptionsTest(remove, UnresolvedType.NONE);
 
-        ResolvedMember clone = iter.lookupMethod(Member.method(UnresolvedType.OBJECT, 0, "clone", "()Ljava/lang/Object;"));
+        ResolvedMember clone = iter.lookupMethod(MemberImpl.method(UnresolvedType.OBJECT, 0, "clone", "()Ljava/lang/Object;"));
         assertNotNull("iterator doesn't have clone" , clone);
         //AV: JRockit Object.clone() is not native.. corrupted test here:
         //modifiersTest(clone, Modifier.PROTECTED | Modifier.NATIVE);
index 4a9188bbc02bb4354c073608f7a9ab6dcf1f905e..d784afc70b9ca002acdbd1b7307fe1e7fb672c7c 100644 (file)
@@ -1,5 +1,6 @@
 /* *******************************************************************
  * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
+ *               2005 Contributors
  * All rights reserved. 
  * This program and the accompanying materials are made available 
  * under the terms of the Common Public License v1.0 
@@ -32,13 +33,13 @@ public class SignaturePatternTestCase extends TestCase {
        BcelWorld world = new BcelWorld();
 
        public void testThrowsMatch() throws IOException {
-               Member onlyDerivedOnDerived = Member.methodFromString("static void fluffy.Derived.onlyDerived()");
-               Member mOnBase = Member.methodFromString("void fluffy.Base.m()");
-               Member mOnDerived = Member.methodFromString("void fluffy.Derived.m()");
+               Member onlyDerivedOnDerived = MemberImpl.methodFromString("static void fluffy.Derived.onlyDerived()");
+               Member mOnBase = MemberImpl.methodFromString("void fluffy.Base.m()");
+               Member mOnDerived = MemberImpl.methodFromString("void fluffy.Derived.m()");
                
                checkMatch(makeMethodPat("* fluffy.Base.*(..) throws java.lang.CloneNotSupportedException"),
-                                       new Member[] { mOnBase },
-                                       new Member[] { mOnDerived });
+                                       new Member[] { mOnBase, mOnDerived },
+                                       new Member[] { });
                                        
                checkMatch(makeMethodPat("* fluffy.Derived.*(..) throws java.lang.CloneNotSupportedException"),
                                        new Member[] { },
@@ -52,7 +53,7 @@ public class SignaturePatternTestCase extends TestCase {
                
                checkMatch(makeMethodPat("* *(..)"), M, NONE);
                checkMatch(makeMethodPat("* *(..) throws !*"), NO_EXCEPTIONS, M);
-               checkMatch(makeMethodPat("* *(..) throws *"), M, NO_EXCEPTIONS);
+               checkMatch(makeMethodPat("* *(..) throws *"), BOTH, NONE);
                checkMatch(makeMethodPat("* *(..) throws *, !*"), NONE, BOTH);
                
                checkMatch(makeMethodPat("* *(..) throws (!*)"), NONE, BOTH);           
@@ -65,9 +66,9 @@ public class SignaturePatternTestCase extends TestCase {
        }
 
        public void testInstanceMethodMatch() throws IOException {
-               Member objectToString = Member.methodFromString("java.lang.String java.lang.Object.toString()");
-               Member integerToString = Member.methodFromString("java.lang.String java.lang.Integer.toString()");
-               Member integerIntValue = Member.methodFromString("int java.lang.Integer.intValue()");
+               Member objectToString = MemberImpl.methodFromString("java.lang.String java.lang.Object.toString()");
+               Member integerToString = MemberImpl.methodFromString("java.lang.String java.lang.Integer.toString()");
+               Member integerIntValue = MemberImpl.methodFromString("int java.lang.Integer.intValue()");
                //Member objectToString = Member.methodFromString("java.lang.String java.lang.Object.toString()");
                
                checkMatch(makeMethodPat("* java.lang.Object.*(..)"),
@@ -81,11 +82,11 @@ public class SignaturePatternTestCase extends TestCase {
 
        
        public void testStaticMethodMatch() throws IOException {
-               Member onlyBaseOnBase = Member.methodFromString("static void fluffy.Base.onlyBase()");
-               Member onlyBaseOnDerived = Member.methodFromString("static void fluffy.Derived.onlyBase()");
-               Member onlyDerivedOnDerived = Member.methodFromString("static void fluffy.Derived.onlyDerived()");
-               Member bothOnBase = Member.methodFromString("static void fluffy.Base.both()");
-               Member bothOnDerived = Member.methodFromString("static void fluffy.Derived.both()");
+               Member onlyBaseOnBase = MemberImpl.methodFromString("static void fluffy.Base.onlyBase()");
+               Member onlyBaseOnDerived = MemberImpl.methodFromString("static void fluffy.Derived.onlyBase()");
+               Member onlyDerivedOnDerived = MemberImpl.methodFromString("static void fluffy.Derived.onlyDerived()");
+               Member bothOnBase = MemberImpl.methodFromString("static void fluffy.Base.both()");
+               Member bothOnDerived = MemberImpl.methodFromString("static void fluffy.Derived.both()");
                
                checkMatch(makeMethodPat("* fluffy.Base.*(..)"),
                                        new Member[] { onlyBaseOnBase, onlyBaseOnDerived, bothOnBase },
@@ -97,11 +98,11 @@ public class SignaturePatternTestCase extends TestCase {
        }
        
        public void testFieldMatch() throws IOException {
-               Member onlyBaseOnBase = Member.fieldFromString("int fluffy.Base.onlyBase");
-               Member onlyBaseOnDerived = Member.fieldFromString("int fluffy.Derived.onlyBase");
-               Member onlyDerivedOnDerived = Member.fieldFromString("int fluffy.Derived.onlyDerived");
-               Member bothOnBase = Member.fieldFromString("int fluffy.Base.both");
-               Member bothOnDerived = Member.fieldFromString("int fluffy.Derived.both");
+               Member onlyBaseOnBase = MemberImpl.fieldFromString("int fluffy.Base.onlyBase");
+               Member onlyBaseOnDerived = MemberImpl.fieldFromString("int fluffy.Derived.onlyBase");
+               Member onlyDerivedOnDerived = MemberImpl.fieldFromString("int fluffy.Derived.onlyDerived");
+               Member bothOnBase = MemberImpl.fieldFromString("int fluffy.Base.both");
+               Member bothOnDerived = MemberImpl.fieldFromString("int fluffy.Derived.both");
                
                checkMatch(makeFieldPat("* fluffy.Base.*"),
                                        new Member[] { onlyBaseOnBase, onlyBaseOnDerived, bothOnBase },
@@ -113,9 +114,9 @@ public class SignaturePatternTestCase extends TestCase {
        }
        
        public void testConstructorMatch() throws IOException {
-               Member onBase = Member.methodFromString("void fluffy.Base.<init>()");
-               Member onDerived = Member.methodFromString("void fluffy.Derived.<init>()");
-               Member onBaseWithInt = Member.methodFromString("void fluffy.Base.<init>(int)");
+               Member onBase = MemberImpl.methodFromString("void fluffy.Base.<init>()");
+               Member onDerived = MemberImpl.methodFromString("void fluffy.Derived.<init>()");
+               Member onBaseWithInt = MemberImpl.methodFromString("void fluffy.Base.<init>(int)");
 
                
                checkMatch(makeMethodPat("fluffy.Base.new(..)"),
index bfbe18bc084514cede5182684ea1544aab469cd7..b0a0fb2590a582fa5261714dca72c00c2408c49d 100644 (file)
@@ -34,7 +34,7 @@ public class WithinTestCase extends TestCase {
        public void testMatch() throws IOException {
                Shadow getOutFromArrayList = new TestShadow(
                        Shadow.FieldGet, 
-                       Member.fieldFromString("java.io.PrintStream java.lang.System.out"),
+                       MemberImpl.fieldFromString("java.io.PrintStream java.lang.System.out"),
                        UnresolvedType.forName("java.util.ArrayList"),
                        world);
 
@@ -50,7 +50,7 @@ public class WithinTestCase extends TestCase {
                
                Shadow getOutFromEntry = new TestShadow(
                        Shadow.FieldGet, 
-                       Member.fieldFromString("java.io.PrintStream java.lang.System.out"),
+                       MemberImpl.fieldFromString("java.io.PrintStream java.lang.System.out"),
                        UnresolvedType.forName("java.util.Map$Entry"),
                        world);