am 4dc187a0: am 2c539239: am a078a044: am 8a8f7912: Doclava: Add support for building samples toc from contents of a target browsable dir.

* commit '4dc187a049ed5b1c83c1d8f68581a415a9a8130a':
  Doclava: Add support for building samples toc from contents of a target browsable dir.
diff --git a/src/com/google/doclava/ClassInfo.java b/src/com/google/doclava/ClassInfo.java
index a750b11..e60f4b8 100644
--- a/src/com/google/doclava/ClassInfo.java
+++ b/src/com/google/doclava/ClassInfo.java
@@ -1208,16 +1208,12 @@
   public boolean isHiddenImpl() {
     ClassInfo cl = this;
     while (cl != null) {
-      PackageInfo pkg = cl.containingPackage();
-      if (pkg != null && pkg.isHidden()) {
-        return true;
+      if (cl.hasShowAnnotation()) {
+        return false;
       }
-      if (cl.annotations() != null) {
-        for (AnnotationInstanceInfo info : cl.annotations()) {
-          if (Doclava.showAnnotations.contains(info.type().qualifiedName())) {
-            return false;
-          }
-        }
+      PackageInfo pkg = cl.containingPackage();
+      if (pkg != null && pkg.hasHideComment()) {
+        return true;
       }
       if (cl.comment().isHidden()) {
         return true;
@@ -1227,6 +1223,17 @@
     return false;
   }
 
+  public boolean hasShowAnnotation() {
+    if (annotations() != null) {
+      for (AnnotationInstanceInfo info : annotations()) {
+        if (Doclava.showAnnotations.contains(info.type().qualifiedName())) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   private MethodInfo matchMethod(ArrayList<MethodInfo> methods, String name, String[] params,
       String[] dimensions, boolean varargs) {
     for (MethodInfo method : methods) {
diff --git a/src/com/google/doclava/Doclava.java b/src/com/google/doclava/Doclava.java
index 213492a..b3e3eb3 100644
--- a/src/com/google/doclava/Doclava.java
+++ b/src/com/google/doclava/Doclava.java
@@ -699,7 +699,7 @@
       Boolean allHidden = true;
       int pass = 0;
       ClassInfo[] classesToCheck = null;
-      while (pass < 5) {
+      while (pass < 6) {
         switch (pass) {
           case 0:
             classesToCheck = pkg.ordinaryClasses();
@@ -716,6 +716,9 @@
           case 4:
             classesToCheck = pkg.interfaces();
             break;
+          case 5:
+            classesToCheck = pkg.annotations();
+            break;
           default:
             System.err.println("Error reading package: " + pkg.name());
             break;
@@ -1072,7 +1075,7 @@
       Boolean allHidden = true;
       int pass = 0;
       ClassInfo[] classesToCheck = null;
-      while (pass < 5) {
+      while (pass < 6) {
         switch (pass) {
           case 0:
             classesToCheck = pkg.ordinaryClasses();
@@ -1089,6 +1092,9 @@
           case 4:
             classesToCheck = pkg.interfaces();
             break;
+          case 5:
+            classesToCheck = pkg.annotations();
+            break;
           default:
             System.err.println("Error reading package: " + pkg.name());
             break;
@@ -1151,6 +1157,7 @@
     data.setValue("package.descr", "...description...");
     pkg.setFederatedReferences(data, "package");
 
+    makeClassListHDF(data, "package.annotations", ClassInfo.sortByName(pkg.annotations()));
     makeClassListHDF(data, "package.interfaces", ClassInfo.sortByName(pkg.interfaces()));
     makeClassListHDF(data, "package.classes", ClassInfo.sortByName(pkg.ordinaryClasses()));
     makeClassListHDF(data, "package.enums", ClassInfo.sortByName(pkg.enums()));
@@ -1759,4 +1766,4 @@
     }
   }
   
-}
\ No newline at end of file
+}
diff --git a/src/com/google/doclava/NavTree.java b/src/com/google/doclava/NavTree.java
index aa02d7c..e36babe 100644
--- a/src/com/google/doclava/NavTree.java
+++ b/src/com/google/doclava/NavTree.java
@@ -133,6 +133,7 @@
   private static Node makePackageNode(PackageInfo pkg) {
     List<Node> children = new ArrayList<Node>();
 
+    addClassNodes(children, "Annotations", pkg.annotations());
     addClassNodes(children, "Interfaces", pkg.interfaces());
     addClassNodes(children, "Classes", pkg.ordinaryClasses());
     addClassNodes(children, "Enums", pkg.enums());
diff --git a/src/com/google/doclava/PackageInfo.java b/src/com/google/doclava/PackageInfo.java
index 65a9639..43b9800 100644
--- a/src/com/google/doclava/PackageInfo.java
+++ b/src/com/google/doclava/PackageInfo.java
@@ -61,6 +61,7 @@
   }
 
   private void initializeMaps() {
+      mAnnotationsMap = new HashMap<String, ClassInfo>();
       mInterfacesMap = new HashMap<String, ClassInfo>();
       mOrdinaryClassesMap = new HashMap<String, ClassInfo>();
       mEnumsMap = new HashMap<String, ClassInfo>();
@@ -83,7 +84,36 @@
 
   @Override
   public boolean isHidden() {
-    return comment().isHidden();
+    if (mHidden == -1) {
+      if (hasHideComment()) {
+        // We change the hidden value of the package if a class wants to be not hidden.
+        ClassInfo[][] types = new ClassInfo[][] { annotations(), interfaces(), ordinaryClasses(), enums(), exceptions() };
+        for (ClassInfo[] type : types) {
+          if (type != null) {
+            for (ClassInfo c : type) {
+              if (c.hasShowAnnotation()) {
+                mHidden = 0;
+                return false;
+              }
+            }
+          }
+        }
+        mHidden = 1;
+      } else {
+        mHidden = 0;
+      }
+    }
+    return mHidden != 0;
+  }
+
+  /**
+   * Used by ClassInfo to determine packages default visability before annoations.
+   */
+  public boolean hasHideComment() {
+    if (mHiddenByComment == -1) {
+      mHiddenByComment = comment().isHidden() ? 1 : 0;
+    }
+    return mHiddenByComment != 0;
   }
 
   public boolean checkLevel() {
@@ -130,6 +160,7 @@
 
   public void makeClassLinkListHDF(Data data, String base) {
     makeLink(data, base);
+    ClassInfo.makeLinkListHDF(data, base + ".annotations", annotations());
     ClassInfo.makeLinkListHDF(data, base + ".interfaces", interfaces());
     ClassInfo.makeLinkListHDF(data, base + ".classes", ordinaryClasses());
     ClassInfo.makeLinkListHDF(data, base + ".enums", enums());
@@ -138,6 +169,14 @@
     data.setValue(base + ".since", getSince());
   }
 
+  public ClassInfo[] annotations() {
+    if (mAnnotations == null) {
+      mAnnotations =
+          ClassInfo.sortByName(filterHidden(Converter.convertClasses(mPackage.annotationTypes())));
+    }
+    return mAnnotations;
+  }
+
   public ClassInfo[] interfaces() {
     if (mInterfaces == null) {
       mInterfaces =
@@ -190,15 +229,19 @@
     return mName.hashCode();
   }
 
+  private int mHidden = -1;
+  private int mHiddenByComment = -1;
   private String mName;
   private PackageDoc mPackage;
   private ApiInfo mContainingApi;
+  private ClassInfo[] mAnnotations;
   private ClassInfo[] mInterfaces;
   private ClassInfo[] mOrdinaryClasses;
   private ClassInfo[] mEnums;
   private ClassInfo[] mExceptions;
   private ClassInfo[] mErrors;
 
+  private HashMap<String, ClassInfo> mAnnotationsMap;
   private HashMap<String, ClassInfo> mInterfacesMap;
   private HashMap<String, ClassInfo> mOrdinaryClassesMap;
   private HashMap<String, ClassInfo> mEnumsMap;
@@ -230,10 +273,24 @@
       if (cls != null) {
           return cls;
       }
+      cls = mAnnotationsMap.get(className);
+
+      if (cls != null) {
+          return cls;
+      }
 
       return mErrorsMap.get(className);
   }
 
+  public void addAnnotation(ClassInfo cls) {
+      cls.setPackage(this);
+      mAnnotationsMap.put(cls.name(), cls);
+  }
+
+  public ClassInfo getAnnotation(String annotationName) {
+      return mAnnotationsMap.get(annotationName);
+  }
+
   public void addInterface(ClassInfo cls) {
       cls.setPackage(this);
       mInterfacesMap.put(cls.name(), cls);