jesse 2003/04/14 20:34:11
Modified: src/etc/testcases/taskdefs/optional/depend depend.xml src/main/org/apache/tools/ant/util/depend/bcel DependencyVisitor.java src/testcases/org/apache/tools/ant/taskdefs/optional/depend DependTest.java src/testcases/org/apache/tools/ant/types/optional/depend ClassFileSetTest.java Added: src/etc/testcases/taskdefs/optional/depend/src4/test ContainsOnlyInner.java MethodParam.java Log: Better detection of classes passed as method params like 'System.out.println(Outer.Inner.class);' PR: 13273 Revision Changes Path 1.1 ant/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java Index: ContainsOnlyInner.java =================================================================== package test; public class ContainsOnlyInner { void method1() { System.out.println(Outer.Inner.class); } } 1.1 ant/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java Index: MethodParam.java =================================================================== package test; public class MethodParam { void method1() { System.out.print(ContainsOnlyInner.class); } } 1.10 +4 -0 ant/src/etc/testcases/taskdefs/optional/depend/depend.xml Index: depend.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/depend/depend.xml,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- depend.xml 20 Dec 2002 13:57:12 -0000 1.9 +++ depend.xml 15 Apr 2003 03:34:11 -0000 1.10 @@ -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> 1.6 +29 -5 ant/src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java Index: DependencyVisitor.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- DependencyVisitor.java 10 Feb 2003 14:14:40 -0000 1.5 +++ DependencyVisitor.java 15 Apr 2003 03:34:11 -0000 1.6 @@ -124,11 +124,35 @@ 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); } } 1.9 +1 -1 ant/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java Index: DependTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- DependTest.java 10 Feb 2003 14:14:53 -0000 1.8 +++ DependTest.java 15 Apr 2003 03:34:11 -0000 1.9 @@ -179,7 +179,7 @@ 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()); } 1.4 +26 -1 ant/src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java Index: ClassFileSetTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ClassFileSetTest.java 10 Feb 2003 14:14:56 -0000 1.3 +++ ClassFileSetTest.java 15 Apr 2003 03:34:11 -0000 1.4 @@ -184,5 +184,30 @@ 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")); + } }