summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorC. Sean Young <csyoung@google.com>2015-05-18 14:12:30 -0500
committerC. Sean Young <csyoung@google.com>2015-05-20 10:34:56 -0500
commitda4b2e21af0d8efcfe73ff060839c97a2d4b8b03 (patch)
tree14e68bbea9ae87875c8bb5c9ec51c168f953f7eb
parentd1ccc1c9cfc5d1e7f400fa5bba4c773af56acb0c (diff)
downloadandroid_external_doclava-da4b2e21af0d8efcfe73ff060839c97a2d4b8b03.tar.gz
android_external_doclava-da4b2e21af0d8efcfe73ff060839c97a2d4b8b03.tar.bz2
android_external_doclava-da4b2e21af0d8efcfe73ff060839c97a2d4b8b03.zip
Save memory by re-using empty TagInfo (and subclasses) arrays.
Arrays of TagInfo (and subclasses) often tend to be empty, as many members simply won't have any of the relevant tags. Re-using empty arrays saves potentially a dozen or more megabytes for large projects. Also some minor performance tweaks the Javadoc comment parsing. Change-Id: Iffaddd3b59a4f8183f11efd6e2680aad95633ade
-rw-r--r--src/com/google/doclava/AttrTagInfo.java6
-rw-r--r--src/com/google/doclava/CodeTagInfo.java6
-rw-r--r--src/com/google/doclava/Comment.java49
-rw-r--r--src/com/google/doclava/Converter.java6
-rw-r--r--src/com/google/doclava/LiteralTagInfo.java6
-rw-r--r--src/com/google/doclava/MethodInfo.java11
-rw-r--r--src/com/google/doclava/ParamTagInfo.java6
-rwxr-xr-xsrc/com/google/doclava/ParsedTagInfo.java8
-rw-r--r--src/com/google/doclava/SampleTagInfo.java6
-rw-r--r--src/com/google/doclava/SeeTagInfo.java6
-rw-r--r--src/com/google/doclava/TagInfo.java6
-rw-r--r--src/com/google/doclava/TextTagInfo.java6
-rw-r--r--src/com/google/doclava/ThrowsTagInfo.java7
13 files changed, 101 insertions, 28 deletions
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.Pattern;
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("&", "&amp;");
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 @@ package com.google.doclava;
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 @@ public class Comment {
"@sample",
"@include",
"@serial",
- };
+ }));
public Comment(String text, ContainerInfo base, SourcePositionInfo sp) {
mText = text;
@@ -296,7 +299,14 @@ public class Comment {
}
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 @@ public class Comment {
} 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 @@ public class Comment {
results.add(t);
}
}
- return results.toArray(new TagInfo[results.size()]);
+ return results.toArray(TagInfo.getArray(results.size()));
}
public ParamTagInfo[] paramTags() {
@@ -516,18 +520,17 @@ public class Comment {
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 @@ public class Converter {
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 class Converter {
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 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv
containingClass(), position()));
}
}
- mThrowsTags = rv.toArray(new ThrowsTagInfo[rv.size()]);
+
+ mThrowsTags = rv.toArray(ThrowsTagInfo.getArray(rv.size()));
}
return mThrowsTags;
}
@@ -424,6 +425,12 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv
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 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv
}
// 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.Pattern;
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 @@ package com.google.doclava;
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 @@ public class ParsedTagInfo extends TagInfo {
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 @@ import java.util.regex.Matcher;
* 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 @@ package com.google.doclava;
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 @@ package com.google.doclava;
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.Pattern;
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,