On Jan 6, 2009, at 6:19 AM, [email protected] wrote:

Author: jlaskowski
Date: Tue Jan  6 06:19:28 2009
New Revision: 731945
[...]

+            for (int pos = 0; pos < tempClassInfos.size(); pos++) {
+                ClassInfo classInfo = tempClassInfos.get(pos);
+                try {
+                    String superType = classInfo.getSuperType();
+                    for (Class clazz : classes) {
+                        if (superType.equals(clazz.getName())) {
+                            classes.add(classInfo.get());
+                            tempClassInfos.remove(pos);
+                            annClassFound = true;
+                            break;
+                        }
+                    }
+                } catch (ClassNotFoundException e) {
+                    classesNotLoaded.add(classInfo.getName());
+                } catch (NoClassDefFoundError e) {
+                    classesNotLoaded.add(classInfo.getName());
+                }
+            }

We should change up this algorithm to either not remove while iterating (i.e. maybe instead add to another list that starts out empty) or add a "pos--;" after the remove statement. Basically, when you remove an item the next item becomes the current value of position, but the loop's next iteration goes to position +1 resulting in the next item being skipped on every remove. Here's an example:

public class FooTest extends TestCase {
   public void test() throws Exception {
List<Integer> list = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9));
       for (int i = 0; i < list.size(); i++) {
           list.remove(i);
       }

       for (Integer item : list) {
           System.out.println(item);
       }
   }
}

The result of this is that all the even numbers will still be there.

Looking at the code though, I bet if we changed classInfos from a list to a map it would make that whole algorithm a little easier to write. Optionally, we could even add a "List<ClassInfo> subclasses" and "ClassInfo superclass" to the ClassInfo and link them together in the related ClassFinder constructors.

It's great to have you in the code!

-David

Reply via email to