]> source.dussan.org Git - aspectj.git/commitdiff
Fix 436653: conditional aspect activation plus various polish
authorAndy Clement <aclement@gopivotal.com>
Tue, 7 Oct 2014 00:35:51 +0000 (17:35 -0700)
committerAndy Clement <aclement@gopivotal.com>
Tue, 7 Oct 2014 00:35:51 +0000 (17:35 -0700)
Modified test expectation system so it is possible to say
the test cares about one particular message and the rest
do not matter (prefix message string with '*') - crude but
quick.

Polished many places to exploit generics

Upgraded all the tests to work on Java8 - some serious changes
regarding ajdoc on Java8. Hopefully it has stayed backwards
compatible with earlier JDK versions (e.g. if using AspectJ 1.8.3+
with a JDK less than 8) but no explicit testing done for this.

57 files changed:
ajdoc/.isJava5 [new file with mode: 0644]
ajdoc/.settings/org.eclipse.jdt.core.prefs [deleted file]
ajdoc/src/org/aspectj/tools/ajdoc/HtmlDecorator.java
ajdoc/testsrc/org/aspectj/tools/ajdoc/AjdocOutputChecker.java
ajdoc/testsrc/org/aspectj/tools/ajdoc/CoverageTestCase.java
aspectj5rt/java5-src/org/aspectj/lang/annotation/RequiredTypes.java [new file with mode: 0644]
org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.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/testsrc/org/aspectj/tools/ajc/AjcTestCase.java
org.aspectj.matcher/src/org/aspectj/weaver/BCException.java
org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceTypeDelegate.java
org.aspectj.matcher/src/org/aspectj/weaver/GeneratedReferenceTypeDelegate.java
org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java
org.aspectj.matcher/src/org/aspectj/weaver/ReferenceTypeDelegate.java
org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java
org.aspectj.matcher/src/org/aspectj/weaver/WeaverStateInfo.java
org.aspectj.matcher/src/org/aspectj/weaver/patterns/ArgsPointcut.java
org.aspectj.matcher/src/org/aspectj/weaver/patterns/BasicTokenSource.java
org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java
org.aspectj.matcher/testsrc/org/aspectj/matcher/tools/CommonAdvancedPointcutExpressionTests.java
org.aspectj.matcher/testsrc/org/aspectj/weaver/CommonWorldTests.java
org.aspectj.matcher/testsrc/org/aspectj/weaver/TestUtils.java
org.aspectj.matcher/testsrc/org/aspectj/weaver/patterns/ArgsTestCase.java
org.aspectj.matcher/testsrc/org/aspectj/weaver/patterns/ModifiersPatternTestCase.java
testing/newsrc/org/aspectj/testing/CompileSpec.java
tests/bugs183/436653/A.java [new file with mode: 0644]
tests/bugs183/436653/AnnoX.java [new file with mode: 0644]
tests/bugs183/436653/B.java [new file with mode: 0644]
tests/bugs183/436653/Code.java [new file with mode: 0644]
tests/bugs183/436653/Runner.java [new file with mode: 0644]
tests/bugs183/436653/X.java [new file with mode: 0644]
tests/bugs183/436653/XA.java [new file with mode: 0644]
tests/bugs183/436653/XA2.java [new file with mode: 0644]
tests/bugs183/436653/XA3.java [new file with mode: 0644]
tests/bugs183/436653/XB.java [new file with mode: 0644]
tests/bugs183/436653/XCode.java [new file with mode: 0644]
tests/bugs183/436653/aop.xml [new file with mode: 0644]
tests/bugs183/436653/aop2.xml [new file with mode: 0644]
tests/bugs183/436653/bin/Code.class [new file with mode: 0644]
tests/java5/annotations/itds/AtItd3.aj
tests/java5/ataspectj/ajc-ant.xml
tests/java5/ataspectj/annotationGen/SA.aj [new file with mode: 0644]
tests/java5/ataspectj/annotationGen/SA.class [new file with mode: 0644]
tests/java5/ataspectj/annotationGen/SimpleAspect.aj
tests/java5/ataspectj/annotationGen/SimpleAspect.class [new file with mode: 0644]
tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java
tests/src/org/aspectj/systemtest/ajc170/ajc170.xml
tests/src/org/aspectj/systemtest/ajc173/ajc173.xml
tests/src/org/aspectj/systemtest/ajc183/Ajc183Tests.java
tests/src/org/aspectj/systemtest/ajc183/ajc183.xml
tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java
tests/src/org/aspectj/systemtest/incremental/tools/MultiProjTestCompilerConfiguration.java
weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java
weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
weaver/testsrc/org/aspectj/weaver/bcel/WorldTestCase.java
weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java

diff --git a/ajdoc/.isJava5 b/ajdoc/.isJava5
new file mode 100644 (file)
index 0000000..136d063
--- /dev/null
@@ -0,0 +1 @@
+  
\ No newline at end of file
diff --git a/ajdoc/.settings/org.eclipse.jdt.core.prefs b/ajdoc/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644 (file)
index 12ff67c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#Thu Oct 06 08:32:56 PDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.3
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=ignore
-org.eclipse.jdt.core.compiler.source=1.3
index bad35529fb78ad197b911ebac1adee38a42b058a..04af19f2d862ac2265deada4fccdfad4aab5ceb1 100644 (file)
@@ -224,7 +224,20 @@ class HtmlDecorator {
                                        classStartIndex = fileContents.toString().indexOf("<H2>\nClass ");
                                        br = false;
                                }
-                               if (classStartIndex != -1) {
+                               if (classStartIndex == -1) {
+                                       // Java8 looks more like this:
+                                       // <h2 title="Class A" class="title">Class A</h2>
+                                       classStartIndex = fileContents.toString().indexOf("<h2 title=\"Class ");
+                                       int classEndIndex = fileContents.toString().indexOf("</h2>", classStartIndex);
+                                       if (classEndIndex != -1) {
+                                               // Convert it to "<h2 title="Aspect A" class="title">Aspect A</h2>"
+                                               String classLine = fileContents.toString().substring(classStartIndex, classEndIndex);
+                                               String aspectLine = classLine.replaceAll("Class ","Aspect ");
+                                               fileContents.delete(classStartIndex, classEndIndex);
+                                               fileContents.insert(classStartIndex, aspectLine);
+                                       }
+                               }
+                               else if (classStartIndex != -1) {
                                        int classEndIndex = fileContents.toString().indexOf("</H2>", classStartIndex);
                                        if (classStartIndex != -1 && classEndIndex != -1) {
                                                String classLine = fileContents.toString().substring(classStartIndex, classEndIndex);
@@ -249,6 +262,19 @@ class HtmlDecorator {
                                                fileContents.insert(secondClassStartIndex, sb.toString());
                                        }
                                }
+                               else {
+                                       // Java8:
+                                       // <pre>static class <span class="typeNameLabel">ClassA.InnerAspect</span>
+                                       classStartIndex = fileContents.toString().indexOf("class <span class=\"typeNameLabel\">");
+                                       int classEndIndex = fileContents.toString().indexOf("</span>", classStartIndex);
+                                       if (classEndIndex != -1) {
+                                               // Convert it to "aspect <span class="typeNameLabel">ClassA.InnerAspect</span>"
+                                               String classLine = fileContents.toString().substring(classStartIndex, classEndIndex);
+                                               String aspectLine = "aspect"+fileContents.substring(classStartIndex+5,classEndIndex);
+                                               fileContents.delete(classStartIndex, classEndIndex);
+                                               fileContents.insert(classStartIndex, aspectLine);
+                                       }
+                               }
                        }
                }
                file.delete();
index 10e22fbf6ed390e315685037b6ad80198cff268a..dbe5125c51bd7ed30814598647552c2b49f2134e 100644 (file)
@@ -50,20 +50,18 @@ public class AjdocOutputChecker {
        }
 
        /**
-        * Returns those strings from the given array which aren't in the
-        * html file
+        * Returns those strings from the given array which aren't in the html file.
         * 
         * @param htmlFile
         * @param an array of requiredStrings
         * @return a List of those strings not found
         * @throws Exception
         */     
