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

Reply via email to