]> source.dussan.org Git - aspectj.git/commitdiff
further work on binary aspects (aspect path) tested and implemented correct behavior
authorjhugunin <jhugunin>
Tue, 11 Mar 2003 19:06:21 +0000 (19:06 +0000)
committerjhugunin <jhugunin>
Tue, 11 Mar 2003 19:06:21 +0000 (19:06 +0000)
for obvious forms of abstract aspects now

18 files changed:
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InlineAccessFieldBinding.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedFieldBinding.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java
org.aspectj.ajdt.core/testdata/src1/binary/client/Client.java
org.aspectj.ajdt.core/testdata/src1/binary/client/Client1.java [new file with mode: 0644]
org.aspectj.ajdt.core/testdata/src1/binary/client/MyAspect.aj [new file with mode: 0644]
org.aspectj.ajdt.core/testdata/src1/binary/client/MyAspect1.aj [new file with mode: 0644]
org.aspectj.ajdt.core/testdata/src1/binary/lib/AbstractA.aj [new file with mode: 0644]
org.aspectj.ajdt.core/testdata/src1/binary/lib/ConcreteA.aj
org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BinaryFormsTestCase.java
weaver/src/org/aspectj/weaver/ConcreteTypeMunger.java
weaver/src/org/aspectj/weaver/PerObjectInterfaceTypeMunger.java
weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java
weaver/src/org/aspectj/weaver/ResolvedTypeX.java
weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java

