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")); | |||||
} | |||||
} | } |