auto import from //branches/cupcake/...@130745
diff --git a/tools/droiddoc/src/DroidDoc.java b/tools/droiddoc/src/DroidDoc.java
index 23ff654..f664c41 100644
--- a/tools/droiddoc/src/DroidDoc.java
+++ b/tools/droiddoc/src/DroidDoc.java
@@ -461,10 +461,13 @@
                 continue;
             }
             Boolean allHidden = true;
-            int pass = 1;
-            ClassInfo[] classesToCheck = pkg.ordinaryClasses();
+            int pass = 0;
+            ClassInfo[] classesToCheck = null;
             while (pass < 5 ) {
                 switch(pass) {
+                case 0:
+                    classesToCheck = pkg.ordinaryClasses();
+                    break;
                 case 1:
                     classesToCheck = pkg.enums();
                     break;
diff --git a/tools/droiddoc/src/Errors.java b/tools/droiddoc/src/Errors.java
index 1431314..dfeac88 100644
--- a/tools/droiddoc/src/Errors.java
+++ b/tools/droiddoc/src/Errors.java
@@ -25,10 +25,12 @@
 
     private static class Message implements Comparable {
         SourcePositionInfo pos;
+        int level;
         String msg;
 
-        Message(SourcePositionInfo p, String m) {
+        Message(SourcePositionInfo p, int l, String m) {
             pos = p;
+            level = l;
             msg = m;
         }
 
@@ -50,14 +52,15 @@
             return;
         }
 
-        String which = (!warningsAreErrors && error.level == WARNING) ? " warning " : " error ";
+        int level = (!warningsAreErrors && error.level == WARNING) ? WARNING : ERROR;
+        String which = level == WARNING ? " warning " : " error ";
         String message = which + error.code + ": " + text;
 
         if (where == null) {
             where = new SourcePositionInfo("unknown", 0, 0);
         }
 
-        allErrors.add(new Message(where, message));
+        allErrors.add(new Message(where, level, message));
 
         if (error.level == ERROR || (warningsAreErrors && error.level == WARNING)) {
             hadError = true;
@@ -66,7 +69,14 @@
 
     public static void printErrors() {
         for (Message m: allErrors) {
-            System.err.println(m.toString());
+            if (m.level == WARNING) {
+                System.err.println(m.toString());
+            }
+        }
+        for (Message m: allErrors) {
+            if (m.level == ERROR) {
+                System.err.println(m.toString());
+            }
         }
     }
 
diff --git a/tools/droiddoc/src/PackageInfo.java b/tools/droiddoc/src/PackageInfo.java
index 09b73d4..aac0def 100644
--- a/tools/droiddoc/src/PackageInfo.java
+++ b/tools/droiddoc/src/PackageInfo.java
@@ -117,36 +117,55 @@
     public void makeClassLinkListHDF(HDF data, String base)
     {
         makeLink(data, base);
-        ClassInfo.makeLinkListHDF(data, base + ".interfaces", ClassInfo.sortByName(interfaces()));
-        ClassInfo.makeLinkListHDF(data, base + ".classes", ClassInfo.sortByName(ordinaryClasses()));
-        ClassInfo.makeLinkListHDF(data, base + ".enums", ClassInfo.sortByName(enums()));
-        ClassInfo.makeLinkListHDF(data, base + ".exceptions", ClassInfo.sortByName(exceptions()));
-        ClassInfo.makeLinkListHDF(data, base + ".errors", ClassInfo.sortByName(errors()));
+        ClassInfo.makeLinkListHDF(data, base + ".interfaces", interfaces());
+        ClassInfo.makeLinkListHDF(data, base + ".classes", ordinaryClasses());
+        ClassInfo.makeLinkListHDF(data, base + ".enums", enums());
+        ClassInfo.makeLinkListHDF(data, base + ".exceptions", exceptions());
+        ClassInfo.makeLinkListHDF(data, base + ".errors", errors());
     }
 
     public ClassInfo[] interfaces()
     {
-        return filterHidden(Converter.convertClasses(mPackage.interfaces()));
+        if (mInterfaces == null) {
+            mInterfaces = ClassInfo.sortByName(filterHidden(Converter.convertClasses(
+                            mPackage.interfaces())));
+        }
+        return mInterfaces;
     }
 
     public ClassInfo[] ordinaryClasses()
     {
-        return filterHidden(Converter.convertClasses(mPackage.ordinaryClasses()));
+        if (mOrdinaryClasses == null) {
+            mOrdinaryClasses = ClassInfo.sortByName(filterHidden(Converter.convertClasses(
+                            mPackage.ordinaryClasses())));
+        }
+        return mOrdinaryClasses;
     }
 
     public ClassInfo[] enums()
     {
-        return filterHidden(Converter.convertClasses(mPackage.enums()));
+        if (mEnums == null) {
+            mEnums = ClassInfo.sortByName(filterHidden(Converter.convertClasses(mPackage.enums())));
+        }
+        return mEnums;
     }
 
     public ClassInfo[] exceptions()
     {
-        return filterHidden(Converter.convertClasses(mPackage.exceptions()));
+        if (mExceptions == null) {
+            mExceptions = ClassInfo.sortByName(filterHidden(Converter.convertClasses(
+                        mPackage.exceptions())));
+        }
+        return mExceptions;
     }
 
     public ClassInfo[] errors()
     {
-        return filterHidden(Converter.convertClasses(mPackage.errors()));
+        if (mErrors == null) {
+            mErrors = ClassInfo.sortByName(filterHidden(Converter.convertClasses(
+                        mPackage.errors())));
+        }
+        return mErrors;
     }
 
     // in hashed containers, treat the name as the key
@@ -157,5 +176,10 @@
 
     private String mName;
     private PackageDoc mPackage;
+    private ClassInfo[] mInterfaces;
+    private ClassInfo[] mOrdinaryClasses;
+    private ClassInfo[] mEnums;
+    private ClassInfo[] mExceptions;
+    private ClassInfo[] mErrors;
 }