am da4b2e21: Save memory by re-using empty TagInfo (and subclasses) arrays.

* commit 'da4b2e21af0d8efcfe73ff060839c97a2d4b8b03':
  Save memory by re-using empty TagInfo (and subclasses) arrays.
diff --git a/src/com/google/doclava/AttrTagInfo.java b/src/com/google/doclava/AttrTagInfo.java
index 909cacf..04e5626 100644
--- a/src/com/google/doclava/AttrTagInfo.java
+++ b/src/com/google/doclava/AttrTagInfo.java
@@ -22,6 +22,12 @@
 import java.util.regex.Matcher;
 
 public class AttrTagInfo extends TagInfo {
+  public static final AttrTagInfo[] EMPTY_ARRAY = new AttrTagInfo[0];
+
+  public static AttrTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new AttrTagInfo[size];
+  }
+
   private static final String REF_COMMAND = "ref";
   private static final String NAME_COMMAND = "name";
   private static final String DESCRIPTION_COMMAND = "description";
diff --git a/src/com/google/doclava/CodeTagInfo.java b/src/com/google/doclava/CodeTagInfo.java
index 1a4a864..56ffd13 100644
--- a/src/com/google/doclava/CodeTagInfo.java
+++ b/src/com/google/doclava/CodeTagInfo.java
@@ -17,6 +17,12 @@
 package com.google.doclava;
 
 public class CodeTagInfo extends TagInfo {
+  public static final CodeTagInfo[] EMPTY_ARRAY = new CodeTagInfo[0];
+
+  public static CodeTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new CodeTagInfo[size];
+  }
+
   private static String encode(String t) {
     t = t.replace("&", "&");
     t = t.replace("<", "&lt;");
diff --git a/src/com/google/doclava/Comment.java b/src/com/google/doclava/Comment.java
index cfb7aaf..33dee3c 100644
--- a/src/com/google/doclava/Comment.java
+++ b/src/com/google/doclava/Comment.java
@@ -19,12 +19,15 @@
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 
 public class Comment {
   static final Pattern FIRST_SENTENCE =
       Pattern.compile("((.*?)\\.)[ \t\r\n\\<](.*)", Pattern.DOTALL);
 
-  private static final String[] KNOWN_TAGS = new String[] {
+  private static final Set<String> KNOWN_TAGS = new HashSet<String>(Arrays.asList(new String[] {
           "@author",
           "@since",
           "@version",
@@ -38,7 +41,7 @@
           "@sample",
           "@include",
           "@serial",
-      };
+      }));
 
   public Comment(String text, ContainerInfo base, SourcePositionInfo sp) {
     mText = text;
@@ -296,7 +299,14 @@
   }
 
   private boolean isWhitespaceChar(char c) {
-      return c == ' ' || c == '\r' || c == '\t' || c == '\n';
+      switch (c) {
+          case ' ':
+          case '\r':
+          case '\t':
+          case '\n':
+              return true;
+      }
+      return false;
   }
 
   private void tag(String name, String text, boolean isInline, SourcePositionInfo pos) {
@@ -346,13 +356,7 @@
     } else if (name.equals("@include") || name.equals("@sample")) {
       mInlineTagsList.add(new SampleTagInfo(name, "@include", text, mBase, pos));
     } else {
-      boolean known = false;
-      for (String s : KNOWN_TAGS) {
-        if (s.equals(name)) {
-          known = true;
-          break;
-        }
-      }
+      boolean known = KNOWN_TAGS.contains(name);
       if (!known) {
         known = Doclava.knownTags.contains(name);
       }
@@ -416,7 +420,7 @@
         results.add(t);
       }
     }
-    return results.toArray(new TagInfo[results.size()]);
+    return results.toArray(TagInfo.getArray(results.size()));
   }
 
   public ParamTagInfo[] paramTags() {
@@ -516,18 +520,17 @@
     mText = null;
     mInitialized = true;
 
-    mInlineTags = mInlineTagsList.toArray(new TagInfo[mInlineTagsList.size()]);
-    mParamTags = mParamTagsList.toArray(new ParamTagInfo[mParamTagsList.size()]);
-    mSeeTags = mSeeTagsList.toArray(new SeeTagInfo[mSeeTagsList.size()]);
-    mThrowsTags = mThrowsTagsList.toArray(new ThrowsTagInfo[mThrowsTagsList.size()]);
-    mReturnTags =
-        ParsedTagInfo.joinTags(mReturnTagsList.toArray(new ParsedTagInfo[mReturnTagsList.size()]));
-    mDeprecatedTags =
-        ParsedTagInfo.joinTags(mDeprecatedTagsList.toArray(new ParsedTagInfo[mDeprecatedTagsList
-            .size()]));
-    mUndeprecateTags = mUndeprecateTagsList.toArray(new TagInfo[mUndeprecateTagsList.size()]);
-    mAttrTags = mAttrTagsList.toArray(new AttrTagInfo[mAttrTagsList.size()]);
-    mBriefTags = mBriefTagsList.toArray(new TagInfo[mBriefTagsList.size()]);
+    mInlineTags = mInlineTagsList.toArray(TagInfo.getArray(mInlineTagsList.size()));
+    mParamTags = mParamTagsList.toArray(ParamTagInfo.getArray(mParamTagsList.size()));
+    mSeeTags = mSeeTagsList.toArray(SeeTagInfo.getArray(mSeeTagsList.size()));
+    mThrowsTags = mThrowsTagsList.toArray(ThrowsTagInfo.getArray(mThrowsTagsList.size()));
+    mReturnTags = ParsedTagInfo.joinTags(
+        mReturnTagsList.toArray(ParsedTagInfo.getArray(mReturnTagsList.size())));
+    mDeprecatedTags = ParsedTagInfo.joinTags(
+        mDeprecatedTagsList.toArray(ParsedTagInfo.getArray(mDeprecatedTagsList.size())));
+    mUndeprecateTags = mUndeprecateTagsList.toArray(TagInfo.getArray(mUndeprecateTagsList.size()));
+    mAttrTags = mAttrTagsList.toArray(AttrTagInfo.getArray(mAttrTagsList.size()));
+    mBriefTags = mBriefTagsList.toArray(TagInfo.getArray(mBriefTagsList.size()));
 
     mParamTagsList = null;
     mSeeTagsList = null;
diff --git a/src/com/google/doclava/Converter.java b/src/com/google/doclava/Converter.java
index e620bf3..3153b41 100644
--- a/src/com/google/doclava/Converter.java
+++ b/src/com/google/doclava/Converter.java
@@ -107,12 +107,14 @@
     return (ClassInfo[]) mClasses.all();
   }
 
