]> source.dussan.org Git - aspectj.git/commitdiff
Fix to ensure woven methods don't lose their annotations.
authoraclement <aclement>
Mon, 24 Jan 2005 09:38:48 +0000 (09:38 +0000)
committeraclement <aclement>
Mon, 24 Jan 2005 09:38:48 +0000 (09:38 +0000)
tests/java5/annotations/attarget/AtTargetAspect.java [new file with mode: 0644]
tests/java5/annotations/attarget/Program.java [new file with mode: 0644]
tests/src/org/aspectj/systemtest/ajc150/Ajc150TestsNoHarness.java
tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java
tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150_NeedJava15.java
tests/src/org/aspectj/systemtest/ajc150/Annotations.java
tests/src/org/aspectj/systemtest/ajc150/AnnotationsBinaryWeaving.java [new file with mode: 0644]
tests/src/org/aspectj/systemtest/ajc150/TestUtils.java
weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java

diff --git a/tests/java5/annotations/attarget/AtTargetAspect.java b/tests/java5/annotations/attarget/AtTargetAspect.java
new file mode 100644 (file)
index 0000000..8e92382
--- /dev/null
@@ -0,0 +1,7 @@
+public aspect AtTargetAspect {
+
+  before(): call(* *(..)) && @target(@MyAnnotation) {
+    System.err.println("advice running");
+  }
+    
+}
diff --git a/tests/java5/annotations/attarget/Program.java b/tests/java5/annotations/attarget/Program.java
new file mode 100644 (file)
index 0000000..a56d5fb
--- /dev/null
@@ -0,0 +1,25 @@
+import java.lang.annotation.*;
+
+@MyAnnotation
+public class Program {
+
+  public static void main(String []argv) {
+    Program p = new Program();
+    p.m1();
+    p.m2();
+  }
+
+
+  @MyAnnotation
+  public void m1() {
+    System.err.println("m1 method");
+  }
+
+  public void m2() {
+    System.err.println("m2 method");
+  }
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@interface MyAnnotation {}
+
index 0fa039be05f0ddc149944a53f90f184030aa574c..6ecac51899478d0bc69480ddc0eaabed22d3699a 100644 (file)
@@ -14,8 +14,6 @@ import java.io.File;
 
 import org.aspectj.apache.bcel.classfile.JavaClass;
 import org.aspectj.apache.bcel.classfile.Method;
-import org.aspectj.apache.bcel.util.ClassPath;
-import org.aspectj.apache.bcel.util.SyntheticRepository;
 import org.aspectj.tools.ajc.CompilationResult;
 
 
@@ -77,25 +75,4 @@ public class Ajc150TestsNoHarness extends TestUtils {
        CompilationResult cR = ajc(baseDir,new String[]{"PR83303.java"});
        assertTrue("Should be no errors:"+cR,!cR.hasErrorMessages());
   }
-  
-  
-  
-  
-  
-  
-  
-  
-  ///////////////////////////////////////// TESTCASE HELPER METHODS BELOW HERE //////////////////////////
-  
-  // Some util methods for accessing .class contents as BCEL objects
-  
-  public SyntheticRepository createRepos(File cpentry) {
-       ClassPath cp = new ClassPath(cpentry+File.pathSeparator+System.getProperty("java.class.path"));
-       return SyntheticRepository.getInstance(cp);
-  }
-  
-  private JavaClass getClassFrom(File where,String clazzname) throws ClassNotFoundException {
-       SyntheticRepository repos = createRepos(where);
-       return repos.loadClass(clazzname);
-  }
 }