-       public static List /*String*/ getMissingStringsInFile(File htmlFile,
-                       String[] requiredStrings) throws Exception {
-               List missingStrings = new ArrayList();
+       public static List<String> getMissingStringsInFile(File htmlFile, String[] requiredStrings) throws Exception {
+               List<String> missingStrings = new ArrayList<String>();
                for (int i = 0; i < requiredStrings.length; i++) {
                        String string = requiredStrings[i];
-                       if (!containsString(htmlFile,string)) {
+                       if (!containsString(htmlFile, string)) {
                                missingStrings.add(string);
                        }
                }
index 0c0a0f26831f1b2993f1c19ff1da192a496af690..afa27b3195f6359755ff6afd55c9d724029eced2 100644 (file)
 import java.io.File;
 import java.util.List;
 
+import org.aspectj.util.FileUtil;
 import org.aspectj.util.LangUtil;
 
+import com.sun.org.apache.xml.internal.serializer.utils.Utils;
+
 
 /**
  * A long way to go until full coverage, but this is the place to add more.
@@ -128,14 +131,39 @@ public class CoverageTestCase extends AjdocTestCase {
         
                // ensure that the file is entitled "Aspect ClassA.InnerAspect" rather
                // than "Class ClassA.InnerAspect"
-               String[] strings = { "Aspect ClassA.InnerAspect",
+               
+               String[] strings = null;
+               if (LangUtil.is18VMOrGreater()) {
+                       strings = new String[] {
+                               "Aspect ClassA.InnerAspect",
+                               "<pre>static aspect <span class=\"typeNameLabel\">ClassA.InnerAspect</span>",
+                               "Class ClassA.InnerAspect",
+                               "<pre>static class <span class=\"typeNameLabel\">ClassA.InnerAspect</span>"};
+               }
+               else {
+                       strings = new String[] {
+                               "Aspect ClassA.InnerAspect",
                                "<PRE>static aspect <B>ClassA.InnerAspect</B><DT>extends java.lang.Object</DL>",
                                "Class ClassA.InnerAspect",
                                "<PRE>static class <B>ClassA.InnerAspect</B><DT>extends java.lang.Object</DL>"};
-               List missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
-               assertEquals("There should be 2 missing strings",2,missing.size());
-               assertTrue(htmlFile.getName() + " should not have Class as it's title",missing.contains("Class ClassA.InnerAspect"));
-               assertTrue(htmlFile.getName() + " should not have class in its subtitle",missing.contains("<PRE>static class <B>ClassA.InnerAspect</B><DT>extends java.lang.Object</DL>"));
+               }
+               List<String> missingStrings = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
+               StringBuilder buf = new StringBuilder();
+               for (String str:missingStrings) {
+                       buf.append(str).append("\n");
+               }
+               buf.append("HTMLFILE=\n").append(htmlFile).append("\n");
+               assertEquals("There should be 2 missing strings:\n"+buf.toString(), 2, missingStrings.size());
+               assertTrue(htmlFile.getName() + " should not have Class as it's title",
+                               missingStrings.contains("Class ClassA.InnerAspect"));
+               if (LangUtil.is18VMOrGreater()) {
+                       assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+                                       missingStrings.contains("<pre>static class <span class=\"typeNameLabel\">ClassA.InnerAspect</span>"));
+               }
+               else {
+                       assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+                                       missingStrings.contains("<PRE>static class <B>ClassA.InnerAspect</B><DT>extends java.lang.Object</DL>"));
+               }
                
                // get the html file for the enclosing class
         File htmlFileClass = new File(getAbsolutePathOutdir() + "/foo/ClassA.html");
@@ -146,14 +174,33 @@ public class CoverageTestCase extends AjdocTestCase {
         
                // ensure that the file is entitled "Class ClassA" and
                // has not been changed to "Aspect ClassA"
-               String[] classStrings = { "Class ClassA</H2>",
-                               "public abstract class <B>ClassA</B><DT>extends java.lang.Object<DT>",
+               String[] classStrings = null;
+               
+               if (LangUtil.is18VMOrGreater()) {
+                       classStrings = new String[] {
+                               "Class ClassA</h2>",
+                               "public abstract class <span class=\"typeNameLabel\">ClassA</span>",
                                "Aspect ClassA</H2>",
-                               "public abstract aspect <B>ClassA</B><DT>extends java.lang.Object<DT>"};
+                               "public abstract aspect <span class=\"typeNameLabel\">ClassA</span>"};
+               }
+               else {
+                       classStrings = new String[] {
+                                       "Class ClassA</H2>",
+                                       "public abstract class <B>ClassA</B><DT>extends java.lang.Object<DT>",
+                                       "Aspect ClassA</H2>",
+                                       "public abstract aspect <B>ClassA</B><DT>extends java.lang.Object<DT>"};
+               }
                List classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
-               assertEquals("There should be 2 missing strings",2,classMissing.size());
+               assertEquals("There should be 2 missing strings:\n"+classMissing,2,classMissing.size());
                assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",classMissing.contains("Aspect ClassA</H2>"));
-               assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",classMissing.contains("public abstract aspect <B>ClassA</B><DT>extends java.lang.Object<DT>"));
+               if (LangUtil.is18VMOrGreater()) {
+                       assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+                                       classMissing.contains("public abstract aspect <span class=\"typeNameLabel\">ClassA</span>"));                   
+               }
+               else {
+                       assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+                                       classMissing.contains("public abstract aspect <B>ClassA</B><DT>extends java.lang.Object<DT>"));
+               }
     }
     
     /**
@@ -623,15 +670,32 @@ public class CoverageTestCase extends AjdocTestCase {
                
                // ensure that the file is entitled "Aspect PkgVisibleClass.NestedAspect" rather
                // than "Class PkgVisibleClass.NestedAspect"
-               String[] strings = { "Aspect PkgVisibleClass.NestedAspect",
-                               "<PRE>static aspect <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>",
-                               "Class PkgVisibleClass.NestedAspect",
-                               "<PRE>static class <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>"};
-               List missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
+               String[] strings = null;
+               if (LangUtil.is18VMOrGreater()) {
+                       strings = new String[] { 
+                                       "Aspect PkgVisibleClass.NestedAspect",
+                                       "<pre>static aspect <span class=\"typeNameLabel\">PkgVisibleClass.NestedAspect</span>",
+                                       "Class PkgVisibleClass.NestedAspect",
+                                       "<pre>static class <span class=\"typeNameLabel\">PkgVisibleClass.NestedAspect</span>"};
+               }
+               else {
+                       strings = new String[] { 
+                                       "Aspect PkgVisibleClass.NestedAspect",
+                                       "<PRE>static aspect <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>",
+                                       "Class PkgVisibleClass.NestedAspect",
+                                       "<PRE>static class <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>"};
+               }
+               List<String> missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
                assertEquals("There should be 2 missing strings",2,missing.size());
                assertTrue(htmlFile.getName() + " should not have Class as it's title",missing.contains("Class PkgVisibleClass.NestedAspect"));
-               assertTrue(htmlFile.getName() + " should not have class in its subtitle",missing.contains("<PRE>static class <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>"));
-               
+               if (LangUtil.is18VMOrGreater()) {
+                       assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+                                       missing.contains("<pre>static class <span class=\"typeNameLabel\">PkgVisibleClass.NestedAspect</span>"));
+               }
+               else {
+                       assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+                                       missing.contains("<PRE>static class <B>PkgVisibleClass.NestedAspect</B><DT>extends java.lang.Object</DL>"));
+               }
                // get the html file for the enclosing class
         File htmlFileClass = new File(getAbsolutePathOutdir() + "/PkgVisibleClass.html");
                if (!htmlFileClass.exists()) {
@@ -641,14 +705,33 @@ public class CoverageTestCase extends AjdocTestCase {
         
                // ensure that the file is entitled "Class PkgVisibleClass" and
                // has not been changed to "Aspect PkgVisibleClass"
-               String[] classStrings = { "Class PkgVisibleClass</H2>",
-                               "class <B>PkgVisibleClass</B><DT>extends java.lang.Object</DL>",
-                               "Aspect PkgVisibleClass</H2>",
-                               "aspect <B>PkgVisibleClass</B><DT>extends java.lang.Object<DT>"};
-               List classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
+               String[] classStrings = null;
+               if (LangUtil.is18VMOrGreater()) {
+                       classStrings = new String[] {
+                               "Class PkgVisibleClass</h2>",
+                               "<pre>class <span class=\"typeNameLabel\">PkgVisibleClass</span>",
+                               "Aspect PkgVisibleClass</h2>",
+                               "<pre>aspect <span class=\"typeNameLabel\">PkgVisibleClass</span>"};
+               }
+               else {
+                       classStrings = new String[] {
+                                       "Class PkgVisibleClass</H2>",
+                                       "class <B>PkgVisibleClass</B><DT>extends java.lang.Object</DL>",
+                                       "Aspect PkgVisibleClass</H2>",
+                                       "aspect <B>PkgVisibleClass</B><DT>extends java.lang.Object<DT>"};
+               }
+               List<String> classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
                assertEquals("There should be 2 missing strings",2,classMissing.size());
-               assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",classMissing.contains("Aspect PkgVisibleClass</H2>"));
-               assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",classMissing.contains("aspect <B>PkgVisibleClass</B><DT>extends java.lang.Object<DT>"));
+               if (LangUtil.is18VMOrGreater()) {
+                       assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",
+                                       classMissing.contains("Aspect PkgVisibleClass</h2>"));
+                       assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+                                       classMissing.contains("<pre>aspect <span class=\"typeNameLabel\">PkgVisibleClass</span>"));
+               }
+               else {
+                       assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",classMissing.contains("Aspect PkgVisibleClass</H2>"));
+                       assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",classMissing.contains("aspect <B>PkgVisibleClass</B><DT>extends java.lang.Object<DT>"));
+               }
        }
 
        /**
@@ -668,14 +751,31 @@ public class CoverageTestCase extends AjdocTestCase {
                }
                // ensure that the file is entitled "Aspect ClassWithNestedAspect.NestedAspect" 
                // rather than "Class ClassWithNestedAspect.NestedAspect"
-               String[] strings = { "Aspect ClassWithNestedAspect.NestedAspect",
-                               "<PRE>static aspect <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>",
+               String[] strings = null;
+               if (LangUtil.is18VMOrGreater()) {
+                       strings = new String [] {
+                               "Aspect ClassWithNestedAspect.NestedAspect",
+                               "<pre>static aspect <span class=\"typeNameLabel\">ClassWithNestedAspect.NestedAspect</span>",
                                "Class ClassWithNestedAspect.NestedAspect",
-                               "<PRE>static class <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>"};
-               List missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
+                               "<pre>static class <span class=\"typeNameLabel\">ClassWithNestedAspect.NestedAspect</span>"};
+               }
+               else {
+                       strings = new String [] {
+                                       "Aspect ClassWithNestedAspect.NestedAspect",
+                                       "<PRE>static a;spect <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>",
+                                       "Class ClassWithNestedAspect.NestedAspect",
+                                       "<PRE>static class <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>"};                        
+               }
+               List<String> missing = AjdocOutputChecker.getMissingStringsInFile(htmlFile,strings);
                assertEquals("There should be 2 missing strings",2,missing.size());
                assertTrue(htmlFile.getName() + " should not have Class as it's title",missing.contains("Class ClassWithNestedAspect.NestedAspect"));
-               assertTrue(htmlFile.getName() + " should not have class in its subtitle",missing.contains("<PRE>static class <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>"));
+               if (LangUtil.is18VMOrGreater()) {
+                       assertTrue(htmlFile.getName() + " should not have class in its subtitle",
+                                       missing.contains("<pre>static class <span class=\"typeNameLabel\">ClassWithNestedAspect.NestedAspect</span>"));
+               }
+               else {
+                       assertTrue(htmlFile.getName() + " should not have class in its subtitle",missing.contains("<PRE>static class <B>ClassWithNestedAspect.NestedAspect</B><DT>extends java.lang.Object</DL>"));
+               }
                
                // get the html file for the enclosing class
         File htmlFileClass = new File(getAbsolutePathOutdir() + "/pkg/ClassWithNestedAspect.html");
@@ -686,17 +786,35 @@ public class CoverageTestCase extends AjdocTestCase {
         
                // ensure that the file is entitled "Class ClassWithNestedAspect" and
                // has not been changed to "Aspect ClassWithNestedAspect"
-               String[] classStrings = { "Class ClassWithNestedAspect</H2>",
-                               "public class <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>",
-                               "Aspect ClassWithNestedAspect</H2>",
-                               "public aspect <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>"};
-               List classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
+               String[] classStrings = null;
+               if (LangUtil.is18VMOrGreater()) {
+                       classStrings = new String[] { 
+                               "Class ClassWithNestedAspect</h2>",
+                               "public class <span class=\"typeNameLabel\">ClassWithNestedAspect</span>",
+                               "Aspect ClassWithNestedAspect</h2>",
+                               "public aspect <span class=\"typeNameLabel\">ClassWithNestedAspect</span>"};
+               }
+               else {
+                       classStrings = new String[] { 
+                                       "Class ClassWithNestedAspect</H2>",
+                                       "public class <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>",
+                                       "Aspect ClassWithNestedAspect</H2>",
+                                       "public aspect <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>"};
+               }
+               List<String> classMissing = AjdocOutputChecker.getMissingStringsInFile(htmlFileClass,classStrings);
                assertEquals("There should be 2 missing strings",2,classMissing.size());
-               assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",
-                               classMissing.contains("Aspect ClassWithNestedAspect</H2>"));
-               assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
-                               classMissing.contains("public aspect <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>"));
-
+               if (LangUtil.is18VMOrGreater()) {
+                       assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",
+                                       classMissing.contains("Aspect ClassWithNestedAspect</h2>"));
+                       assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+                                       classMissing.contains("public aspect <span class=\"typeNameLabel\">ClassWithNestedAspect</span>"));
+               }
+               else {
+                       assertTrue(htmlFileClass.getName() + " should not have Aspect as it's title",
+                                       classMissing.contains("Aspect ClassWithNestedAspect</H2>"));
+                       assertTrue(htmlFileClass.getName() + " should not have aspect in its subtitle",
+                                       classMissing.contains("public aspect <B>ClassWithNestedAspect</B><DT>extends java.lang.Object</DL>"));
+               }
        }
        
        /**
diff --git a/aspectj5rt/java5-src/org/aspectj/lang/annotation/RequiredTypes.java b/aspectj5rt/java5-src/org/aspectj/lang/annotation/RequiredTypes.java
new file mode 100644 (file)
index 0000000..d83b1bb
--- /dev/null
@@ -0,0 +1,30 @@
+/* *******************************************************************
+ * Copyright (c) 2014 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 
+ * ******************************************************************/
+package org.aspectj.lang.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Can be specified on an aspect to ensure that particular types must be accessible before
+ * the aspect will be 'activated'. The array value should be a list of fully qualified
+ * type names as strings, for example "com.foo.Bar". Useful in an aspect library that
+ * includes a number of aspects, only a few of which should ever be active depending
+ * upon what is on the classpath.
+ * 
+ * @author Andy Clement
+ * @since 1.8.3
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface RequiredTypes {
+  String[] value();
+}
index d1529859c555c8a018a8638dd4af18b43484012e..f6316cd00629a2f27fbe8ebc6197fcfc9ea89521 100644 (file)
@@ -413,7 +413,7 @@ public class BuildArgParser extends Main {
                                if (args.size() > nextArgIndex) {
                                        // buildConfig.getAjOptions().put(AjCompilerOptions.OPTION_Inpath, CompilerOptions.PRESERVE);
 
-                                       List inPath = buildConfig.getInpath();
+                                       List<File> inPath = buildConfig.getInpath();
                                        StringTokenizer st = new StringTokenizer(((ConfigParser.Arg) args.get(nextArgIndex)).getValue(),
                                                        File.pathSeparator);
                                        while (st.hasMoreTokens()) {
@@ -475,7 +475,7 @@ public class BuildArgParser extends Main {
                                buildConfig.setMakeReflectable(true);
                        } else if (arg.equals("-sourceroots")) {
                                if (args.size() > nextArgIndex) {
-                                       List sourceRoots = new ArrayList();
+                                       List<File> sourceRoots = new ArrayList<File>();
                                        StringTokenizer st = new StringTokenizer(((ConfigParser.Arg) args.get(nextArgIndex)).getValue(),
                                                        File.pathSeparator);
                                        while (st.hasMoreTokens()) {
index c9e992b5b7208e822107989f79a500fcb5d6e13b..e5201a3e9f848aa7269802797d27ca60ccf43175 100644 (file)
@@ -211,6 +211,10 @@ public class AspectDeclaration extends TypeDeclaration {
                        // For e37 moved the check down to this level
                        return;
                }
+               if ((binding.tagBits & TagBits.AnnotationResolved) != 0) {
+                       // possibly resolution occurred during hasUnsatisfiedDependency()...
+                       binding.tagBits = (binding.tagBits & ~TagBits.AnnotationResolved);                      
+               }
                Annotation atAspectAnnotation = AtAspectJAnnotationFactory.createAspectAnnotation(perClause.toDeclarationString(),
                                declarationSourceStart);
                Annotation privilegedAnnotation = null;
@@ -230,6 +234,7 @@ public class AspectDeclaration extends TypeDeclaration {
                        System.arraycopy(old, 0, annotations, 0, old.length);
                        System.arraycopy(toAdd, 0, annotations, old.length, toAdd.length);
                }
+               TypeDeclaration.resolveAnnotations(staticInitializerScope, annotations, binding);
        }
 
        public void generateCode(ClassFile enclosingClassFile) {
index d24ff7a3c0189a8e30321083291d45fc5c2469c1..9b04c6d1fb7aec988dd5f876ad83b4c7967e8fbb 100644 (file)
@@ -682,7 +682,7 @@ public class EclipseSourceType extends AbstractReferenceTypeDelegate {
         */
        public AnnotationAJ[] getAnnotations() {
                int declarationAnnoCount = (declaration.annotations == null ? 0 : declaration.annotations.length);
-               if (annotations != null && annotations.length==declarationAnnoCount) {
+               if (annotations != null && annotations.length == declarationAnnoCount) {
                        return annotations; // only do this once
                }
                if (!annotationsFullyResolved || annotations.length!=declarationAnnoCount) {
@@ -700,6 +700,10 @@ public class EclipseSourceType extends AbstractReferenceTypeDelegate {
                }
                return annotations;
        }
+       
+       public boolean hasAnnotations() {
+               return (declaration.annotations != null && declaration.annotations.length != 0);
+       }
 
        /**
         * Convert one eclipse annotation into an AnnotationX object containing an AnnotationAJ object.
index c8bb6c1b6bcfdbd5d267b485eebfa0da871de73b..d444c4d099edcfc6a60feed24bd1c0a9d6d78878 100644 (file)
@@ -138,6 +138,7 @@ public class AjcTestCase extends TestCase {
                private String text;
                private String sourceFileName;
                private ISourceLocation[] seeAlsos;
+               public boolean careAboutOtherMessages = true;
 
                /**
                 * Create a message that will match any compiler message on the given line.
@@ -153,6 +154,11 @@ public class AjcTestCase extends TestCase {
                public Message(int line, String text) {
                        this.line = line;
                        this.text = text;
+                       if (this.text != null && text.startsWith("*")) {
+                               // Don't care what other messages are around
+                               this.careAboutOtherMessages = false;
+                               this.text = this.text.substring(1);
+                       }
                }
 
                /**
@@ -181,6 +187,11 @@ public class AjcTestCase extends TestCase {
                                this.sourceFileName = srcFileName.toString();
                        }
                        this.text = text;
+                       if (this.text != null && text.startsWith("*")) {
+                               // Don't care what other messages are around
+                               this.careAboutOtherMessages = false;
+                               this.text = this.text.substring(1);
+                       }
                        this.seeAlsos = seeAlso;
                }
 
@@ -189,6 +200,11 @@ public class AjcTestCase extends TestCase {
                 */
                public Message(String text) {
                        this.text = text;
+                       if (this.text != null && text.startsWith("*")) {
+                               // Don't care what other messages are around
+                               this.careAboutOtherMessages = false;
+                               this.text = this.text.substring(1);
+                       }
                }
 
                /**
@@ -288,11 +304,11 @@ public class AjcTestCase extends TestCase {
                                Collections.EMPTY_LIST, Collections.EMPTY_LIST);
 
                boolean ignoreInfos = true;
-               public List fails;
-               public List infos;
-               public List warnings;
-               public List errors;
-               public List weaves;
+               public List<AjcTestCase.Message> fails;
+               public List<AjcTestCase.Message> infos;
+               public List<AjcTestCase.Message> warnings;
+               public List<AjcTestCase.Message> errors;
+               public List<AjcTestCase.Message> weaves;
 
                /**
                 * Set to true to enable or disable comparison of information messages.
@@ -317,24 +333,25 @@ public class AjcTestCase extends TestCase {
                 * @param errors The set of error messages to test for - can pass null to indicate empty set.
                 * @param fails The set of fail or abort messages to test for - can pass null to indicate empty set.
                 */
-               public MessageSpec(List infos, List warnings, List errors, List fails, List weaves) {
+               public MessageSpec(List<AjcTestCase.Message> infos, List<AjcTestCase.Message> warnings, 
+                               List<AjcTestCase.Message> errors, List<AjcTestCase.Message> fails, List<AjcTestCase.Message> weaves) {
                        if (infos != null) {
                                this.infos = infos;
                                ignoreInfos = false;
                        } else {
-                               this.infos = Collections.EMPTY_LIST;
+                               this.infos = Collections.emptyList();
                        }
-                       this.warnings = ((warnings == null) ? Collections.EMPTY_LIST : warnings);
-                       this.errors = ((errors == null) ? Collections.EMPTY_LIST : errors);
-                       this.fails = ((fails == null) ? Collections.EMPTY_LIST : fails);
-                       this.weaves = ((weaves == null) ? Collections.EMPTY_LIST : weaves);
+                       this.warnings = ((warnings == null) ? Collections.<AjcTestCase.Message>emptyList() : warnings);
+                       this.errors = ((errors == null) ? Collections.<AjcTestCase.Message>emptyList() : errors);
+                       this.fails = ((fails == null) ? Collections.<AjcTestCase.Message>emptyList() : fails);
+                       this.weaves = ((weaves == null) ? Collections.<AjcTestCase.Message>emptyList() : weaves);
                }
 
                /**
                 * Create a message specification to test a CompilationResult for a given set of info, warning, and error messages. The
                 * presence of any fail or abort messages in a CompilationResult will be a test failure.
                 */
-               public MessageSpec(List infos, List warnings, List errors) {
+               public MessageSpec(List<AjcTestCase.Message> infos, List<AjcTestCase.Message> warnings, List<AjcTestCase.Message> errors) {
                        this(infos, warnings, errors, null, null);
                }
 
@@ -342,7 +359,7 @@ public class AjcTestCase extends TestCase {
                 * Create a message specification to test a CompilationResult for a given set of warning, and error messages. The presence
                 * of any fail or abort messages in a CompilationResult will be a test failure. Informational messages will be ignored.
                 */
-               public MessageSpec(List warnings, List errors) {
+               public MessageSpec(List<AjcTestCase.Message> warnings, List<AjcTestCase.Message> errors) {
                        this(null, warnings, errors, null, null);
                }
        }
@@ -424,11 +441,11 @@ public class AjcTestCase extends TestCase {
        public void assertMessages(CompilationResult result, String message, MessageSpec expected) {
                if (result == null)
                        fail("Attempt to compare null compilation results against expected.");
-               List missingFails = copyAll(expected.fails);
-               List missingInfos = copyAll(expected.infos);
-               List missingWarnings = copyAll(expected.warnings);
-               List missingErrors = copyAll(expected.errors);
-               List missingWeaves = copyAll(expected.weaves);
+               List<AjcTestCase.Message> missingFails = copyAll(expected.fails);
+               List<AjcTestCase.Message> missingInfos = copyAll(expected.infos);
+               List<AjcTestCase.Message> missingWarnings = copyAll(expected.warnings);
+               List<AjcTestCase.Message> missingErrors = copyAll(expected.errors);
+               List<AjcTestCase.Message> missingWeaves = copyAll(expected.weaves);
                List<IMessage> extraFails = copyAll(result.getFailMessages());
                List<IMessage> extraInfos = copyAll(result.getInfoMessages());
                List<IMessage> extraWarnings = copyAll(result.getWarningMessages());
@@ -873,12 +890,12 @@ public class AjcTestCase extends TestCase {
                return ret;
        }
 
-       private List copyAll(List in) {
+       private <T> List<T> copyAll(List<T> in) {
                if (in == Collections.EMPTY_LIST)
                        return in;
 
-               List out = new ArrayList();
-               for (Iterator iter = in.iterator(); iter.hasNext();) {
+               List<T> out = new ArrayList<T>();
+               for (Iterator<T> iter = in.iterator(); iter.hasNext();) {
                        out.add(iter.next());
                }
                return out;
@@ -893,25 +910,29 @@ public class AjcTestCase extends TestCase {
         * @param missingElements the missing messages, when passed in must contain all of the expected messages
         * @param extraElements the additional messages, when passed in must contain all of the actual messages
         */
-       private void compare(List expected, List actual, List missingElements, List extraElements) {
-               for (Iterator expectedIter = expected.iterator(); expectedIter.hasNext();) {
-                       Message expectedMessage = (Message) expectedIter.next();
-                       for (Iterator actualIter = actual.iterator(); actualIter.hasNext();) {
-                               IMessage actualMessage = (IMessage) actualIter.next();
+       private void compare(List<AjcTestCase.Message> expected, List<IMessage> actual, List<AjcTestCase.Message> missingElements, List<IMessage> extraElements) {
+               for (Message expectedMessage: expected) {
+                       for (IMessage actualMessage: actual) {
                                if (expectedMessage.matches(actualMessage)) {
-                                       missingElements.remove(expectedMessage);
-                                       extraElements.remove(actualMessage);
+                                       if (expectedMessage.careAboutOtherMessages) {
+                                               missingElements.remove(expectedMessage);
+                                               extraElements.remove(actualMessage);
+                                       }
+                                       else {
+                                               missingElements.clear();
+                                               extraElements.clear();
+                                       }
                                }
                        }
                }
        }
 
-       private void addMissing(StringBuffer buff, String type, List messages) {
+       private void addMissing(StringBuffer buff, String type, List<AjcTestCase.Message> messages) {
                if (!messages.isEmpty()) {
                        buff.append("Missing expected ");
                        buff.append(type);
                        buff.append(" messages:\n");
-                       for (Iterator iter = messages.iterator(); iter.hasNext();) {
+                       for (Iterator<AjcTestCase.Message> iter = messages.iterator(); iter.hasNext();) {
                                buff.append("\t");
                                buff.append(iter.next().toString());
                                buff.append("\n");
index 5e378343cbcd4133ae0c944fec99ec8bbdd8bc9c..81bf607ed8f940bceb46d495f46b274af6aca81f 100644 (file)
@@ -20,6 +20,7 @@ import org.aspectj.bridge.context.CompilationAndWeavingContext;
 /**
  * Exception to use inside the bcweaver.
  */
+@SuppressWarnings("serial")
 public class BCException extends RuntimeException {
        Throwable thrown;
 
index a9db7b6991edfda1fc0edae28e888602ac4f1df3..f928b729b51a9037662d21e02b2333fb867ceb58 100644 (file)
@@ -78,6 +78,10 @@ class BoundedReferenceTypeDelegate extends AbstractReferenceTypeDelegate {
        public AnnotationAJ[] getAnnotations() {
                return resolvedTypeX.getAnnotations();
        }
+       
+       public boolean hasAnnotations() {
+               return resolvedTypeX.hasAnnotations();
+       }
 
        public ResolvedType[] getAnnotationTypes() {
                return resolvedTypeX.getAnnotationTypes();
index e396b4025495da9928ecc158e0fe5ca5d99e5f9a..5d08467d024822fa4aebe3b78b439f4dd6c51536 100644 (file)
@@ -91,6 +91,10 @@ public class GeneratedReferenceTypeDelegate extends AbstractReferenceTypeDelegat
        public AnnotationAJ[] getAnnotations() {
                throw new UnsupportedOperationException("Not supported for GeneratedReferenceTypeDelegate");
        }
+       
+       public boolean hasAnnotations() {
+               throw new UnsupportedOperationException("Not supported for GeneratedReferenceTypeDelegate");
+       }
 
        public ResolvedType[] getAnnotationTypes() {
                throw new UnsupportedOperationException("Not supported for GeneratedReferenceTypeDelegate");
index 538bd940fd499ed2dbcbb6bb11c701164c93630a..9791b80834f856f7b36aadd83200363d34b7707d 100644 (file)
@@ -200,6 +200,11 @@ public class ReferenceType extends ResolvedType {
                return getDelegate().getAnnotations();
        }
 
+       @Override
+       public boolean hasAnnotations() {
+               return getDelegate().hasAnnotations();
+       }
+
        @Override
        public void addAnnotation(AnnotationAJ annotationX) {
                if (annotations == null) {
index 6ed155ed61444b224d4a37efa7d00a412b74b8af..e07c032e63658369eb9e73099a4999437db56df8 100644 (file)
@@ -143,4 +143,6 @@ public interface ReferenceTypeDelegate {
 
        public boolean hasBeenWoven();
 
+       public boolean hasAnnotations();
+
 }
\ No newline at end of file
index 9746fea813dd8815e0a5fea28b382bd601541554..c053f511985fba7d861b93f03d761aa8a9cc282d 100644 (file)
@@ -925,6 +925,11 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl
        public AnnotationAJ[] getAnnotations() {
                throw new RuntimeException("ResolvedType.getAnnotations() should never be called");
        }
+       
+       public boolean hasAnnotations() {
+               throw new RuntimeException("ResolvedType.getAnnotations() should never be called");
+       }
+
 
        /**
         * Note: Only overridden by ReferenceType subtype
index aea2f806d8e69845aa414af3ba502c697cf14462..b9fc99da8e24aa34297aa4527adfe4419c455cc9 100644 (file)
@@ -137,7 +137,7 @@ public class WeaverStateInfo {
                case UNTOUCHED:
                        throw new RuntimeException("unexpected UNWOVEN");
                case WOVEN:
-                       return new WeaverStateInfo(Collections.EMPTY_LIST, true, isReweavable, isReweavableCompressed, isReweavableDiff);
+                       return new WeaverStateInfo(Collections.<Entry>emptyList(), true, isReweavable, isReweavableCompressed, isReweavableDiff);
                case EXTENDED:
                        boolean isCompressed = false;
                        if (s.isAtLeast169()) {
@@ -145,7 +145,7 @@ public class WeaverStateInfo {
                        }
 
                        int n = s.readShort();
-                       List l = new ArrayList();
+                       List<Entry> l = new ArrayList<Entry>();
                        for (int i = 0; i < n; i++) {
                                // conditional on version
                                UnresolvedType aspectType = null;
index c10e090d4469c1647bfa1ba1addb634055531ea0..a5d3569c268fd6740ffc5d879cc5253015e6d52a 100644 (file)
@@ -133,11 +133,11 @@ public class ArgsPointcut extends NameBindingPointcut {
         * @see org.aspectj.weaver.patterns.NameBindingPointcut#getBindingTypePatterns()
         */
        public List getBindingTypePatterns() {
-               List l = new ArrayList();
+               List<BindingTypePattern> l = new ArrayList<BindingTypePattern>();
                TypePattern[] pats = arguments.getTypePatterns();
                for (int i = 0; i < pats.length; i++) {
                        if (pats[i] instanceof BindingTypePattern) {
-                               l.add(pats[i]);
+                               l.add((BindingTypePattern)pats[i]);
                        }
                }
                return l;
index 9e2a626183bc0e1fb087922753881ba2447476d1..ccde927f42e082fc936a5d9cbb3ce286be2edff5 100644 (file)
@@ -84,7 +84,7 @@ public class BasicTokenSource implements ITokenSource {
                char[] chars = input.toCharArray();
                
                int i = 0;
-               List tokens = new ArrayList();
+               List<BasicToken> tokens = new ArrayList<BasicToken>();
                
                while (i < chars.length) {
                        char ch = chars[i++];                   
index 3a7e31d6fd1943ef0a29dda8d2a571bb75c51c13..988239e980cf9b9806ce6dd7a0f574b90cd4a36f 100644 (file)
@@ -194,6 +194,10 @@ public class ReflectionBasedReferenceTypeDelegate implements ReferenceTypeDelega
                // no annotations in Java 1.4
                return AnnotationAJ.EMPTY_ARRAY;
        }
+       
+       public boolean hasAnnotations() {
+               return false;
+       }
 
        /*
         * (non-Javadoc)
index 2d366974869a0840a278ac5b515c697870cbe86c..5325883638618bb7b8f04af6a36109e92296301a 100644 (file)
@@ -664,6 +664,7 @@ public abstract class CommonAdvancedPointcutExpressionTests extends TestCase {
                return null;
        }
 
+       @SuppressWarnings("unused")
        private void checkAlwaysMatches(String pointcutExpression, String type, String methodName, String methodSignature) {
                StandardPointcutExpression ex = pointcutParser.parsePointcutExpression(pointcutExpression);
                assertNotNull(ex);
@@ -674,6 +675,7 @@ public abstract class CommonAdvancedPointcutExpressionTests extends TestCase {
                assertTrue(b);
        }
 
+       @SuppressWarnings("unused")
        private void checkNeverMatches(String pointcutExpression, String type, String methodName, String methodSignature) {
                StandardPointcutExpression ex = pointcutParser.parsePointcutExpression(pointcutExpression);
                assertNotNull(ex);
index faa42b9ed4bc5f4b18dd64b055e4df9be5119c1c..ff6c56a345c6ab66011d9adc0cf68048be4691fd 100644 (file)
@@ -194,7 +194,7 @@ public abstract class CommonWorldTests extends TestCase {
        }
 
        protected void mungersTest(ResolvedType ty, ShadowMunger[] x) {
-               List l = (List) ty.getDeclaredShadowMungers();
+               List<ShadowMunger> l = ty.getDeclaredShadowMungers();
                ShadowMunger[] array = (ShadowMunger[]) l.toArray(new ShadowMunger[l.size()]);
                TestUtil.assertSetEquals(ty + " mungers:", x, array);
        }
index 456cd2bfc2cd29608aa99679d2ff3d523e2bbb19..ac4c46cb7b50436f83f63b1287aa4f32d69e67d0 100644 (file)
@@ -287,7 +287,7 @@ public class TestUtils {
        public static String[] parseIds(String str) {
                if (str.length() == 0)
                        return ZERO_STRINGS;
-               List l = new ArrayList();
+               List<String> l = new ArrayList<String>();
                int start = 0;
                while (true) {
                        int i = str.indexOf(',', start);
index af16d09f6b9512d738a75014303d1a0958c5d0ef..705674cb3897abc867dbb6074ebd8f913e6bca8b 100644 (file)
@@ -141,6 +141,7 @@ public class ArgsTestCase extends TestCase {
                assertFalse("no match expected", sMatch.matchesJoinPoint(thisOjb, targetObj, args).matches());
        }
 
+       @SuppressWarnings("unused")
        private static class A {
                public void anInt(int i) {
                }
@@ -150,6 +151,7 @@ public class ArgsTestCase extends TestCase {
 
        }
 
+       @SuppressWarnings("unused")
        private static class B extends A {
                public void x(A a) {
                }
@@ -158,6 +160,7 @@ public class ArgsTestCase extends TestCase {
                }
        }
 
+       @SuppressWarnings("unused")
        private static class C {
                public void z(A a, C c) {
                }
index fa561149e4c730c0ad2bab48e7979ddd882edbd6..265ee4b0abd5a33f3c6695012aec25922051eb15 100644 (file)
@@ -16,12 +16,8 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
 
 import org.aspectj.weaver.CompressingDataOutputStream;
-import org.aspectj.weaver.ConstantPoolReader;
-import org.aspectj.weaver.ConstantPoolWriter;
 import org.aspectj.weaver.VersionedDataInputStream;
 import org.aspectj.weaver.World;
 import org.aspectj.weaver.reflect.ReflectionWorld;
index 6d42149ff3fbe3ef259b0d5810993e96e94f536c..540c678a55847eb84df483b64a9c97aae91b7240 100644 (file)
@@ -293,16 +293,16 @@ public class CompileSpec implements ITestStep {
        }
        
        protected AjcTestCase.MessageSpec buildMessageSpec() {
-               List infos = null;
-               List warnings = new ArrayList();
-               List errors = new ArrayList();
-               List fails = new ArrayList();
-               List weaveInfos = new ArrayList();
+               List<AjcTestCase.Message> infos = null;
+               List<AjcTestCase.Message> warnings = new ArrayList<AjcTestCase.Message>();
+               List<AjcTestCase.Message> errors = new ArrayList<AjcTestCase.Message>();
+               List<AjcTestCase.Message> fails = new ArrayList<AjcTestCase.Message>();
+               List<AjcTestCase.Message> weaveInfos = new ArrayList<AjcTestCase.Message>();
                for (Iterator iter = expected.iterator(); iter.hasNext();) {
                        ExpectedMessageSpec exMsg = (ExpectedMessageSpec) iter.next();
                        String kind = exMsg.getKind();
                        if (kind.equals("info")) {
-                               if (infos == null) infos = new ArrayList();
+                               if (infos == null) infos = new ArrayList<AjcTestCase.Message>();
                                infos.add(exMsg.toMessage());
                        } else if (kind.equals("warning")) {
                                warnings.add(exMsg.toMessage());
diff --git a/tests/bugs183/436653/A.java b/tests/bugs183/436653/A.java
new file mode 100644 (file)
index 0000000..9f4b93d
--- /dev/null
@@ -0,0 +1 @@
+public class A {}
diff --git a/tests/bugs183/436653/AnnoX.java b/tests/bugs183/436653/AnnoX.java
new file mode 100644 (file)
index 0000000..19c1045
--- /dev/null
@@ -0,0 +1,10 @@
+import org.aspectj.lang.annotation.*;
+
+@RequiredTypes("A")
+@Aspect
+class X {
+  @Before("execution(* Code.*(..))")
+  public void m() {
+    System.out.println("x");
+  }
+}
diff --git a/tests/bugs183/436653/B.java b/tests/bugs183/436653/B.java
new file mode 100644 (file)
index 0000000..b90c451
--- /dev/null
@@ -0,0 +1 @@
+public class B {}
diff --git a/tests/bugs183/436653/Code.java b/tests/bugs183/436653/Code.java
new file mode 100644 (file)
index 0000000..866a01f
--- /dev/null
@@ -0,0 +1,3 @@
+public class Code {
+  public void m() {}
+}
diff --git a/tests/bugs183/436653/Runner.java b/tests/bugs183/436653/Runner.java
new file mode 100644 (file)
index 0000000..7705ecc
--- /dev/null
@@ -0,0 +1,11 @@
+public class Runner {
+  public static void main(String []argv) {
+    new Code().m();
+  }
+}
+
+class Code {
+  public void m() {
+    System.out.println("Code.m() running");
+  }
+}
diff --git a/tests/bugs183/436653/X.java b/tests/bugs183/436653/X.java
new file mode 100644 (file)
index 0000000..0f19a61
--- /dev/null
@@ -0,0 +1,6 @@
+import org.aspectj.lang.annotation.*;
+
+@RequiredTypes("A")
+aspect X {
+  before(): execution(* Code.*(..)) {System.out.println("x");}
+}
diff --git a/tests/bugs183/436653/XA.java b/tests/bugs183/436653/XA.java
new file mode 100644 (file)
index 0000000..fc40298
--- /dev/null
@@ -0,0 +1,7 @@
+import org.aspectj.lang.annotation.*;
+
+aspect XA {
+  @SuppressAjWarnings("adviceDidNotMatch")
+  before(): execution(* A.*(..)) {}
+}
+
diff --git a/tests/bugs183/436653/XA2.java b/tests/bugs183/436653/XA2.java
new file mode 100644 (file)
index 0000000..94748bd
--- /dev/null
@@ -0,0 +1,9 @@
+import org.aspectj.lang.annotation.*;
+
+// Aspect deactivated if A is missing
+@RequiredTypes("A")
+aspect XA2 {
+  @SuppressAjWarnings("adviceDidNotMatch")
+  before(): execution(* A.*(..)) {}
+}
+
diff --git a/tests/bugs183/436653/XA3.java b/tests/bugs183/436653/XA3.java
new file mode 100644 (file)
index 0000000..483d310
--- /dev/null
@@ -0,0 +1,9 @@
+import org.aspectj.lang.annotation.*;
+
+// Aspect deactivated if A or B is missing (although aspect only really needs A)
+@RequiredTypes({"A","B"})
+aspect XA2 {
+  @SuppressAjWarnings("adviceDidNotMatch")
+  before(): execution(* A.*(..)) {}
+}
+
diff --git a/tests/bugs183/436653/XB.java b/tests/bugs183/436653/XB.java
new file mode 100644 (file)
index 0000000..4bcf903
--- /dev/null
@@ -0,0 +1,6 @@
+import org.aspectj.lang.annotation.*;
+
+aspect XB {
+  before(): execution(* B.*(..)) {}
+}
+
diff --git a/tests/bugs183/436653/XCode.java b/tests/bugs183/436653/XCode.java
new file mode 100644 (file)
index 0000000..d3985fc
--- /dev/null
@@ -0,0 +1,7 @@
+import org.aspectj.lang.annotation.*;
+
+aspect XCode {
+  @SuppressAjWarnings("adviceDidNotMatch")
+  before(): execution(* Cod*.*(..)) {}
+}
+
diff --git a/tests/bugs183/436653/aop.xml b/tests/bugs183/436653/aop.xml
new file mode 100644 (file)
index 0000000..aa7d74b
--- /dev/null
@@ -0,0 +1,7 @@
+<aspectj>
+<aspects>
+<aspect name="X"/>
+</aspects>
+<weaver options="-verbose"/>
+</aspectj>
+
diff --git a/tests/bugs183/436653/aop2.xml b/tests/bugs183/436653/aop2.xml
new file mode 100644 (file)
index 0000000..aa7d74b
--- /dev/null
@@ -0,0 +1,7 @@
+<aspectj>
+<aspects>
+<aspect name="X"/>
+</aspects>
+<weaver options="-verbose"/>
+</aspectj>
+
diff --git a/tests/bugs183/436653/bin/Code.class b/tests/bugs183/436653/bin/Code.class
new file mode 100644 (file)
index 0000000..3cb9640
Binary files /dev/null and b/tests/bugs183/436653/bin/Code.class differ
index bc6c671f93f6edd331f0c2b51335c290fbd2b7e9..c3412cf56361a3eb3acb6a2a2d28d3be73ec0dd6 100644 (file)
@@ -22,7 +22,8 @@ public class AtItd3 {
       Annotation aa = m.getAnnotation(Ann.class);
       System.err.println("Ann.class retrieved is: "+aa);
 
-      if (!aa.toString().equals("@Ann(id=goodbye, anInt=4)")) 
+      if (!aa.toString().equals("@Ann(id=goodbye, anInt=4)")) // < Java8 order
+          if (!aa.toString().equals("@Ann(anInt=4, id=goodbye)")) // Java8 order
         throw new RuntimeException("Incorrect output, expected:"+
           "@Ann(id=goodbye, anInt=4) but got "+aa.toString());
  
index 4f2e9f36cbbe84742c38996b6545fef42321af2d..0730d7b85be1251d886fc91b11c31bf5caf0a635 100644 (file)
@@ -10,7 +10,7 @@
 
     <target name="compile:javac">
         <!-- compile only javac compilable stuff, exclude the one that needs other dependencies -->
-        <javac target="1.5" destdir="${aj.sandbox}" classpathref="aj.path"
+        <javac source="1.5" target="1.5" destdir="${aj.sandbox}" classpathref="aj.path"
             srcdir="${basedir}"
             includes="ataspectj/*"
             excludes="ataspectj/UnweavableTest.java"
@@ -75,7 +75,7 @@
 
     <target name="ltw.Aspect2MainTest">
         <!-- javac Aspect2 -->
-        <javac target="1.5" destdir="${aj.sandbox}" classpathref="aj.path"
+        <javac source="1.5" target="1.5" destdir="${aj.sandbox}" classpathref="aj.path"
             srcdir="${basedir}"
             includes="ataspectj/ltwreweavable/Aspect2.java"
             debug="true">
     </target>
 
     <target name="ltw.Unweavable">
-        <javac target="1.5"  destdir="${aj.sandbox}"
+        <javac source="1.5" target="1.5"  destdir="${aj.sandbox}"
             srcdir="${basedir}"
             includes="ataspectj/UnweavableTest.java, ataspectj/TestHelper.java"
             debug="true">
 
     <target name="ltw.Decp2">
         <!-- javac compile the 2nd aspect -->
-        <javac target="1.5"  destdir="${aj.sandbox}"
+        <javac source="1.5" target="1.5"  destdir="${aj.sandbox}"
             srcdir="${basedir}"
             includes="ataspectj/DeclareParentsImplementsReweavableTestAspect.java"
             debug="true">
diff --git a/tests/java5/ataspectj/annotationGen/SA.aj b/tests/java5/ataspectj/annotationGen/SA.aj
new file mode 100644 (file)
index 0000000..5ca3d66
--- /dev/null
@@ -0,0 +1,14 @@
+import org.aspectj.lang.annotation.Aspect;
+import java.lang.annotation.*;
+
+public aspect SA {
+       
+       public static void main(String[] args) {
+               Annotation[] annotations = SA.class.getAnnotations();
+               if (annotations.length != 1) throw new RuntimeException("Should have one annotation but has "+annotations.length);
+               Aspect aspectAnnotation = (Aspect) annotations[0];
+System.out.println(aspectAnnotation);
+               if (!aspectAnnotation.value().equals("")) throw new RuntimeException("value should be empty");
+       }
+       
+}
diff --git a/tests/java5/ataspectj/annotationGen/SA.class b/tests/java5/ataspectj/annotationGen/SA.class
new file mode 100644 (file)
index 0000000..1ce9f8f
Binary files /dev/null and b/tests/java5/ataspectj/annotationGen/SA.class differ
index 34f6954dc4a048a1b1205eb22e3b6d411bed320c..731ef5ca9ffc2d4a073aff5cd704970fef1510a1 100644 (file)
@@ -5,9 +5,9 @@ public aspect SimpleAspect {
        
        public static void main(String[] args) {
                Annotation[] annotations = SimpleAspect.class.getAnnotations();
-               if (annotations.length != 1) throw new RuntimeException("Should have one annotation");
+               if (annotations.length != 1) throw new RuntimeException("Should have one annotation but has "+annotations.length);
                Aspect aspectAnnotation = (Aspect) annotations[0];
                if (!aspectAnnotation.value().equals("")) throw new RuntimeException("value should be empty");
        }
        
-}
\ No newline at end of file
+}
diff --git a/tests/java5/ataspectj/annotationGen/SimpleAspect.class b/tests/java5/ataspectj/annotationGen/SimpleAspect.class
new file mode 100644 (file)
index 0000000..a5d815f
Binary files /dev/null and b/tests/java5/ataspectj/annotationGen/SimpleAspect.class differ
index 443018bb6f58feae6a102234cf8d5d2535ec17d0..ff9e5933986cdfbe70248787be01bfd92a5fa61f 100644 (file)
@@ -119,9 +119,9 @@ public class LTWTests extends org.aspectj.testing.XMLBasedAjcTestCase {
                runTest("JDK14 LTW with XML");                  
        }
        
-       public void testJ14LTWWithASPECTPATH() {        
-               runTest("JDK14 LTW with ASPECTPATH");           
-       }
+//     public void testJ14LTWWithASPECTPATH() {        
+//             runTest("JDK14 LTW with ASPECTPATH");           
+//     }
        
 
     //public void testDiscardingWovenTypes() { 
index 6e95476ed8095f830f964619f7fc15857ddf5930..37963fc15ff096b8f082b73e4562357635bf1947 100644 (file)
        <stdout>
            <line text="Annotations on field1? true"/>
            <line text="Annotation count is 4"/>
-           <line text="@AnnoBoolean(zzz=false, value=true)"/>
+           <line text="@AnnoBoolean(value=true, zzz=false)"/>
            <line text="@AnnoClass(value=class java.lang.Integer, ccc=class java.lang.String)"/>
-           <line text="@AnnoLong(jjj=111, value=999)"/>
-           <line text="@AnnoString(sss=xyz, value=set from xml)"/>
+           <line text="@AnnoLong(value=999, jjj=111)"/>
+           <line text="@AnnoString(value=set from xml, sss=xyz)"/>
            <line text="Annotations on field2? true"/>
            <line text="Annotation count is 1"/>
            <line text="@AnnoClass(value=class java.lang.String, ccc=class java.lang.String)"/>
            <line text="Annotations on field1? true"/>
            <line text="Annotation count is 4"/>
            <line text="@AnnoChar(value=z, ccc=a)"/>
-           <line text="@AnnoDouble(ddd=3.0, value=99.0)"/>
-           <line text="@AnnoFloat(fff=4.0, value=6.0)"/>
-           <line text="@AnnoShort(sss=3, value=8)"/>
+           <line text="@AnnoDouble(value=99.0, ddd=3.0)"/>
+           <line text="@AnnoFloat(value=6.0, fff=4.0)"/>
+           <line text="@AnnoShort(value=8, sss=3)"/>
            <line text="Annotations on field2? true"/>
            <line text="Annotation count is 2"/>
            <line text="@AnnoByte(value=88, bbb=66)"/>
-           <line text="@AnnoInt(value=99, iii=111)"/>
+           <line text="@AnnoInt(iii=111, value=99)"/>
        </stdout>
      </run>
    </ajc-test>
index f882d71c7ad16ea87709dc215b63f6759fd72a2a..7c2b88a547b015e26fa6680f9890216a888bcc2d 100644 (file)
@@ -9,7 +9,7 @@
                </compile>
                <run class="Hello">
                <stdout>
-               <line text="@MyAnnotation(dummy2=korte, dummy1=)"/>
+               <line text="@MyAnnotation(dummy1=, dummy2=korte)"/>
                </stdout>
                </run>
        </ajc-test>
index ed7c74aeec7f068d787e887cf21ea44f502f11fa..412fc00eb0f73a25d04a61c4f188333d3cd98700 100644 (file)
@@ -21,6 +21,38 @@ import org.aspectj.testing.XMLBasedAjcTestCase;
  */
 public class Ajc183Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
 
+       public void testSuppressTypeNotFound_436653() {
+               runTest("suppress type not found");
+       }
+
+       public void testSuppressTypeNotFound_436653_2() {
+               runTest("suppress type not found 2");
+       }
+
+       public void testSuppressTypeNotFound_436653_3() {
+               runTest("suppress type not found 3");
+       }
+       
+       public void testSuppressTypeNotFound_436653_4() {
+               runTest("suppress type not found 4");
+       }
+
+       public void testSuppressTypeNotFound_436653_5() {
+               runTest("suppress type not found 5");
+       }
+
+       public void testSuppressTypeNotFound_436653_6() {
+               runTest("suppress type not found 6");
+       }
+
+       public void testSuppressTypeNotFound_436653_7() {
+               runTest("suppress type not found 7");
+       }
+       
+       public void testSuppressTypeNotFound_436653_8() {
+               runTest("suppress type not found 8");
+       }
+       
        public void testConstantPool_445395_0() {
                runTest("constant pool 0");
        }
index b08be60a9d984a324c6b7134cd1c07b0f351c04c..163ce443e7c7369337deb2db50793442c5b75c14 100644 (file)
@@ -2,6 +2,93 @@
 
 <suite>
 
+       <ajc-test dir="bugs183/436653" title="suppress type not found 4">
+               <compile options="-1.8 -Xlint:ignore" files="X.java" outjar="aspects.jar"/>
+               <compile options="-1.8" files="Runner.java"/>
+               <run class="Runner" ltw="aop.xml">
+               <stdout>
+               <line text="Code.m() running"/>
+               </stdout>
+           </run>
+    </ajc-test>
+    
+    <ajc-test dir="bugs183/436653" title="suppress type not found 5">
+               <compile options="-1.8 -Xlint:ignore" files="X.java" outjar="aspects.jar"/>
+               <compile class="-1.8" files="A.java"/>
+               <compile options="-1.8" files="Runner.java"/>
+               <run class="Runner" ltw="aop.xml">
+               <stdout>
+               <line text="x"/>
+               <line text="Code.m() running"/>
+               </stdout>
+           </run>
+    </ajc-test>
+    
+    <!-- annotation style aspect, missing type so deactivated -->
+       <ajc-test dir="bugs183/436653" title="suppress type not found 6">
+               <compile options="-1.8 -Xlint:ignore" files="AnnoX.java" outjar="aspects.jar"/>
+               <compile options="-1.8" files="Runner.java"/>
+               <run class="Runner" ltw="aop2.xml">
+               <stdout>
+               <line text="Code.m() running"/>
+               </stdout>
+           </run>
+    </ajc-test>
+    
+    <!-- annotation style aspect, type not missing so not deactivated -->
+    <ajc-test dir="bugs183/436653" title="suppress type not found 7">
+               <compile options="-1.8 -Xlint:ignore" files="AnnoX.java A.java" outjar="aspects.jar"/>
+               <compile options="-1.8" files="Runner.java"/>
+               <run class="Runner" ltw="aop2.xml">
+               <stdout>
+               <line text="x"/>
+               <line text="Code.m() running"/>
+               </stdout>
+           </run>
+    </ajc-test>
+    
+    <!-- annotation style aspect, type not missing so not deactivated -->
+    <ajc-test dir="bugs183/436653" title="suppress type not found 8">
+               <compile options="-1.8 -Xlint:ignore" files="AnnoX.java A.java" outjar="aspects.jar"/>
+               <compile options="-1.8 -showWeaveInfo" files="Runner.java" aspectpath="aspects.jar">
+                       <message kind="weave" text="Join point 'method-execution(void Code.m())' in Type 'Code' (Runner.java:8) advised by before advice from 'X' (aspects.jar!AnnoX.class(from AnnoX.java))"/>
+               </compile>
+               <run class="Runner">
+               <stdout>
+               <line text="x"/>
+               <line text="Code.m() running"/>
+               </stdout>
+           </run>
+    </ajc-test>
+
+       <ajc-test dir="bugs183/436653" title="suppress type not found 3">
+               <compile options="-1.8" files="A.java" outjar="typeA.jar"/>
+               <compile options="-1.8" files="B.java" outjar="typeB.jar"/>
+               <!-- adviceDidNotMatch messages are suppressed here -->
+               <compile options="-1.8" files="XA3.java XCode.java" outjar="aspects.jar" classpath="typeA.jar"/>
+               <compile options="-1.8 -verbose" files="Code.java" classpath="typeA.jar" aspectpath="aspects.jar">
+                       <!-- '*' is a hint that we care about only this message, not other messages. avoids needing to list them all -->
+                       <message kind="info" text="*deactivating aspect 'XA2' as it requires type 'B' which cannot be found on the classpath"/>
+               </compile>
+       </ajc-test>
+       
+       <ajc-test dir="bugs183/436653" title="suppress type not found 2">
+               <compile options="-1.8" files="A.java" outjar="typeA.jar"/>
+               <!-- adviceDidNotMatch messages are suppressed here -->
+               <compile options="-1.8" files="XA2.java XCode.java" outjar="aspects.jar" classpath="typeA.jar"/>
+               <compile options="-1.8" files="Code.java" aspectpath="aspects.jar">
+               </compile>
+       </ajc-test>
+       
+       <ajc-test dir="bugs183/436653" title="suppress type not found">
+               <compile options="-1.8" files="A.java" outjar="typeA.jar"/>
+               <!-- adviceDidNotMatch messages are suppressed here -->
+               <compile options="-1.8" files="XA.java XCode.java" outjar="aspects.jar" classpath="typeA.jar"/>
+               <compile options="-1.8" files="Code.java" aspectpath="aspects.jar">
+                 <message kind="error" text="can't determine modifiers of missing type A"/>
+               </compile>
+       </ajc-test>
+
        <ajc-test dir="bugs183/445395" title="constant pool 0">
                <compile options="-1.8" files="Code.java">
                </compile>
index 14e880a0a92a47e3cd5431d91cf930d4efa49546..9b6c11e9036e498fa6acb5fb9115ed7f753336c4 100644 (file)
@@ -241,7 +241,7 @@ public class AjdeInteractionTestbed extends TestCase {
                File projectBase = new File(sandboxDir, pname);
                ICompilerConfiguration icc = compiler.getCompilerConfiguration();
                List currentFiles = icc.getProjectSourceFiles();
-               List filesForCompilation = new ArrayList();
+               List<String> filesForCompilation = new ArrayList<String>();
                collectUpFiles(projectBase, projectBase, filesForCompilation);
                boolean changed = false;
                for (int i = 0; i < filesForCompilation.size(); i++) {
index f355e1557e92cad02d5f9b9f13c4fb65b990910b..562291c6933cf2019e21fc47ad4eafe0c8ef4d3d 100644 (file)
@@ -33,7 +33,7 @@ public class MultiProjTestCompilerConfiguration implements ICompilerConfiguratio
        private Set aspectPath = null;
        private Map sourcePathResources = null;
        private IOutputLocationManager outputLocationManager = null;
-       private List dependants;
+       private List<String> dependants;
        private Map javaOptionsMap;
        private Set<File> inpath;
        private String encoding = null;
@@ -41,9 +41,9 @@ public class MultiProjTestCompilerConfiguration implements ICompilerConfiguratio
        private String processor;
        private String processorPath;
        private String nonstandardoptions;
-       private List modifiedFiles;
-       private List modifiedDirs;
-       private List projectSourceFiles = new ArrayList();
+       private List<File> modifiedFiles;
+       private List<String> modifiedDirs;
+       private List<String> projectSourceFiles = new ArrayList();
        private List xmlConfigFiles = new ArrayList();
        private String projectPath;
 
@@ -129,7 +129,7 @@ public class MultiProjTestCompilerConfiguration implements ICompilerConfiguratio
                return xmlConfigFiles;
        }
 
-       public List getProjectSourceFilesChanged() {
+       public List<File> getProjectSourceFilesChanged() {
                log("ICompilerConfiguration.getProjectSourceFilesChanged()");
                return modifiedFiles;
        }
@@ -146,7 +146,7 @@ public class MultiProjTestCompilerConfiguration implements ICompilerConfiguratio
 
        public void addDependancy(String projectItDependsOn) {
                if (dependants == null) {
-                       dependants = new ArrayList();
+                       dependants = new ArrayList<String>();
                }
                dependants.add(projectItDependsOn);
        }
@@ -187,19 +187,19 @@ public class MultiProjTestCompilerConfiguration implements ICompilerConfiguratio
                this.changed |= ICompilerConfiguration.NONSTANDARDOPTIONS_CHANGED;
        }
 
-       public void setProjectSourceFiles(List projectSourceFiles) {
+       public void setProjectSourceFiles(List<String> projectSourceFiles) {
                this.projectSourceFiles = projectSourceFiles;
                this.changed |= ICompilerConfiguration.PROJECTSOURCEFILES_CHANGED;
        }
 
-       public void setProjectXmlConfigFiles(List xmlConfigFiles) {
+       public void setProjectXmlConfigFiles(List<String> xmlConfigFiles) {
                this.xmlConfigFiles = xmlConfigFiles;
                this.changed |= ICompilerConfiguration.XMLCONFIG_CHANGED;
        }
 
        public void addProjectSourceFileChanged(File f) {
                if (this.modifiedFiles == null) {
-                       this.modifiedFiles = new ArrayList();
+                       this.modifiedFiles = new ArrayList<File>();
                }
                if (f != null) {
                        modifiedFiles.add(f);
@@ -208,7 +208,7 @@ public class MultiProjTestCompilerConfiguration implements ICompilerConfiguratio
 
        public void addClasspathEntryChanged(String f) {
                if (this.modifiedDirs == null) {
-                       this.modifiedDirs = new ArrayList();
+                       this.modifiedDirs = new ArrayList<String>();
                }
                if (f != null) {
                        modifiedDirs.add(f);
index 2286a06cf203291189bad48e0cb6cf3128dd679f..5c1ae918be1455fa7ca8cc97699ee1d54addd8de 100644 (file)
@@ -587,6 +587,11 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
                ensureAnnotationsUnpacked();
                return annotations;
        }
+       
+       public boolean hasAnnotations() {
+               ensureAnnotationsUnpacked();
+               return annotations.length != 0;
+       }
 
        public boolean hasAnnotation(UnresolvedType ofType) {
                // Due to re-entrancy we may be in the middle of unpacking the annotations already... in which case use this slow
index 4dfb30e682d677d9860245bd0310f7974724c4aa..4f0dfe1bc0ac2db956656de02e99d16bd88365bc 100644 (file)
@@ -1016,11 +1016,52 @@ public class BcelWorld extends World implements Repository {
 
        @Override
        public boolean hasUnsatisfiedDependency(ResolvedType aspectType) {
+               String aspectName = aspectType.getName();
+
+               if (aspectType.hasAnnotations()) {
+                       AnnotationAJ[] annos = aspectType.getAnnotations();
+                       for (AnnotationAJ anno: annos) {
+                               if (anno.getTypeName().equals("org.aspectj.lang.annotation.RequiredTypes")) {
+                                       String values = anno.getStringFormOfValue("value"); // Example: "[A,org.foo.Bar]"
+                                       if (values != null && values.length() > 2) {
+                                               values = values.substring(1,values.length()-1);
+                                               StringTokenizer tokenizer = new StringTokenizer(values,",");
+                                               boolean anythingMissing = false;
+                                               while (tokenizer.hasMoreElements()) {
+                                                       String requiredTypeName = tokenizer.nextToken();
+                                                       ResolvedType rt = resolve(UnresolvedType.forName(requiredTypeName));
+                                                       if (rt.isMissing()) {
+                                                               if (!getMessageHandler().isIgnoring(IMessage.INFO)) {
+                                                                       getMessageHandler().handleMessage(
+                                                                                       MessageUtil.info("deactivating aspect '" + aspectName + "' as it requires type '"
+                                                                                                       + requiredTypeName + "' which cannot be found on the classpath"));
+                                                               }
+                                                               anythingMissing = true;
+                                                               if (aspectRequiredTypes == null) {
+                                                                       aspectRequiredTypes = new HashMap<String,String>();
+                                                               }
+                                                               // Record that it has an invalid type reference
+                                                               aspectRequiredTypes.put(aspectName,requiredTypeName);
+                                                       }
+                                               }                               
+                                               if (anythingMissing) {
+                                                       return true;
+                                               }
+                                               else {
+                                                       return false;
+                                               }
+                                       }
+                                       else {
+                                               // no value specified for annotation
+                                               return false;
+                                       }
+                               }
+                       }
+               }
                if (aspectRequiredTypes == null) {
                        // no aspects require anything, so there can be no unsatisfied dependencies
                        return false;
                }
-               String aspectName = aspectType.getName();
                if (!aspectRequiredTypesProcessed.contains(aspectName)) {
                        String requiredTypeName = aspectRequiredTypes.get(aspectName);
                        if (requiredTypeName==null) {
@@ -1053,7 +1094,7 @@ public class BcelWorld extends World implements Repository {
                if (aspectRequiredTypes == null) {
                        aspectRequiredTypes = new HashMap<String, String>();
                }
-               aspectRequiredTypes.put(aspectClassName, requiredType);
+               aspectRequiredTypes.put(aspectClassName,requiredType);
        }
 
        /**
index e7332b73cb549e0392e35b95cb4c8f3489284c26..111d7e54dd053852a47839f46befb6fee84459fc 100644 (file)
@@ -13,6 +13,8 @@
 package org.aspectj.weaver.bcel;
 
 import java.lang.reflect.Modifier;
+import java.util.Objects;
+import java.util.function.Consumer;
 
 import org.aspectj.weaver.Advice;
 import org.aspectj.weaver.BcweaverTests;
@@ -108,11 +110,20 @@ public class WorldTestCase extends CommonWorldTests {
 
                modifiersTest(iter, abstractPublic | Modifier.INTERFACE);
                fieldsTest(iter, ResolvedMember.NONE);
-               methodsTest(iter, new Member[] { MemberImpl.method(iter, 0, "hasNext", "()Z"), MemberImpl.method(iter, 0, "remove", "()V"),
-                               MemberImpl.method(iter, 0, "next", "()Ljava/lang/Object;"), });
+               methodsTest(iter, new Member[] { 
+                               MemberImpl.method(iter, 0, "hasNext", "()Z"), 
+                               MemberImpl.method(iter, 0, "remove", "()V"),
+                               MemberImpl.method(iter, 0, "next", "()Ljava/lang/Object;"), 
+                               MemberImpl.method(iter, 0, "forEachRemaining", "(Ljava/util/function/Consumer;)V")
+//                             default void forEachRemaining(Consumer<? super E> action) {
+//                             Objects.requireNonNull(action);
+//                             while (hasNext())
+//                                 action.accept(next());
+//                         }
+                               });
                ResolvedMember remove = iter.lookupMethod(MemberImpl.method(iter, 0, "remove", "()V"));
                assertNotNull("iterator doesn't have remove", remove);
-               modifiersTest(remove, abstractPublic | Modifier.INTERFACE);
+               modifiersTest(remove, Modifier.PUBLIC | Modifier.INTERFACE); // no longer abstract in Java8 (default instead)
                exceptionsTest(remove, UnresolvedType.NONE);
 
                ResolvedMember clone = iter.lookupMethod(MemberImpl.method(UnresolvedType.OBJECT, 0, "clone", "()Ljava/lang/Object;"));
index 2782bddb5ff7d0391d905734fc2cbc7a3921ae31..e9606790a0e092d767ccbf9a8a22a5328930c0da 100644 (file)
@@ -92,6 +92,14 @@ public class Java15ReflectionBasedReferenceTypeDelegate extends ReflectionBasedR
                }
                return annotations;
        }
+       
+       @Override
+       public boolean hasAnnotations() {
+               if (annotations == null) {
+                       annotations = annotationFinder.getAnnotations(getBaseClass(), getWorld());
+               }
+               return annotations.length != 0;
+       }
 
        @Override
        public boolean hasAnnotation(UnresolvedType ofType) {