+  private static final MethodDoc[] EMPTY_METHOD_DOC = new MethodDoc[0];
+
   private static void initClass(ClassDoc c, ClassInfo cl) {
     MethodDoc[] annotationElements;
     if (c instanceof AnnotationTypeDoc) {
       annotationElements = ((AnnotationTypeDoc) c).elements();
     } else {
-      annotationElements = new MethodDoc[0];
+      annotationElements = EMPTY_METHOD_DOC;
     }
     cl.init(Converter.obtainType(c),
             new ArrayList<ClassInfo>(Arrays.asList(Converter.convertClasses(c.interfaces()))),
@@ -192,7 +194,7 @@
 
   public static TagInfo[] convertTags(Tag[] tags, ContainerInfo base) {
     int len = tags.length;
-    TagInfo[] out = new TagInfo[len];
+    TagInfo[] out = TagInfo.getArray(len);
     for (int i = 0; i < len; i++) {
       Tag t = tags[i];
       /*
diff --git a/src/com/google/doclava/LiteralTagInfo.java b/src/com/google/doclava/LiteralTagInfo.java
index 1feb276..e6b9115 100644
--- a/src/com/google/doclava/LiteralTagInfo.java
+++ b/src/com/google/doclava/LiteralTagInfo.java
@@ -17,6 +17,12 @@
 package com.google.doclava;
 
 public class LiteralTagInfo extends TagInfo {
+  public static final LiteralTagInfo[] EMPTY_ARRAY = new LiteralTagInfo[0];
+
+  public static LiteralTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new LiteralTagInfo[size];
+  }
+
   private static String encode(String t) {
     t = t.replace("&", "&amp;");
     t = t.replace("<", "&lt;");
diff --git a/src/com/google/doclava/MethodInfo.java b/src/com/google/doclava/MethodInfo.java
index f1659f3..cf98d0f 100644
--- a/src/com/google/doclava/MethodInfo.java
+++ b/src/com/google/doclava/MethodInfo.java
@@ -405,7 +405,8 @@
               containingClass(), position()));
         }
       }
-      mThrowsTags = rv.toArray(new ThrowsTagInfo[rv.size()]);
+
+      mThrowsTags = rv.toArray(ThrowsTagInfo.getArray(rv.size()));
     }
     return mThrowsTags;
   }
@@ -424,6 +425,12 @@
     if (mParamTags == null) {
       final int N = mParameters.size();
 
+      if (N == 0) {
+          // Early out for empty case.
+          mParamTags = ParamTagInfo.EMPTY_ARRAY;
+          return ParamTagInfo.EMPTY_ARRAY;
+      }
+
       String[] names = new String[N];
       String[] comments = new String[N];
       SourcePositionInfo[] positions = new SourcePositionInfo[N];
@@ -464,7 +471,7 @@
       }
 
       // construct the results, and cache them for next time
-      mParamTags = new ParamTagInfo[N];
+      mParamTags = ParamTagInfo.getArray(N);
       for (i = 0; i < N; i++) {
         mParamTags[i] =
             new ParamTagInfo("@param", "@param", names[i] + " " + comments[i], parent(),
diff --git a/src/com/google/doclava/ParamTagInfo.java b/src/com/google/doclava/ParamTagInfo.java
index f8329bc..13eb30b 100644
--- a/src/com/google/doclava/ParamTagInfo.java
+++ b/src/com/google/doclava/ParamTagInfo.java
@@ -22,6 +22,12 @@
 import java.util.regex.Matcher;
 
 public class ParamTagInfo extends ParsedTagInfo {
+  public static final ParamTagInfo[] EMPTY_ARRAY = new ParamTagInfo[0];
+
+  public static ParamTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new ParamTagInfo[size];
+  }
+
   static final Pattern PATTERN = Pattern.compile("([^ \t\r\n]+)[ \t\r\n]+(.*)", Pattern.DOTALL);
 
   private boolean mIsTypeParameter;
diff --git a/src/com/google/doclava/ParsedTagInfo.java b/src/com/google/doclava/ParsedTagInfo.java
index bcb9230..aad3767 100755
--- a/src/com/google/doclava/ParsedTagInfo.java
+++ b/src/com/google/doclava/ParsedTagInfo.java
@@ -19,6 +19,12 @@
 import java.util.ArrayList;
 
 public class ParsedTagInfo extends TagInfo {
+  public static final ParsedTagInfo[] EMPTY_ARRAY = new ParsedTagInfo[0];
+
+  public static ParsedTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new ParsedTagInfo[size];
+  }
+
   private ContainerInfo mContainer;
   private String mCommentText;
   private Comment mComment;
@@ -50,6 +56,6 @@
         list.add(t[j]);
       }
     }
-    return list.toArray(new TagInfo[list.size()]);
+    return list.toArray(TagInfo.getArray(list.size()));
   }
 }
diff --git a/src/com/google/doclava/SampleTagInfo.java b/src/com/google/doclava/SampleTagInfo.java
index a69a3f3..66eb9ac 100644
--- a/src/com/google/doclava/SampleTagInfo.java
+++ b/src/com/google/doclava/SampleTagInfo.java
@@ -44,6 +44,12 @@
  * samples/ApiDemos/src/com/google/app/Notification1.java Bleh}
  */
 public class SampleTagInfo extends TagInfo {
+  public static final SampleTagInfo[] EMPTY_ARRAY = new SampleTagInfo[0];
+
+  public static SampleTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new SampleTagInfo[size];
+  }
+
   static final int STATE_BEGIN = 0;
   static final int STATE_MATCHING = 1;
 
diff --git a/src/com/google/doclava/SeeTagInfo.java b/src/com/google/doclava/SeeTagInfo.java
index 34e6aed..9f38655 100644
--- a/src/com/google/doclava/SeeTagInfo.java
+++ b/src/com/google/doclava/SeeTagInfo.java
@@ -19,6 +19,12 @@
 import com.google.clearsilver.jsilver.data.Data;
 
 public class SeeTagInfo extends TagInfo {
+  public static final SeeTagInfo[] EMPTY_ARRAY = new SeeTagInfo[0];
+
+  public static SeeTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new SeeTagInfo[size];
+  }
+
   private ContainerInfo mBase;
   LinkReference mLink;
 
diff --git a/src/com/google/doclava/TagInfo.java b/src/com/google/doclava/TagInfo.java
index ec1f811..7bb640e 100644
--- a/src/com/google/doclava/TagInfo.java
+++ b/src/com/google/doclava/TagInfo.java
@@ -19,6 +19,12 @@
 import com.google.clearsilver.jsilver.data.Data;
 
 public class TagInfo {
+  public static final TagInfo[] EMPTY_ARRAY = new TagInfo[0];
+
+  public static TagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new TagInfo[size];
+  }
+
   private String mName;
   private String mText;
   private String mKind;
diff --git a/src/com/google/doclava/TextTagInfo.java b/src/com/google/doclava/TextTagInfo.java
index 35a486b..7403883 100644
--- a/src/com/google/doclava/TextTagInfo.java
+++ b/src/com/google/doclava/TextTagInfo.java
@@ -17,6 +17,12 @@
 package com.google.doclava;
 
 public class TextTagInfo extends TagInfo {
+  public static final TextTagInfo[] EMPTY_ARRAY = new TextTagInfo[0];
+
+  public static TextTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new TextTagInfo[size];
+  }
+
   TextTagInfo(String n, String k, String t, SourcePositionInfo p) {
     super(n, k, Doclava.escape(t), p);
   }
diff --git a/src/com/google/doclava/ThrowsTagInfo.java b/src/com/google/doclava/ThrowsTagInfo.java
index 5f49485..9a9e72f 100644
--- a/src/com/google/doclava/ThrowsTagInfo.java
+++ b/src/com/google/doclava/ThrowsTagInfo.java
@@ -22,7 +22,14 @@
 import java.util.regex.Matcher;
 
 public class ThrowsTagInfo extends ParsedTagInfo {
+  public static final ThrowsTagInfo[] EMPTY_ARRAY = new ThrowsTagInfo[0];
+
+  public static ThrowsTagInfo[] getArray(int size) {
+      return size == 0 ? EMPTY_ARRAY : new ThrowsTagInfo[size];
+  }
+
   static final Pattern PATTERN = Pattern.compile("(\\S+)\\s+(.*)", Pattern.DOTALL);
+
   private ClassInfo mException;
 
   public ThrowsTagInfo(String name, String kind, String text, ContainerInfo base,