aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-08-30 16:00:52 -0700
committerandroid code review <noreply-gerritcodereview@google.com>2012-08-30 16:00:53 -0700
commit9a3a38255ee053f6254e58f487178efa98070c62 (patch)
treef4ceca9e6281045d5740313a1c30e0fd92137a5e
parentc4f51bab0d606b016b6541c4e73343b32f2ccfc2 (diff)
parent8f286c00d50c6966d84a14fac5fb5bf5897fc5b1 (diff)
downloadsdk-9a3a38255ee053f6254e58f487178efa98070c62.zip
sdk-9a3a38255ee053f6254e58f487178efa98070c62.tar.gz
sdk-9a3a38255ee053f6254e58f487178efa98070c62.tar.bz2
Merge "Suggest using SparseIntArray instead of SparseArray<Integer>"
-rw-r--r--lint/libs/lint_checks/src/com/android/tools/lint/checks/JavaPerformanceDetector.java27
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java9
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/JavaPerformanceTest.java.txt7
3 files changed, 40 insertions, 3 deletions
diff --git a/lint/libs/lint_checks/src/com/android/tools/lint/checks/JavaPerformanceDetector.java b/lint/libs/lint_checks/src/com/android/tools/lint/checks/JavaPerformanceDetector.java
index fe3b713..34a697c 100644
--- a/lint/libs/lint_checks/src/com/android/tools/lint/checks/JavaPerformanceDetector.java
+++ b/lint/libs/lint_checks/src/com/android/tools/lint/checks/JavaPerformanceDetector.java
@@ -129,6 +129,7 @@ public class JavaPerformanceDetector extends Detector implements Detector.JavaSc
private static final String DOUBLE = "Double"; //$NON-NLS-1$
private static final String FLOAT = "Float"; //$NON-NLS-1$
private static final String HASH_MAP = "HashMap"; //$NON-NLS-1$
+ private static final String SPARSE_ARRAY = "SparseArray"; //$NON-NLS-1$
private static final String CANVAS = "Canvas"; //$NON-NLS-1$
private static final String ON_DRAW = "onDraw"; //$NON-NLS-1$
private static final String ON_LAYOUT = "onLayout"; //$NON-NLS-1$
@@ -199,6 +200,8 @@ public class JavaPerformanceDetector extends Detector implements Detector.JavaSc
// e.g. via Guava? This is a bit trickier since we need to infer the type
// arguments from the calling context.
if (typeName.equals(HASH_MAP)) {
+ checkHashMap(node, reference);
+ } else if (typeName.equals(SPARSE_ARRAY)) {
checkSparseArray(node, reference);
}
}
@@ -481,7 +484,7 @@ public class JavaPerformanceDetector extends Detector implements Detector.JavaSc
* to a HashMap constructor call that is eligible for replacement by a
* SparseArray call instead
*/
- private void checkSparseArray(ConstructorInvocation node, TypeReference reference) {
+ private void checkHashMap(ConstructorInvocation node, TypeReference reference) {
// reference.hasTypeArguments returns false where it should not
StrictListAccessor<TypeReference, TypeReference> types = reference.getTypeArguments();
if (types != null && types.size() == 2) {
@@ -510,6 +513,28 @@ public class JavaPerformanceDetector extends Detector implements Detector.JavaSc
}
}
}
+
+ private void checkSparseArray(ConstructorInvocation node, TypeReference reference) {
+ // reference.hasTypeArguments returns false where it should not
+ StrictListAccessor<TypeReference, TypeReference> types = reference.getTypeArguments();
+ if (types != null && types.size() == 1) {
+ TypeReference first = types.first();
+ String valueType = first.getTypeName();
+ if (valueType.equals(INTEGER)) {
+ mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
+ "Use new SparseIntArray(...) instead for better performance",
+ null);
+ } else if (valueType.equals(BOOLEAN)) {
+ mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
+ "Use new SparseBooleanArray(...) instead for better performance",
+ null);
+ } else if (valueType.equals(LONG) && mContext.getProject().getMinSdk() >= 17) {
+ mContext.report(USE_SPARSEARRAY, node, mContext.getLocation(node),
+ "Use new SparseLongArray(...) instead for better performance",
+ null);
+ }
+ }
+ }
}
/** Visitor which records variable names assigned into */
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java
index 1d2974c..9705dff 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java
@@ -63,6 +63,12 @@ public class JavaPerformanceDetectorTest extends AbstractCheckTest {
"src/test/pkg/JavaPerformanceTest.java:74: Warning: Use new SparseIntArray(...) instead for better performance [UseSparseArrays]\n" +
" Map<Integer, Integer> myIntMap = new java.util.HashMap<Integer, Integer>();\n" +
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:190: Warning: Use new SparseIntArray(...) instead for better performance [UseSparseArrays]\n" +
+ " new SparseArray<Integer>(); // Use SparseIntArray instead\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:192: Warning: Use new SparseBooleanArray(...) instead for better performance [UseSparseArrays]\n" +
+ " new SparseArray<Boolean>(); // Use SparseBooleanArray instead\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
"src/test/pkg/JavaPerformanceTest.java:33: Warning: Use Integer.valueOf(5) instead [UseValueOf]\n" +
" Integer i = new Integer(5);\n" +
" ~~~~~~~~~~~~~~\n" +
@@ -84,8 +90,7 @@ public class JavaPerformanceDetectorTest extends AbstractCheckTest {
"src/test/pkg/JavaPerformanceTest.java:150: Warning: Use Double.valueOf(1.0) instead [UseValueOf]\n" +
" Double d1 = new Double(1.0);\n" +
" ~~~~~~~~~~~~~~~\n" +
- "0 errors, 19 warnings\n" +
- "",
+ "0 errors, 21 warnings\n",
lintProject("src/test/pkg/JavaPerformanceTest.java.txt=>" +
"src/test/pkg/JavaPerformanceTest.java"));
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/JavaPerformanceTest.java.txt b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/JavaPerformanceTest.java.txt
index 55834ec..a8caccb 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/JavaPerformanceTest.java.txt
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/JavaPerformanceTest.java.txt
@@ -185,4 +185,11 @@ public class JavaPerformanceTest extends Button {
if ((shader == null) || (lastWidth != getWidth()) || (lastHeight != getHeight())) {
}
}
+
+ public void inefficientSparseArray() {
+ new SparseArray<Integer>(); // Use SparseIntArray instead
+ new SparseArray<Long>(); // Use SparseLongArray instead
+ new SparseArray<Boolean>(); // Use SparseBooleanArray instead
+ new SparseArray<Object>(); // OK
+ }
}