Refaster templates for new TypedXml classes.
Since we have over 100 unique schemas across the OS, it would be
incredibly tedious to try migrating all that logic to use the more
efficient TypedXmlSerializer and TypedXmlPullParser interfaces.
To aid this migration process, this change adds Refaster templates
that offer to refactor matching existing code in a no-op fashion.
This change also upgrades Error Prone to the latest release.
Bug: 171832118
Test: manual
Change-Id: Ic93a46d646edee98af7d0e2f7891d931fca4825f
diff --git a/Android.bp b/Android.bp
index 27378d4..bc19a6f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -25,6 +25,9 @@
"-Xep:AndroidFrameworkBinderIdentity:ERROR",
"-Xep:AndroidFrameworkCompatChange:ERROR",
"-Xep:AndroidFrameworkUid:ERROR",
+ // NOTE: only enable to generate local patchfiles
+ // "-XepPatchChecks:refaster:frameworks/base/errorprone/refaster/EfficientXml.java.refaster",
+ // "-XepPatchLocation:/tmp/refaster/",
],
},
}
@@ -913,8 +916,9 @@
include_dirs: ["external/protobuf/src"],
type: "full",
},
+ // Protos have lots of MissingOverride and similar.
errorprone: {
- javacflags: ["-Xep:MissingOverride:OFF"], // b/72714520
+ javacflags: ["-XepDisableAllChecks"],
},
}
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java
index 9c84f50..e759663 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java
@@ -18,13 +18,13 @@
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
import static com.google.errorprone.bugpatterns.android.TargetSdkChecker.binaryTreeExact;
-import static com.google.errorprone.matchers.FieldMatchers.anyFieldInClass;
-import static com.google.errorprone.matchers.FieldMatchers.staticField;
import static com.google.errorprone.matchers.Matchers.allOf;
import static com.google.errorprone.matchers.Matchers.anyOf;
import static com.google.errorprone.matchers.Matchers.anything;
import static com.google.errorprone.matchers.Matchers.kindIs;
import static com.google.errorprone.matchers.Matchers.not;
+import static com.google.errorprone.matchers.android.FieldMatchers.anyFieldInClass;
+import static com.google.errorprone.matchers.android.FieldMatchers.staticField;
import com.google.auto.service.AutoService;
import com.google.errorprone.BugPattern;
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java
index 2561b41..e323a89 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java
@@ -17,12 +17,11 @@
package com.google.errorprone.bugpatterns.android;
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
-import static com.google.errorprone.matchers.FieldMatchers.staticField;
import static com.google.errorprone.matchers.Matchers.anyOf;
import static com.google.errorprone.matchers.Matchers.contains;
import static com.google.errorprone.matchers.Matchers.methodInvocation;
import static com.google.errorprone.matchers.Matchers.staticMethod;
-
+import static com.google.errorprone.matchers.android.FieldMatchers.staticField;
import com.google.auto.service.AutoService;
import com.google.errorprone.BugPattern;
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java
index e1ebf42..032ae00 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java
@@ -28,8 +28,8 @@
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.BinaryTreeMatcher;
import com.google.errorprone.matchers.Description;
-import com.google.errorprone.matchers.FieldMatchers;
import com.google.errorprone.matchers.Matcher;
+import com.google.errorprone.matchers.android.FieldMatchers;
import com.sun.source.tree.BinaryTree;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.Tree.Kind;
diff --git a/errorprone/java/com/google/errorprone/matchers/FieldMatchers.java b/errorprone/java/com/google/errorprone/matchers/android/FieldMatchers.java
similarity index 97%
rename from errorprone/java/com/google/errorprone/matchers/FieldMatchers.java
rename to errorprone/java/com/google/errorprone/matchers/android/FieldMatchers.java
index 08969d6..5d56e80 100644
--- a/errorprone/java/com/google/errorprone/matchers/FieldMatchers.java
+++ b/errorprone/java/com/google/errorprone/matchers/android/FieldMatchers.java
@@ -14,9 +14,10 @@
* limitations under the License.
*/
-package com.google.errorprone.matchers;
+package com.google.errorprone.matchers.android;
import com.google.errorprone.VisitorState;
+import com.google.errorprone.matchers.Matcher;
import com.google.errorprone.util.ASTHelpers;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.ImportTree;
diff --git a/errorprone/refaster/EfficientXml.java b/errorprone/refaster/EfficientXml.java
new file mode 100644
index 0000000..bd1ddfc
--- /dev/null
+++ b/errorprone/refaster/EfficientXml.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
+
+import com.android.internal.util.XmlUtils;
+
+import com.google.errorprone.refaster.annotation.AfterTemplate;
+import com.google.errorprone.refaster.annotation.BeforeTemplate;
+
+/**
+ * Refaster templates that migrate callers to equivalent and more efficient
+ * {@link TypedXmlSerializer} and {@link TypedXmlPullParser} methods.
+ */
+public class EfficientXml {
+ class IntToString {
+ @BeforeTemplate
+ void beforeToString(TypedXmlSerializer out, String n, int v) throws Exception {
+ out.attribute(null, n, Integer.toString(v));
+ }
+
+ @BeforeTemplate
+ void beforeValueOf(TypedXmlSerializer out, String n, int v) throws Exception {
+ out.attribute(null, n, String.valueOf(v));
+ }
+
+ @BeforeTemplate
+ void beforeUtils(TypedXmlSerializer out, String n, int v) throws Exception {
+ XmlUtils.writeIntAttribute(out, n, v);
+ }
+
+ @BeforeTemplate
+ void beforeRadix(TypedXmlSerializer out, String n, int v) throws Exception {
+ out.attribute(null, n, Integer.toString(v, 10));
+ }
+
+ @AfterTemplate
+ void after(TypedXmlSerializer out, String n, int v) throws Exception {
+ out.attributeInt(null, n, v);
+ }
+ }
+
+ class IntToStringHex {
+ @BeforeTemplate
+ void beforeToHexString(TypedXmlSerializer out, String n, int v) throws Exception {
+ out.attribute(null, n, Integer.toHexString(v));
+ }
+
+ @BeforeTemplate
+ void beforeRadix(TypedXmlSerializer out, String n, int v) throws Exception {
+ out.attribute(null, n, Integer.toString(v, 16));
+ }
+
+ @AfterTemplate
+ void after(TypedXmlSerializer out, String n, int v) throws Exception {
+ out.attributeIntHex(null, n, v);
+ }
+ }
+
+ class IntFromString {
+ @BeforeTemplate
+ int beforeParse(TypedXmlPullParser in, String n) throws Exception {
+ return Integer.parseInt(in.getAttributeValue(null, n));
+ }
+
+ @BeforeTemplate
+ int beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+ return XmlUtils.readIntAttribute(in, n);
+ }
+
+ @BeforeTemplate
+ int beforeRadix(TypedXmlPullParser in, String n) throws Exception {
+ return Integer.parseInt(in.getAttributeValue(null, n), 10);
+ }
+
+ @AfterTemplate
+ int after(TypedXmlPullParser in, String n) throws Exception {
+ return in.getAttributeInt(null, n);
+ }
+ }
+
+ class IntFromStringDefault {
+ @BeforeTemplate
+ int before(TypedXmlPullParser in, String n, int d) throws Exception {
+ return XmlUtils.readIntAttribute(in, n, d);
+ }
+
+ @AfterTemplate
+ int after(TypedXmlPullParser in, String n, int d) throws Exception {
+ return in.getAttributeInt(null, n, d);
+ }
+ }
+
+ class IntFromStringHex {
+ @BeforeTemplate
+ int beforeParse(TypedXmlPullParser in, String n) throws Exception {
+ return Integer.parseInt(in.getAttributeValue(null, n), 16);
+ }
+
+ @AfterTemplate
+ int after(TypedXmlPullParser in, String n) throws Exception {
+ return in.getAttributeIntHex(null, n);
+ }
+ }
+
+ class LongToString {
+ @BeforeTemplate
+ void beforeToString(TypedXmlSerializer out, String n, long v) throws Exception {
+ out.attribute(null, n, Long.toString(v));
+ }
+
+ @BeforeTemplate
+ void beforeValueOf(TypedXmlSerializer out, String n, long v) throws Exception {
+ out.attribute(null, n, String.valueOf(v));
+ }
+
+ @BeforeTemplate
+ void beforeUtils(TypedXmlSerializer out, String n, long v) throws Exception {
+ XmlUtils.writeLongAttribute(out, n, v);
+ }
+
+ @BeforeTemplate
+ void beforeRadix(TypedXmlSerializer out, String n, long v) throws Exception {
+ out.attribute(null, n, Long.toString(v, 10));
+ }
+
+ @AfterTemplate
+ void after(TypedXmlSerializer out, String n, long v) throws Exception {
+ out.attributeLong(null, n, v);
+ }
+ }
+
+ class LongToStringHex {
+ @BeforeTemplate
+ void beforeToHexString(TypedXmlSerializer out, String n, long v) throws Exception {
+ out.attribute(null, n, Long.toHexString(v));
+ }
+
+ @BeforeTemplate
+ void beforeRadix(TypedXmlSerializer out, String n, long v) throws Exception {
+ out.attribute(null, n, Long.toString(v, 16));
+ }
+
+ @AfterTemplate
+ void after(TypedXmlSerializer out, String n, long v) throws Exception {
+ out.attributeLongHex(null, n, v);
+ }
+ }
+
+ class LongFromString {
+ @BeforeTemplate
+ long beforeParse(TypedXmlPullParser in, String n) throws Exception {
+ return Long.parseLong(in.getAttributeValue(null, n));
+ }
+
+ @BeforeTemplate
+ long beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+ return XmlUtils.readLongAttribute(in, n);
+ }
+
+ @BeforeTemplate
+ long beforeRadix(TypedXmlPullParser in, String n) throws Exception {
+ return Long.parseLong(in.getAttributeValue(null, n), 10);
+ }
+
+ @AfterTemplate
+ long after(TypedXmlPullParser in, String n) throws Exception {
+ return in.getAttributeLong(null, n);
+ }
+ }
+
+ class LongFromStringDefault {
+ @BeforeTemplate
+ long before(TypedXmlPullParser in, String n, long d) throws Exception {
+ return XmlUtils.readLongAttribute(in, n, d);
+ }
+
+ @AfterTemplate
+ long after(TypedXmlPullParser in, String n, long d) throws Exception {
+ return in.getAttributeLong(null, n, d);
+ }
+ }
+
+ class LongFromStringHex {
+ @BeforeTemplate
+ long beforeParse(TypedXmlPullParser in, String n) throws Exception {
+ return Long.parseLong(in.getAttributeValue(null, n), 16);
+ }
+
+ @AfterTemplate
+ long after(TypedXmlPullParser in, String n) throws Exception {
+ return in.getAttributeLongHex(null, n);
+ }
+ }
+
+ class FloatToString {
+ @BeforeTemplate
+ void beforeToString(TypedXmlSerializer out, String n, float v) throws Exception {
+ out.attribute(null, n, Float.toString(v));
+ }
+
+ @BeforeTemplate
+ void beforeValueOf(TypedXmlSerializer out, String n, float v) throws Exception {
+ out.attribute(null, n, String.valueOf(v));
+ }
+
+ @BeforeTemplate
+ void beforeUtils(TypedXmlSerializer out, String n, float v) throws Exception {
+ XmlUtils.writeFloatAttribute(out, n, v);
+ }
+
+ @AfterTemplate
+ void after(TypedXmlSerializer out, String n, float v) throws Exception {
+ out.attributeFloat(null, n, v);
+ }
+ }
+
+ class FloatFromString {
+ @BeforeTemplate
+ float beforeParse(TypedXmlPullParser in, String n) throws Exception {
+ return Float.parseFloat(in.getAttributeValue(null, n));
+ }
+
+ @BeforeTemplate
+ float beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+ return XmlUtils.readFloatAttribute(in, n);
+ }
+
+ @AfterTemplate
+ float after(TypedXmlPullParser in, String n) throws Exception {
+ return in.getAttributeFloat(null, n);
+ }
+ }
+
+ class DoubleToString {
+ @BeforeTemplate
+ void beforeToString(TypedXmlSerializer out, String n, double v) throws Exception {
+ out.attribute(null, n, Double.toString(v));
+ }
+
+ @BeforeTemplate
+ void beforeValueOf(TypedXmlSerializer out, String n, double v) throws Exception {
+ out.attribute(null, n, String.valueOf(v));
+ }
+
+ @AfterTemplate
+ void after(TypedXmlSerializer out, String n, double v) throws Exception {
+ out.attributeDouble(null, n, v);
+ }
+ }
+
+ class DoubleFromString {
+ @BeforeTemplate
+ double beforeParse(TypedXmlPullParser in, String n) throws Exception {
+ return Double.parseDouble(in.getAttributeValue(null, n));
+ }
+
+ @AfterTemplate
+ double after(TypedXmlPullParser in, String n) throws Exception {
+ return in.getAttributeDouble(null, n);
+ }
+ }
+
+ class BooleanToString {
+ @BeforeTemplate
+ void beforeToString(TypedXmlSerializer out, String n, boolean v) throws Exception {
+ out.attribute(null, n, Boolean.toString(v));
+ }
+
+ @BeforeTemplate
+ void beforeValueOf(TypedXmlSerializer out, String n, boolean v) throws Exception {
+ out.attribute(null, n, String.valueOf(v));
+ }
+
+ @AfterTemplate
+ void after(TypedXmlSerializer out, String n, boolean v) throws Exception {
+ out.attributeBoolean(null, n, v);
+ }
+ }
+
+ class BooleanFromString {
+ @BeforeTemplate
+ boolean beforeParse(TypedXmlPullParser in, String n) throws Exception {
+ return Boolean.parseBoolean(in.getAttributeValue(null, n));
+ }
+
+ @BeforeTemplate
+ boolean beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+ return XmlUtils.readBooleanAttribute(in, n);
+ }
+
+ @AfterTemplate
+ boolean after(TypedXmlPullParser in, String n) throws Exception {
+ return in.getAttributeBoolean(null, n, false);
+ }
+ }
+
+ class BooleanFromStringDefault {
+ @BeforeTemplate
+ boolean before(TypedXmlPullParser in, String n, boolean d) throws Exception {
+ return XmlUtils.readBooleanAttribute(in, n, d);
+ }
+
+ @AfterTemplate
+ boolean after(TypedXmlPullParser in, String n, boolean d) throws Exception {
+ return in.getAttributeBoolean(null, n, d);
+ }
+ }
+}
diff --git a/errorprone/refaster/EfficientXml.java.refaster b/errorprone/refaster/EfficientXml.java.refaster
new file mode 100644
index 0000000..f2974ff
--- /dev/null
+++ b/errorprone/refaster/EfficientXml.java.refaster
Binary files differ
diff --git a/errorprone/refaster/refaster.sh b/errorprone/refaster/refaster.sh
new file mode 100755
index 0000000..67dc3e4
--- /dev/null
+++ b/errorprone/refaster/refaster.sh
@@ -0,0 +1,11 @@
+
+paths=(
+ $ANDROID_BUILD_TOP/out/soong/.intermediates/frameworks/base/framework/android_common/turbine-combined/framework.jar
+ $ANDROID_BUILD_TOP/out/soong/.intermediates/libcore/core-all/android_common/turbine-combined/core-all.jar
+ $ANDROID_BUILD_TOP/external/error_prone/error_prone/error_prone_refaster-2.4.0.jar
+)
+
+javac -cp "$(IFS=:; echo "${paths[*]}")" \
+ "-Xplugin:RefasterRuleCompiler --out $1.refaster" $1
+
+rm *.class