Merge "Fix incorrect proguard keepfile generation for fields." into lmp-ub-dev
diff --git a/src/com/google/doclava/AnnotationInstanceInfo.java b/src/com/google/doclava/AnnotationInstanceInfo.java
index ff17e8d..c72ca9a 100644
--- a/src/com/google/doclava/AnnotationInstanceInfo.java
+++ b/src/com/google/doclava/AnnotationInstanceInfo.java
@@ -16,6 +16,8 @@
 
 package com.google.doclava;
 
+import com.google.clearsilver.jsilver.data.Data;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 
@@ -117,4 +119,32 @@
 
       return allResolved;
   }
+
+  public static void makeLinkListHDF(Data data, String base, AnnotationInstanceInfo[] annotations) {
+    if (annotations == null) return;
+
+    final int N = annotations.length;
+    for (int i = 0; i < N; i++) {
+      AnnotationInstanceInfo aii = annotations[i];
+      aii.type().makeShortDescrHDF(data, base + "." + i);
+    }
+  }
+
+  /**
+   * Get a new list containing the set of annotations that are shared between
+   * the input annotations collection and the names of annotations passed in
+   * the showAnnotations parameter
+   */
+  public static ArrayList<AnnotationInstanceInfo> getShowAnnotationsIntersection(
+          ArrayList<AnnotationInstanceInfo> annotations) {
+    ArrayList<AnnotationInstanceInfo> list = new ArrayList<AnnotationInstanceInfo>();
+    if (annotations != null) {
+      for (AnnotationInstanceInfo info : annotations) {
+        if (Doclava.showAnnotations.contains(info.type().qualifiedName())) {
+          list.add(info);
+        }
+      }
+    }
+    return list;
+  }
 }
diff --git a/src/com/google/doclava/ClassInfo.java b/src/com/google/doclava/ClassInfo.java
index 7ab7a6a..e8b1f89 100644
--- a/src/com/google/doclava/ClassInfo.java
+++ b/src/com/google/doclava/ClassInfo.java
@@ -104,6 +104,7 @@
     mQualifiedTypeName = qualifiedTypeName;
     mIsPrimitive = isPrimitive;
     mAnnotations = annotations;
+    mShowAnnotations = AnnotationInstanceInfo.getShowAnnotationsIntersection(annotations);
   }
 
   public void init(TypeInfo typeInfo, ArrayList<ClassInfo> interfaces,
@@ -135,6 +136,7 @@
     mRealSuperclass = superclass;
     mRealSuperclassType = superclassType;
     mAnnotations = annotations;
+    mShowAnnotations = AnnotationInstanceInfo.getShowAnnotationsIntersection(annotations);
 
     // after providing new methods and new superclass info,clear any cached
     // lists of self + superclass methods, ctors, etc.
@@ -1025,6 +1027,12 @@
     if (isDeprecated()) {
       data.setValue(base + ".deprecatedsince", getDeprecatedSince());
     }
+
+    AnnotationInstanceInfo.makeLinkListHDF(
+      data,
+      base + ".showAnnotations",
+      showAnnotations().toArray(new AnnotationInstanceInfo[showAnnotations().size()]));
+
     setFederatedReferences(data, base);
   }
 
@@ -1062,6 +1070,11 @@
       data.setValue("class.abstract", "abstract");
     }
 
+    AnnotationInstanceInfo.makeLinkListHDF(
+      data,
+      "class.showAnnotations",
+      showAnnotations().toArray(new AnnotationInstanceInfo[showAnnotations().size()]));
+
     // class info
     String kind = kind();
     if (kind != null) {
@@ -1414,14 +1427,11 @@
   }
 
   public boolean hasShowAnnotation() {
-    if (annotations() != null) {
-      for (AnnotationInstanceInfo info : annotations()) {
-        if (Doclava.showAnnotations.contains(info.type().qualifiedName())) {
-          return true;
-        }
-      }
-    }
-    return false;
+    return mShowAnnotations.size() > 0;
+  }
+
+  public ArrayList<AnnotationInstanceInfo> showAnnotations() {
+    return mShowAnnotations;
   }
 
   private MethodInfo matchMethod(ArrayList<MethodInfo> methods, String name, String[] params,
@@ -1686,6 +1696,7 @@
   private TypeInfo mRealSuperclassType;
   private ClassInfo mSuperclass;
   private ArrayList<AnnotationInstanceInfo> mAnnotations;
+  private ArrayList<AnnotationInstanceInfo> mShowAnnotations;
   private boolean mSuperclassInit;
   private boolean mDeprecatedKnown;
 
diff --git a/src/com/google/doclava/MemberInfo.java b/src/com/google/doclava/MemberInfo.java
index 800edba..76087eb 100644
--- a/src/com/google/doclava/MemberInfo.java
+++ b/src/com/google/doclava/MemberInfo.java
@@ -38,30 +38,23 @@
     mIsSynthetic = isSynthetic;
     mKind = kind;
     mAnnotations = annotations;
+    mShowAnnotations = AnnotationInstanceInfo.getShowAnnotationsIntersection(annotations);
   }
 
   public abstract boolean isExecutable();
 
   @Override
   public boolean isHidden() {
-    if (mAnnotations != null) {
-      for (AnnotationInstanceInfo info : mAnnotations) {
-        if (Doclava.showAnnotations.contains(info.type().qualifiedName())) {
-          return false;
-        }
-      }
+    if (mShowAnnotations.size() > 0) {
+      return false;
     }
     return super.isHidden();
   }
 
   @Override
   public boolean isRemoved() {
-    if (mAnnotations != null) {
-      for (AnnotationInstanceInfo info : mAnnotations) {
-        if (Doclava.showAnnotations.contains(info.type().qualifiedName())) {
-          return false;
-        }
-      }
+    if (mShowAnnotations.size() > 0) {
+      return false;
     }
     return super.isRemoved();
   }
@@ -163,6 +156,10 @@
     return mAnnotations;
   }
 
+  public ArrayList<AnnotationInstanceInfo> showAnnotations() {
+    return mShowAnnotations;
+  }
+
   ClassInfo mContainingClass;
   ClassInfo mRealContainingClass;
   String mName;
@@ -176,5 +173,6 @@
   boolean mIsSynthetic;
   String mKind;
   private ArrayList<AnnotationInstanceInfo> mAnnotations;
+  private ArrayList<AnnotationInstanceInfo> mShowAnnotations;
 
 }
diff --git a/src/com/google/doclava/MethodInfo.java b/src/com/google/doclava/MethodInfo.java
index 999de0b..8c5e271 100644
--- a/src/com/google/doclava/MethodInfo.java
+++ b/src/com/google/doclava/MethodInfo.java
@@ -575,7 +575,12 @@
     if (mTypeParameters != null) {
       TypeInfo.makeHDF(data, base + ".generic.typeArguments", mTypeParameters, false);
     }
-    
+
+    AnnotationInstanceInfo.makeLinkListHDF(
+      data,
+      base + ".showAnnotations",
+      showAnnotations().toArray(new AnnotationInstanceInfo[showAnnotations().size()]));
+
     setFederatedReferences(data, base);
   }