diff --git a/src/etc/testcases/taskdefs/optional/depend/depend.xml b/src/etc/testcases/taskdefs/optional/depend/depend.xml
index 0493e9b2a..22b35dbd7 100644
--- a/src/etc/testcases/taskdefs/optional/depend/depend.xml
+++ b/src/etc/testcases/taskdefs/optional/depend/depend.xml
@@ -117,6 +117,10 @@
+
+
+
+
diff --git a/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java b/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java
new file mode 100644
index 000000000..a60252dc5
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java
@@ -0,0 +1,8 @@
+package test;
+
+public class ContainsOnlyInner {
+ void method1() {
+ System.out.println(Outer.Inner.class);
+ }
+}
+
diff --git a/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java b/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java
new file mode 100644
index 000000000..de088bf1f
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java
@@ -0,0 +1,8 @@
+package test;
+
+public class MethodParam {
+ void method1() {
+ System.out.print(ContainsOnlyInner.class);
+ }
+}
+
diff --git a/src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java b/src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java
index ddee618c0..77dc85093 100644
--- a/src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java
+++ b/src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java
@@ -124,11 +124,35 @@ public class DependencyVisitor extends EmptyVisitor {
if (obj.getSignature(constantPool).equals("Ljava/lang/Class;")
&& name.startsWith("class$")) {
String classname = name.substring(6).replace('$', '.');
- addClass(classname);
- int index = classname.lastIndexOf(".");
- if (index != -1) {
- classname = classname.substring(0, index) + "$" +
- classname.substring(index + 1);
+ // does the class have a package structure
+ int index = classname.lastIndexOf(".");
+ if (index > 0) {
+ char start;
+ // check if the package structure is more than 1 level deep
+ int index2 = classname.lastIndexOf(".", index -1);
+ if (index2 != -1) {
+ // class name has more than 1 package level 'com.company.Class'
+ start = classname.charAt(index2 + 1);
+ }
+ else {
+ // class name has only 1 package level 'package.Class'
+ start = classname.charAt(0);
+ }
+ // Check to see if it's an inner class 'com.company.Class$Inner'
+ if ((start > 0x40) && (start < 0x5B)) {
+ // first letter of the previous segment of the class name 'Class'
+ // is upper case ascii. so according to the spec it's an inner class
+ classname = classname.substring(0, index) + "$" +
+ classname.substring(index + 1);
+ addClass(classname);
+ }
+ else {
+ // Add the class in dotted notation 'com.company.Class'
+ addClass(classname);
+ }
+ }
+ else {
+ // Add a class with no package 'Class'
addClass(classname);
}
}
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java
index 736bb355d..e571af5d8 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java
@@ -179,7 +179,7 @@ public class DependTest extends BuildFileTest {
public void testInnerClosure() {
Project project = getProject();
executeTarget("testinnerclosure");
- assertEquals("Depend did not leave correct number of files", 2,
+ assertEquals("Depend did not leave correct number of files", 4,
getResultFiles().size());
}
diff --git a/src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java b/src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java
index 8dac493e2..c445e9377 100644
--- a/src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java
+++ b/src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java
@@ -184,5 +184,30 @@ public class ClassFileSetTest extends BuildFileTest {
files.containsKey("D.class"));
assertTrue("Result did not contain E.class",
files.containsKey("E.class"));
- }
+ }
+
+ /**
+ * Test that classes included in a method "System.out.println(Outer.Inner.class)" are included.
+ */
+ public void testMethodParamInner() {
+ Project project = getProject();
+ executeTarget("testmethodparaminner");
+ FileSet resultFileSet = (FileSet)project.getReference(RESULT_FILESET);
+ DirectoryScanner scanner = resultFileSet.getDirectoryScanner(project);
+ String[] scannedFiles = scanner.getIncludedFiles();
+ Hashtable files = new Hashtable();
+ for (int i = 0; i < scannedFiles.length; ++i) {
+ files.put(scannedFiles[i], scannedFiles[i]);
+ }
+ assertEquals("Classfileset did not pick up expected number of "
+ + "class files", 4, files.size());
+ assertTrue("Result did not contain test/Outer$Inner.class",
+ files.containsKey("test/Outer$Inner.class"));
+ assertTrue("Result did not contain test/Outer.class",
+ files.containsKey("test/Outer.class"));
+ assertTrue("Result did not contain test/ContainsOnlyInner.class",
+ files.containsKey("test/ContainsOnlyInner.class"));
+ assertTrue("Result did not contain test/ContainsOnlyInner.class",
+ files.containsKey("test/MethodParam.class"));
+ }
}