diff options
author | Jesse Stockall <jesse@apache.org> | 2003-04-15 03:34:11 +0000 |
---|---|---|
committer | Jesse Stockall <jesse@apache.org> | 2003-04-15 03:34:11 +0000 |
commit | 5722812dbe0cfda11a528c3e6c32b2b2b67b7960 (patch) | |
tree | b0f482182ce44048cbcb3ec4cbf4a40ba5be9d0a | |
parent | ffd2a2d7c25b78eb5f50c182312acb9dcf01ccda (diff) | |
download | ant-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
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")); + } } |