Fix incorrect desugaring of android.os.Build$VERSION_CODES_FULL
Extend test to validate the android.os.Build$VERSION_CODES_FULL values
in android.jar.
Bug: b/380038007
Change-Id: I5e614030f089ba53a4595b9dee79a34610024676
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 131ec35..178aa89 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -1804,41 +1804,41 @@
// android.os.Build$VERSION_CODES_FULL
Object[][] versionCodesFull = {
- {"BASE", 10_000},
- {"BASE_1_1", 20_000},
- {"CUPCAKE", 30_000},
- {"DONUT", 40_000},
- {"ECLAIR", 50_000},
- {"ECLAIR_0_1", 60_000},
- {"ECLAIR_MR1", 70_000},
- {"FROYO", 80_000},
- {"GINGERBREAD", 90_000},
- {"GINGERBREAD_MR1", 100_000},
- {"HONEYCOMB", 110_000},
- {"HONEYCOMB_MR1", 120_000},
- {"HONEYCOMB_MR2", 130_000},
- {"ICE_CREAM_SANDWICH", 140_000},
- {"ICE_CREAM_SANDWICH_MR1", 150_000},
- {"JELLY_BEAN", 160_000},
- {"JELLY_BEAN_MR1", 170_000},
- {"JELLY_BEAN_MR2", 180_000},
- {"KITKAT", 190_000},
- {"KITKAT_WATCH", 200_000},
- {"LOLLIPOP", 210_000},
- {"LOLLIPOP_MR1", 220_000},
- {"M", 230_000},
- {"N", 240_000},
- {"N_MR1", 250_000},
- {"O", 260_000},
- {"O_MR1", 270_000},
- {"P", 280_000},
- {"Q", 290_000},
- {"R", 300_000},
- {"S", 310_000},
- {"S_V2", 320_000},
- {"TIRAMISU", 330_000},
- {"UPSIDE_DOWN_CAKE", 340_000},
- {"VANILLA_ICE_CREAM", 350_000},
+ {"BASE", 100_000},
+ {"BASE_1_1", 200_000},
+ {"CUPCAKE", 300_000},
+ {"DONUT", 400_000},
+ {"ECLAIR", 500_000},
+ {"ECLAIR_0_1", 600_000},
+ {"ECLAIR_MR1", 700_000},
+ {"FROYO", 800_000},
+ {"GINGERBREAD", 900_000},
+ {"GINGERBREAD_MR1", 1000_000},
+ {"HONEYCOMB", 1100_000},
+ {"HONEYCOMB_MR1", 1200_000},
+ {"HONEYCOMB_MR2", 1300_000},
+ {"ICE_CREAM_SANDWICH", 1400_000},
+ {"ICE_CREAM_SANDWICH_MR1", 1500_000},
+ {"JELLY_BEAN", 1600_000},
+ {"JELLY_BEAN_MR1", 1700_000},
+ {"JELLY_BEAN_MR2", 1800_000},
+ {"KITKAT", 1900_000},
+ {"KITKAT_WATCH", 2000_000},
+ {"LOLLIPOP", 2100_000},
+ {"LOLLIPOP_MR1", 2200_000},
+ {"M", 2300_000},
+ {"N", 2400_000},
+ {"N_MR1", 2500_000},
+ {"O", 2600_000},
+ {"O_MR1", 2700_000},
+ {"P", 2800_000},
+ {"Q", 2900_000},
+ {"R", 3000_000},
+ {"S", 3100_000},
+ {"S_V2", 3200_000},
+ {"TIRAMISU", 3300_000},
+ {"UPSIDE_DOWN_CAKE", 3400_000},
+ {"VANILLA_ICE_CREAM", 3500_000},
};
type = factory.createType("Landroid/os/Build$VERSION_CODES_FULL;");
for (Object[] versionCodeFull : versionCodesFull) {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/AndroidOsBuildVersionCodesFullBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/AndroidOsBuildVersionCodesFullBackportTest.java
index 1c9e1a0..c5ca271 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/AndroidOsBuildVersionCodesFullBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/AndroidOsBuildVersionCodesFullBackportTest.java
@@ -13,9 +13,13 @@
import com.android.tools.r8.transformers.ClassFileTransformer;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.lang.reflect.Field;
+import org.junit.Assert;
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@@ -85,85 +89,153 @@
.transform();
}
+ @Test
+ public void checkVersionCodesFullInAndroidJar() throws Exception {
+ ClassSubject versionCodesFullClass =
+ new CodeInspector(parameters.getDefaultAndroidJar())
+ .clazz("android.os.Build$VERSION_CODES_FULL");
+ Assert.assertFalse(versionCodesFullClass.isPresent());
+ // Update test when fully testing Android Baklava.
+ Assert.assertFalse(parameters.getApiLevel().equals(AndroidApiLevel.BAKLAVA));
+ if (parameters.getApiLevel().equals(AndroidApiLevel.V)) {
+ versionCodesFullClass =
+ new CodeInspector(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
+ .clazz("android.os.Build$VERSION_CODES_FULL");
+ Assert.assertTrue(versionCodesFullClass.isPresent());
+ // Update test when more version codes full are added.
+ Assert.assertEquals(35, versionCodesFullClass.allFields().size());
+ // Copied from BackportedMethodRewriter.
+ Object[][] versionCodesFull = {
+ {"BASE", 100_000},
+ {"BASE_1_1", 200_000},
+ {"CUPCAKE", 300_000},
+ {"DONUT", 400_000},
+ {"ECLAIR", 500_000},
+ {"ECLAIR_0_1", 600_000},
+ {"ECLAIR_MR1", 700_000},
+ {"FROYO", 800_000},
+ {"GINGERBREAD", 900_000},
+ {"GINGERBREAD_MR1", 1000_000},
+ {"HONEYCOMB", 1100_000},
+ {"HONEYCOMB_MR1", 1200_000},
+ {"HONEYCOMB_MR2", 1300_000},
+ {"ICE_CREAM_SANDWICH", 1400_000},
+ {"ICE_CREAM_SANDWICH_MR1", 1500_000},
+ {"JELLY_BEAN", 1600_000},
+ {"JELLY_BEAN_MR1", 1700_000},
+ {"JELLY_BEAN_MR2", 1800_000},
+ {"KITKAT", 1900_000},
+ {"KITKAT_WATCH", 2000_000},
+ {"LOLLIPOP", 2100_000},
+ {"LOLLIPOP_MR1", 2200_000},
+ {"M", 2300_000},
+ {"N", 2400_000},
+ {"N_MR1", 2500_000},
+ {"O", 2600_000},
+ {"O_MR1", 2700_000},
+ {"P", 2800_000},
+ {"Q", 2900_000},
+ {"R", 3000_000},
+ {"S", 3100_000},
+ {"S_V2", 3200_000},
+ {"TIRAMISU", 3300_000},
+ {"UPSIDE_DOWN_CAKE", 3400_000},
+ {"VANILLA_ICE_CREAM", 3500_000},
+ };
+ for (Object[] versionCodeFull : versionCodesFull) {
+ Assert.assertEquals(
+ ((Integer) versionCodeFull[1]).intValue(),
+ versionCodesFullClass
+ .field("int", (String) versionCodeFull[0])
+ .getField()
+ .getStaticValue()
+ .asDexValueInt()
+ .value);
+ }
+ }
+ }
+
// android.os.Build$VERSION_CODES_FULL for building TestRunner and for runtime classpath.
- // Fields are not final to insure that the static gets are not inlined by javac for the test code.
+ // Fields are not final to ensure that the static gets are not inlined by javac for the test code
+ // and the field values are not relevant, as desugaring will replace them with the proper
+ // constants.
public static class /*android.os.Build$*/ VERSION_CODES_FULL {
- public static /* final */ int BASE = 10_000;
- public static /* final */ int BASE_1_1 = 20_000;
- public static /* final */ int CUPCAKE = 30_000;
- public static /* final */ int DONUT = 40_000;
- public static /* final */ int ECLAIR = 50_000;
- public static /* final */ int ECLAIR_0_1 = 60_000;
- public static /* final */ int ECLAIR_MR1 = 70_000;
- public static /* final */ int FROYO = 80_000;
- public static /* final */ int GINGERBREAD = 90_000;
- public static /* final */ int GINGERBREAD_MR1 = 100_000;
- public static /* final */ int HONEYCOMB = 110_000;
- public static /* final */ int HONEYCOMB_MR1 = 120_000;
- public static /* final */ int HONEYCOMB_MR2 = 130_000;
- public static /* final */ int ICE_CREAM_SANDWICH = 140_000;
- public static /* final */ int ICE_CREAM_SANDWICH_MR1 = 150_000;
- public static /* final */ int JELLY_BEAN = 160_000;
- public static /* final */ int JELLY_BEAN_MR1 = 170_000;
- public static /* final */ int JELLY_BEAN_MR2 = 180_000;
- public static /* final */ int KITKAT = 190_000;
- public static /* final */ int KITKAT_WATCH = 200_000;
- public static /* final */ int LOLLIPOP = 210_000;
- public static /* final */ int LOLLIPOP_MR1 = 220_000;
- public static /* final */ int M = 230_000;
- public static /* final */ int N = 240_000;
- public static /* final */ int N_MR1 = 250_000;
- public static /* final */ int O = 260_000;
- public static /* final */ int O_MR1 = 270_000;
- public static /* final */ int P = 280_000;
- public static /* final */ int Q = 290_000;
- public static /* final */ int R = 300_000;
- public static /* final */ int S = 310_000;
- public static /* final */ int S_V2 = 320_000;
- public static /* final */ int TIRAMISU = 330_000;
- public static /* final */ int UPSIDE_DOWN_CAKE = 340_000;
- public static /* final */ int VANILLA_ICE_CREAM = 350_000;
+ public static /* final */ int BASE = -1;
+ public static /* final */ int BASE_1_1 = -1;
+ public static /* final */ int CUPCAKE = -1;
+ public static /* final */ int DONUT = -1;
+ public static /* final */ int ECLAIR = -1;
+ public static /* final */ int ECLAIR_0_1 = -1;
+ public static /* final */ int ECLAIR_MR1 = -1;
+ public static /* final */ int FROYO = -1;
+ public static /* final */ int GINGERBREAD = -1;
+ public static /* final */ int GINGERBREAD_MR1 = -1;
+ public static /* final */ int HONEYCOMB = -1;
+ public static /* final */ int HONEYCOMB_MR1 = -1;
+ public static /* final */ int HONEYCOMB_MR2 = -1;
+ public static /* final */ int ICE_CREAM_SANDWICH = -1;
+ public static /* final */ int ICE_CREAM_SANDWICH_MR1 = -1;
+ public static /* final */ int JELLY_BEAN = -1;
+ public static /* final */ int JELLY_BEAN_MR1 = -1;
+ public static /* final */ int JELLY_BEAN_MR2 = -1;
+ public static /* final */ int KITKAT = -1;
+ public static /* final */ int KITKAT_WATCH = -1;
+ public static /* final */ int LOLLIPOP = -1;
+ public static /* final */ int LOLLIPOP_MR1 = -1;
+ public static /* final */ int M = -1;
+ public static /* final */ int N = -1;
+ public static /* final */ int N_MR1 = -1;
+ public static /* final */ int O = -1;
+ public static /* final */ int O_MR1 = -1;
+ public static /* final */ int P = -1;
+ public static /* final */ int Q = -1;
+ public static /* final */ int R = -1;
+ public static /* final */ int S = -1;
+ public static /* final */ int S_V2 = -1;
+ public static /* final */ int TIRAMISU = -1;
+ public static /* final */ int UPSIDE_DOWN_CAKE = -1;
+ public static /* final */ int VANILLA_ICE_CREAM = -1;
}
public static class TestRunner extends MiniAssert {
public static void main(String[] args) throws Exception {
- assertEquals(10_000, VERSION_CODES_FULL.BASE);
- assertEquals(20_000, VERSION_CODES_FULL.BASE_1_1);
- assertEquals(30_000, VERSION_CODES_FULL.CUPCAKE);
- assertEquals(40_000, VERSION_CODES_FULL.DONUT);
- assertEquals(50_000, VERSION_CODES_FULL.ECLAIR);
- assertEquals(60_000, VERSION_CODES_FULL.ECLAIR_0_1);
- assertEquals(70_000, VERSION_CODES_FULL.ECLAIR_MR1);
- assertEquals(80_000, VERSION_CODES_FULL.FROYO);
- assertEquals(90_000, VERSION_CODES_FULL.GINGERBREAD);
- assertEquals(100_000, VERSION_CODES_FULL.GINGERBREAD_MR1);
- assertEquals(110_000, VERSION_CODES_FULL.HONEYCOMB);
- assertEquals(120_000, VERSION_CODES_FULL.HONEYCOMB_MR1);
- assertEquals(130_000, VERSION_CODES_FULL.HONEYCOMB_MR2);
- assertEquals(140_000, VERSION_CODES_FULL.ICE_CREAM_SANDWICH);
- assertEquals(150_000, VERSION_CODES_FULL.ICE_CREAM_SANDWICH_MR1);
- assertEquals(160_000, VERSION_CODES_FULL.JELLY_BEAN);
- assertEquals(170_000, VERSION_CODES_FULL.JELLY_BEAN_MR1);
- assertEquals(180_000, VERSION_CODES_FULL.JELLY_BEAN_MR2);
- assertEquals(190_000, VERSION_CODES_FULL.KITKAT);
- assertEquals(200_000, VERSION_CODES_FULL.KITKAT_WATCH);
- assertEquals(210_000, VERSION_CODES_FULL.LOLLIPOP);
- assertEquals(220_000, VERSION_CODES_FULL.LOLLIPOP_MR1);
- assertEquals(230_000, VERSION_CODES_FULL.M);
- assertEquals(240_000, VERSION_CODES_FULL.N);
- assertEquals(250_000, VERSION_CODES_FULL.N_MR1);
- assertEquals(260_000, VERSION_CODES_FULL.O);
- assertEquals(270_000, VERSION_CODES_FULL.O_MR1);
- assertEquals(280_000, VERSION_CODES_FULL.P);
- assertEquals(290_000, VERSION_CODES_FULL.Q);
- assertEquals(300_000, VERSION_CODES_FULL.R);
- assertEquals(310_000, VERSION_CODES_FULL.S);
- assertEquals(320_000, VERSION_CODES_FULL.S_V2);
- assertEquals(330_000, VERSION_CODES_FULL.TIRAMISU);
- assertEquals(340_000, VERSION_CODES_FULL.UPSIDE_DOWN_CAKE);
- assertEquals(350_000, VERSION_CODES_FULL.VANILLA_ICE_CREAM);
+ assertEquals(100_000, VERSION_CODES_FULL.BASE);
+ assertEquals(200_000, VERSION_CODES_FULL.BASE_1_1);
+ assertEquals(300_000, VERSION_CODES_FULL.CUPCAKE);
+ assertEquals(400_000, VERSION_CODES_FULL.DONUT);
+ assertEquals(500_000, VERSION_CODES_FULL.ECLAIR);
+ assertEquals(600_000, VERSION_CODES_FULL.ECLAIR_0_1);
+ assertEquals(700_000, VERSION_CODES_FULL.ECLAIR_MR1);
+ assertEquals(800_000, VERSION_CODES_FULL.FROYO);
+ assertEquals(900_000, VERSION_CODES_FULL.GINGERBREAD);
+ assertEquals(1000_000, VERSION_CODES_FULL.GINGERBREAD_MR1);
+ assertEquals(1100_000, VERSION_CODES_FULL.HONEYCOMB);
+ assertEquals(1200_000, VERSION_CODES_FULL.HONEYCOMB_MR1);
+ assertEquals(1300_000, VERSION_CODES_FULL.HONEYCOMB_MR2);
+ assertEquals(1400_000, VERSION_CODES_FULL.ICE_CREAM_SANDWICH);
+ assertEquals(1500_000, VERSION_CODES_FULL.ICE_CREAM_SANDWICH_MR1);
+ assertEquals(1600_000, VERSION_CODES_FULL.JELLY_BEAN);
+ assertEquals(1700_000, VERSION_CODES_FULL.JELLY_BEAN_MR1);
+ assertEquals(1800_000, VERSION_CODES_FULL.JELLY_BEAN_MR2);
+ assertEquals(1900_000, VERSION_CODES_FULL.KITKAT);
+ assertEquals(2000_000, VERSION_CODES_FULL.KITKAT_WATCH);
+ assertEquals(2100_000, VERSION_CODES_FULL.LOLLIPOP);
+ assertEquals(2200_000, VERSION_CODES_FULL.LOLLIPOP_MR1);
+ assertEquals(2300_000, VERSION_CODES_FULL.M);
+ assertEquals(2400_000, VERSION_CODES_FULL.N);
+ assertEquals(2500_000, VERSION_CODES_FULL.N_MR1);
+ assertEquals(2600_000, VERSION_CODES_FULL.O);
+ assertEquals(2700_000, VERSION_CODES_FULL.O_MR1);
+ assertEquals(2800_000, VERSION_CODES_FULL.P);
+ assertEquals(2900_000, VERSION_CODES_FULL.Q);
+ assertEquals(3000_000, VERSION_CODES_FULL.R);
+ assertEquals(3100_000, VERSION_CODES_FULL.S);
+ assertEquals(3200_000, VERSION_CODES_FULL.S_V2);
+ assertEquals(3300_000, VERSION_CODES_FULL.TIRAMISU);
+ assertEquals(3400_000, VERSION_CODES_FULL.UPSIDE_DOWN_CAKE);
+ assertEquals(3500_000, VERSION_CODES_FULL.VANILLA_ICE_CREAM);
}
}
}