summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Stockall <jesse@apache.org>2003-04-15 03:34:11 +0000
committerJesse Stockall <jesse@apache.org>2003-04-15 03:34:11 +0000
commit5722812dbe0cfda11a528c3e6c32b2b2b67b7960 (patch)
treeb0f482182ce44048cbcb3ec4cbf4a40ba5be9d0a
parentffd2a2d7c25b78eb5f50c182312acb9dcf01ccda (diff)
downloadant-5722812dbe0cfda11a528c3e6c32b2b2b67b7960.tar.gz
Better detection of classes passed as method params like 'System.out.println(Outer.Inner.class);'
PR: 13273 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274456 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/etc/testcases/taskdefs/optional/depend/depend.xml4
-rw-r--r--src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java8
-rw-r--r--src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java8
-rw-r--r--src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java34
-rw-r--r--src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java2
-rw-r--r--src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java27
6 files changed, 76 insertions, 7 deletions
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 @@
<fileset id="result" dir="${classes.dir}"/>
</target>
+ <target name="testmethodparaminner" depends="src4setup, compile">
+ <classfileset id="result" dir="${classes.dir}" rootclass="test.MethodParam"/>
+ </target>
+
<target name="testnosource" depends="src1setup, compile">
<depend destdir="${classes.dir}" closure="yes"/>
</target>
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"));
+ }
}