PR: 13273 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274456 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -117,6 +117,10 @@ | |||||
| <fileset id="result" dir="${classes.dir}"/> | <fileset id="result" dir="${classes.dir}"/> | ||||
| </target> | </target> | ||||
| <target name="testmethodparaminner" depends="src4setup, compile"> | |||||
| <classfileset id="result" dir="${classes.dir}" rootclass="test.MethodParam"/> | |||||
| </target> | |||||
| <target name="testnosource" depends="src1setup, compile"> | <target name="testnosource" depends="src1setup, compile"> | ||||
| <depend destdir="${classes.dir}" closure="yes"/> | <depend destdir="${classes.dir}" closure="yes"/> | ||||
| </target> | </target> | ||||
| @@ -0,0 +1,8 @@ | |||||
| package test; | |||||
| public class ContainsOnlyInner { | |||||
| void method1() { | |||||
| System.out.println(Outer.Inner.class); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,8 @@ | |||||
| package test; | |||||
| public class MethodParam { | |||||
| void method1() { | |||||
| System.out.print(ContainsOnlyInner.class); | |||||
| } | |||||
| } | |||||
| @@ -124,11 +124,35 @@ public class DependencyVisitor extends EmptyVisitor { | |||||
| if (obj.getSignature(constantPool).equals("Ljava/lang/Class;") | if (obj.getSignature(constantPool).equals("Ljava/lang/Class;") | ||||
| && name.startsWith("class$")) { | && name.startsWith("class$")) { | ||||
| String classname = name.substring(6).replace('$', '.'); | 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); | addClass(classname); | ||||
| } | } | ||||
| } | } | ||||
| @@ -179,7 +179,7 @@ public class DependTest extends BuildFileTest { | |||||
| public void testInnerClosure() { | public void testInnerClosure() { | ||||
| Project project = getProject(); | Project project = getProject(); | ||||
| executeTarget("testinnerclosure"); | executeTarget("testinnerclosure"); | ||||
| assertEquals("Depend did not leave correct number of files", 2, | |||||
| assertEquals("Depend did not leave correct number of files", 4, | |||||
| getResultFiles().size()); | getResultFiles().size()); | ||||
| } | } | ||||
| @@ -184,5 +184,30 @@ public class ClassFileSetTest extends BuildFileTest { | |||||
| files.containsKey("D.class")); | files.containsKey("D.class")); | ||||
| assertTrue("Result did not contain E.class", | assertTrue("Result did not contain E.class", | ||||
| files.containsKey("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")); | |||||
| } | |||||
| } | } | ||||