index 0cb2ef29e189531a43cf034e7a9eab4aa59e8460..166a44cd8e7b448ed9cfeb9af0cec391adda86b4 100644 (file)
@@ -59,7 +59,7 @@ public class AccessForInlineVisitor extends AbstractSyntaxTreeVisitorAdapter {
        
        public AccessForInlineVisitor(AspectDeclaration inAspect, PrivilegedHandler handler) {
                this.inAspect = inAspect;
-               this.world = inAspect.world;
+               this.world = inAspect.factory;
                this.handler = handler;
        }
        
index 565a419d37c1191701eeb5f834d04654eb545387..c92cd026b9478d08b32e5e97ee59b7925e853700 100644 (file)
@@ -47,7 +47,7 @@ public class AspectDeclaration extends MemberTypeDeclaration {
        
        public ResolvedTypeX.Name typeX;
        
-       public EclipseFactory world;  //??? should use this consistently
+       public EclipseFactory factory;  //??? should use this consistently
 
 
        // for better error messages in 1.0 to 1.1 transition
@@ -171,12 +171,12 @@ public class AspectDeclaration extends MemberTypeDeclaration {
                        if (perClause == null) {
                                // we've already produced an error for this
                        } else if (perClause.getKind() == PerClause.SINGLETON) {
-                               binding.addField(world.makeFieldBinding(AjcMemberMaker.perSingletonField(
+                               binding.addField(factory.makeFieldBinding(AjcMemberMaker.perSingletonField(
                                                typeX)));
                                methods[0] = new AspectClinit((Clinit)methods[0], compilationResult, false, true);
                        } else if (perClause.getKind() == PerClause.PERCFLOW) {
                                binding.addField(
-                                       world.makeFieldBinding(
+                                       factory.makeFieldBinding(
                                                AjcMemberMaker.perCflowField(
                                                        typeX)));
                                methods[0] = new AspectClinit((Clinit)methods[0], compilationResult, true, false);
@@ -583,7 +583,7 @@ public class AspectDeclaration extends MemberTypeDeclaration {
                                codeStream.aload_0();
                                AstUtil.generateParameterLoads(accessMethod.parameters, codeStream);
                                codeStream.invokespecial(
-                                       world.makeMethodBinding(method));
+                                       factory.makeMethodBinding(method));
                                AstUtil.generateReturn(accessMethod.returnType, codeStream);
                                // body ends here
                        }});
@@ -600,7 +600,7 @@ public class AspectDeclaration extends MemberTypeDeclaration {
        }
        
        private void generateInlineAccessors(ClassFile classFile, final InlineAccessFieldBinding accessField, final ResolvedMember field) {
-               final FieldBinding fieldBinding = world.makeFieldBinding(field);
+               final FieldBinding fieldBinding = factory.makeFieldBinding(field);
                generateMethod(classFile, accessField.reader, 
                new BodyGenerator() {
                        public void generate(CodeStream codeStream) {
@@ -645,9 +645,9 @@ public class AspectDeclaration extends MemberTypeDeclaration {
                                AstUtil.generateParameterLoads(accessMethod.parameters, codeStream);
                                
                                if (method.isStatic()) {
-                                       codeStream.invokestatic(world.makeMethodBinding(method));
+                                       codeStream.invokestatic(factory.makeMethodBinding(method));
                                } else {
-                                   codeStream.invokevirtual(world.makeMethodBinding(method));
+                                   codeStream.invokevirtual(factory.makeMethodBinding(method));
                                }
                                        
                                AstUtil.generateReturn(accessMethod.returnType, codeStream);
@@ -724,19 +724,12 @@ public class AspectDeclaration extends MemberTypeDeclaration {
                checkSpec(classScope);
                if (ignoreFurtherInvestigation) return;
                
-               world = EclipseFactory.fromScopeLookupEnvironment(scope);
-//             concreteName = world.lookupConcreteName(binding);
-//             typeX = concreteName.getResolvedTypeX();
-
+               factory = EclipseFactory.fromScopeLookupEnvironment(scope);
                
                if (isPrivileged) {
                        binding.privilegedHandler = new PrivilegedHandler(this);
                }
                
-//             CrosscuttingMembers xcut = new CrosscuttingMembers(typeX);
-//             concreteName.crosscuttingMembers = xcut;
-               //typeX.crosscuttingMembers = xcut;
-               //XXXxcut.setPerClause(buildPerClause(scope));
                buildPerClause(scope);
                
                if (methods != null) {
@@ -752,7 +745,11 @@ public class AspectDeclaration extends MemberTypeDeclaration {
                }
 
                //??? timing is weird
-               world.getWorld().getCrosscuttingMembersSet().addOrReplaceAspect(typeX);         
+               factory.getWorld().getCrosscuttingMembersSet().addOrReplaceAspect(typeX);
+               
+               if (typeX.getSuperclass().isAspect() && !typeX.getSuperclass().isExposedToWeaver()) {
+                       factory.getWorld().getCrosscuttingMembersSet().addOrReplaceAspect(typeX.getSuperclass());
+               }
        }
 
 
index f36c6eeff9f7fc38332bad95f2c8d894c51fdc09..dbb985ab00da8a9767b9a0df6369d877a56241a8 100644 (file)
@@ -59,7 +59,10 @@ public class EclipseSourceType extends ResolvedTypeX.ConcreteName {
 
        public boolean isAspect() {
                return binding.scope.referenceContext instanceof AspectDeclaration;
+       }
 
+       public boolean isWovenBy(ResolvedTypeX aspectType) {
+               return false;
        }
        
        public ResolvedTypeX getSuperclass() {
index 61f37145a4b63a0fca89370ee48c2b55719dd59f..13e91184f5e34db1a67008af94901a891db2a4f9 100644 (file)
@@ -44,13 +44,13 @@ public class InlineAccessFieldBinding extends FieldBinding {
                super(baseField, baseField.declaringClass);
 
                this.reader = new SimpleSyntheticAccessMethodBinding(
-                       inAspect.world.makeMethodBinding(
+                       inAspect.factory.makeMethodBinding(
                                AjcMemberMaker.inlineAccessMethodForFieldGet(
-                                       inAspect.typeX, inAspect.world.makeResolvedMember(baseField)
+                                       inAspect.typeX, inAspect.factory.makeResolvedMember(baseField)
                        )));
-               this.writer = new SimpleSyntheticAccessMethodBinding(inAspect.world.makeMethodBinding(
+               this.writer = new SimpleSyntheticAccessMethodBinding(inAspect.factory.makeMethodBinding(
                                AjcMemberMaker.inlineAccessMethodForFieldSet(
-                                       inAspect.typeX, inAspect.world.makeResolvedMember(baseField)
+                                       inAspect.typeX, inAspect.factory.makeResolvedMember(baseField)
                        )));
                        
                this.constant = AstNode.NotAConstant;
index 67d2aaa3616b5f672a6e1e66668d44f7b4bfb0cc..a2bfe7d7723584678171a470bee2830e15a1c4d0 100644 (file)
@@ -33,13 +33,13 @@ public class PrivilegedFieldBinding extends FieldBinding {
                super(baseField, baseField.declaringClass);
 
                this.reader = new SimpleSyntheticAccessMethodBinding(
-                       inAspect.world.makeMethodBinding(
+                       inAspect.factory.makeMethodBinding(
                                AjcMemberMaker.privilegedAccessMethodForFieldGet(
-                                       inAspect.typeX, inAspect.world.makeResolvedMember(baseField)
+                                       inAspect.typeX, inAspect.factory.makeResolvedMember(baseField)
                        )));
-               this.writer = new SimpleSyntheticAccessMethodBinding(inAspect.world.makeMethodBinding(
+               this.writer = new SimpleSyntheticAccessMethodBinding(inAspect.factory.makeMethodBinding(
                                AjcMemberMaker.privilegedAccessMethodForFieldSet(
-                                       inAspect.typeX, inAspect.world.makeResolvedMember(baseField)
+                                       inAspect.typeX, inAspect.factory.makeResolvedMember(baseField)
                        )));
                        
                this.constant = AstNode.NotAConstant;
index 89e8c8f4b1b3e170315e4efa4446f4be36f10aad..f6b482b68e4bd7da13892c731f67d092bb4f8cff 100644 (file)
@@ -44,7 +44,7 @@ public class PrivilegedHandler implements IPrivilegedHandler {
        }
 
        public FieldBinding getPrivilegedAccessField(FieldBinding baseField, AstNode location) {
-               ResolvedMember key = inAspect.world.makeResolvedMember(baseField);
+               ResolvedMember key = inAspect.factory.makeResolvedMember(baseField);
                if (accessors.containsKey(key)) return (FieldBinding)accessors.get(key);
                FieldBinding ret = new PrivilegedFieldBinding(inAspect, baseField);
                checkWeaveAccess(key.getDeclaringType(), location);
@@ -53,14 +53,14 @@ public class PrivilegedHandler implements IPrivilegedHandler {
        }
 
        public MethodBinding getPrivilegedAccessMethod(MethodBinding baseMethod, AstNode location) {
-               ResolvedMember key = inAspect.world.makeResolvedMember(baseMethod);
+               ResolvedMember key = inAspect.factory.makeResolvedMember(baseMethod);
                if (accessors.containsKey(key)) return (MethodBinding)accessors.get(key);
                
                MethodBinding ret;
                if (baseMethod.isConstructor()) {
                        ret = baseMethod;
                } else {
-                       ret = inAspect.world.makeMethodBinding(
+                       ret = inAspect.factory.makeMethodBinding(
                        AjcMemberMaker.privilegedAccessMethodForMethod(inAspect.typeX, key)
                        );
                }
@@ -73,14 +73,14 @@ public class PrivilegedHandler implements IPrivilegedHandler {
        public void notePrivilegedTypeAccess(ReferenceBinding type, AstNode location) {
                ResolvedMember key =
                        new ResolvedMember(Member.STATIC_INITIALIZATION,
-                               inAspect.world.fromEclipse(type), 0, ResolvedTypeX.VOID, "", TypeX.NONE);
+                               inAspect.factory.fromEclipse(type), 0, ResolvedTypeX.VOID, "", TypeX.NONE);
                
                checkWeaveAccess(key.getDeclaringType(), location);
                accessors.put(key, key);
        }
 
        private void checkWeaveAccess(TypeX typeX, AstNode location) {
-               World world = inAspect.world.getWorld();
+               World world = inAspect.factory.getWorld();
                Lint.Kind check = world.getLint().typeNotExposedToWeaver;
                if (check.isEnabled()) {
                        if (!world.resolve(typeX).isExposedToWeaver()) {
index 181b78628308ef51fbb446629d76527fdd165374..5a495ed8ef174e4b3c3f8d4eede19115cb5f978f 100644 (file)
@@ -9,6 +9,7 @@ public class Client {
                System.out.println(c.value);
                ConcreteA.Marker m = c;
                System.out.println(m.value);
+               System.out.println(ConcreteA.getPrivateValue(c));
                try {
                        new Client();
                } catch (SoftException se) {
diff --git a/org.aspectj.ajdt.core/testdata/src1/binary/client/Client1.java b/org.aspectj.ajdt.core/testdata/src1/binary/client/Client1.java
new file mode 100644 (file)
index 0000000..426c3cd
--- /dev/null
@@ -0,0 +1,32 @@
+package client;
+
+import lib.AbstractA;
+import org.aspectj.lang.*;
+
+public class Client1 {
+       public static void main(String[] args) {
+               C1 c = new C1();
+               System.out.println(c.value);
+               AbstractA.Marker m = c;
+               System.out.println(m.value);
+               System.out.println(AbstractA.getPrivateValue(c));
+               
+               FooMarkMe f = new FooMarkMe();
+               System.out.println(f.value);
+               
+               m = f;
+       }       
+
+}
+
+class C1 implements AbstractA.Marker {
+       public void m() {
+               System.out.println("hello");
+       }
+}
+
+class FooMarkMe {
+       public void m() {
+               System.out.println("hello");
+       }
+}
diff --git a/org.aspectj.ajdt.core/testdata/src1/binary/client/MyAspect.aj b/org.aspectj.ajdt.core/testdata/src1/binary/client/MyAspect.aj
new file mode 100644 (file)
index 0000000..317ecc9
--- /dev/null
@@ -0,0 +1,6 @@
+package client;\r
+import lib.AbstractA;\r
+\r
+aspect MyAspect extends AbstractA {\r
+       protected pointcut scope();\r
+}
\ No newline at end of file
diff --git a/org.aspectj.ajdt.core/testdata/src1/binary/client/MyAspect1.aj b/org.aspectj.ajdt.core/testdata/src1/binary/client/MyAspect1.aj
new file mode 100644 (file)
index 0000000..bec3ad7
--- /dev/null
@@ -0,0 +1,6 @@
+package client;\r
+import lib.AbstractA;\r
+\r
+aspect MyAspect1 extends AbstractA {\r
+       protected pointcut scope(): within(client.*);\r
+}
\ No newline at end of file
diff --git a/org.aspectj.ajdt.core/testdata/src1/binary/lib/AbstractA.aj b/org.aspectj.ajdt.core/testdata/src1/binary/lib/AbstractA.aj
new file mode 100644 (file)
index 0000000..a8a69ab
--- /dev/null
@@ -0,0 +1,21 @@
+package lib;\r
+\r
+public abstract aspect AbstractA {\r
+    public interface Marker {}\r
+    \r
+    public String Marker.value = "public";\r
+    private String Marker.pValue = "private";\r
+    \r
+    public static String getPrivateValue(Marker m) { return m.pValue; }\r
+\r
+       protected abstract pointcut scope();\r
+\r
+    declare error: scope() && within(Marker+) && call(* java.io.PrintStream.println(*)):\r
+        "use a proper logger";\r
+    \r
+    before(Marker m): this(m) && execution(new(..)) {\r
+        System.err.println("making a Marker: " + m + " with " + m.pValue);\r
+    }\r
+    \r
+    declare parents: *..*MarkMe implements Marker;\r
+}
\ No newline at end of file
index 02a09c87d5e8c86da98a44d69e95e4fa9a5efc09..15a3d5cc65df88258ac7a66e93291d1fe9b360e0 100644 (file)
@@ -4,7 +4,9 @@ public aspect ConcreteA {
     public interface Marker {}\r
     \r
     public String Marker.value = "public";\r
-    //private String Marker.pValue = "private";\r
+    private String Marker.pValue = "private";\r
+    \r
+    public static String getPrivateValue(Marker m) { return m.pValue; }\r
 \r
     public static class MyException extends Exception {}\r
 \r
index 07fb71daec07b05307bed38d000df17c49f31d74..c98a12a11752da821c9d40e5f885e51107721a51 100644 (file)
@@ -38,6 +38,7 @@ public class BinaryFormsTestCase extends CommandTestCase {
                args.add("out");
                
                args.add("testdata/src1/binary/lib/ConcreteA.aj");
+               args.add("testdata/src1/binary/lib/AbstractA.aj");
                
                CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS);
                
@@ -52,34 +53,66 @@ public class BinaryFormsTestCase extends CommandTestCase {
                args.add("out");
                
                args.add("testdata/src1/binary/client/Client.java");
+               args.add("testdata/src1/binary/client/Client1.java");
                
                CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS);
                
                TestUtil.runMain("out;out/lib.jar", "client.Client");
-       }
-
-
-       public void XXXtestJar1() throws IOException {
-               List args = new ArrayList();
-               args.add("-outjar");
-               args.add("out/megatrace.jar");
+               TestUtil.runMain("out;out/lib.jar", "client.Client1");
+               
+               args = new ArrayList();
+               args.add("-aspectpath");
+               args.add("out/lib.jar");
 
                args.add("-classpath");
                args.add("../runtime/bin");
                
-               args.add("testdata/src1/trace/MegaTrace.java");
-               args.add("testdata/src1/trace/ExecTrace.java");
+               args.add("-d");
+               args.add("out");
+               
+               args.add("testdata/src1/binary/client/MyAspect.aj");
+               args.add("testdata/src1/binary/client/Client1.java");
                
                CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS);
                
+               TestUtil.runMain("out;out/lib.jar", "client.Client1");
+
                args = new ArrayList();
                args.add("-aspectpath");
-               args.add("out/megatrace.jar");
+               args.add("out/lib.jar");
 
                args.add("-classpath");
                args.add("../runtime/bin");
                
-               args.add("testdata/src1/tracep1/TraceTest.java");
+               args.add("-d");
+               args.add("out");
+               
+               args.add("testdata/src1/binary/client/MyAspect1.aj");
+               args.add("testdata/src1/binary/client/Client1.java");
+               
+               CommandTestCase.runCompiler(args, new int[] {24, 30});
+
+               args = new ArrayList();
+               args.add("-classpath");
+               args.add("../runtime/bin;out/lib.jar");
+               
+               args.add("-d");
+               args.add("out");
+               
+               args.add("testdata/src1/binary/client/Client1.java");
+               
+               CommandTestCase.runCompiler(args, new int[] {9, 11, 15, 17});
+               
+               args = new ArrayList();
+               args.add("-classpath");
+               args.add("../runtime/bin;out/lib.jar");
+               args.add("-Xlint:error");
+               
+               args.add("-d");
+               args.add("out");
+               
+               args.add("testdata/src1/binary/client/MyAspect.aj");
+               args.add("testdata/src1/binary/client/Client1.java");
                
                CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS);
        }
index 7eda16abb189823409c0450ff5619bc97e8307e1..d268f2fbae502045835fc5726b913ad5c579b8c3 100644 (file)
@@ -49,7 +49,7 @@ public abstract class ConcreteTypeMunger implements PartialOrder.PartialComparab
 
        public boolean matches(ResolvedTypeX onType) {
                if (munger == null) throw new RuntimeException("huh: " + this);
-               return munger.matches(onType);
+               return munger.matches(onType, aspectType);
        }
 
        public ResolvedMember getMatchingSyntheticMember(Member member) {
index 1064d7e83032f4a748dbaca8feccbfa6830c76f4..504f030011461e1cd1ce0fe7c439115f93584df2 100644 (file)
@@ -59,7 +59,7 @@ public class PerObjectInterfaceTypeMunger extends ResolvedTypeMunger {
                return testPointcut;
        }
        
-       public boolean matches(ResolvedTypeX matchType) {
+       public boolean matches(ResolvedTypeX matchType, ResolvedTypeX aspectType) {
                //??? this matches many more types than are needed
                return !matchType.isInterface();
        }
index b2365c388d92456302cbbcc5bb6fcfcd6891c1e3..8944e788fc72fc38b7263c93bd914d0bbd6da4a9 100644 (file)
@@ -49,14 +49,17 @@ public abstract class ResolvedTypeMunger {
     }
     
     
-    public boolean matches(ResolvedTypeX matchType) {
+    public boolean matches(ResolvedTypeX matchType, ResolvedTypeX aspectType) {
        ResolvedTypeX onType = matchType.getWorld().resolve(signature.getDeclaringType());
        //System.err.println("matching: " + this + " to " + matchType + " onType = " + onType);
                if (matchType.equals(onType)) { 
-                       if (!onType.isExposedToWeaver() &&
-                                       matchType.getWorld().getLint().typeNotExposedToWeaver.isEnabled())
-                       {
-                               matchType.getWorld().getLint().typeNotExposedToWeaver.signal(matchType.getName(), signature.getSourceLocation());
+                       if (!onType.isExposedToWeaver()) {
+                               if (!onType.isWovenBy(aspectType)) {
+                                       if (matchType.getWorld().getLint().typeNotExposedToWeaver.isEnabled()) {
+                                               matchType.getWorld().getLint().typeNotExposedToWeaver.signal(
+                                                       matchType.getName(), signature.getSourceLocation());
+                                       }
+                               }
                        }
                        return true;
                }
index 2d718388111d4f135df7c9bacf2579188d6b03fb..6249a9b213492d153e1a1ed11e74a17d4042200f 100644 (file)
@@ -564,6 +564,10 @@ public abstract class ResolvedTypeX extends TypeX {
                public boolean isExposedToWeaver() {
                        return delegate.isExposedToWeaver();  //??? where does this belong
                }
+               
+               public boolean isWovenBy(ResolvedTypeX aspectType) {
+                       return delegate.isWovenBy(aspectType);
+               }
 
                public ResolvedMember[] getDeclaredFields() {
                        return delegate.getDeclaredFields();
@@ -646,6 +650,7 @@ public abstract class ResolvedTypeX extends TypeX {
 
                public abstract ISourceLocation getSourceLocation();
 
+               public abstract boolean isWovenBy(ResolvedTypeX aspectType);
 
                public ISourceContext getSourceContext() {
                        return sourceContext;
@@ -1213,4 +1218,8 @@ public abstract class ResolvedTypeX extends TypeX {
        
        public ISourceLocation getSourceLocation() { return null; }
        public boolean isExposedToWeaver() { return false; }
+       public boolean isWovenBy(ResolvedTypeX aspectType) {
+               return false;
+       }
+
 }
index d26e63a386becc4d25e972b3db1f8a2adf535079..05d7248b160b8fe558a680e28a38eda5b5a70c21 100644 (file)
@@ -146,8 +146,6 @@ public class BcelObjectType extends ResolvedTypeX.ConcreteName {
                ret[len] = d;
                pointcuts = ret;
        }
-               
-               
 
     public boolean isAspect() {
                return perClause != null;
@@ -191,11 +189,6 @@ public class BcelObjectType extends ResolvedTypeX.ConcreteName {
                return perClause;
        }
     
-    
-    
-    
-    
-    
     JavaClass getJavaClass() {
         return javaClass;
     }
@@ -213,16 +206,12 @@ public class BcelObjectType extends ResolvedTypeX.ConcreteName {
        isObject = (javaClass.getSuperclassNameIndex() == 0);
         unpackAspectAttributes();
     }
-    
-    
-    /**
-     * Switch to a new JavaClass and clear all caches
-     */
-    void replaceJavaClass(JavaClass jc) {
-       if (this.javaClass == jc) return;
-       
-       this.javaClass = jc;
-               resetState();
+
+       //XXX we've lost information so that we don't know who wove into this
+       //    class, only that someone did.  For better error messages we should
+       //    probably expand the information in weaverState
+       public boolean isWovenBy(ResolvedTypeX aspectType) {
+               return weaverState == WeaverStateKind.Woven;
        }
 
        public WeaverStateKind getWeaverState() {