Browse Source

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
master
Jesse Stockall 22 years ago
parent
commit
5722812dbe
6 changed files with 76 additions and 7 deletions
  1. +4
    -0
      src/etc/testcases/taskdefs/optional/depend/depend.xml
  2. +8
    -0
      src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java
  3. +8
    -0
      src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java
  4. +29
    -5
      src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java
  5. +1
    -1
      src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java
  6. +26
    -1
      src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java

+ 4
- 0
src/etc/testcases/taskdefs/optional/depend/depend.xml View File

@@ -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>


+ 8
- 0
src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java View File

@@ -0,0 +1,8 @@
package test;

public class ContainsOnlyInner {
void method1() {
System.out.println(Outer.Inner.class);
}
}


+ 8
- 0
src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java View File

@@ -0,0 +1,8 @@
package test;

public class MethodParam {
void method1() {
System.out.print(ContainsOnlyInner.class);
}
}


+ 29
- 5
src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java View File

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


+ 1
- 1
src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java View File

@@ -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());
} }




+ 26
- 1
src/testcases/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java View File

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

Loading…
Cancel
Save