Output annotations in package-summary docs.

Bug 10749552
Bug 6333357

Change-Id: Iffdd04c911bafc8f2c368fc0d24af926f155928a
diff --git a/src/com/google/doclava/Doclava.java b/src/com/google/doclava/Doclava.java
index bc57fa2..14acf33 100644
--- a/src/com/google/doclava/Doclava.java
+++ b/src/com/google/doclava/Doclava.java
@@ -688,7 +688,7 @@
       Boolean allHidden = true;
       int pass = 0;
       ClassInfo[] classesToCheck = null;
-      while (pass < 5) {
+      while (pass < 6) {
         switch (pass) {
           case 0:
             classesToCheck = pkg.ordinaryClasses();
@@ -705,6 +705,9 @@
           case 4:
             classesToCheck = pkg.interfaces();
             break;
+          case 5:
+            classesToCheck = pkg.annotations();
+            break;
           default:
             System.err.println("Error reading package: " + pkg.name());
             break;
@@ -1055,7 +1058,7 @@
       Boolean allHidden = true;
       int pass = 0;
       ClassInfo[] classesToCheck = null;
-      while (pass < 5) {
+      while (pass < 6) {
         switch (pass) {
           case 0:
             classesToCheck = pkg.ordinaryClasses();
@@ -1072,6 +1075,9 @@
           case 4:
             classesToCheck = pkg.interfaces();
             break;
+          case 5:
+            classesToCheck = pkg.annotations();
+            break;
           default:
             System.err.println("Error reading package: " + pkg.name());
             break;
@@ -1134,6 +1140,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()));
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 ef3b2ed..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>();
@@ -86,7 +87,7 @@
     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[][] { interfaces(), ordinaryClasses(), enums(), exceptions() };
+        ClassInfo[][] types = new ClassInfo[][] { annotations(), interfaces(), ordinaryClasses(), enums(), exceptions() };
         for (ClassInfo[] type : types) {
           if (type != null) {
             for (ClassInfo c : type) {
@@ -159,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());
@@ -167,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 =
@@ -224,12 +234,14 @@
   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;
@@ -261,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);