\ No newline at end of file
index a528692bdae442a8af52abd87c7f84918dbbb3f5..9e38feb707d1c63638cbce5bb9df38517759fa87 100644 (file)
@@ -29,7 +29,7 @@ public class AllTestsAspectJ150 {
                suite.addTest(AccBridgeMethods.suite());
                suite.addTestSuite(CovarianceTests.class);
                suite.addTestSuite(Enums.class);
-               suite.addTestSuite(Annotations.class);
+               suite.addTestSuite(AnnotationsBinaryWeaving.class);
                suite.addTestSuite(AnnotationPointcutsTests.class);
                suite.addTestSuite(VarargsTests.class);
                suite.addTestSuite(AnnotationRuntimeTests.class);
index ff0f1920249de0f6fd4619448efc0b88bd2a3298..47a2342f88cea4c45fd60a829b4780671e1b8694 100644 (file)
@@ -23,6 +23,7 @@ public class AllTestsAspectJ150_NeedJava15 {
                //$JUnit-BEGIN$
                suite.addTestSuite(Ajc150TestsRequireJava15.class);
                suite.addTestSuite(Autoboxing.class);           
+               suite.addTestSuite(Annotations.class);
                
                //$JUnit-END$
                return suite;
index 1a8b83cc91897d07b59b73eebfacc645fa007492..9c9c9935a09f6c9cddfc710353dbfa543208ed4e 100644 (file)
 package org.aspectj.systemtest.ajc150;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.aspectj.bridge.IMessage;
+import org.aspectj.apache.bcel.classfile.JavaClass;
+import org.aspectj.apache.bcel.classfile.Method;
 import org.aspectj.tools.ajc.CompilationResult;
 
-
-/**
- * Annotations, the rules/tests:
- * 
- * 1. cannot make ITD (C,M or F) on an annotation
- * 2. cannot use declare parents to change the super type of an annotation
- * 3. cannot use decp to make an annotation type implement an interface
- * 4. cannot use decp to dec java.lang.annotation.Annotation as the parent of any type
- * 5. cannot extend set of values in an annotation via an ITD like construct
- * 6. Compilation error if you explicitly identify an Annotation type.  
- * 7. Lint warning if a non-explicit type pattern would match an annotation type.
- */
 public class Annotations extends TestUtils {
        
   protected void setUp() throws Exception {
        super.setUp();
        baseDir = new File("../tests/java5/annotations");
   }
-       
-  // Cannot make ITD (c/m/f) on an annotation
-  public void test001_itdsOnAnnotationsNotAllowed() {
-       CompilationResult cR = binaryWeave("testcode.jar","AnnotationAspect01.aj",3,0);
-       assertTrue("Expected three message about ITDs not allowed on Annotations but got: #"+
-                       cR.getErrorMessages().size()+": \n"+cR.getErrorMessages(),
-                       cR.getErrorMessages().size()==3);
-       IMessage msg1_ctor   = (IMessage)cR.getErrorMessages().get(0);
-       IMessage msg2_method = (IMessage)cR.getErrorMessages().get(1);
-       IMessage msg3_field  = (IMessage)cR.getErrorMessages().get(2);
-       assertTrue("Expected message about ITDCs on annotations not allowed, but got: \n"+msg1_ctor,
-                       msg1_ctor.toString().indexOf("can't make inter-type constructor declarations")!=-1);
-       assertTrue("Expected message about ITDMs on annotations not allowed, but got: \n"+msg2_method,
-                       msg2_method.toString().indexOf("can't make inter-type method declarations")!=-1);
-       assertTrue("Expected message about ITDFs on annotations not allowed, but got: \n"+msg3_field,
-                       msg3_field.toString().indexOf("can't make inter-type field declarations")!=-1);
-       verifyWeavingMessagesOutput(cR,new String[]{});
+  
+  public void testCompilingAnnotation() {
+       CompilationResult cR = ajc(baseDir,new String[]{"SimpleAnnotation.java","-1.5"});
+       MessageSpec ms = new MessageSpec(null,null);
+       assertMessages(cR,ms);
   }
   
-  // Deals with the cases where an explicit type is specified and it is an annotation type
-  public void test002_decpOnAnnotationNotAllowed_errors() {
-       CompilationResult cR = binaryWeave("testcode.jar","AnnotationAspect04.aj",3,0,true,new String[]{"-source","1.5"});
-       IMessage msg = (IMessage)cR.getErrorMessages().get(1);
-       assertTrue("Expected a message about can't use decp to alter supertype of an annotation: "+msg,
-                       msg.toString().indexOf("to alter supertype of annotation type")!=-1);
-       msg = (IMessage)cR.getErrorMessages().get(2);
-       assertTrue("Expected a message about can't use decp to make annotation implement interface: "+msg,
-                       msg.toString().indexOf("implement an interface")!=-1);
-       msg = (IMessage)cR.getErrorMessages().get(0);
-       assertTrue("Expected a message about can't use decp to make Annotation parent of another type: "+msg,
-                       msg.toString().indexOf("the parent of type")!=-1);
-       verifyWeavingMessagesOutput(cR,new String[]{});
+  public void testCompilingAnnotatedFile() {
+       CompilationResult cR = ajc(baseDir,new String[]{"AnnotatedType.java","SimpleAnnotation.java","-1.5"});
+       MessageSpec ms = new MessageSpec(null,null);
+       assertMessages(cR,ms);
   }
   
-  //Deals with the cases where an wild type pattern is specified and it hits an annotation type
-  public void test004_decpOnAnnotationNotAllowed_xlints() {
-       CompilationResult cR = binaryWeave("testcode.jar","AnnotationAspect05.aj",0,2,false);
-       IMessage msg = (IMessage)cR.getWarningMessages().get(0);
-       assertTrue("Expected a message about an annotation type matching a declare parents but being ignored: "+msg,
-                       msg.toString().indexOf("matches a declare parents type pattern")!=-1);
-       msg = (IMessage)cR.getWarningMessages().get(1);
-       assertTrue("Expected a message about an annotation type matching a declare parents but being ignored: "+msg,
-                       msg.toString().indexOf("matches a declare parents type pattern")!=-1);
-       verifyWeavingMessagesOutput(cR,new String[]{});
+  public void testCompilingUsingWithinAndAnnotationTypePattern() {
+       CompilationResult cR = ajc(new File(baseDir+File.separator+"within"),
+                       new String[]{"PlainWithin.java","PlainWithinTests.java","-1.5"});
+       List expectedInfoMessages = new ArrayList();
+       expectedInfoMessages.add(new Message(21,"positive within match on annotation"));
+       expectedInfoMessages.add(new Message(25,"negative within match on annotation"));
+       MessageSpec ms = new MessageSpec(expectedInfoMessages,null);
+       assertMessages(cR,ms);
   }
   
-  // TODO extra tests:
-  // declare parents with annotation pattern
-  // declare soft with annotation pattern
-  // declare warning with annotation pattern
-  // declare precedence with annotation pattern
+  /**
+   * We had a bug where annotations were not present in the output class file for methods
+   * that got woven.  This was due to unpacking bugs in LazyMethodGen.  This test compiles
+   * a simple program then checks the annotations were copied across.
+   */
+  public void testBugWithAnnotationsLostOnWovenMethods() throws ClassNotFoundException {
+       CompilationResult cR = ajc(new File(baseDir+File.separator+"attarget"),
+                       new String[]{"Program.java","AtTargetAspect.java","-1.5"});
+       System.err.println(cR.getStandardError());
+       List expectedInfoMessages = new ArrayList();
+       MessageSpec ms = new MessageSpec(null,null);
+       assertMessages(cR,ms);
+       
+       JavaClass jc = getClassFrom(ajc.getSandboxDirectory(),"Program");
+    Method[] meths = jc.getMethods();
+    for (int i = 0; i < meths.length; i++) {
+               Method method = meths[i];
+               if (method.getName().equals("m1")) {
+                       assertTrue("Didn't have annotations - were they lost? method="+method.getName(),method.getAnnotations().length==1);
+               }
+       }
+  }
 }
\ No newline at end of file
diff --git a/tests/src/org/aspectj/systemtest/ajc150/AnnotationsBinaryWeaving.java b/tests/src/org/aspectj/systemtest/ajc150/AnnotationsBinaryWeaving.java
new file mode 100644 (file)
index 0000000..c7510e1
--- /dev/null
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM 
+ * 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:
+ *    Andy Clement - initial API and implementation
+ *******************************************************************************/
+package org.aspectj.systemtest.ajc150;
+
+import java.io.File;
+
+import org.aspectj.bridge.IMessage;
+import org.aspectj.tools.ajc.CompilationResult;
+
+
+/**
+ * Annotations, the rules/tests:
+ * 
+ * 1. cannot make ITD (C,M or F) on an annotation
+ * 2. cannot use declare parents to change the super type of an annotation
+ * 3. cannot use decp to make an annotation type implement an interface
+ * 4. cannot use decp to dec java.lang.annotation.Annotation as the parent of any type
+ * 5. cannot extend set of values in an annotation via an ITD like construct
+ * 6. Compilation error if you explicitly identify an Annotation type.  
+ * 7. Lint warning if a non-explicit type pattern would match an annotation type.
+ */
+public class AnnotationsBinaryWeaving extends TestUtils {
+       
+  protected void setUp() throws Exception {
+       super.setUp();
+       baseDir = new File("../tests/java5/annotations");
+  }
+       
+  // Cannot make ITD (c/m/f) on an annotation
+  public void test001_itdsOnAnnotationsNotAllowed() {
+       CompilationResult cR = binaryWeave("testcode.jar","AnnotationAspect01.aj",3,0);
+       assertTrue("Expected three message about ITDs not allowed on Annotations but got: #"+
+                       cR.getErrorMessages().size()+": \n"+cR.getErrorMessages(),
+                       cR.getErrorMessages().size()==3);
+       IMessage msg1_ctor   = (IMessage)cR.getErrorMessages().get(0);
+       IMessage msg2_method = (IMessage)cR.getErrorMessages().get(1);
+       IMessage msg3_field  = (IMessage)cR.getErrorMessages().get(2);
+       assertTrue("Expected message about ITDCs on annotations not allowed, but got: \n"+msg1_ctor,
+                       msg1_ctor.toString().indexOf("can't make inter-type constructor declarations")!=-1);
+       assertTrue("Expected message about ITDMs on annotations not allowed, but got: \n"+msg2_method,
+                       msg2_method.toString().indexOf("can't make inter-type method declarations")!=-1);
+       assertTrue("Expected message about ITDFs on annotations not allowed, but got: \n"+msg3_field,
+                       msg3_field.toString().indexOf("can't make inter-type field declarations")!=-1);
+       verifyWeavingMessagesOutput(cR,new String[]{});
+  }
+  
+  // Deals with the cases where an explicit type is specified and it is an annotation type
+  public void test002_decpOnAnnotationNotAllowed_errors() {
+       CompilationResult cR = binaryWeave("testcode.jar","AnnotationAspect04.aj",3,0,true,new String[]{"-source","1.5"});
+       IMessage msg = (IMessage)cR.getErrorMessages().get(1);
+       assertTrue("Expected a message about can't use decp to alter supertype of an annotation: "+msg,
+                       msg.toString().indexOf("to alter supertype of annotation type")!=-1);
+       msg = (IMessage)cR.getErrorMessages().get(2);
+       assertTrue("Expected a message about can't use decp to make annotation implement interface: "+msg,
+                       msg.toString().indexOf("implement an interface")!=-1);
+       msg = (IMessage)cR.getErrorMessages().get(0);
+       assertTrue("Expected a message about can't use decp to make Annotation parent of another type: "+msg,
+                       msg.toString().indexOf("the parent of type")!=-1);
+       verifyWeavingMessagesOutput(cR,new String[]{});
+  }
+  
+  //Deals with the cases where an wild type pattern is specified and it hits an annotation type
+  public void test004_decpOnAnnotationNotAllowed_xlints() {
+       CompilationResult cR = binaryWeave("testcode.jar","AnnotationAspect05.aj",0,2,false);
+       IMessage msg = (IMessage)cR.getWarningMessages().get(0);
+       assertTrue("Expected a message about an annotation type matching a declare parents but being ignored: "+msg,
+                       msg.toString().indexOf("matches a declare parents type pattern")!=-1);
+       msg = (IMessage)cR.getWarningMessages().get(1);
+       assertTrue("Expected a message about an annotation type matching a declare parents but being ignored: "+msg,
+                       msg.toString().indexOf("matches a declare parents type pattern")!=-1);
+       verifyWeavingMessagesOutput(cR,new String[]{});
+  }
+}
\ No newline at end of file
index 180f9a7c7be35a198998b7fc8bb1f2c7f837fc73..69b3b9f4eb8cf852c573a86772808a5a09311359 100644 (file)
@@ -16,6 +16,9 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
+import org.aspectj.apache.bcel.classfile.JavaClass;
+import org.aspectj.apache.bcel.util.ClassPath;
+import org.aspectj.apache.bcel.util.SyntheticRepository;
 import org.aspectj.bridge.IMessage;
 import org.aspectj.tools.ajc.AjcTestCase;
 import org.aspectj.tools.ajc.CompilationResult;
@@ -119,4 +122,14 @@ public abstract class TestUtils extends AjcTestCase {
                sb.append("------------------------\n");
                return sb.toString();
        }
+       
+         public SyntheticRepository createRepos(File cpentry) {
+               ClassPath cp = new ClassPath(cpentry+File.pathSeparator+System.getProperty("java.class.path"));
+               return SyntheticRepository.getInstance(cp);
+         }
+         
+         protected JavaClass getClassFrom(File where,String clazzname) throws ClassNotFoundException {
+               SyntheticRepository repos = createRepos(where);
+               return repos.loadClass(clazzname);
+         }
 }
index 5da038ef6eb5b71ef95bea358c566b0e12089d54..f4b24adff08ac4a0ee01142c99262829211eaa50 100644 (file)
@@ -49,6 +49,7 @@ import org.aspectj.apache.bcel.generic.MethodGen;
 import org.aspectj.apache.bcel.generic.ObjectType;
 import org.aspectj.apache.bcel.generic.Select;
 import org.aspectj.apache.bcel.generic.Type;
+import org.aspectj.apache.bcel.generic.annotation.AnnotationGen;
 import org.aspectj.bridge.IMessage;
 import org.aspectj.bridge.ISourceLocation;
 import org.aspectj.weaver.AjAttribute;
@@ -82,6 +83,7 @@ public final class LazyMethodGen {
     private  String[]        declaredExceptions;
     private  InstructionList body; // leaving null for abstracts
     private  Attribute[]     attributes;
+    private AnnotationGen[]  annotations;
     /* private */ final LazyClassGen    enclosingClass;   
     private final BcelMethod      memberView;
     int highestLineNumber = 0;
@@ -188,6 +190,7 @@ public final class LazyMethodGen {
 
                this.declaredExceptions = gen.getExceptions();
                this.attributes = gen.getAttributes();
+               this.annotations = gen.getAnnotations();
                this.maxLocals = gen.getMaxLocals();
         
 //             this.returnType = BcelWorld.makeBcelType(memberView.getReturnType());
@@ -777,10 +780,17 @@ public final class LazyMethodGen {
         for (int i = 0, len = declaredExceptions.length; i < len; i++) {
             gen.addException(declaredExceptions[i]);
         }
+        
         for (int i = 0, len = attributes.length; i < len; i++) {
             gen.addAttribute(attributes[i]);
         }
         
+        if (annotations!=null) { 
+          for (int i = 0, len = annotations.length; i < len; i++) {
+            gen.addAnnotation(annotations[i]);
+          }
+        }
+        
         if (isSynthetic) {
                        ConstantPoolGen cpg = gen.getConstantPool();
                        int index = cpg.addUtf8("Synthetic");