diff options
author | Tor Norbye <tnorbye@google.com> | 2012-08-30 16:00:52 -0700 |
---|---|---|
committer | android code review <noreply-gerritcodereview@google.com> | 2012-08-30 16:00:53 -0700 |
commit | 9a3a38255ee053f6254e58f487178efa98070c62 (patch) | |
tree | f4ceca9e6281045d5740313a1c30e0fd92137a5e | |
parent | c4f51bab0d606b016b6541c4e73343b32f2ccfc2 (diff) | |
parent | 8f286c00d50c6966d84a14fac5fb5bf5897fc5b1 (diff) | |
download | sdk-9a3a38255ee053f6254e58f487178efa98070c62.zip sdk-9a3a38255ee053f6254e58f487178efa98070c62.tar.gz sdk-9a3a38255ee053f6254e58f487178efa98070c62.tar.bz2 |
Merge "Suggest using SparseIntArray instead of SparseArray<Integer>"
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 + } } |