summaryrefslogtreecommitdiff
path: root/src/main/org/apache/tools/ant/util/depend/bcel
diff options
context:
space:
mode:
authorJesse Stockall <jesse@apache.org>2003-04-15 03:34:11 +0000
committerJesse Stockall <jesse@apache.org>2003-04-15 03:34:11 +0000
commit5722812dbe0cfda11a528c3e6c32b2b2b67b7960 (patch)
treeb0f482182ce44048cbcb3ec4cbf4a40ba5be9d0a /src/main/org/apache/tools/ant/util/depend/bcel
parentffd2a2d7c25b78eb5f50c182312acb9dcf01ccda (diff)
downloadant-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
Diffstat (limited to 'src/main/org/apache/tools/ant/util/depend/bcel')
-rw-r--r--src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java34
1 files changed, 29 insertions, 5 deletions
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);
}
}