Merge commit '0f8d71d13180a0b634967f2c48d4f801e3913b36' into dev-release
diff --git a/build.gradle b/build.gradle
index e614057..9f4cf29 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2238,6 +2238,9 @@
systemProperty 'slow_tests', project.property('slow_tests')
}
+ if (project.hasProperty('force_32_bit_art')) {
+ systemProperty 'force_32_bit_art', project.property('force_32_bit_art')
+ }
if (project.hasProperty('desugar_jdk_json_dir')) {
systemProperty 'desugar_jdk_json_dir', project.property('desugar_jdk_json_dir')
diff --git a/infra/config/global/generated/cr-buildbucket.cfg b/infra/config/global/generated/cr-buildbucket.cfg
index 49e39c7..f461b56 100644
--- a/infra/config/global/generated/cr-buildbucket.cfg
+++ b/infra/config/global/generated/cr-buildbucket.cfg
@@ -24,7 +24,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -53,7 +53,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -82,7 +82,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -118,7 +118,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -156,7 +156,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -190,7 +190,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -222,7 +222,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -255,7 +255,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -292,7 +292,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -329,7 +329,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -366,7 +366,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -403,7 +403,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -440,7 +440,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -477,7 +477,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -514,7 +514,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -551,7 +551,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -588,7 +588,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -625,7 +625,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -662,7 +662,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -699,7 +699,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -736,7 +736,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -773,7 +773,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -810,7 +810,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -847,7 +847,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -861,6 +861,7 @@
' "test_options": ['
' "--dex_vm=7.0.0",'
' "--all_tests",'
+ ' "--force-32-bit-art",'
' "--tool=r8",'
' "--no_internal",'
' "--one_line_per_test",'
@@ -884,7 +885,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -898,6 +899,7 @@
' "test_options": ['
' "--dex_vm=7.0.0",'
' "--all_tests",'
+ ' "--force-32-bit-art",'
' "--tool=r8",'
' "--no_internal",'
' "--one_line_per_test",'
@@ -921,7 +923,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -958,7 +960,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -995,7 +997,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1032,7 +1034,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1069,7 +1071,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1105,7 +1107,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1141,7 +1143,7 @@
dimensions: "cores:2"
dimensions: "cpu:x86-64"
dimensions: "internal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1174,7 +1176,7 @@
dimensions: "cores:2"
dimensions: "cpu:x86-64"
dimensions: "internal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1207,7 +1209,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1243,7 +1245,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1279,7 +1281,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1315,7 +1317,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1351,7 +1353,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1387,7 +1389,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1423,7 +1425,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1459,7 +1461,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1494,7 +1496,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1531,7 +1533,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1569,7 +1571,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1605,7 +1607,7 @@
dimensions: "cores:8"
dimensions: "cpu:x86-64"
dimensions: "normal:true"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1640,7 +1642,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
@@ -1672,7 +1674,7 @@
swarming_tags: "vpython:native-python-wrapper"
dimensions: "cores:8"
dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-22.04"
+ dimensions: "os:Ubuntu-20.04"
dimensions: "pool:luci.r8.ci"
exe {
cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
diff --git a/infra/config/global/main.star b/infra/config/global/main.star
index 9fb3733..40ea46a 100755
--- a/infra/config/global/main.star
+++ b/infra/config/global/main.star
@@ -178,7 +178,7 @@
if windows:
dimensions["os"] = "Windows-10"
else:
- dimensions["os"] = "Ubuntu-22.04"
+ dimensions["os"] = "Ubuntu-20.04"
if internal:
dimensions["internal"] = "true"
if normal:
@@ -302,7 +302,7 @@
r8_tester_with_default("linux-android-6.0.1",
["--dex_vm=6.0.1", "--all_tests"])
r8_tester_with_default("linux-android-7.0.0",
- ["--dex_vm=7.0.0", "--all_tests"])
+ ["--dex_vm=7.0.0", "--all_tests", "--force-32-bit-art"])
r8_tester_with_default("linux-android-8.1.0",
["--dex_vm=8.1.0", "--all_tests"])
r8_tester_with_default("linux-android-9.0.0",
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index abf8844..2af2e26 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.dex.ApplicationWriter;
import com.android.tools.r8.dex.Marker;
-import com.android.tools.r8.experimental.startup.instrumentation.StartupInstrumentation;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppServices;
import com.android.tools.r8.graph.AppView;
@@ -37,6 +36,7 @@
import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
import com.android.tools.r8.origin.CommandLineOrigin;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.profile.startup.instrumentation.StartupInstrumentation;
import com.android.tools.r8.shaking.AssumeInfoCollection;
import com.android.tools.r8.shaking.MainDexInfo;
import com.android.tools.r8.synthesis.SyntheticFinalization;
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 49f8155..ff649f7 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -291,8 +291,6 @@
*
* <p>NOTE: Startup profiles are ignored when compiling to class files or the min-API level does
* not support native multidex (API<=20).
- *
- * <p>NOTE: This API is experimental and may be subject to changes.
*/
@Override
public Builder addStartupProfileProviders(StartupProfileProvider... startupProfileProviders) {
@@ -305,8 +303,6 @@
*
* <p>NOTE: Startup profiles are ignored when compiling to class files or the min-API level does
* not support native multidex (API<=20).
- *
- * <p>NOTE: This API is experimental and may be subject to changes.
*/
@Override
public Builder addStartupProfileProviders(
diff --git a/src/main/java/com/android/tools/r8/D8CommandParser.java b/src/main/java/com/android/tools/r8/D8CommandParser.java
index 444f522..4cf6711 100644
--- a/src/main/java/com/android/tools/r8/D8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/D8CommandParser.java
@@ -5,11 +5,11 @@
import static com.android.tools.r8.ParseFlagInfoImpl.flag1;
-import com.android.tools.r8.experimental.startup.StartupProfileProviderUtils;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.profile.art.ArtProfileConsumerUtils;
import com.android.tools.r8.profile.art.ArtProfileProviderUtils;
+import com.android.tools.r8.profile.startup.StartupProfileProviderUtils;
import com.android.tools.r8.utils.ExceptionDiagnostic;
import com.android.tools.r8.utils.FlagFile;
import com.android.tools.r8.utils.StringDiagnostic;
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 14677cc..1e0f9c9 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -15,7 +15,7 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.SubtypingInfo;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.shaking.Enqueuer;
import com.android.tools.r8.shaking.EnqueuerFactory;
import com.android.tools.r8.shaking.MainDexInfo;
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 2ff0966..79d8121 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -17,7 +17,6 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppServices;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.AppliedGraphLens;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -28,7 +27,6 @@
import com.android.tools.r8.graph.DirectMappedDexApplication;
import com.android.tools.r8.graph.GenericSignatureContextBuilder;
import com.android.tools.r8.graph.GenericSignatureCorrectnessHelper;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
@@ -36,6 +34,8 @@
import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis;
import com.android.tools.r8.graph.analysis.InitializedClassesInInstanceMethodsAnalysis;
import com.android.tools.r8.graph.classmerging.VerticallyMergedClasses;
+import com.android.tools.r8.graph.lens.AppliedGraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger;
import com.android.tools.r8.inspector.internal.InspectorImpl;
import com.android.tools.r8.ir.conversion.IRConverter;
@@ -73,7 +73,7 @@
import com.android.tools.r8.optimize.redundantbridgeremoval.RedundantBridgeRemover;
import com.android.tools.r8.origin.CommandLineOrigin;
import com.android.tools.r8.profile.art.ArtProfileCompletenessChecker;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.repackaging.Repackaging;
import com.android.tools.r8.repackaging.RepackagingLens;
import com.android.tools.r8.shaking.AbstractMethodRemover;
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 6003038..f4a984e 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -484,8 +484,6 @@
*
* <p>NOTE: Startup profiles are ignored when compiling to class files or the min-API level does
* not support native multidex (API<=20).
- *
- * <p>NOTE: This API is experimental and may be subject to changes.
*/
@Override
public Builder addStartupProfileProviders(StartupProfileProvider... startupProfileProviders) {
@@ -499,8 +497,6 @@
*
* <p>NOTE: Startup profiles are ignored when compiling to class files or the min-API level does
* not support native multidex (API<=20).
- *
- * <p>NOTE: This API is experimental and may be subject to changes.
*/
@Override
public Builder addStartupProfileProviders(
@@ -1298,20 +1294,20 @@
return true;
}
// Expect one of the following patterns:
- // com.android.tools/r8-min-1.5.0/
- // com.android.tools/r8-max-1.5.99/
- // com.android.tools/r8-min-1.5.0-max-1.5.99/
- final String minPrefix = "-min-";
- final String maxPrefix = "-max-";
- if (!withoutPrefix.startsWith(minPrefix) && !withoutPrefix.startsWith(maxPrefix)) {
+ // com.android.tools/r8-from-1.5.0/
+ // com.android.tools/r8-upto-1.6.0/
+ // com.android.tools/r8-from-1.5.0-upto-1.6.0/
+ final String fromPrefix = "-from-";
+ final String uptoPrefix = "-upto-";
+ if (!withoutPrefix.startsWith(fromPrefix) && !withoutPrefix.startsWith(uptoPrefix)) {
return false;
}
SemanticVersion from = SemanticVersion.min();
- SemanticVersion to = SemanticVersion.max();
+ SemanticVersion upto = null;
- if (withoutPrefix.startsWith(minPrefix)) {
- withoutPrefix = withoutPrefix.substring(minPrefix.length());
+ if (withoutPrefix.startsWith(fromPrefix)) {
+ withoutPrefix = withoutPrefix.substring(fromPrefix.length());
int versionEnd = StringUtils.indexOf(withoutPrefix, '-', '/');
if (versionEnd == -1) {
return false;
@@ -1323,14 +1319,14 @@
}
withoutPrefix = withoutPrefix.substring(versionEnd);
}
- if (withoutPrefix.startsWith(maxPrefix)) {
- withoutPrefix = withoutPrefix.substring(maxPrefix.length());
+ if (withoutPrefix.startsWith(uptoPrefix)) {
+ withoutPrefix = withoutPrefix.substring(uptoPrefix.length());
int versionEnd = withoutPrefix.indexOf('/');
if (versionEnd == -1) {
return false;
}
try {
- to = SemanticVersion.parse(withoutPrefix.substring(0, versionEnd));
+ upto = SemanticVersion.parse(withoutPrefix.substring(0, versionEnd));
} catch (IllegalArgumentException e) {
return false;
}
@@ -1338,7 +1334,8 @@
if (compilerVersion == null) {
compilerVersion = compilerVersionSupplier.get();
}
- return compilerVersion.isNewerOrEqual(from) && to.isNewerOrEqual(compilerVersion);
+ return compilerVersion.isNewerOrEqual(from)
+ && (upto == null || upto.isNewer(compilerVersion));
}
private void parse(
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubberEventConsumer.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubberEventConsumer.java
index 47b5efb..b37673b 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubberEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubberEventConsumer.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexLibraryClass;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingApiReferenceStubberEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingApiReferenceStubberEventConsumer;
public interface ApiReferenceStubberEventConsumer {
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java b/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java
index 398da41..460a7d7 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java
index a78ca40..0c25941 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.CfState.Slot;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java
index bbffacb..cd21707 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.MemberType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java
index 41f6774..aee2e6f 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.MemberType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
index bec1872..f450da4 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
@@ -10,10 +10,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.CfState.Slot;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfCmp.java b/src/main/java/com/android/tools/r8/cf/code/CfCmp.java
index 6c1eea5..5b35a3e 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfCmp.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfCmp.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.Cmp;
import com.android.tools.r8.ir.code.Cmp.Bias;
import com.android.tools.r8.ir.code.NumericType;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
index 6ade9b2..bc226cb 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
@@ -11,10 +11,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java b/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java
index 9b9b2b1..9f3f073 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java
@@ -18,11 +18,11 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.JarApplicationReader;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java
index ca13ef3..e02b1fe 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java
@@ -10,11 +10,11 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethodHandle;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.graph.UseRegistry.MethodHandleUse;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java
index 2c8a35f..7e8d519 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java
@@ -10,10 +10,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java b/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java
index a77dc2c..75eb939 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
index cf6d035..21dbd68 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
index 46f1c0c..9756641 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java
index abc1113..9bf20e3 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java
@@ -11,10 +11,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
index 1709270..39e66b1 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
@@ -10,9 +10,9 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
index eab78b9..ed3970c 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
@@ -15,10 +15,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifier.java b/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifier.java
index 58e9d2a..d56f09a 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifier.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifier.java
@@ -17,8 +17,8 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig;
import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState;
import com.android.tools.r8.optimize.interfaces.analysis.ConcreteCfFrameState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfGoto.java b/src/main/java/com/android/tools/r8/cf/code/CfGoto.java
index 7df905c..48fe920 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfGoto.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfGoto.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIf.java b/src/main/java/com/android/tools/r8/cf/code/CfIf.java
index a12fd3ed..25dfd77 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfIf.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfIf.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.IfType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java b/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java
index 510975f..ee9ece8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.IfType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIinc.java b/src/main/java/com/android/tools/r8/cf/code/CfIinc.java
index 570a842..063f778 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfIinc.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfIinc.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java b/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java
index 7a54a7b..440f799f 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java
@@ -11,10 +11,10 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java b/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java
index 4feb794..9a0308e 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java
@@ -10,10 +10,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
index 5fbed91..b13fbe8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
@@ -13,10 +13,10 @@
import com.android.tools.r8.graph.ClasspathMethod;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
index d18bcc7..a0f3d5e 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
@@ -16,11 +16,11 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java b/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java
index 121305c..c174214 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java
@@ -15,10 +15,10 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java b/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java
index db045cd..6abd7ae 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLabel.java b/src/main/java/com/android/tools/r8/cf/code/CfLabel.java
index 9121e85..0cb0665 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfLabel.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfLabel.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
index f18c47c..0479271 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
@@ -10,9 +10,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java b/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java
index a8333d6..32afbc5 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java b/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java
index c0c62d9..edfb91a 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.MonitorType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java b/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java
index 1fdb693..344e65b 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java
@@ -10,10 +10,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNeg.java b/src/main/java/com/android/tools/r8/cf/code/CfNeg.java
index d6f9c18..d861c19 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNeg.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNeg.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNew.java b/src/main/java/com/android/tools/r8/cf/code/CfNew.java
index 4ec3b43..e6a51f8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNew.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNew.java
@@ -11,10 +11,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java b/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java
index aa3d852..5c2a657 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java
@@ -11,10 +11,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.CfState.Slot;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java b/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java
index e6b8170..5864372 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java
@@ -11,10 +11,10 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNop.java b/src/main/java/com/android/tools/r8/cf/code/CfNop.java
index f4b0527..139c2a7 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNop.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNop.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java b/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java
index a8a88b6..856cc36 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfPosition.java b/src/main/java/com/android/tools/r8/cf/code/CfPosition.java
index ec74503..6a442c3 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfPosition.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfPosition.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java b/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java
index dd9c957..98c1e78 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java
@@ -11,9 +11,9 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.CfState.Slot;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfReturn.java b/src/main/java/com/android/tools/r8/cf/code/CfReturn.java
index ee0f453..bddd05e 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfReturn.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfReturn.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java b/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java
index 497ad00..0a96d17 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java
index 2746906..e3b70f6 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java
@@ -10,9 +10,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStore.java b/src/main/java/com/android/tools/r8/cf/code/CfStore.java
index 3ff52f9..279014d 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfStore.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfStore.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java b/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java
index 2492110..f54eaa1 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java
@@ -9,9 +9,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.CfState.Slot;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfThrow.java b/src/main/java/com/android/tools/r8/cf/code/CfThrow.java
index 7333669..4bdf343 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfThrow.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfThrow.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.CfSourceCode;
import com.android.tools.r8.ir.conversion.CfState;
import com.android.tools.r8.ir.conversion.CfState.Slot;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/BooleanFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/BooleanFrameType.java
index faca255..b0ec955 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/BooleanFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/BooleanFrameType.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class BooleanFrameType extends SinglePrimitiveFrameType {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/ByteFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/ByteFrameType.java
index c55f98f..e6aa4da 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/ByteFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/ByteFrameType.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class ByteFrameType extends SinglePrimitiveFrameType {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/CharFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/CharFrameType.java
index 99fadc1..8dc437d 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/CharFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/CharFrameType.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class CharFrameType extends SinglePrimitiveFrameType {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/DoubleFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/DoubleFrameType.java
index 41ee1b5..7ad8dc2 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/DoubleFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/DoubleFrameType.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/DoubleHighFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/DoubleHighFrameType.java
index 7c89492..655fa52 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/DoubleHighFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/DoubleHighFrameType.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class DoubleHighFrameType extends DoubleFrameType {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/FloatFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/FloatFrameType.java
index 6789e2e..9cc991a 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/FloatFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/FloatFrameType.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/FrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/FrameType.java
index bf16f11..9db9a68 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/FrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/FrameType.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.PrimitiveTypeElement;
import com.android.tools.r8.ir.analysis.type.ReferenceTypeElement;
import com.android.tools.r8.ir.analysis.type.TypeElement;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithInterfaces.java b/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithInterfaces.java
index d1187c0..25e8a13 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithInterfaces.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithInterfaces.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.ReferenceTypeElement;
import com.android.tools.r8.naming.NamingLens;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java b/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java
index 88beb14..d25fb70 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.ReferenceTypeElement;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/IntFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/IntFrameType.java
index 23fd119..0f802b4 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/IntFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/IntFrameType.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/LongFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/LongFrameType.java
index 507c164..a73ab16 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/LongFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/LongFrameType.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/LongHighFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/LongHighFrameType.java
index fadcd79..f2c5c9a 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/LongHighFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/LongHighFrameType.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class LongHighFrameType extends LongFrameType {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/NullFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/NullFrameType.java
index a5e26c8..be3fa37 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/NullFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/NullFrameType.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/OneWord.java b/src/main/java/com/android/tools/r8/cf/code/frame/OneWord.java
index 06add68..3153ef8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/OneWord.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/OneWord.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/ShortFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/ShortFrameType.java
index 0b64a52..82f0279 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/ShortFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/ShortFrameType.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class ShortFrameType extends SinglePrimitiveFrameType {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/TwoWord.java b/src/main/java/com/android/tools/r8/cf/code/frame/TwoWord.java
index 23a4ca1..95cab6f 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/TwoWord.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/TwoWord.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.cf.code.frame;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class TwoWord extends SingletonFrameType implements WideFrameType {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java b/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java
index 0d45c04..5fe76fe 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import java.util.Objects;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedThis.java b/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedThis.java
index 21036e4..a1654ab 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedThis.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedThis.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 08b14b8..a664d9d 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -24,8 +24,6 @@
import com.android.tools.r8.dex.VirtualFile.FilePerInputClassDistributor;
import com.android.tools.r8.dex.VirtualFile.ItemUseInfo;
import com.android.tools.r8.errors.CompilationError;
-import com.android.tools.r8.experimental.startup.StartupCompleteness;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.features.FeatureSplitConfiguration.DataResourceProvidersAndConsumer;
import com.android.tools.r8.graph.AppServices;
import com.android.tools.r8.graph.AppView;
@@ -53,6 +51,8 @@
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapId;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.profile.startup.StartupCompleteness;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.shaking.MainDexInfo;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.ArrayUtils;
@@ -773,7 +773,8 @@
if (enclosingMethod == null
&& innerClasses.isEmpty()
&& clazz.getClassSignature().hasNoSignature()
- && !clazz.isInANest()) {
+ && !clazz.isInANest()
+ && !clazz.isRecord()) {
return;
}
@@ -853,6 +854,10 @@
clazz.getPermittedSubclassAttributes(), options.itemFactory));
}
+ if (clazz.isRecord() && options.canUseRecords()) {
+ annotations.add(DexAnnotation.createRecordAnnotation(clazz, appView));
+ }
+
if (!annotations.isEmpty()) {
// Append the annotations to annotations array of the class.
DexAnnotation[] copy =
@@ -868,6 +873,7 @@
clazz.clearInnerClasses();
clazz.clearClassSignature();
clazz.clearPermittedSubclasses();
+ clazz.clearRecordComponents();
}
private void insertAttributeAnnotationsForField(DexEncodedField field) {
diff --git a/src/main/java/com/android/tools/r8/dex/DebugBytecodeWriter.java b/src/main/java/com/android/tools/r8/dex/DebugBytecodeWriter.java
index 5a6a377..e314417 100644
--- a/src/main/java/com/android/tools/r8/dex/DebugBytecodeWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/DebugBytecodeWriter.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.DexDebugInfoForWriting;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.LebUtils;
import java.nio.ByteBuffer;
import java.util.Arrays;
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 263acfc..2055d69 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -67,6 +67,7 @@
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.PermittedSubclassAttribute;
+import com.android.tools.r8.graph.RecordComponentInfo;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.utils.InternalOptions;
@@ -898,6 +899,7 @@
attrs.nestHostAttribute,
attrs.nestMembersAttribute,
attrs.permittedSubclassesAttribute,
+ attrs.recordComponents,
attrs.getEnclosingMethodAttribute(),
attrs.getInnerClasses(),
attrs.classSignature,
@@ -1464,6 +1466,7 @@
private NestHostClassAttribute nestHostAttribute;
private List<NestMemberClassAttribute> nestMembersAttribute = Collections.emptyList();
private List<PermittedSubclassAttribute> permittedSubclassesAttribute = Collections.emptyList();
+ private List<RecordComponentInfo> recordComponents = Collections.emptyList();
public DexAnnotationSet getAnnotations() {
if (lazyAnnotations != null) {
@@ -1545,6 +1548,13 @@
permittedSubclassesAttribute =
ListUtils.map(permittedSubclasses, PermittedSubclassAttribute::new);
}
+ } else if (DexAnnotation.isRecordAnnotation(annotation, factory)) {
+ ensureAnnotations(i);
+ List<RecordComponentInfo> recordComponents =
+ DexAnnotation.getRecordComponentInfoFromAnnotation(type, annotation, factory, origin);
+ if (recordComponents != null) {
+ this.recordComponents = recordComponents;
+ }
} else {
copyAnnotation(annotation);
}
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index a6d4e84..25d19b0 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -40,12 +40,12 @@
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.DexWritableCode;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.IndexedDexItem;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.ProgramClassVisitor;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.MethodPosition;
diff --git a/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java
index 60055c9..158b912 100644
--- a/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java
+++ b/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.dex;
import com.android.tools.r8.dex.FileWriter.MixedSectionOffsets;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexAnnotationDirectory;
@@ -16,6 +15,7 @@
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import java.util.Collection;
public abstract class MixedSectionLayoutStrategy {
diff --git a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
index e249186..58f2b54 100644
--- a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
+++ b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.ProguardConfiguration;
import com.android.tools.r8.shaking.ProguardPathFilter;
diff --git a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
index c2ae2a1..b98df1c 100644
--- a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
+++ b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
@@ -5,9 +5,6 @@
package com.android.tools.r8.dex;
import com.android.tools.r8.dex.FileWriter.MixedSectionOffsets;
-import com.android.tools.r8.experimental.startup.StartupProfile;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileClassRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileMethodRule;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexAnnotationDirectory;
@@ -26,6 +23,9 @@
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
+import com.android.tools.r8.profile.startup.profile.StartupProfileClassRule;
+import com.android.tools.r8.profile.startup.profile.StartupProfileMethodRule;
import com.android.tools.r8.utils.MapUtils;
import com.android.tools.r8.utils.collections.LinkedProgramMethodSet;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index d163330..63975c0 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.debuginfo.DebugRepresentation;
import com.android.tools.r8.errors.DexFileOverflowDiagnostic;
import com.android.tools.r8.errors.InternalCompilerError;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
@@ -23,12 +22,13 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.naming.NamingLens;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.shaking.MainDexInfo;
import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.DescriptorUtils;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
index 6d95477..224f94a 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.StructuralSpecification;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
index 791eef5..b4a593e 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.StructuralSpecification;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
index 7cf55ad..7aa77db 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
@@ -7,12 +7,12 @@
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethodHandle;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.graph.UseRegistry.MethodHandleUse;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
index a4e1941..485b3da 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
@@ -7,11 +7,11 @@
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
index da79e38..b95b247 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
@@ -7,10 +7,10 @@
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
index 62b99a3..ceaaa09 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
@@ -3,9 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.dex.code;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
index 08d174c..e9ff38e 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
@@ -6,10 +6,10 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
index 5a7ab7d..436ec57 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
@@ -6,10 +6,10 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
index 1b1ad0c..eaee763 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
@@ -5,9 +5,9 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
index ce80312..3071bfa 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
@@ -5,9 +5,9 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
index 805512d..d18c307 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
index 7a5ada4..ef59bfb 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
index 711072d..05a6b22 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
index e226b0b..d398e0d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
@@ -5,9 +5,9 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
index 40d5684..5dfec30 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.CompareToVisitor;
import com.android.tools.r8.utils.structural.HashingVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
index 2351a2c..8ccce8c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.StringUtils;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
index fa27f2c..55eaac6 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.IfType;
import com.android.tools.r8.ir.code.ValueTypeConstraint;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
index f9c8419..d3bb2df 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.StringUtils;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
index 715f719..fc22957 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.StringUtils;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
index 37257b1..00b22c1 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.IfType;
import com.android.tools.r8.ir.code.ValueTypeConstraint;
import com.android.tools.r8.ir.conversion.IRBuilder;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
index 9d8f38c..0dedb95 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
index c6ee23e..bcadc94 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
index df14fb9..18c9137 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
@@ -5,9 +5,9 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
index d5b1037..695779e 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
@@ -8,10 +8,10 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.IndexedDexItem;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
index 67ae1b5..d2eed2d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
index 07cea77..2e7de21 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
index 7cd9e2c..dd6f6bf 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
@@ -7,9 +7,9 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
index 3a9dff4..0718573 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -9,10 +9,10 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
index 7e887dc..e4ec21d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -8,11 +8,11 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.IndexedDexItem;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
index 15cb63a..a135f5b 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.structural.CompareToVisitor;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
index 1f77b9f..8edfdf6 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
index 77a2f9f..76a3289 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
@@ -9,10 +9,10 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.FieldMemberType;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
index ba204cd..a85b4a3 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
index 118556a..184b024 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
@@ -12,11 +12,11 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.IndexedDexItem;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
index 28464af..21dd606 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexCallSite;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
index 51f0908..3bc4796 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexCallSite;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
index c59579b..763b823 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
@@ -6,10 +6,10 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
index 7dc8a6c..8809f06 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
@@ -6,10 +6,10 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
index 451eef1..d2adc25 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
@@ -7,10 +7,10 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.naming.dexitembasedstring.NameComputationInfo;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
index 285b82e..cad1490 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
index e3bc04d..20067e5 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.StructuralSpecification;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
index 3992859..0ef15d8 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
@@ -7,10 +7,10 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.StructuralSpecification;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
index 77b35f6..056efc7 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
@@ -3,9 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.dex.code;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.StringUtils;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
index 8f0b9e8..f7e4684 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
@@ -7,10 +7,10 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
index 0e9b3b8..3fe34b47 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.StructuralSpecification;
import java.nio.ShortBuffer;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
index f0059d9..0738430 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
@@ -3,9 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.dex.code;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.RetracerForCodePrinting;
import com.android.tools.r8.utils.StringUtils;
diff --git a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
index 88bfb4f..3033f19 100644
--- a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
+++ b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
@@ -8,16 +8,16 @@
import com.android.tools.r8.ProgramResource;
import com.android.tools.r8.ProgramResourceProvider;
import com.android.tools.r8.ResourceException;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Reporter;
diff --git a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
index 4c3c809..f9acf30 100644
--- a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
+++ b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.features;
import com.android.tools.r8.FeatureSplit;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMember;
@@ -13,6 +12,7 @@
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.OptionalBool;
diff --git a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
index 3e180df..4c63987 100644
--- a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
+++ b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.graph;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import java.util.IdentityHashMap;
import java.util.Map;
diff --git a/src/main/java/com/android/tools/r8/graph/AccessControl.java b/src/main/java/com/android/tools/r8/graph/AccessControl.java
index ecb16404..d692cba 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessControl.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessControl.java
@@ -3,9 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.graph;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
import com.android.tools.r8.features.FeatureSplitBoundaryOptimizationUtils;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.OptionalBool;
diff --git a/src/main/java/com/android/tools/r8/graph/AppServices.java b/src/main/java/com/android/tools/r8/graph/AppServices.java
index 6776d2c..dc557e9 100644
--- a/src/main/java/com/android/tools/r8/graph/AppServices.java
+++ b/src/main/java/com/android/tools/r8/graph/AppServices.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.ResourceException;
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.DescriptorUtils;
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index 92848aa..919de23 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -9,13 +9,14 @@
import com.android.tools.r8.contexts.CompilationContext;
import com.android.tools.r8.contexts.CompilationContext.ProcessorContext;
import com.android.tools.r8.errors.dontwarn.DontWarnConfiguration;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
import com.android.tools.r8.graph.DexValue.DexValueString;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.analysis.InitializedClassesInInstanceMethodsAnalysis.InitializedClassesInInstanceMethods;
import com.android.tools.r8.graph.classmerging.MergedClassesCollection;
import com.android.tools.r8.graph.classmerging.VerticallyMergedClasses;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger;
import com.android.tools.r8.horizontalclassmerging.HorizontallyMergedClasses;
import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraintFactory;
@@ -35,6 +36,7 @@
import com.android.tools.r8.optimize.argumentpropagation.ArgumentPropagator;
import com.android.tools.r8.optimize.interfaces.collection.OpenClosedInterfacesCollection;
import com.android.tools.r8.profile.art.ArtProfileCollection;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.AssumeInfoCollection;
import com.android.tools.r8.shaking.KeepClassInfo;
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 38bf4ee..b71e8d2 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -27,6 +27,8 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.bytecodemetadata.BytecodeInstructionMetadata;
import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadata;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/graph/ClassKind.java b/src/main/java/com/android/tools/r8/graph/ClassKind.java
index e878e0d..0e3e660 100644
--- a/src/main/java/com/android/tools/r8/graph/ClassKind.java
+++ b/src/main/java/com/android/tools/r8/graph/ClassKind.java
@@ -27,6 +27,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -49,6 +50,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -72,6 +74,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -94,6 +97,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -115,6 +119,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -137,6 +142,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -159,6 +165,7 @@
NestHostClassAttribute nestHost,
List<NestMemberClassAttribute> nestMembers,
List<PermittedSubclassAttribute> permittedSubclasses,
+ List<RecordComponentInfo> recordComponents,
EnclosingMethodAttribute enclosingMember,
List<InnerClassAttribute> innerClasses,
ClassSignature classSignature,
@@ -191,6 +198,7 @@
NestHostClassAttribute nestHost,
List<NestMemberClassAttribute> nestMembers,
List<PermittedSubclassAttribute> permittedSubclasses,
+ List<RecordComponentInfo> recordComponents,
EnclosingMethodAttribute enclosingMember,
List<InnerClassAttribute> innerClasses,
ClassSignature classSignature,
@@ -213,6 +221,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index c70e226..42dc600 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.bytecodemetadata.BytecodeInstructionMetadata;
import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadata;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
index 601ce08..06fd92e 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -16,7 +16,8 @@
import com.android.tools.r8.dex.code.DexReturnVoid;
import com.android.tools.r8.graph.DexCode.Try;
import com.android.tools.r8.graph.DexCode.TryHandler;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index f72877a..25a5a97 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -9,12 +9,15 @@
import com.android.tools.r8.dex.MixedSectionCollection;
import com.android.tools.r8.graph.DexValue.DexValueAnnotation;
import com.android.tools.r8.graph.DexValue.DexValueArray;
+import com.android.tools.r8.graph.DexValue.DexValueByte;
import com.android.tools.r8.graph.DexValue.DexValueInt;
import com.android.tools.r8.graph.DexValue.DexValueMethod;
import com.android.tools.r8.graph.DexValue.DexValueNull;
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.graph.DexValue.DexValueType;
+import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
import com.android.tools.r8.ir.desugar.CovariantReturnTypeAnnotationTransformer;
+import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -24,6 +27,7 @@
import com.android.tools.r8.utils.structural.StructuralMapping;
import com.android.tools.r8.utils.structural.StructuralSpecification;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.function.Function;
@@ -209,6 +213,10 @@
return annotation.annotation.type == factory.annotationPermittedSubclasses;
}
+ public static boolean isRecordAnnotation(DexAnnotation annotation, DexItemFactory factory) {
+ return annotation.getAnnotationType() == factory.annotationRecord;
+ }
+
public static DexAnnotation createInnerClassAnnotation(
DexString clazz, int access, DexItemFactory factory) {
return new DexAnnotation(
@@ -299,6 +307,110 @@
return getTypesFromAnnotation(factory.annotationPermittedSubclasses, annotation);
}
+ /** See {@link #createRecordAnnotation(DexProgramClass, AppView)} for the representation. */
+ public static List<RecordComponentInfo> getRecordComponentInfoFromAnnotation(
+ DexType type, DexAnnotation annotation, DexItemFactory factory, Origin origin) {
+ DexValue componentNamesValue =
+ getSystemValueAnnotationValueWithName(
+ factory.annotationRecord, annotation, factory.annotationRecordComponentNames);
+ DexValue componentTypesValue =
+ getSystemValueAnnotationValueWithName(
+ factory.annotationRecord, annotation, factory.annotationRecordComponentTypes);
+ DexValue componentSignaturesValue =
+ getSystemValueAnnotationValueWithName(
+ factory.annotationRecord, annotation, factory.annotationRecordComponentSignatures);
+ DexValue componentAnnotationVisibilitiesValue =
+ getSystemValueAnnotationValueWithName(
+ factory.annotationRecord,
+ annotation,
+ factory.annotationRecordComponentAnnotationVisibilities);
+ DexValue componentAnnotationsValue =
+ getSystemValueAnnotationValueWithName(
+ factory.annotationRecord, annotation, factory.annotationRecordComponentAnnotations);
+
+ if (componentNamesValue == null
+ || componentTypesValue == null
+ || componentSignaturesValue == null
+ || componentAnnotationVisibilitiesValue == null
+ || componentAnnotationsValue == null) {
+ return null;
+ }
+ if (!componentNamesValue.isDexValueArray()
+ || !componentTypesValue.isDexValueArray()
+ || !componentSignaturesValue.isDexValueArray()
+ || !componentAnnotationVisibilitiesValue.isDexValueArray()
+ || !componentAnnotationsValue.isDexValueArray()) {
+ return null;
+ }
+ DexValueArray componentNamesValueArray = componentNamesValue.asDexValueArray();
+ DexValueArray componentTypesValueArray = componentTypesValue.asDexValueArray();
+ DexValueArray componentSignaturesValueArray = componentSignaturesValue.asDexValueArray();
+ DexValueArray componentAnnotationVisibilitiesValueArray =
+ componentAnnotationVisibilitiesValue.asDexValueArray();
+ DexValueArray componentAnnotationsValueArray = componentAnnotationsValue.asDexValueArray();
+ if (componentNamesValueArray.size() != componentTypesValueArray.size()
+ || componentNamesValueArray.size() != componentSignaturesValueArray.size()
+ || componentNamesValueArray.size() != componentAnnotationVisibilitiesValueArray.size()
+ || componentNamesValueArray.size() != componentAnnotationsValueArray.size()) {
+ return null;
+ }
+ List<RecordComponentInfo> result = new ArrayList<>(componentNamesValueArray.size());
+ for (int componentIndex = 0;
+ componentIndex < componentNamesValueArray.size();
+ componentIndex++) {
+ DexValue nameValue = componentNamesValueArray.getValue(componentIndex);
+ DexValue typeValue = componentTypesValueArray.getValue(componentIndex);
+ DexValue signatureValue = componentSignaturesValueArray.getValue(componentIndex);
+ DexValue visibilitiesValue =
+ componentAnnotationVisibilitiesValueArray.getValue(componentIndex);
+ DexValue annotationsValue = componentAnnotationsValueArray.getValue(componentIndex);
+ if (!nameValue.isDexValueString()
+ || !typeValue.isDexValueType()
+ || !(signatureValue.isDexValueAnnotation() || signatureValue.isDexValueNull())
+ || !visibilitiesValue.isDexValueArray()
+ || !annotationsValue.isDexValueArray()) {
+ return null;
+ }
+ DexValueArray visibilitiesValueArray = visibilitiesValue.asDexValueArray();
+ DexValueArray annotationsValueArray = annotationsValue.asDexValueArray();
+ if (visibilitiesValueArray.size() != annotationsValueArray.size()) {
+ return null;
+ }
+ List<DexAnnotation> componentAnnotations = Collections.emptyList();
+ if (annotationsValueArray.size() > 0) {
+ componentAnnotations = new ArrayList<>(annotationsValueArray.size());
+ for (int annotationIndex = 0;
+ annotationIndex < annotationsValueArray.size();
+ annotationIndex++) {
+ DexValue visibilityValue = visibilitiesValueArray.getValue(annotationIndex);
+ DexValue annotationValue = annotationsValueArray.getValue(annotationIndex);
+ if (!visibilityValue.isDexValueByte() || !annotationValue.isDexValueAnnotation()) {
+ return null;
+ }
+ componentAnnotations.add(
+ new DexAnnotation(
+ visibilityValue.asDexValueByte().getValue(),
+ annotationValue.asDexValueAnnotation().getValue()));
+ }
+ }
+ FieldTypeSignature componentSignature =
+ GenericSignature.parseFieldTypeSignature(
+ nameValue.asDexValueString().getValue().toString(),
+ signatureValue.isDexValueAnnotation()
+ ? getSignature(signatureValue.asDexValueAnnotation().getValue())
+ : null,
+ origin,
+ factory,
+ null);
+
+ DexType componentType = typeValue.asDexValueType().getValue();
+ DexString componentName = nameValue.asDexValueString().getValue();
+ DexField componentField = factory.createField(type, componentType, componentName);
+ result.add(new RecordComponentInfo(componentField, componentSignature, componentAnnotations));
+ }
+ return result;
+ }
+
public static DexAnnotation createSourceDebugExtensionAnnotation(DexValue value,
DexItemFactory factory) {
return new DexAnnotation(VISIBILITY_SYSTEM,
@@ -367,8 +479,143 @@
new DexValue.DexValueArray(list.toArray(DexValue.EMPTY_ARRAY)));
}
+ /**
+ * Record component information is written to DEX as a system annotation named <code>
+ * dalvik.annotation.Record</code> with the following content:
+ *
+ * <pre>
+ * componentAnnotationVisibilities byte[][]
+ * componentAnnotations Annotation[][]
+ * componentNames String[]
+ * componentSignatures Annotation[] // Annotation dalvik.annotation.Signature or NULL
+ * componentTypes String[]
+ * </pre>
+ *
+ * Each of the arrays have one element for each component.
+ *
+ * <p>Example of a two component record with two annotations on the first component and one on the
+ * second and with a signature on the first component.
+ *
+ * <pre>
+ * .annotation system Ldalvik/annotation/Record;
+ * componentAnnotationVisibilities = {
+ * {
+ * 0x1,
+ * 0x1
+ * },
+ * {
+ * 0x1
+ * }
+ * }
+ * componentAnnotations = {
+ * {
+ * .subannotation LAnnotation1;
+ * value = "a"
+ * .end subannotation,
+ * .subannotation LAnnotation2;
+ * value = "c"
+ * .end subannotation
+ * },
+ * {
+ * .subannotation LAnnotation3;
+ * value = "z"
+ * .end subannotation
+ * }
+ * }
+ * componentNames = {
+ * "name",
+ * "age"
+ * }
+ * componentSignatures = {
+ * .subannotation Ldalvik/annotation/Signature;
+ * value = {
+ * "TX;"
+ * }
+ * .end subannotation,
+ * NULL
+ * }
+ * componentTypes = {
+ * Ljava/lang/CharSequence;,
+ * Ljava/lang/Object;
+ * }
+ * .end annotation
+ * </pre>
+ */
+ public static DexAnnotation createRecordAnnotation(DexProgramClass clazz, AppView<?> appView) {
+ DexItemFactory factory = appView.dexItemFactory();
+ int componentCount = clazz.getRecordComponents().size();
+ DexValueString[] componentNames = new DexValueString[componentCount];
+ DexValueType[] componentTypes = new DexValueType[componentCount];
+ DexValue[] componentSignatures = new DexValue[componentCount];
+ DexValueArray[] componentAnnotationVisibilities = new DexValueArray[componentCount];
+ DexValueArray[] componentAnnotations = new DexValueArray[componentCount];
+ for (int componentIndex = 0; componentIndex < componentCount; componentIndex++) {
+ RecordComponentInfo info = clazz.getRecordComponents().get(componentIndex);
+ componentNames[componentIndex] =
+ new DexValueString(appView.getNamingLens().lookupName(info.getField()));
+ componentTypes[componentIndex] = new DexValueType(info.getType());
+ if (info.getSignature().hasNoSignature()) {
+ componentSignatures[componentIndex] = DexValueNull.NULL;
+ } else {
+ componentSignatures[componentIndex] =
+ new DexValueAnnotation(
+ createSignatureAnnotation(info.getSignature().toString(), factory).annotation);
+ }
+ int annotationsSize = info.getAnnotations().size();
+ DexValueByte[] visibilities = new DexValueByte[annotationsSize];
+ DexValueAnnotation[] annotations = new DexValueAnnotation[annotationsSize];
+ componentAnnotationVisibilities[componentIndex] = new DexValueArray(visibilities);
+ componentAnnotations[componentIndex] = new DexValueArray(annotations);
+ for (int annotationIndex = 0; annotationIndex < annotationsSize; annotationIndex++) {
+ DexAnnotation annotation = info.getAnnotations().get(annotationIndex);
+ visibilities[annotationIndex] = DexValueByte.create((byte) annotation.getVisibility());
+ annotations[annotationIndex] = new DexValueAnnotation(annotation.annotation);
+ }
+ }
+
+ if (appView.options().emitRecordAnnotationsExInDex) {
+ return new DexAnnotation(
+ VISIBILITY_SYSTEM,
+ new DexEncodedAnnotation(
+ factory.annotationRecord,
+ new DexAnnotationElement[] {
+ new DexAnnotationElement(
+ factory.annotationRecordComponentNames, new DexValueArray(componentNames)),
+ new DexAnnotationElement(
+ factory.annotationRecordComponentTypes, new DexValueArray(componentTypes)),
+ new DexAnnotationElement(
+ factory.annotationRecordComponentSignatures,
+ new DexValueArray(componentSignatures)),
+ new DexAnnotationElement(
+ factory.annotationRecordComponentAnnotationVisibilities,
+ new DexValueArray(componentAnnotationVisibilities)),
+ new DexAnnotationElement(
+ factory.annotationRecordComponentAnnotations,
+ new DexValueArray(componentAnnotations))
+ }));
+ } else {
+ return new DexAnnotation(
+ VISIBILITY_SYSTEM,
+ new DexEncodedAnnotation(
+ factory.annotationRecord,
+ new DexAnnotationElement[] {
+ new DexAnnotationElement(
+ factory.annotationRecordComponentNames, new DexValueArray(componentNames)),
+ new DexAnnotationElement(
+ factory.annotationRecordComponentTypes, new DexValueArray(componentTypes))
+ }));
+ }
+ }
+
public static String getSignature(DexAnnotation signatureAnnotation) {
- DexValueArray elements = signatureAnnotation.annotation.elements[0].value.asDexValueArray();
+ return getSignature(signatureAnnotation.annotation);
+ }
+
+ public static String getSignature(DexEncodedAnnotation signatureAnnotation) {
+ return getSignature(signatureAnnotation.elements[0].value.asDexValueArray());
+ }
+
+ public static String getSignature(DexValueArray elements) {
StringBuilder signature = new StringBuilder();
for (DexValue element : elements.getValues()) {
signature.append(element.asDexValueString().value.toString());
@@ -403,6 +650,18 @@
: annotation.annotation.elements[0].value;
}
+ private static DexValue getSystemValueAnnotationValueWithName(
+ DexType type, DexAnnotation annotation, DexString name) {
+ assert annotation.visibility == VISIBILITY_SYSTEM;
+ assert annotation.getAnnotationType() == type;
+ for (DexAnnotationElement element : annotation.annotation.elements) {
+ if (element.name == name) {
+ return element.value;
+ }
+ }
+ return null;
+ }
+
public static boolean isThrowingAnnotation(DexAnnotation annotation,
DexItemFactory factory) {
return annotation.annotation.type == factory.annotationThrows;
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 59bff83..342a214 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -78,6 +78,8 @@
private List<PermittedSubclassAttribute> permittedSubclasses;
+ private List<RecordComponentInfo> recordComponents;
+
/** Generic signature information if the attribute is present in the input */
protected ClassSignature classSignature;
@@ -93,6 +95,7 @@
NestHostClassAttribute nestHost,
List<NestMemberClassAttribute> nestMembers,
List<PermittedSubclassAttribute> permittedSubclasses,
+ List<RecordComponentInfo> recordComponents,
EnclosingMethodAttribute enclosingMethod,
List<InnerClassAttribute> innerClasses,
ClassSignature classSignature,
@@ -113,6 +116,7 @@
this.nestMembers = nestMembers;
assert nestMembers != null;
this.permittedSubclasses = permittedSubclasses;
+ this.recordComponents = recordComponents;
assert permittedSubclasses != null;
this.enclosingMethod = enclosingMethod;
this.innerClasses = innerClasses;
@@ -1113,6 +1117,20 @@
return permittedSubclasses;
}
+ public List<RecordComponentInfo> getRecordComponents() {
+ return recordComponents;
+ }
+
+ public void clearRecordComponents() {
+ recordComponents.clear();
+ }
+
+ public void removeRecordComponents(Predicate<RecordComponentInfo> predicate) {
+ if (!recordComponents.isEmpty()) {
+ recordComponents.removeIf(predicate);
+ }
+ }
+
/** Returns kotlin class info if the class is synthesized by kotlin compiler. */
public abstract KotlinClassLevelInfo getKotlinInfo();
diff --git a/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java b/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java
index aca2a14..2937cd2 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java
@@ -36,6 +36,7 @@
NestHostClassAttribute nestHost,
List<NestMemberClassAttribute> nestMembers,
List<PermittedSubclassAttribute> permittedSubclasses,
+ List<RecordComponentInfo> recordComponents,
EnclosingMethodAttribute enclosingMember,
List<InnerClassAttribute> innerClasses,
ClassSignature classSignature,
@@ -56,6 +57,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 401a1eb..486aaa7 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -24,6 +24,7 @@
import com.android.tools.r8.graph.DexDebugInfo.EventBasedDebugInfo;
import com.android.tools.r8.graph.bytecodemetadata.BytecodeInstructionMetadata;
import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadata;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java b/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java
index 737df40..ac495b4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.dex.MixedSectionCollection;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.utils.structural.CompareToVisitor;
import com.android.tools.r8.utils.structural.HashingVisitor;
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
index 3b40cdb..a7cd5d1 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.dex.MixedSectionCollection;
import com.android.tools.r8.dex.code.DexInstruction;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.LebUtils;
import com.android.tools.r8.utils.StringUtils;
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java b/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java
index 75cdd80..67ab2aa 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.dex.DebugBytecodeWriter;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.graph.lens.GraphLens;
/** Interface to guarantee that the info only contains writable events. */
public interface DexDebugInfoForWriting {
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 5c14069..579b21f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -735,6 +735,14 @@
createStaticallyKnownType("Ldalvik/annotation/NestMembers;");
public final DexType annotationPermittedSubclasses =
createStaticallyKnownType("Ldalvik/annotation/PermittedSubclasses;");
+ public final DexType annotationRecord = createStaticallyKnownType("Ldalvik/annotation/Record;");
+ public final DexString annotationRecordComponentNames = createString("componentNames");
+ public final DexString annotationRecordComponentTypes = createString("componentTypes");
+ public final DexString annotationRecordComponentSignatures = createString("componentSignatures");
+ public final DexString annotationRecordComponentAnnotationVisibilities =
+ createString("componentAnnotationVisibilities");
+ public final DexString annotationRecordComponentAnnotations =
+ createString("componentAnnotations");
public final DexType annotationSourceDebugExtension =
createStaticallyKnownType("Ldalvik/annotation/SourceDebugExtension;");
public final DexType annotationThrows = createStaticallyKnownType("Ldalvik/annotation/Throws;");
diff --git a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
index 24091e4..a145cba 100644
--- a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
@@ -34,6 +34,7 @@
NestHostClassAttribute nestHost,
List<NestMemberClassAttribute> nestMembers,
List<PermittedSubclassAttribute> permittedSubclasses,
+ List<RecordComponentInfo> recordComponents,
EnclosingMethodAttribute enclosingMember,
List<InnerClassAttribute> innerClasses,
ClassSignature classSignature,
@@ -54,6 +55,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -174,6 +176,7 @@
private NestHostClassAttribute nestHost = null;
private List<NestMemberClassAttribute> nestMembers = Collections.emptyList();
private List<PermittedSubclassAttribute> permittedSubclasses = Collections.emptyList();
+ private List<RecordComponentInfo> recordComponents = Collections.emptyList();
private EnclosingMethodAttribute enclosingMember = null;
private List<InnerClassAttribute> innerClasses = Collections.emptyList();
private ClassSignature classSignature = ClassSignature.noSignature();
@@ -217,6 +220,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index 01fa0e0..a448af0 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -71,6 +71,7 @@
NestHostClassAttribute nestHost,
List<NestMemberClassAttribute> nestMembers,
List<PermittedSubclassAttribute> permittedSubclasses,
+ List<RecordComponentInfo> recordComponents,
EnclosingMethodAttribute enclosingMember,
List<InnerClassAttribute> innerClasses,
ClassSignature classSignature,
@@ -93,6 +94,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -117,6 +119,7 @@
NestHostClassAttribute nestHost,
List<NestMemberClassAttribute> nestMembers,
List<PermittedSubclassAttribute> permittedSubclasses,
+ List<RecordComponentInfo> recordComponents,
EnclosingMethodAttribute enclosingMember,
List<InnerClassAttribute> innerClasses,
ClassSignature classSignature,
@@ -137,6 +140,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -161,6 +165,7 @@
null,
Collections.emptyList(),
Collections.emptyList(),
+ Collections.emptyList(),
null,
Collections.emptyList(),
ClassSignature.noSignature(),
diff --git a/src/main/java/com/android/tools/r8/graph/DexValue.java b/src/main/java/com/android/tools/r8/graph/DexValue.java
index c455396..5271c0a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexValue.java
+++ b/src/main/java/com/android/tools/r8/graph/DexValue.java
@@ -1600,6 +1600,14 @@
return values;
}
+ public int size() {
+ return values.length;
+ }
+
+ public DexValue getValue(int i) {
+ return values[i];
+ }
+
@Override
public DexValueKind getValueKind() {
return DexValueKind.ARRAY;
diff --git a/src/main/java/com/android/tools/r8/graph/DexWritableCode.java b/src/main/java/com/android/tools/r8/graph/DexWritableCode.java
index af4b8a0..1e8856c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexWritableCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexWritableCode.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexCode.Try;
import com.android.tools.r8.graph.DexCode.TryHandler;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.CompareToVisitor;
import com.android.tools.r8.utils.structural.HashingVisitor;
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 1f756ee..08dad18 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.DataResourceProvider;
import com.android.tools.r8.graph.LazyLoadedDexApplication.AllClasses;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Timing;
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java
index 8a8b9da..63e4530 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.graph;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.ObjectUtils;
import com.android.tools.r8.utils.SetUtils;
import java.util.IdentityHashMap;
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
index 8779817..e5d9dfe 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AbstractAccessContexts.ConcreteAccessContexts;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.google.common.collect.Sets;
import java.util.IdentityHashMap;
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
deleted file mode 100644
index 95921b3..0000000
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ /dev/null
@@ -1,1223 +0,0 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
-
-import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
-
-import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
-import com.android.tools.r8.ir.code.InvokeType;
-import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.ir.optimize.enums.EnumUnboxingLens;
-import com.android.tools.r8.optimize.MemberRebindingIdentityLens;
-import com.android.tools.r8.optimize.MemberRebindingLens;
-import com.android.tools.r8.shaking.KeepInfoCollection;
-import com.android.tools.r8.utils.Action;
-import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.IterableUtils;
-import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.SetUtils;
-import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeHashMap;
-import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeMap;
-import com.android.tools.r8.utils.collections.MutableBidirectionalManyToOneRepresentativeMap;
-import com.android.tools.r8.utils.collections.ProgramMethodSet;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import it.unimi.dsi.fastutil.objects.Object2BooleanArrayMap;
-import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
-import java.util.ArrayList;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * A GraphLens implements a virtual view on top of the graph, used to delay global rewrites until
- * later IR processing stages.
- *
- * <p>Valid remappings are limited to the following operations:
- *
- * <ul>
- * <li>Mapping a classes type to one of the super/subtypes.
- * <li>Renaming private methods/fields.
- * <li>Moving methods/fields to a super/subclass.
- * <li>Replacing method/field references by the same method/field on a super/subtype
- * <li>Moved methods might require changed invocation type at the call site
- * </ul>
- *
- * Note that the latter two have to take visibility into account.
- */
-public abstract class GraphLens {
-
- abstract static class MemberLookupResult<R extends DexMember<?, R>> {
-
- private final R reference;
- private final R reboundReference;
-
- private MemberLookupResult(R reference, R reboundReference) {
- this.reference = reference;
- this.reboundReference = reboundReference;
- }
-
- public R getReference() {
- return reference;
- }
-
- public R getRewrittenReference(BidirectionalManyToOneRepresentativeMap<R, R> rewritings) {
- return rewritings.getOrDefault(reference, reference);
- }
-
- public R getRewrittenReference(Map<R, R> rewritings) {
- return rewritings.getOrDefault(reference, reference);
- }
-
- public boolean hasReboundReference() {
- return reboundReference != null;
- }
-
- public R getReboundReference() {
- return reboundReference;
- }
-
- public R getRewrittenReboundReference(
- BidirectionalManyToOneRepresentativeMap<R, R> rewritings) {
- return rewritings.getOrDefault(reboundReference, reboundReference);
- }
-
- public R getRewrittenReboundReference(Function<R, R> rewritings) {
- R rewrittenReboundReference = rewritings.apply(reboundReference);
- return rewrittenReboundReference != null ? rewrittenReboundReference : reboundReference;
- }
-
- abstract static class Builder<R extends DexMember<?, R>, Self extends Builder<R, Self>> {
-
- R reference;
- R reboundReference;
-
- public Self setReference(R reference) {
- this.reference = reference;
- return self();
- }
-
- public Self setReboundReference(R reboundReference) {
- this.reboundReference = reboundReference;
- return self();
- }
-
- public abstract Self self();
- }
- }
-
- /**
- * Intermediate result of a field lookup that stores the actual non-rebound reference and the
- * rebound reference that points to the definition of the field.
- */
- public static class FieldLookupResult extends MemberLookupResult<DexField> {
-
- private final DexType readCastType;
- private final DexType writeCastType;
-
- private FieldLookupResult(
- DexField reference,
- DexField reboundReference,
- DexType readCastType,
- DexType writeCastType) {
- super(reference, reboundReference);
- this.readCastType = readCastType;
- this.writeCastType = writeCastType;
- }
-
- public static Builder builder(GraphLens lens) {
- return new Builder(lens);
- }
-
- public boolean hasReadCastType() {
- return readCastType != null;
- }
-
- public DexType getReadCastType() {
- return readCastType;
- }
-
- public DexType getRewrittenReadCastType(Function<DexType, DexType> fn) {
- return hasReadCastType() ? fn.apply(readCastType) : null;
- }
-
- public boolean hasWriteCastType() {
- return writeCastType != null;
- }
-
- public DexType getWriteCastType() {
- return writeCastType;
- }
-
- public DexType getRewrittenWriteCastType(Function<DexType, DexType> fn) {
- return hasWriteCastType() ? fn.apply(writeCastType) : null;
- }
-
- public static class Builder extends MemberLookupResult.Builder<DexField, Builder> {
-
- private DexType readCastType;
- private DexType writeCastType;
- private GraphLens lens;
-
- private Builder(GraphLens lens) {
- this.lens = lens;
- }
-
- public Builder setReadCastType(DexType readCastType) {
- this.readCastType = readCastType;
- return this;
- }
-
- public Builder setWriteCastType(DexType writeCastType) {
- this.writeCastType = writeCastType;
- return this;
- }
-
- @Override
- public Builder self() {
- return this;
- }
-
- public FieldLookupResult build() {
- // TODO(b/168282032): All non-identity graph lenses should set the rebound reference.
- return new FieldLookupResult(reference, reboundReference, readCastType, writeCastType);
- }
- }
- }
-
- /**
- * Result of a method lookup in a GraphLens.
- *
- * <p>This provides the new target and invoke type to use, along with a description of the
- * prototype changes that have been made to the target method and the corresponding required
- * changes to the invoke arguments.
- */
- public static class MethodLookupResult extends MemberLookupResult<DexMethod> {
-
- private final InvokeType type;
- private final RewrittenPrototypeDescription prototypeChanges;
-
- public MethodLookupResult(
- DexMethod reference,
- DexMethod reboundReference,
- InvokeType type,
- RewrittenPrototypeDescription prototypeChanges) {
- super(reference, reboundReference);
- this.type = type;
- this.prototypeChanges = prototypeChanges;
- }
-
- public static Builder builder(GraphLens lens) {
- return new Builder(lens);
- }
-
- public InvokeType getType() {
- return type;
- }
-
- public RewrittenPrototypeDescription getPrototypeChanges() {
- return prototypeChanges;
- }
-
- public static class Builder extends MemberLookupResult.Builder<DexMethod, Builder> {
-
- private final GraphLens lens;
- private RewrittenPrototypeDescription prototypeChanges = RewrittenPrototypeDescription.none();
- private InvokeType type;
-
- private Builder(GraphLens lens) {
- this.lens = lens;
- }
-
- public Builder setPrototypeChanges(RewrittenPrototypeDescription prototypeChanges) {
- this.prototypeChanges = prototypeChanges;
- return this;
- }
-
- public Builder setType(InvokeType type) {
- this.type = type;
- return this;
- }
-
- public MethodLookupResult build() {
- assert reference != null;
- // TODO(b/168282032): All non-identity graph lenses should set the rebound reference.
- return new MethodLookupResult(reference, reboundReference, type, prototypeChanges);
- }
-
- @Override
- public Builder self() {
- return this;
- }
- }
- }
-
- public abstract static class Builder {
-
- protected final MutableBidirectionalManyToOneRepresentativeMap<DexField, DexField> fieldMap =
- BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
- protected final MutableBidirectionalManyToOneRepresentativeMap<DexMethod, DexMethod> methodMap =
- BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
- protected final Map<DexType, DexType> typeMap = new IdentityHashMap<>();
-
- protected Builder() {}
-
- public void map(DexType from, DexType to) {
- if (from == to) {
- return;
- }
- typeMap.put(from, to);
- }
-
- public void move(DexMethod from, DexMethod to) {
- if (from == to) {
- return;
- }
- methodMap.put(from, to);
- }
-
- public void move(DexField from, DexField to) {
- if (from == to) {
- return;
- }
- fieldMap.put(from, to);
- }
-
- public abstract GraphLens build(AppView<?> appView);
- }
-
- /**
- * Intentionally private. All graph lenses except for {@link IdentityGraphLens} should inherit
- * from {@link NonIdentityGraphLens}.
- */
- private GraphLens() {}
-
- public boolean isSyntheticFinalizationGraphLens() {
- return false;
- }
-
- public abstract DexType getOriginalType(DexType type);
-
- public abstract Iterable<DexType> getOriginalTypes(DexType type);
-
- public abstract DexField getOriginalFieldSignature(DexField field);
-
- public final DexMember<?, ?> getOriginalMemberSignature(DexMember<?, ?> member) {
- return member.apply(this::getOriginalFieldSignature, this::getOriginalMethodSignature);
- }
-
- public final DexMethod getOriginalMethodSignature(DexMethod method) {
- return getOriginalMethodSignature(method, null);
- }
-
- public final DexMethod getOriginalMethodSignature(DexMethod method, GraphLens atGraphLens) {
- GraphLens current = this;
- DexMethod original = method;
- while (current.isNonIdentityLens() && current != atGraphLens) {
- NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
- original = nonIdentityLens.getPreviousMethodSignature(original);
- current = nonIdentityLens.getPrevious();
- }
- assert atGraphLens == null ? current.isIdentityLens() : (current == atGraphLens);
- return original;
- }
-
- public final DexMethod getOriginalMethodSignatureForMapping(DexMethod method) {
- GraphLens current = this;
- DexMethod original = method;
- while (current.isNonIdentityLens()) {
- NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
- original = nonIdentityLens.getPreviousMethodSignatureForMapping(original);
- current = nonIdentityLens.getPrevious();
- }
- assert current.isIdentityLens();
- return original;
- }
-
- public final DexField getRenamedFieldSignature(DexField originalField) {
- return getRenamedFieldSignature(originalField, null);
- }
-
- public abstract DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens);
-
- public final DexMember<?, ?> getRenamedMemberSignature(DexMember<?, ?> originalMember) {
- return originalMember.isDexField()
- ? getRenamedFieldSignature(originalMember.asDexField())
- : getRenamedMethodSignature(originalMember.asDexMethod());
- }
-
- public final DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
- return getRenamedMethodSignature(originalMethod, null);
- }
-
- public abstract DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied);
-
- public DexEncodedMethod mapDexEncodedMethod(
- DexEncodedMethod originalEncodedMethod, DexDefinitionSupplier definitions) {
- return mapDexEncodedMethod(originalEncodedMethod, definitions, null);
- }
-
- public DexEncodedMethod mapDexEncodedMethod(
- DexEncodedMethod originalEncodedMethod,
- DexDefinitionSupplier definitions,
- GraphLens applied) {
- assert originalEncodedMethod != DexEncodedMethod.SENTINEL;
- DexMethod newMethod = getRenamedMethodSignature(originalEncodedMethod.getReference(), applied);
- // Note that:
- // * Even if `newMethod` is the same as `originalEncodedMethod.method`, we still need to look it
- // up, since `originalEncodedMethod` may be obsolete.
- // * We can't directly use AppInfo#definitionFor(DexMethod) since definitions may not be
- // updated either yet.
- DexClass newHolder = definitions.definitionFor(newMethod.holder);
- assert newHolder != null;
- DexEncodedMethod newEncodedMethod = newHolder.lookupMethod(newMethod);
- assert newEncodedMethod != null;
- return newEncodedMethod;
- }
-
- public ProgramMethod mapProgramMethod(
- ProgramMethod oldMethod, DexDefinitionSupplier definitions) {
- DexMethod newMethod = getRenamedMethodSignature(oldMethod.getReference());
- DexProgramClass holder = asProgramClassOrNull(definitions.definitionForHolder(newMethod));
- return newMethod.lookupOnProgramClass(holder);
- }
-
- // Predicate indicating if a rewritten reference is a simple renaming, meaning the move from one
- // reference to another is simply either just a renaming or/also renaming of the references. In
- // other words, the content of the definition, including the definition of all of its members is
- // the same modulo the renaming.
- public <T extends DexReference> boolean isSimpleRenaming(T from, T to) {
- assert from != to;
- return false;
- }
-
- // Predicate to see if a method definition is only changed by repackaging or synthetic
- // finalization indicating that it is a simple renaming.
- public final boolean isSimpleRenaming(DexMethod method) {
- DexMethod methodToCompareAgainst = method;
- DexMethod original = method;
- GraphLens current = this;
- while (current.isNonIdentityLens()) {
- NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
- original = nonIdentityLens.getPreviousMethodSignature(original);
- if (current.isSimpleRenamingLens()) {
- methodToCompareAgainst = original;
- } else if (methodToCompareAgainst != original) {
- return false;
- }
- assert nonIdentityLens.getPrevious() != null;
- current = nonIdentityLens.getPrevious();
- }
- return true;
- }
-
- public abstract String lookupPackageName(String pkg);
-
- public DexType lookupClassType(DexType type) {
- return lookupClassType(type, getIdentityLens());
- }
-
- public abstract DexType lookupClassType(DexType type, GraphLens applied);
-
- public DexType lookupType(DexType type) {
- return lookupType(type, getIdentityLens());
- }
-
- public abstract DexType lookupType(DexType type, GraphLens applied);
-
- @Deprecated
- public final DexMethod lookupMethod(DexMethod method) {
- assert verifyIsContextFreeForMethod(method);
- return lookupMethod(method, null, null).getReference();
- }
-
- public final MethodLookupResult lookupInvokeDirect(DexMethod method, ProgramMethod context) {
- return lookupMethod(method, context.getReference(), InvokeType.DIRECT);
- }
-
- public final MethodLookupResult lookupInvokeDirect(
- DexMethod method, ProgramMethod context, GraphLens codeLens) {
- return lookupMethod(method, context.getReference(), InvokeType.DIRECT, codeLens);
- }
-
- public final MethodLookupResult lookupInvokeInterface(DexMethod method, ProgramMethod context) {
- return lookupMethod(method, context.getReference(), InvokeType.INTERFACE);
- }
-
- public final MethodLookupResult lookupInvokeInterface(
- DexMethod method, ProgramMethod context, GraphLens codeLens) {
- return lookupMethod(method, context.getReference(), InvokeType.INTERFACE, codeLens);
- }
-
- public final MethodLookupResult lookupInvokeStatic(DexMethod method, ProgramMethod context) {
- return lookupMethod(method, context.getReference(), InvokeType.STATIC);
- }
-
- public final MethodLookupResult lookupInvokeStatic(
- DexMethod method, ProgramMethod context, GraphLens codeLens) {
- return lookupMethod(method, context.getReference(), InvokeType.STATIC, codeLens);
- }
-
- public final MethodLookupResult lookupInvokeSuper(DexMethod method, ProgramMethod context) {
- return lookupMethod(method, context.getReference(), InvokeType.SUPER);
- }
-
- public final MethodLookupResult lookupInvokeSuper(
- DexMethod method, ProgramMethod context, GraphLens codeLens) {
- return lookupMethod(method, context.getReference(), InvokeType.SUPER, codeLens);
- }
-
- public final MethodLookupResult lookupInvokeVirtual(DexMethod method, ProgramMethod context) {
- return lookupMethod(method, context.getReference(), InvokeType.VIRTUAL);
- }
-
- public final MethodLookupResult lookupInvokeVirtual(
- DexMethod method, ProgramMethod context, GraphLens codeLens) {
- return lookupMethod(method, context.getReference(), InvokeType.VIRTUAL, codeLens);
- }
-
- public final MethodLookupResult lookupMethod(
- DexMethod method, DexMethod context, InvokeType type) {
- return lookupMethod(method, context, type, null);
- }
-
- /**
- * Lookup a rebound or non-rebound method reference using the current graph lens.
- *
- * @param codeLens Specifies the graph lens which has already been applied to the code object. The
- * lookup procedure will not recurse beyond this graph lens to ensure that each mapping is
- * applied at most once.
- * <p>Note: since the compiler currently inserts {@link ClearCodeRewritingGraphLens} it is
- * generally valid to pass null for the {@param codeLens}. The removal of {@link
- * ClearCodeRewritingGraphLens} is tracked by b/202368283. After this is removed, the compiler
- * should generally use the result of calling {@link AppView#codeLens()}.
- */
- public abstract MethodLookupResult lookupMethod(
- DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens);
-
- protected abstract MethodLookupResult internalLookupMethod(
- DexMethod reference,
- DexMethod context,
- InvokeType type,
- GraphLens codeLens,
- LookupMethodContinuation continuation);
-
- interface LookupMethodContinuation {
-
- MethodLookupResult lookupMethod(MethodLookupResult previous);
- }
-
- public final RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method) {
- return lookupPrototypeChangesForMethodDefinition(method, null);
- }
-
- public abstract RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens);
-
- public final DexField lookupField(DexField field) {
- return lookupField(field, null);
- }
-
- /** Lookup a rebound or non-rebound field reference using the current graph lens. */
- public DexField lookupField(DexField field, GraphLens codeLens) {
- // Lookup the field using the graph lens and return the (non-rebound) reference from the lookup
- // result.
- return lookupFieldResult(field, codeLens).getReference();
- }
-
- /** Lookup a rebound or non-rebound field reference using the current graph lens. */
- public final FieldLookupResult lookupFieldResult(DexField field) {
- // Lookup the field using the graph lens and return the lookup result.
- return lookupFieldResult(field, null);
- }
-
- /** Lookup a rebound or non-rebound field reference using the current graph lens. */
- public final FieldLookupResult lookupFieldResult(DexField field, GraphLens codeLens) {
- // Lookup the field using the graph lens and return the lookup result.
- return internalLookupField(field, codeLens, x -> x);
- }
-
- protected abstract FieldLookupResult internalLookupField(
- DexField reference, GraphLens codeLens, LookupFieldContinuation continuation);
-
- interface LookupFieldContinuation {
-
- FieldLookupResult lookupField(FieldLookupResult previous);
- }
-
- public DexReference lookupReference(DexReference reference) {
- return reference.apply(this::lookupType, this::lookupField, this::lookupMethod);
- }
-
- // The method lookupMethod() maps a pair INVOKE=(method signature, invoke type) to a new pair
- // INVOKE'=(method signature', invoke type'). This mapping can be context sensitive, meaning that
- // the result INVOKE' depends on where the invocation INVOKE is in the program. This is, for
- // example, used by the vertical class merger to translate invoke-super instructions that hit
- // a method in the direct super class to invoke-direct instructions after class merging.
- //
- // This method can be used to determine if a graph lens is context sensitive. If a graph lens
- // is context insensitive, it is safe to invoke lookupMethod() without a context (or to pass null
- // as context). Trying to invoke a context sensitive graph lens without a context will lead to
- // an assertion error.
- public abstract boolean isContextFreeForMethods();
-
- public boolean verifyIsContextFreeForMethod(DexMethod method) {
- return isContextFreeForMethods();
- }
-
- public static GraphLens getIdentityLens() {
- return IdentityGraphLens.getInstance();
- }
-
- public boolean hasCodeRewritings() {
- return true;
- }
-
- public boolean hasCustomCodeRewritings() {
- return false;
- }
-
- public boolean isAppliedLens() {
- return false;
- }
-
- public boolean isArgumentPropagatorGraphLens() {
- return false;
- }
-
- public boolean isClearCodeRewritingLens() {
- return false;
- }
-
- public boolean isEnumUnboxerLens() {
- return false;
- }
-
- public EnumUnboxingLens asEnumUnboxerLens() {
- return null;
- }
-
- public boolean isHorizontalClassMergerGraphLens() {
- return false;
- }
-
- public boolean isSimpleRenamingLens() {
- return false;
- }
-
- public abstract boolean isIdentityLens();
-
- public boolean isMemberRebindingLens() {
- return false;
- }
-
- public MemberRebindingLens asMemberRebindingLens() {
- return null;
- }
-
- public boolean isMemberRebindingIdentityLens() {
- return false;
- }
-
- public MemberRebindingIdentityLens asMemberRebindingIdentityLens() {
- return null;
- }
-
- public abstract boolean isNonIdentityLens();
-
- public NonIdentityGraphLens asNonIdentityLens() {
- return null;
- }
-
- public boolean isVerticalClassMergerLens() {
- return false;
- }
-
- public GraphLens withCodeRewritingsApplied(DexItemFactory dexItemFactory) {
- if (hasCodeRewritings()) {
- return new ClearCodeRewritingGraphLens(dexItemFactory, this);
- }
- return this;
- }
-
- public <T extends DexDefinition> boolean assertDefinitionsNotModified(Iterable<T> definitions) {
- for (DexDefinition definition : definitions) {
- DexReference reference = definition.getReference();
- // We allow changes to bridge methods as these get retargeted even if they are kept.
- boolean isBridge =
- definition.isDexEncodedMethod() && definition.asDexEncodedMethod().accessFlags.isBridge();
- assert isBridge || lookupReference(reference) == reference;
- }
- return true;
- }
-
- public <T extends DexReference> boolean assertPinnedNotModified(
- KeepInfoCollection keepInfo, InternalOptions options) {
- List<DexReference> pinnedItems = new ArrayList<>();
- keepInfo.forEachPinnedType(pinnedItems::add, options);
- keepInfo.forEachPinnedMethod(pinnedItems::add, options);
- keepInfo.forEachPinnedField(pinnedItems::add, options);
- return assertReferencesNotModified(pinnedItems);
- }
-
- public <T extends DexReference> boolean assertReferencesNotModified(Iterable<T> references) {
- for (DexReference reference : references) {
- if (reference.isDexField()) {
- DexField field = reference.asDexField();
- assert getRenamedFieldSignature(field) == field;
- } else if (reference.isDexMethod()) {
- DexMethod method = reference.asDexMethod();
- assert getRenamedMethodSignature(method) == method;
- } else {
- assert reference.isDexType();
- DexType type = reference.asDexType();
- assert lookupType(type) == type;
- }
- }
- return true;
- }
-
- public Map<DexCallSite, ProgramMethodSet> rewriteCallSites(
- Map<DexCallSite, ProgramMethodSet> callSites, DexDefinitionSupplier definitions) {
- Map<DexCallSite, ProgramMethodSet> result = new IdentityHashMap<>();
- LensCodeRewriterUtils rewriter = new LensCodeRewriterUtils(definitions, this, null);
- callSites.forEach(
- (callSite, contexts) -> {
- for (ProgramMethod context : contexts.rewrittenWithLens(definitions, this)) {
- DexCallSite rewrittenCallSite = rewriter.rewriteCallSite(callSite, context);
- result
- .computeIfAbsent(rewrittenCallSite, ignore -> ProgramMethodSet.create())
- .add(context);
- }
- });
- return result;
- }
-
- @SuppressWarnings("unchecked")
- public <T extends DexReference> T rewriteReference(T reference) {
- return rewriteReference(reference, null);
- }
-
- @SuppressWarnings("unchecked")
- public <T extends DexReference> T rewriteReference(T reference, GraphLens codeLens) {
- return (T)
- reference.apply(
- type -> lookupType(type, codeLens),
- field -> getRenamedFieldSignature(field, codeLens),
- method -> getRenamedMethodSignature(method, codeLens));
- }
-
- public <T extends DexReference> Set<T> rewriteReferences(Set<T> references) {
- Set<T> result = SetUtils.newIdentityHashSet(references.size());
- for (T reference : references) {
- result.add(rewriteReference(reference));
- }
- return result;
- }
-
- public <R extends DexReference, T> Map<R, T> rewriteReferenceKeys(
- Map<R, T> map, BiFunction<R, List<T>, T> merge) {
- Map<R, T> result = new IdentityHashMap<>();
- Map<R, List<T>> needsMerge = new IdentityHashMap<>();
- map.forEach(
- (reference, value) -> {
- R rewrittenReference = rewriteReference(reference);
- List<T> unmergedValues = needsMerge.get(rewrittenReference);
- if (unmergedValues != null) {
- unmergedValues.add(value);
- } else {
- T existingValue = result.put(rewrittenReference, value);
- if (existingValue != null) {
- // Remove this for now and let the merge function decide when all colliding values are
- // known.
- needsMerge.put(rewrittenReference, ListUtils.newArrayList(existingValue, value));
- result.remove(rewrittenReference);
- }
- }
- });
- needsMerge.forEach(
- (rewrittenReference, unmergedValues) -> {
- T mergedValue = merge.apply(rewrittenReference, unmergedValues);
- if (mergedValue != null) {
- result.put(rewrittenReference, mergedValue);
- }
- });
- return result;
- }
-
- public <T extends DexReference> Object2BooleanMap<T> rewriteReferenceKeys(
- Object2BooleanMap<T> map) {
- Object2BooleanMap<T> result = new Object2BooleanArrayMap<>();
- for (Object2BooleanMap.Entry<T> entry : map.object2BooleanEntrySet()) {
- result.put(rewriteReference(entry.getKey()), entry.getBooleanValue());
- }
- return result;
- }
-
- public <T> ImmutableMap<DexField, T> rewriteFieldKeys(Map<DexField, T> map) {
- ImmutableMap.Builder<DexField, T> builder = ImmutableMap.builder();
- map.forEach((field, value) -> builder.put(getRenamedFieldSignature(field), value));
- return builder.build();
- }
-
- public ImmutableSet<DexType> rewriteTypes(Set<DexType> types) {
- ImmutableSet.Builder<DexType> builder = new ImmutableSet.Builder<>();
- for (DexType type : types) {
- builder.add(lookupType(type));
- }
- return builder.build();
- }
-
- public <T> Map<DexType, T> rewriteTypeKeys(Map<DexType, T> map, BiFunction<T, T, T> merge) {
- Map<DexType, T> newMap = new IdentityHashMap<>();
- map.forEach(
- (type, value) -> {
- DexType rewrittenType = lookupType(type);
- T previousValue = newMap.get(rewrittenType);
- newMap.put(
- rewrittenType, previousValue != null ? merge.apply(value, previousValue) : value);
- });
- return newMap;
- }
-
- public boolean verifyMappingToOriginalProgram(
- AppView<?> appView, DexApplication originalApplication) {
- Iterable<DexProgramClass> classes = appView.appInfo().classesWithDeterministicOrder();
- // Collect all original fields and methods for efficient querying.
- Set<DexField> originalFields = Sets.newIdentityHashSet();
- Set<DexMethod> originalMethods = Sets.newIdentityHashSet();
- for (DexProgramClass clazz : originalApplication.classes()) {
- for (DexEncodedField field : clazz.fields()) {
- originalFields.add(field.getReference());
- }
- for (DexEncodedMethod method : clazz.methods()) {
- originalMethods.add(method.getReference());
- }
- }
-
- // Check that all fields and methods in the generated program can be mapped back to one of the
- // original fields or methods.
- for (DexProgramClass clazz : classes) {
- if (appView.appInfo().getSyntheticItems().isSyntheticClass(clazz)) {
- continue;
- }
- for (DexEncodedField field : clazz.fields()) {
- if (field.isD8R8Synthesized()) {
- // Fields synthesized by D8/R8 may not be mapped.
- continue;
- }
- DexField originalField = getOriginalFieldSignature(field.getReference());
- assert originalFields.contains(originalField)
- : "Unable to map field `"
- + field.getReference().toSourceString()
- + "` back to original program";
- }
- for (DexEncodedMethod method : clazz.methods()) {
- if (method.isD8R8Synthesized()) {
- // Methods synthesized by D8/R8 may not be mapped.
- continue;
- }
- DexMethod originalMethod = getOriginalMethodSignature(method.getReference());
- assert originalMethods.contains(originalMethod)
- : "Method could not be mapped back: "
- + method.toSourceString()
- + ", originalMethod: "
- + originalMethod.toSourceString();
- }
- }
-
- return true;
- }
-
- public abstract static class NonIdentityGraphLens extends GraphLens {
-
- private final DexItemFactory dexItemFactory;
- private GraphLens previousLens;
-
- private final Map<DexType, DexType> arrayTypeCache = new ConcurrentHashMap<>();
-
- public NonIdentityGraphLens(AppView<?> appView) {
- this(appView.dexItemFactory(), appView.graphLens());
- }
-
- public NonIdentityGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
- this.dexItemFactory = dexItemFactory;
- this.previousLens = previousLens;
- }
-
- public final DexItemFactory dexItemFactory() {
- return dexItemFactory;
- }
-
- public final GraphLens getPrevious() {
- return previousLens;
- }
-
- @SuppressWarnings("unchecked")
- public final <T extends NonIdentityGraphLens> T find(
- Predicate<NonIdentityGraphLens> predicate) {
- GraphLens current = this;
- while (current.isNonIdentityLens()) {
- NonIdentityGraphLens nonIdentityGraphLens = current.asNonIdentityLens();
- if (predicate.test(nonIdentityGraphLens)) {
- return (T) nonIdentityGraphLens;
- }
- current = nonIdentityGraphLens.getPrevious();
- }
- return null;
- }
-
- @SuppressWarnings("unchecked")
- public final <T extends NonIdentityGraphLens> T findPrevious(
- Predicate<NonIdentityGraphLens> predicate) {
- GraphLens previous = getPrevious();
- return previous.isNonIdentityLens() ? previous.asNonIdentityLens().find(predicate) : null;
- }
-
- public final <T extends NonIdentityGraphLens> T findPreviousUntil(
- Predicate<NonIdentityGraphLens> predicate,
- Predicate<NonIdentityGraphLens> stoppingCriterion) {
- T found = findPrevious(predicate.or(stoppingCriterion));
- return (found == null || stoppingCriterion.test(found)) ? null : found;
- }
-
- public final void withAlternativeParentLens(GraphLens lens, Action action) {
- GraphLens oldParent = getPrevious();
- previousLens = lens;
- action.execute();
- previousLens = oldParent;
- }
-
- @Override
- public MethodLookupResult lookupMethod(
- DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens) {
- if (method.getHolderType().isArrayType()) {
- assert lookupType(method.getReturnType()) == method.getReturnType();
- assert method.getParameters().stream()
- .allMatch(parameterType -> lookupType(parameterType) == parameterType);
- return MethodLookupResult.builder(this)
- .setReference(method.withHolder(lookupType(method.getHolderType()), dexItemFactory))
- .setType(type)
- .build();
- }
- assert method.getHolderType().isClassType();
- return internalLookupMethod(method, context, type, codeLens, result -> result);
- }
-
- @Override
- public String lookupPackageName(String pkg) {
- return getPrevious().lookupPackageName(pkg);
- }
-
- @Override
- public final DexType lookupType(DexType type, GraphLens applied) {
- if (this == applied) {
- return type;
- }
- if (type.isPrimitiveType() || type.isVoidType() || type.isNullValueType()) {
- return type;
- }
- if (type.isArrayType()) {
- DexType result = arrayTypeCache.get(type);
- if (result == null) {
- DexType baseType = type.toBaseType(dexItemFactory);
- DexType newType = lookupType(baseType);
- result = baseType == newType ? type : type.replaceBaseType(newType, dexItemFactory);
- arrayTypeCache.put(type, result);
- }
- return result;
- }
- return lookupClassType(type);
- }
-
- @Override
- public final DexType lookupClassType(DexType type, GraphLens applied) {
- assert type.isClassType() : "Expected class type, but was `" + type.toSourceString() + "`";
- if (this == applied) {
- return type;
- }
- return internalDescribeLookupClassType(getPrevious().lookupClassType(type));
- }
-
- @Override
- protected FieldLookupResult internalLookupField(
- DexField reference, GraphLens codeLens, LookupFieldContinuation continuation) {
- if (this == codeLens) {
- return getIdentityLens().internalLookupField(reference, codeLens, continuation);
- }
- return previousLens.internalLookupField(
- reference,
- codeLens,
- previous -> continuation.lookupField(internalDescribeLookupField(previous)));
- }
-
- @Override
- protected MethodLookupResult internalLookupMethod(
- DexMethod reference,
- DexMethod context,
- InvokeType type,
- GraphLens codeLens,
- LookupMethodContinuation continuation) {
- if (this == codeLens) {
- GraphLens identityLens = getIdentityLens();
- return identityLens.internalLookupMethod(
- reference, context, type, identityLens, continuation);
- }
- return previousLens.internalLookupMethod(
- reference,
- getPreviousMethodSignature(context),
- type,
- codeLens,
- previous -> continuation.lookupMethod(internalDescribeLookupMethod(previous, context)));
- }
-
- protected abstract FieldLookupResult internalDescribeLookupField(FieldLookupResult previous);
-
- protected abstract MethodLookupResult internalDescribeLookupMethod(
- MethodLookupResult previous, DexMethod context);
-
- protected abstract DexType internalDescribeLookupClassType(DexType previous);
-
- public abstract DexMethod getPreviousMethodSignature(DexMethod method);
-
- /***
- * The previous mapping for a method often coincides with the previous method signature, but it
- * may not, for example for bridges inserted in vertically merged classes where the original
- * signature is used for computing invoke-super but should not be used for mapping output.
- */
- public DexMethod getPreviousMethodSignatureForMapping(DexMethod method) {
- return getPreviousMethodSignature(method);
- }
-
- public abstract DexMethod getNextMethodSignature(DexMethod method);
-
- @Override
- public final boolean isIdentityLens() {
- return false;
- }
-
- @Override
- public final boolean isNonIdentityLens() {
- return true;
- }
-
- @Override
- public final NonIdentityGraphLens asNonIdentityLens() {
- return this;
- }
- }
-
- private static final class IdentityGraphLens extends GraphLens {
-
- private static IdentityGraphLens INSTANCE = new IdentityGraphLens();
-
- private IdentityGraphLens() {}
-
- private static IdentityGraphLens getInstance() {
- return INSTANCE;
- }
-
- @Override
- public boolean isIdentityLens() {
- return true;
- }
-
- @Override
- public boolean isNonIdentityLens() {
- return false;
- }
-
- @Override
- public DexType getOriginalType(DexType type) {
- return type;
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return IterableUtils.singleton(type);
- }
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return field;
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
- return originalField;
- }
-
- @Override
- public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
- return originalMethod;
- }
-
- @Override
- public String lookupPackageName(String pkg) {
- return pkg;
- }
-
- @Override
- public DexType lookupType(DexType type, GraphLens applied) {
- return type;
- }
-
- @Override
- public DexType lookupClassType(DexType type, GraphLens applied) {
- assert type.isClassType();
- return type;
- }
-
- @Override
- public MethodLookupResult lookupMethod(
- DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens) {
- assert codeLens == null || codeLens.isIdentityLens();
- return MethodLookupResult.builder(this).setReference(method).setType(type).build();
- }
-
- @Override
- public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens) {
- return RewrittenPrototypeDescription.none();
- }
-
- @Override
- protected FieldLookupResult internalLookupField(
- DexField reference, GraphLens codeLens, LookupFieldContinuation continuation) {
- // Passes the field reference back to the next graph lens. The identity lens intentionally
- // does not set the rebound field reference, since it does not know what that is.
- return continuation.lookupField(
- FieldLookupResult.builder(this).setReference(reference).build());
- }
-
- @Override
- protected MethodLookupResult internalLookupMethod(
- DexMethod reference,
- DexMethod context,
- InvokeType type,
- GraphLens codeLens,
- LookupMethodContinuation continuation) {
- // Passes the method reference back to the next graph lens. The identity lens intentionally
- // does not set the rebound method reference, since it does not know what that is.
- return continuation.lookupMethod(lookupMethod(reference, context, type, codeLens));
- }
-
- @Override
- public boolean isContextFreeForMethods() {
- return true;
- }
-
- @Override
- public boolean hasCodeRewritings() {
- return false;
- }
- }
-
- // This lens clears all code rewriting (lookup methods mimics identity lens behavior) but still
- // relies on the previous lens for names (getRenamed/Original methods).
- public static class ClearCodeRewritingGraphLens extends NonIdentityGraphLens {
-
- public ClearCodeRewritingGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
- super(dexItemFactory, previousLens);
- }
-
- @Override
- public DexType getOriginalType(DexType type) {
- return getPrevious().getOriginalType(type);
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return getPrevious().getOriginalTypes(type);
- }
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return getPrevious().getOriginalFieldSignature(field);
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
- return this != codeLens
- ? getPrevious().getRenamedFieldSignature(originalField)
- : originalField;
- }
-
- @Override
- public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
- return this != applied
- ? getPrevious().getRenamedMethodSignature(originalMethod, applied)
- : originalMethod;
- }
-
- @Override
- public boolean isClearCodeRewritingLens() {
- return true;
- }
-
- @Override
- public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens) {
- return getIdentityLens().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
-
- @Override
- public final DexType internalDescribeLookupClassType(DexType previous) {
- return previous;
- }
-
- @Override
- protected FieldLookupResult internalLookupField(
- DexField reference, GraphLens codeLens, LookupFieldContinuation continuation) {
- return getIdentityLens().internalLookupField(reference, codeLens, continuation);
- }
-
- @Override
- protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
- throw new Unreachable();
- }
-
- @Override
- protected MethodLookupResult internalLookupMethod(
- DexMethod reference,
- DexMethod context,
- InvokeType type,
- GraphLens codeLens,
- LookupMethodContinuation continuation) {
- assert codeLens == null || codeLens == this;
- GraphLens identityLens = getIdentityLens();
- return identityLens.internalLookupMethod(
- reference, context, type, identityLens, continuation);
- }
-
- @Override
- public MethodLookupResult internalDescribeLookupMethod(
- MethodLookupResult previous, DexMethod context) {
- throw new Unreachable();
- }
-
- @Override
- public DexMethod getPreviousMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public DexMethod getNextMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public boolean isContextFreeForMethods() {
- return getIdentityLens().isContextFreeForMethods();
- }
- }
-}
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 368ffea..d9158fc 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -48,9 +48,9 @@
import com.android.tools.r8.utils.StringUtils;
import com.google.common.base.Equivalence.Wrapper;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -203,7 +203,7 @@
int typeRef,
TypePath typePath) {
assert annotations != null;
- // Java 8 type annotations are not supported by Dex. Ignore them.
+ // Java 8 type annotations are not supported by DEX. Ignore them.
if (!application.options.isGeneratingClassFiles()) {
return null;
}
@@ -252,7 +252,7 @@
private NestHostClassAttribute nestHost = null;
private final List<NestMemberClassAttribute> nestMembers = new ArrayList<>();
private final List<PermittedSubclassAttribute> permittedSubclasses = new ArrayList<>();
- private final Set<DexField> recordComponents = Sets.newIdentityHashSet();
+ private final List<RecordComponentInfo> recordComponents = new ArrayList<>();
private EnclosingMethodAttribute enclosingMember = null;
private final List<InnerClassAttribute> innerClasses = new ArrayList<>();
private ClassSignature classSignature = ClassSignature.noSignature();
@@ -361,15 +361,7 @@
String name, String descriptor, String signature) {
assert name != null;
assert descriptor != null;
- // Javac generated record components are only the instance fields, so we just reuse the field
- // to avoid duplicating the field and field signature rewriting logic.
- DexField field =
- application
- .getFactory()
- .createField(
- type, application.getTypeFromDescriptor(descriptor), application.getString(name));
- recordComponents.add(field);
- return super.visitRecordComponent(name, descriptor, signature);
+ return new CreateRecordComponentVisitor(this, name, descriptor, signature);
}
@Override
@@ -502,6 +494,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMember,
innerClasses,
classSignature,
@@ -568,18 +561,12 @@
// so it's safe to compile even if there is a missmatch.
return;
}
- // TODO(b/169645628): Change this logic if we start stripping the record components.
+ // TODO(b/274888318): Change this logic if we start stripping the record components.
// Another approach would be to mark a bit in fields that are record components instead.
String message = "Records are expected to have one record component per instance field.";
if (recordComponents.size() != instanceFields.size()) {
throw new CompilationError(message, origin);
}
- for (DexEncodedField instanceField : instanceFields) {
- if (!recordComponents.contains(instanceField.getReference())) {
- throw new CompilationError(
- message + " Unmatched field " + instanceField.getReference() + ".", origin);
- }
- }
}
private ChecksumSupplier getChecksumSupplier(ClassKind<T> classKind) {
@@ -1172,6 +1159,66 @@
}
}
+ private static class CreateRecordComponentVisitor extends RecordComponentVisitor {
+ private final CreateDexClassVisitor<?> parent;
+ private final String name;
+ private final String descriptor;
+ private final DexField field;
+ private final FieldTypeSignature componentSignature;
+
+ public CreateRecordComponentVisitor(
+ CreateDexClassVisitor<?> parent, String name, String descriptor, String signature) {
+ super(ASM_VERSION);
+ this.field = parent.application.getField(parent.type, name, descriptor);
+ this.parent = parent;
+ this.name = name;
+ this.descriptor = descriptor;
+ this.componentSignature =
+ parent.application.options.parseSignatureAttribute()
+ ? GenericSignature.parseFieldTypeSignature(
+ name,
+ signature,
+ parent.origin,
+ parent.application.getFactory(),
+ parent.application.options.reporter)
+ : FieldTypeSignature.noSignature();
+ }
+
+ private List<DexAnnotation> annotations = null;
+
+ private List<DexAnnotation> getAnnotations() {
+ if (annotations == null) {
+ annotations = new ArrayList<>();
+ }
+ return annotations;
+ }
+
+ @Override
+ public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+ return createAnnotationVisitor(
+ desc, visible, getAnnotations(), parent.application, DexAnnotation::new);
+ }
+
+ @Override
+ public AnnotationVisitor visitTypeAnnotation(
+ int typeRef, TypePath typePath, String desc, boolean visible) {
+ // Java 8 type annotations are not supported by DEX, thus ignore them.
+ return null;
+ }
+
+ @Override
+ public void visitEnd() {
+ assert annotations == null || !annotations.isEmpty();
+ parent.recordComponents.add(
+ new RecordComponentInfo(
+ field,
+ componentSignature,
+ annotations != null && !annotations.isEmpty()
+ ? annotations
+ : Collections.emptyList()));
+ }
+ }
+
public static class ReparseContext {
// This will hold the content of the whole class. Once all the methods of the class are swapped
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index d393d72..e54e691 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -53,6 +53,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.CfCode.LocalVariableInfo;
import com.android.tools.r8.graph.JarClassFileReader.ReparseContext;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.IfType;
diff --git a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
index d6efacb..b4dbc3d 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
@@ -4,7 +4,8 @@
package com.android.tools.r8.graph;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.utils.ConsumerUtils;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java
index 300bca7..0edf837 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.graph;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
import com.android.tools.r8.utils.TraversalContinuation;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
index 98eab7f..45936b7 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
@@ -7,6 +7,7 @@
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
import static com.android.tools.r8.utils.MapUtils.ignoreKey;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
import com.android.tools.r8.shaking.GraphReporter;
import com.android.tools.r8.shaking.InstantiationReason;
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index 028617e..9b37860 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -5,6 +5,8 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.Box;
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
index 32d7fd3..c1f869c 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.ir.optimize.info.OptimizationFeedback.getSimpleFeedback;
import com.android.tools.r8.dex.IndexedItemCollection;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/graph/RecordComponentInfo.java b/src/main/java/com/android/tools/r8/graph/RecordComponentInfo.java
new file mode 100644
index 0000000..c6ac18f
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/RecordComponentInfo.java
@@ -0,0 +1,101 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph;
+
+import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
+import com.android.tools.r8.naming.NamingLens;
+import com.android.tools.r8.utils.structural.StructuralItem;
+import com.android.tools.r8.utils.structural.StructuralMapping;
+import com.android.tools.r8.utils.structural.StructuralSpecification;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Predicate;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class RecordComponentInfo implements StructuralItem<RecordComponentInfo> {
+
+ private final DexField field;
+ private final FieldTypeSignature signature;
+ private final List<DexAnnotation> annotations;
+
+ private static void specify(StructuralSpecification<RecordComponentInfo, ?> spec) {
+ spec.withItem(RecordComponentInfo::getName).withItem(RecordComponentInfo::getType);
+ }
+
+ public RecordComponentInfo(
+ DexField field, FieldTypeSignature signature, List<DexAnnotation> annotations) {
+ assert field != null;
+ assert signature != null;
+ assert annotations != null;
+ this.field = field;
+ this.signature = signature;
+ this.annotations = annotations;
+ }
+
+ public static List<RecordComponentInfo> emptyList() {
+ return Collections.emptyList();
+ }
+
+ public DexField getField() {
+ return field;
+ }
+
+ public DexString getName() {
+ return field.getName();
+ }
+
+ public DexType getType() {
+ return field.getType();
+ }
+
+ public FieldTypeSignature getSignature() {
+ return signature;
+ }
+
+ public List<DexAnnotation> getAnnotations() {
+ return annotations;
+ }
+
+ public void write(
+ ClassWriter writer,
+ NamingLens lens,
+ Predicate<DexType> isTypeMissing,
+ BiConsumer<AnnotationVisitor, DexEncodedAnnotation> annotationWriter) {
+ RecordComponentVisitor v =
+ writer.visitRecordComponent(
+ lens.lookupName(field).toString(),
+ lens.lookupDescriptor(getType()).toString(),
+ signature.toRenamedString(lens, isTypeMissing));
+ for (DexAnnotation annotation : annotations) {
+ if (annotation.visibility == DexAnnotation.VISIBILITY_SYSTEM) {
+ // Annotations with VISIBILITY_SYSTEM are not annotations in CF, but are special
+ // annotations in DEX, i.e. default, enclosing class, enclosing method, member classes,
+ // signature, throws.
+ continue;
+ }
+ String desc = lens.lookupDescriptor(annotation.getAnnotationType()).toString();
+ boolean visible = annotation.visibility == DexAnnotation.VISIBILITY_RUNTIME;
+ AnnotationVisitor av = v.visitAnnotation(desc, visible);
+ if (av != null) {
+ annotationWriter.accept(av, annotation.annotation);
+ av.visitEnd();
+ }
+ }
+ v.visitEnd();
+ }
+
+ @Override
+ public RecordComponentInfo self() {
+ return this;
+ }
+
+ @Override
+ public StructuralMapping<RecordComponentInfo> getStructuralMapping() {
+ return RecordComponentInfo::specify;
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
index 57baddf..383504d 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexCode.Try;
import com.android.tools.r8.graph.DexCode.TryHandler;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
index a15e551..82f320c 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.dex.code.DexThrow;
import com.android.tools.r8.graph.DexCode.Try;
import com.android.tools.r8.graph.DexCode.TryHandler;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
index 7a6a5fc..f3cc3e9 100644
--- a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
@@ -108,6 +108,7 @@
fixupNestHost(clazz.getNestHostClassAttribute()),
fixupNestMemberAttributes(clazz.getNestMembersClassAttributes()),
fixupPermittedSubclassAttribute(clazz.getPermittedSubclassAttributes()),
+ fixupRecordComponents(clazz.getRecordComponents()),
fixupEnclosingMethodAttribute(clazz.getEnclosingMethodAttribute()),
fixupInnerClassAttributes(clazz.getInnerClasses()),
clazz.getClassSignature(),
@@ -289,6 +290,24 @@
return changed ? newPermittedSubclassAttributes : permittedSubclassAttributes;
}
+ protected List<RecordComponentInfo> fixupRecordComponents(
+ List<RecordComponentInfo> recordComponents) {
+ if (recordComponents.isEmpty()) {
+ return recordComponents;
+ }
+ // TODO(b/274888318): Check this.
+ boolean changed = false;
+ List<RecordComponentInfo> newRecordComponents = new ArrayList<>(recordComponents.size());
+ for (RecordComponentInfo info : recordComponents) {
+ DexField field = info.getField();
+ DexField newField = fixupFieldReference(field);
+ newRecordComponents.add(
+ new RecordComponentInfo(newField, info.getSignature(), info.getAnnotations()));
+ changed |= newField != field;
+ }
+ return changed ? newRecordComponents : recordComponents;
+ }
+
/** Fixup a proto descriptor. */
public DexProto fixupProto(DexProto proto) {
DexProto result = protoFixupCache.get(proto);
diff --git a/src/main/java/com/android/tools/r8/graph/UseRegistry.java b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
index be1b904c06..3797119 100644
--- a/src/main/java/com/android/tools/r8/graph/UseRegistry.java
+++ b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.dex.code.CfOrDexInstanceFieldRead;
import com.android.tools.r8.dex.code.CfOrDexInstruction;
import com.android.tools.r8.dex.code.CfOrDexStaticFieldRead;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.utils.TraversalContinuation;
import java.util.ListIterator;
diff --git a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
similarity index 91%
rename from src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
rename to src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
index f360949..0e85802 100644
--- a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
@@ -1,10 +1,17 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.graph.lens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.utils.MapUtils;
import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeHashMap;
@@ -25,7 +32,7 @@
*
* <p>The mappings from the original program to the generated program are kept, though.
*/
-public final class AppliedGraphLens extends NonIdentityGraphLens {
+public final class AppliedGraphLens extends DefaultNonIdentityGraphLens {
private final MutableBidirectionalManyToOneRepresentativeMap<DexType, DexType> renamedTypeNames =
BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
@@ -147,17 +154,6 @@
}
@Override
- protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
- return previous;
- }
-
- @Override
- public MethodLookupResult internalDescribeLookupMethod(
- MethodLookupResult previous, DexMethod context) {
- return previous;
- }
-
- @Override
public DexMethod getPreviousMethodSignature(DexMethod method) {
if (extraOriginalMethodSignatures.containsKey(method)) {
return extraOriginalMethodSignatures.get(method);
diff --git a/src/main/java/com/android/tools/r8/graph/lens/ClearCodeRewritingGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/ClearCodeRewritingGraphLens.java
new file mode 100644
index 0000000..f63985a
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/ClearCodeRewritingGraphLens.java
@@ -0,0 +1,78 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.lens;
+
+import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.ir.code.InvokeType;
+
+// This lens clears all code rewriting (lookup methods mimics identity lens behavior) but still
+// relies on the previous lens for names (getRenamed/Original methods).
+public class ClearCodeRewritingGraphLens extends DefaultNonIdentityGraphLens {
+
+ public ClearCodeRewritingGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
+ super(dexItemFactory, previousLens);
+ }
+
+ @Override
+ public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
+ return this != codeLens ? getPrevious().getRenamedFieldSignature(originalField) : originalField;
+ }
+
+ @Override
+ public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
+ return this != applied
+ ? getPrevious().getRenamedMethodSignature(originalMethod, applied)
+ : originalMethod;
+ }
+
+ @Override
+ public boolean isClearCodeRewritingLens() {
+ return true;
+ }
+
+ @Override
+ public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
+ DexMethod method, GraphLens codeLens) {
+ return getIdentityLens().lookupPrototypeChangesForMethodDefinition(method, codeLens);
+ }
+
+ @Override
+ protected FieldLookupResult internalLookupField(
+ DexField reference, GraphLens codeLens, LookupFieldContinuation continuation) {
+ return getIdentityLens().internalLookupField(reference, codeLens, continuation);
+ }
+
+ @Override
+ protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
+ throw new Unreachable();
+ }
+
+ @Override
+ protected MethodLookupResult internalLookupMethod(
+ DexMethod reference,
+ DexMethod context,
+ InvokeType type,
+ GraphLens codeLens,
+ LookupMethodContinuation continuation) {
+ assert codeLens == null || codeLens == this;
+ GraphLens identityLens = getIdentityLens();
+ return identityLens.internalLookupMethod(reference, context, type, identityLens, continuation);
+ }
+
+ @Override
+ public MethodLookupResult internalDescribeLookupMethod(
+ MethodLookupResult previous, DexMethod context) {
+ throw new Unreachable();
+ }
+
+ @Override
+ public boolean isContextFreeForMethods() {
+ return getIdentityLens().isContextFreeForMethods();
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/lens/DefaultNonIdentityGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/DefaultNonIdentityGraphLens.java
new file mode 100644
index 0000000..1f8f516
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/DefaultNonIdentityGraphLens.java
@@ -0,0 +1,103 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.lens;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+
+public class DefaultNonIdentityGraphLens extends NonIdentityGraphLens {
+
+ public DefaultNonIdentityGraphLens(AppView<?> appView) {
+ this(appView.dexItemFactory(), appView.graphLens());
+ }
+
+ public DefaultNonIdentityGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
+ super(dexItemFactory, previousLens);
+ }
+
+ @Override
+ public boolean isContextFreeForMethods() {
+ return getPrevious().isContextFreeForMethods();
+ }
+
+ // Class lookup APIs.
+
+ @Override
+ protected DexType internalDescribeLookupClassType(DexType previous) {
+ return previous;
+ }
+
+ @Override
+ public DexType getOriginalType(DexType type) {
+ return getPrevious().getOriginalType(type);
+ }
+
+ @Override
+ public Iterable<DexType> getOriginalTypes(DexType type) {
+ return getPrevious().getOriginalTypes(type);
+ }
+
+ // Field lookup APIs.
+
+ @Override
+ protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
+ return previous;
+ }
+
+ @Override
+ public DexField getOriginalFieldSignature(DexField field) {
+ return getPrevious().getOriginalFieldSignature(field);
+ }
+
+ @Override
+ public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
+ if (this == codeLens) {
+ return originalField;
+ }
+ return getPrevious().getRenamedFieldSignature(originalField);
+ }
+
+ // Method lookup APIs.
+
+ @Override
+ protected MethodLookupResult internalDescribeLookupMethod(
+ MethodLookupResult previous, DexMethod context) {
+ return previous;
+ }
+
+ @Override
+ public DexMethod getPreviousMethodSignature(DexMethod method) {
+ return method;
+ }
+
+ @Override
+ public DexMethod getNextMethodSignature(DexMethod method) {
+ return method;
+ }
+
+ @Override
+ public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens codeLens) {
+ if (this == codeLens) {
+ return originalMethod;
+ }
+ return getNextMethodSignature(getPrevious().getRenamedMethodSignature(originalMethod));
+ }
+
+ // Prototype lookup APIs.
+
+ @Override
+ public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
+ DexMethod method, GraphLens codeLens) {
+ if (this == codeLens) {
+ return RewrittenPrototypeDescription.none();
+ }
+ DexMethod previousMethodSignature = getPreviousMethodSignature(method);
+ return getPrevious().lookupPrototypeChangesForMethodDefinition(previousMethodSignature);
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/lens/FieldLookupResult.java b/src/main/java/com/android/tools/r8/graph/lens/FieldLookupResult.java
new file mode 100644
index 0000000..b031af1
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/FieldLookupResult.java
@@ -0,0 +1,85 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.lens;
+
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexType;
+import java.util.function.Function;
+
+/**
+ * Intermediate result of a field lookup that stores the actual non-rebound reference and the
+ * rebound reference that points to the definition of the field.
+ */
+public class FieldLookupResult extends MemberLookupResult<DexField> {
+
+ private final DexType readCastType;
+ private final DexType writeCastType;
+
+ private FieldLookupResult(
+ DexField reference, DexField reboundReference, DexType readCastType, DexType writeCastType) {
+ super(reference, reboundReference);
+ this.readCastType = readCastType;
+ this.writeCastType = writeCastType;
+ }
+
+ public static Builder builder(GraphLens lens) {
+ return new Builder(lens);
+ }
+
+ public boolean hasReadCastType() {
+ return readCastType != null;
+ }
+
+ public DexType getReadCastType() {
+ return readCastType;
+ }
+
+ public DexType getRewrittenReadCastType(Function<DexType, DexType> fn) {
+ return hasReadCastType() ? fn.apply(readCastType) : null;
+ }
+
+ public boolean hasWriteCastType() {
+ return writeCastType != null;
+ }
+
+ public DexType getWriteCastType() {
+ return writeCastType;
+ }
+
+ public DexType getRewrittenWriteCastType(Function<DexType, DexType> fn) {
+ return hasWriteCastType() ? fn.apply(writeCastType) : null;
+ }
+
+ public static class Builder extends MemberLookupResult.Builder<DexField, Builder> {
+
+ private DexType readCastType;
+ private DexType writeCastType;
+ private GraphLens lens;
+
+ private Builder(GraphLens lens) {
+ this.lens = lens;
+ }
+
+ public Builder setReadCastType(DexType readCastType) {
+ this.readCastType = readCastType;
+ return this;
+ }
+
+ public Builder setWriteCastType(DexType writeCastType) {
+ this.writeCastType = writeCastType;
+ return this;
+ }
+
+ @Override
+ public Builder self() {
+ return this;
+ }
+
+ public FieldLookupResult build() {
+ // TODO(b/168282032): All non-identity graph lenses should set the rebound reference.
+ return new FieldLookupResult(reference, reboundReference, readCastType, writeCastType);
+ }
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/FinalInitClassLens.java b/src/main/java/com/android/tools/r8/graph/lens/FinalInitClassLens.java
similarity index 85%
rename from src/main/java/com/android/tools/r8/graph/FinalInitClassLens.java
rename to src/main/java/com/android/tools/r8/graph/lens/FinalInitClassLens.java
index 07e4dc2..54949fa 100644
--- a/src/main/java/com/android/tools/r8/graph/FinalInitClassLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/FinalInitClassLens.java
@@ -1,10 +1,12 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.graph.lens;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexType;
import java.util.Map;
public class FinalInitClassLens extends InitClassLens {
diff --git a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
new file mode 100644
index 0000000..bd71700
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
@@ -0,0 +1,645 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.graph.lens;
+
+import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexApplication;
+import com.android.tools.r8.graph.DexCallSite;
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexDefinition;
+import com.android.tools.r8.graph.DexDefinitionSupplier;
+import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMember;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexReference;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.ir.code.InvokeType;
+import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
+import com.android.tools.r8.ir.optimize.enums.EnumUnboxingLens;
+import com.android.tools.r8.optimize.MemberRebindingIdentityLens;
+import com.android.tools.r8.optimize.MemberRebindingLens;
+import com.android.tools.r8.shaking.KeepInfoCollection;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.SetUtils;
+import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeHashMap;
+import com.android.tools.r8.utils.collections.MutableBidirectionalManyToOneRepresentativeMap;
+import com.android.tools.r8.utils.collections.ProgramMethodSet;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import it.unimi.dsi.fastutil.objects.Object2BooleanArrayMap;
+import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
+import java.util.ArrayList;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * A GraphLens implements a virtual view on top of the graph, used to delay global rewrites until
+ * later IR processing stages.
+ *
+ * <p>Valid remappings are limited to the following operations:
+ *
+ * <ul>
+ * <li>Mapping a classes type to one of the super/subtypes.
+ * <li>Renaming private methods/fields.
+ * <li>Moving methods/fields to a super/subclass.
+ * <li>Replacing method/field references by the same method/field on a super/subtype
+ * <li>Moved methods might require changed invocation type at the call site
+ * </ul>
+ *
+ * Note that the latter two have to take visibility into account.
+ */
+public abstract class GraphLens {
+
+ public abstract static class Builder {
+
+ protected final MutableBidirectionalManyToOneRepresentativeMap<DexField, DexField> fieldMap =
+ BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
+ protected final MutableBidirectionalManyToOneRepresentativeMap<DexMethod, DexMethod> methodMap =
+ BidirectionalManyToOneRepresentativeHashMap.newIdentityHashMap();
+ protected final Map<DexType, DexType> typeMap = new IdentityHashMap<>();
+
+ protected Builder() {}
+
+ public void map(DexType from, DexType to) {
+ if (from == to) {
+ return;
+ }
+ typeMap.put(from, to);
+ }
+
+ public void move(DexMethod from, DexMethod to) {
+ if (from == to) {
+ return;
+ }
+ methodMap.put(from, to);
+ }
+
+ public void move(DexField from, DexField to) {
+ if (from == to) {
+ return;
+ }
+ fieldMap.put(from, to);
+ }
+
+ public abstract GraphLens build(AppView<?> appView);
+ }
+
+ /**
+ * Intentionally package private. All graph lenses except for {@link IdentityGraphLens} should
+ * inherit from {@link NonIdentityGraphLens}.
+ */
+ GraphLens() {}
+
+ public boolean isSyntheticFinalizationGraphLens() {
+ return false;
+ }
+
+ public abstract DexType getOriginalType(DexType type);
+
+ public abstract Iterable<DexType> getOriginalTypes(DexType type);
+
+ public abstract DexField getOriginalFieldSignature(DexField field);
+
+ public final DexMember<?, ?> getOriginalMemberSignature(DexMember<?, ?> member) {
+ return member.apply(this::getOriginalFieldSignature, this::getOriginalMethodSignature);
+ }
+
+ public final DexMethod getOriginalMethodSignature(DexMethod method) {
+ return getOriginalMethodSignature(method, null);
+ }
+
+ public final DexMethod getOriginalMethodSignature(DexMethod method, GraphLens atGraphLens) {
+ GraphLens current = this;
+ DexMethod original = method;
+ while (current.isNonIdentityLens() && current != atGraphLens) {
+ NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
+ original = nonIdentityLens.getPreviousMethodSignature(original);
+ current = nonIdentityLens.getPrevious();
+ }
+ assert atGraphLens == null ? current.isIdentityLens() : (current == atGraphLens);
+ return original;
+ }
+
+ public final DexMethod getOriginalMethodSignatureForMapping(DexMethod method) {
+ GraphLens current = this;
+ DexMethod original = method;
+ while (current.isNonIdentityLens()) {
+ NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
+ original = nonIdentityLens.getPreviousMethodSignatureForMapping(original);
+ current = nonIdentityLens.getPrevious();
+ }
+ assert current.isIdentityLens();
+ return original;
+ }
+
+ public final DexField getRenamedFieldSignature(DexField originalField) {
+ return getRenamedFieldSignature(originalField, null);
+ }
+
+ public abstract DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens);
+
+ public final DexMember<?, ?> getRenamedMemberSignature(DexMember<?, ?> originalMember) {
+ return originalMember.isDexField()
+ ? getRenamedFieldSignature(originalMember.asDexField())
+ : getRenamedMethodSignature(originalMember.asDexMethod());
+ }
+
+ public final DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
+ return getRenamedMethodSignature(originalMethod, null);
+ }
+
+ public abstract DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied);
+
+ public DexEncodedMethod mapDexEncodedMethod(
+ DexEncodedMethod originalEncodedMethod, DexDefinitionSupplier definitions) {
+ return mapDexEncodedMethod(originalEncodedMethod, definitions, null);
+ }
+
+ public DexEncodedMethod mapDexEncodedMethod(
+ DexEncodedMethod originalEncodedMethod,
+ DexDefinitionSupplier definitions,
+ GraphLens applied) {
+ assert originalEncodedMethod != DexEncodedMethod.SENTINEL;
+ DexMethod newMethod = getRenamedMethodSignature(originalEncodedMethod.getReference(), applied);
+ // Note that:
+ // * Even if `newMethod` is the same as `originalEncodedMethod.method`, we still need to look it
+ // up, since `originalEncodedMethod` may be obsolete.
+ // * We can't directly use AppInfo#definitionFor(DexMethod) since definitions may not be
+ // updated either yet.
+ DexClass newHolder = definitions.definitionFor(newMethod.holder);
+ assert newHolder != null;
+ DexEncodedMethod newEncodedMethod = newHolder.lookupMethod(newMethod);
+ assert newEncodedMethod != null;
+ return newEncodedMethod;
+ }
+
+ public ProgramMethod mapProgramMethod(
+ ProgramMethod oldMethod, DexDefinitionSupplier definitions) {
+ DexMethod newMethod = getRenamedMethodSignature(oldMethod.getReference());
+ DexProgramClass holder = asProgramClassOrNull(definitions.definitionForHolder(newMethod));
+ return newMethod.lookupOnProgramClass(holder);
+ }
+
+ // Predicate indicating if a rewritten reference is a simple renaming, meaning the move from one
+ // reference to another is simply either just a renaming or/also renaming of the references. In
+ // other words, the content of the definition, including the definition of all of its members is
+ // the same modulo the renaming.
+ public <T extends DexReference> boolean isSimpleRenaming(T from, T to) {
+ assert from != to;
+ return false;
+ }
+
+ // Predicate to see if a method definition is only changed by repackaging or synthetic
+ // finalization indicating that it is a simple renaming.
+ public final boolean isSimpleRenaming(DexMethod method) {
+ DexMethod methodToCompareAgainst = method;
+ DexMethod original = method;
+ GraphLens current = this;
+ while (current.isNonIdentityLens()) {
+ NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
+ original = nonIdentityLens.getPreviousMethodSignature(original);
+ if (current.isSimpleRenamingLens()) {
+ methodToCompareAgainst = original;
+ } else if (methodToCompareAgainst != original) {
+ return false;
+ }
+ assert nonIdentityLens.getPrevious() != null;
+ current = nonIdentityLens.getPrevious();
+ }
+ return true;
+ }
+
+ public abstract String lookupPackageName(String pkg);
+
+ public DexType lookupClassType(DexType type) {
+ return lookupClassType(type, getIdentityLens());
+ }
+
+ public abstract DexType lookupClassType(DexType type, GraphLens applied);
+
+ public DexType lookupType(DexType type) {
+ return lookupType(type, getIdentityLens());
+ }
+
+ public abstract DexType lookupType(DexType type, GraphLens applied);
+
+ @Deprecated
+ public final DexMethod lookupMethod(DexMethod method) {
+ assert verifyIsContextFreeForMethod(method);
+ return lookupMethod(method, null, null).getReference();
+ }
+
+ public final MethodLookupResult lookupInvokeDirect(DexMethod method, ProgramMethod context) {
+ return lookupMethod(method, context.getReference(), InvokeType.DIRECT);
+ }
+
+ public final MethodLookupResult lookupInvokeDirect(
+ DexMethod method, ProgramMethod context, GraphLens codeLens) {
+ return lookupMethod(method, context.getReference(), InvokeType.DIRECT, codeLens);
+ }
+
+ public final MethodLookupResult lookupInvokeInterface(DexMethod method, ProgramMethod context) {
+ return lookupMethod(method, context.getReference(), InvokeType.INTERFACE);
+ }
+
+ public final MethodLookupResult lookupInvokeInterface(
+ DexMethod method, ProgramMethod context, GraphLens codeLens) {
+ return lookupMethod(method, context.getReference(), InvokeType.INTERFACE, codeLens);
+ }
+
+ public final MethodLookupResult lookupInvokeStatic(DexMethod method, ProgramMethod context) {
+ return lookupMethod(method, context.getReference(), InvokeType.STATIC);
+ }
+
+ public final MethodLookupResult lookupInvokeStatic(
+ DexMethod method, ProgramMethod context, GraphLens codeLens) {
+ return lookupMethod(method, context.getReference(), InvokeType.STATIC, codeLens);
+ }
+
+ public final MethodLookupResult lookupInvokeSuper(DexMethod method, ProgramMethod context) {
+ return lookupMethod(method, context.getReference(), InvokeType.SUPER);
+ }
+
+ public final MethodLookupResult lookupInvokeSuper(
+ DexMethod method, ProgramMethod context, GraphLens codeLens) {
+ return lookupMethod(method, context.getReference(), InvokeType.SUPER, codeLens);
+ }
+
+ public final MethodLookupResult lookupInvokeVirtual(DexMethod method, ProgramMethod context) {
+ return lookupMethod(method, context.getReference(), InvokeType.VIRTUAL);
+ }
+
+ public final MethodLookupResult lookupInvokeVirtual(
+ DexMethod method, ProgramMethod context, GraphLens codeLens) {
+ return lookupMethod(method, context.getReference(), InvokeType.VIRTUAL, codeLens);
+ }
+
+ public final MethodLookupResult lookupMethod(
+ DexMethod method, DexMethod context, InvokeType type) {
+ return lookupMethod(method, context, type, null);
+ }
+
+ /**
+ * Lookup a rebound or non-rebound method reference using the current graph lens.
+ *
+ * @param codeLens Specifies the graph lens which has already been applied to the code object. The
+ * lookup procedure will not recurse beyond this graph lens to ensure that each mapping is
+ * applied at most once.
+ * <p>Note: since the compiler currently inserts {@link ClearCodeRewritingGraphLens} it is
+ * generally valid to pass null for the {@param codeLens}. The removal of {@link
+ * ClearCodeRewritingGraphLens} is tracked by b/202368283. After this is removed, the compiler
+ * should generally use the result of calling {@link AppView#codeLens()}.
+ */
+ public abstract MethodLookupResult lookupMethod(
+ DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens);
+
+ protected abstract MethodLookupResult internalLookupMethod(
+ DexMethod reference,
+ DexMethod context,
+ InvokeType type,
+ GraphLens codeLens,
+ LookupMethodContinuation continuation);
+
+ interface LookupMethodContinuation {
+
+ MethodLookupResult lookupMethod(MethodLookupResult previous);
+ }
+
+ public final RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
+ DexMethod method) {
+ return lookupPrototypeChangesForMethodDefinition(method, null);
+ }
+
+ public abstract RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
+ DexMethod method, GraphLens codeLens);
+
+ public final DexField lookupField(DexField field) {
+ return lookupField(field, null);
+ }
+
+ /** Lookup a rebound or non-rebound field reference using the current graph lens. */
+ public DexField lookupField(DexField field, GraphLens codeLens) {
+ // Lookup the field using the graph lens and return the (non-rebound) reference from the lookup
+ // result.
+ return lookupFieldResult(field, codeLens).getReference();
+ }
+
+ /** Lookup a rebound or non-rebound field reference using the current graph lens. */
+ public final FieldLookupResult lookupFieldResult(DexField field) {
+ // Lookup the field using the graph lens and return the lookup result.
+ return lookupFieldResult(field, null);
+ }
+
+ /** Lookup a rebound or non-rebound field reference using the current graph lens. */
+ public final FieldLookupResult lookupFieldResult(DexField field, GraphLens codeLens) {
+ // Lookup the field using the graph lens and return the lookup result.
+ return internalLookupField(field, codeLens, x -> x);
+ }
+
+ protected abstract FieldLookupResult internalLookupField(
+ DexField reference, GraphLens codeLens, LookupFieldContinuation continuation);
+
+ interface LookupFieldContinuation {
+
+ FieldLookupResult lookupField(FieldLookupResult previous);
+ }
+
+ public DexReference lookupReference(DexReference reference) {
+ return reference.apply(this::lookupType, this::lookupField, this::lookupMethod);
+ }
+
+ // The method lookupMethod() maps a pair INVOKE=(method signature, invoke type) to a new pair
+ // INVOKE'=(method signature', invoke type'). This mapping can be context sensitive, meaning that
+ // the result INVOKE' depends on where the invocation INVOKE is in the program. This is, for
+ // example, used by the vertical class merger to translate invoke-super instructions that hit
+ // a method in the direct super class to invoke-direct instructions after class merging.
+ //
+ // This method can be used to determine if a graph lens is context sensitive. If a graph lens
+ // is context insensitive, it is safe to invoke lookupMethod() without a context (or to pass null
+ // as context). Trying to invoke a context sensitive graph lens without a context will lead to
+ // an assertion error.
+ public abstract boolean isContextFreeForMethods();
+
+ public boolean verifyIsContextFreeForMethod(DexMethod method) {
+ return isContextFreeForMethods();
+ }
+
+ public static GraphLens getIdentityLens() {
+ return IdentityGraphLens.getInstance();
+ }
+
+ public boolean hasCodeRewritings() {
+ return true;
+ }
+
+ public boolean hasCustomCodeRewritings() {
+ return false;
+ }
+
+ public boolean isAppliedLens() {
+ return false;
+ }
+
+ public boolean isArgumentPropagatorGraphLens() {
+ return false;
+ }
+
+ public boolean isClearCodeRewritingLens() {
+ return false;
+ }
+
+ public boolean isEnumUnboxerLens() {
+ return false;
+ }
+
+ public EnumUnboxingLens asEnumUnboxerLens() {
+ return null;
+ }
+
+ public boolean isHorizontalClassMergerGraphLens() {
+ return false;
+ }
+
+ public boolean isSimpleRenamingLens() {
+ return false;
+ }
+
+ public abstract boolean isIdentityLens();
+
+ public boolean isMemberRebindingLens() {
+ return false;
+ }
+
+ public MemberRebindingLens asMemberRebindingLens() {
+ return null;
+ }
+
+ public boolean isMemberRebindingIdentityLens() {
+ return false;
+ }
+
+ public MemberRebindingIdentityLens asMemberRebindingIdentityLens() {
+ return null;
+ }
+
+ public abstract boolean isNonIdentityLens();
+
+ public NonIdentityGraphLens asNonIdentityLens() {
+ return null;
+ }
+
+ public boolean isVerticalClassMergerLens() {
+ return false;
+ }
+
+ public GraphLens withCodeRewritingsApplied(DexItemFactory dexItemFactory) {
+ if (hasCodeRewritings()) {
+ return new ClearCodeRewritingGraphLens(dexItemFactory, this);
+ }
+ return this;
+ }
+
+ public <T extends DexDefinition> boolean assertDefinitionsNotModified(Iterable<T> definitions) {
+ for (DexDefinition definition : definitions) {
+ DexReference reference = definition.getReference();
+ // We allow changes to bridge methods as these get retargeted even if they are kept.
+ boolean isBridge =
+ definition.isDexEncodedMethod() && definition.asDexEncodedMethod().accessFlags.isBridge();
+ assert isBridge || lookupReference(reference) == reference;
+ }
+ return true;
+ }
+
+ public <T extends DexReference> boolean assertPinnedNotModified(
+ KeepInfoCollection keepInfo, InternalOptions options) {
+ List<DexReference> pinnedItems = new ArrayList<>();
+ keepInfo.forEachPinnedType(pinnedItems::add, options);
+ keepInfo.forEachPinnedMethod(pinnedItems::add, options);
+ keepInfo.forEachPinnedField(pinnedItems::add, options);
+ return assertReferencesNotModified(pinnedItems);
+ }
+
+ public <T extends DexReference> boolean assertReferencesNotModified(Iterable<T> references) {
+ for (DexReference reference : references) {
+ if (reference.isDexField()) {
+ DexField field = reference.asDexField();
+ assert getRenamedFieldSignature(field) == field;
+ } else if (reference.isDexMethod()) {
+ DexMethod method = reference.asDexMethod();
+ assert getRenamedMethodSignature(method) == method;
+ } else {
+ assert reference.isDexType();
+ DexType type = reference.asDexType();
+ assert lookupType(type) == type;
+ }
+ }
+ return true;
+ }
+
+ public Map<DexCallSite, ProgramMethodSet> rewriteCallSites(
+ Map<DexCallSite, ProgramMethodSet> callSites, DexDefinitionSupplier definitions) {
+ Map<DexCallSite, ProgramMethodSet> result = new IdentityHashMap<>();
+ LensCodeRewriterUtils rewriter = new LensCodeRewriterUtils(definitions, this, null);
+ callSites.forEach(
+ (callSite, contexts) -> {
+ for (ProgramMethod context : contexts.rewrittenWithLens(definitions, this)) {
+ DexCallSite rewrittenCallSite = rewriter.rewriteCallSite(callSite, context);
+ result
+ .computeIfAbsent(rewrittenCallSite, ignore -> ProgramMethodSet.create())
+ .add(context);
+ }
+ });
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends DexReference> T rewriteReference(T reference) {
+ return rewriteReference(reference, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends DexReference> T rewriteReference(T reference, GraphLens codeLens) {
+ return (T)
+ reference.apply(
+ type -> lookupType(type, codeLens),
+ field -> getRenamedFieldSignature(field, codeLens),
+ method -> getRenamedMethodSignature(method, codeLens));
+ }
+
+ public <T extends DexReference> Set<T> rewriteReferences(Set<T> references) {
+ Set<T> result = SetUtils.newIdentityHashSet(references.size());
+ for (T reference : references) {
+ result.add(rewriteReference(reference));
+ }
+ return result;
+ }
+
+ public <R extends DexReference, T> Map<R, T> rewriteReferenceKeys(
+ Map<R, T> map, BiFunction<R, List<T>, T> merge) {
+ Map<R, T> result = new IdentityHashMap<>();
+ Map<R, List<T>> needsMerge = new IdentityHashMap<>();
+ map.forEach(
+ (reference, value) -> {
+ R rewrittenReference = rewriteReference(reference);
+ List<T> unmergedValues = needsMerge.get(rewrittenReference);
+ if (unmergedValues != null) {
+ unmergedValues.add(value);
+ } else {
+ T existingValue = result.put(rewrittenReference, value);
+ if (existingValue != null) {
+ // Remove this for now and let the merge function decide when all colliding values are
+ // known.
+ needsMerge.put(rewrittenReference, ListUtils.newArrayList(existingValue, value));
+ result.remove(rewrittenReference);
+ }
+ }
+ });
+ needsMerge.forEach(
+ (rewrittenReference, unmergedValues) -> {
+ T mergedValue = merge.apply(rewrittenReference, unmergedValues);
+ if (mergedValue != null) {
+ result.put(rewrittenReference, mergedValue);
+ }
+ });
+ return result;
+ }
+
+ public <T extends DexReference> Object2BooleanMap<T> rewriteReferenceKeys(
+ Object2BooleanMap<T> map) {
+ Object2BooleanMap<T> result = new Object2BooleanArrayMap<>();
+ for (Object2BooleanMap.Entry<T> entry : map.object2BooleanEntrySet()) {
+ result.put(rewriteReference(entry.getKey()), entry.getBooleanValue());
+ }
+ return result;
+ }
+
+ public <T> ImmutableMap<DexField, T> rewriteFieldKeys(Map<DexField, T> map) {
+ ImmutableMap.Builder<DexField, T> builder = ImmutableMap.builder();
+ map.forEach((field, value) -> builder.put(getRenamedFieldSignature(field), value));
+ return builder.build();
+ }
+
+ public ImmutableSet<DexType> rewriteTypes(Set<DexType> types) {
+ ImmutableSet.Builder<DexType> builder = new ImmutableSet.Builder<>();
+ for (DexType type : types) {
+ builder.add(lookupType(type));
+ }
+ return builder.build();
+ }
+
+ public <T> Map<DexType, T> rewriteTypeKeys(Map<DexType, T> map, BiFunction<T, T, T> merge) {
+ Map<DexType, T> newMap = new IdentityHashMap<>();
+ map.forEach(
+ (type, value) -> {
+ DexType rewrittenType = lookupType(type);
+ T previousValue = newMap.get(rewrittenType);
+ newMap.put(
+ rewrittenType, previousValue != null ? merge.apply(value, previousValue) : value);
+ });
+ return newMap;
+ }
+
+ public boolean verifyMappingToOriginalProgram(
+ AppView<?> appView, DexApplication originalApplication) {
+ Iterable<DexProgramClass> classes = appView.appInfo().classesWithDeterministicOrder();
+ // Collect all original fields and methods for efficient querying.
+ Set<DexField> originalFields = Sets.newIdentityHashSet();
+ Set<DexMethod> originalMethods = Sets.newIdentityHashSet();
+ for (DexProgramClass clazz : originalApplication.classes()) {
+ for (DexEncodedField field : clazz.fields()) {
+ originalFields.add(field.getReference());
+ }
+ for (DexEncodedMethod method : clazz.methods()) {
+ originalMethods.add(method.getReference());
+ }
+ }
+
+ // Check that all fields and methods in the generated program can be mapped back to one of the
+ // original fields or methods.
+ for (DexProgramClass clazz : classes) {
+ if (appView.appInfo().getSyntheticItems().isSyntheticClass(clazz)) {
+ continue;
+ }
+ for (DexEncodedField field : clazz.fields()) {
+ if (field.isD8R8Synthesized()) {
+ // Fields synthesized by D8/R8 may not be mapped.
+ continue;
+ }
+ DexField originalField = getOriginalFieldSignature(field.getReference());
+ assert originalFields.contains(originalField)
+ : "Unable to map field `"
+ + field.getReference().toSourceString()
+ + "` back to original program";
+ }
+ for (DexEncodedMethod method : clazz.methods()) {
+ if (method.isD8R8Synthesized()) {
+ // Methods synthesized by D8/R8 may not be mapped.
+ continue;
+ }
+ DexMethod originalMethod = getOriginalMethodSignature(method.getReference());
+ assert originalMethods.contains(originalMethod)
+ : "Method could not be mapped back: "
+ + method.toSourceString()
+ + ", originalMethod: "
+ + originalMethod.toSourceString();
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/src/main/java/com/android/tools/r8/graph/lens/IdentityGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/IdentityGraphLens.java
new file mode 100644
index 0000000..ce9aca7
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/IdentityGraphLens.java
@@ -0,0 +1,118 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.lens;
+
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.ir.code.InvokeType;
+import com.android.tools.r8.utils.IterableUtils;
+
+final class IdentityGraphLens extends GraphLens {
+
+ private static IdentityGraphLens INSTANCE = new IdentityGraphLens();
+
+ private IdentityGraphLens() {}
+
+ static IdentityGraphLens getInstance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public boolean isIdentityLens() {
+ return true;
+ }
+
+ @Override
+ public boolean isNonIdentityLens() {
+ return false;
+ }
+
+ @Override
+ public DexType getOriginalType(DexType type) {
+ return type;
+ }
+
+ @Override
+ public Iterable<DexType> getOriginalTypes(DexType type) {
+ return IterableUtils.singleton(type);
+ }
+
+ @Override
+ public DexField getOriginalFieldSignature(DexField field) {
+ return field;
+ }
+
+ @Override
+ public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
+ return originalField;
+ }
+
+ @Override
+ public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
+ return originalMethod;
+ }
+
+ @Override
+ public String lookupPackageName(String pkg) {
+ return pkg;
+ }
+
+ @Override
+ public DexType lookupType(DexType type, GraphLens applied) {
+ return type;
+ }
+
+ @Override
+ public DexType lookupClassType(DexType type, GraphLens applied) {
+ assert type.isClassType();
+ return type;
+ }
+
+ @Override
+ public MethodLookupResult lookupMethod(
+ DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens) {
+ assert codeLens == null || codeLens.isIdentityLens();
+ return MethodLookupResult.builder(this).setReference(method).setType(type).build();
+ }
+
+ @Override
+ public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
+ DexMethod method, GraphLens codeLens) {
+ return RewrittenPrototypeDescription.none();
+ }
+
+ @Override
+ protected FieldLookupResult internalLookupField(
+ DexField reference, GraphLens codeLens, LookupFieldContinuation continuation) {
+ // Passes the field reference back to the next graph lens. The identity lens intentionally
+ // does not set the rebound field reference, since it does not know what that is.
+ return continuation.lookupField(
+ FieldLookupResult.builder(this).setReference(reference).build());
+ }
+
+ @Override
+ protected MethodLookupResult internalLookupMethod(
+ DexMethod reference,
+ DexMethod context,
+ InvokeType type,
+ GraphLens codeLens,
+ LookupMethodContinuation continuation) {
+ // Passes the method reference back to the next graph lens. The identity lens intentionally
+ // does not set the rebound method reference, since it does not know what that is.
+ return continuation.lookupMethod(lookupMethod(reference, context, type, codeLens));
+ }
+
+ @Override
+ public boolean isContextFreeForMethods() {
+ return true;
+ }
+
+ @Override
+ public boolean hasCodeRewritings() {
+ return false;
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/InitClassLens.java b/src/main/java/com/android/tools/r8/graph/lens/InitClassLens.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/graph/InitClassLens.java
rename to src/main/java/com/android/tools/r8/graph/lens/InitClassLens.java
index 2b74f9f..8ec8404 100644
--- a/src/main/java/com/android/tools/r8/graph/InitClassLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/InitClassLens.java
@@ -1,9 +1,11 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.graph.lens;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexType;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/com/android/tools/r8/graph/lens/MemberLookupResult.java b/src/main/java/com/android/tools/r8/graph/lens/MemberLookupResult.java
new file mode 100644
index 0000000..7ec7c85
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/MemberLookupResult.java
@@ -0,0 +1,68 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.lens;
+
+import com.android.tools.r8.graph.DexMember;
+import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeMap;
+import java.util.Map;
+import java.util.function.Function;
+
+abstract class MemberLookupResult<R extends DexMember<?, R>> {
+
+ private final R reference;
+ private final R reboundReference;
+
+ MemberLookupResult(R reference, R reboundReference) {
+ this.reference = reference;
+ this.reboundReference = reboundReference;
+ }
+
+ public R getReference() {
+ return reference;
+ }
+
+ public R getRewrittenReference(BidirectionalManyToOneRepresentativeMap<R, R> rewritings) {
+ return rewritings.getOrDefault(reference, reference);
+ }
+
+ public R getRewrittenReference(Map<R, R> rewritings) {
+ return rewritings.getOrDefault(reference, reference);
+ }
+
+ public boolean hasReboundReference() {
+ return reboundReference != null;
+ }
+
+ public R getReboundReference() {
+ return reboundReference;
+ }
+
+ public R getRewrittenReboundReference(BidirectionalManyToOneRepresentativeMap<R, R> rewritings) {
+ return rewritings.getOrDefault(reboundReference, reboundReference);
+ }
+
+ public R getRewrittenReboundReference(Function<R, R> rewritings) {
+ R rewrittenReboundReference = rewritings.apply(reboundReference);
+ return rewrittenReboundReference != null ? rewrittenReboundReference : reboundReference;
+ }
+
+ abstract static class Builder<R extends DexMember<?, R>, Self extends Builder<R, Self>> {
+
+ R reference;
+ R reboundReference;
+
+ public Self setReference(R reference) {
+ this.reference = reference;
+ return self();
+ }
+
+ public Self setReboundReference(R reboundReference) {
+ this.reboundReference = reboundReference;
+ return self();
+ }
+
+ public abstract Self self();
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/lens/MethodLookupResult.java b/src/main/java/com/android/tools/r8/graph/lens/MethodLookupResult.java
new file mode 100644
index 0000000..a69267e
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/MethodLookupResult.java
@@ -0,0 +1,76 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.lens;
+
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.ir.code.InvokeType;
+
+/**
+ * Result of a method lookup in a GraphLens.
+ *
+ * <p>This provides the new target and invoke type to use, along with a description of the prototype
+ * changes that have been made to the target method and the corresponding required changes to the
+ * invoke arguments.
+ */
+public class MethodLookupResult extends MemberLookupResult<DexMethod> {
+
+ private final InvokeType type;
+ private final RewrittenPrototypeDescription prototypeChanges;
+
+ public MethodLookupResult(
+ DexMethod reference,
+ DexMethod reboundReference,
+ InvokeType type,
+ RewrittenPrototypeDescription prototypeChanges) {
+ super(reference, reboundReference);
+ this.type = type;
+ this.prototypeChanges = prototypeChanges;
+ }
+
+ public static Builder builder(GraphLens lens) {
+ return new Builder(lens);
+ }
+
+ public InvokeType getType() {
+ return type;
+ }
+
+ public RewrittenPrototypeDescription getPrototypeChanges() {
+ return prototypeChanges;
+ }
+
+ public static class Builder extends MemberLookupResult.Builder<DexMethod, Builder> {
+
+ private final GraphLens lens;
+ private RewrittenPrototypeDescription prototypeChanges = RewrittenPrototypeDescription.none();
+ private InvokeType type;
+
+ private Builder(GraphLens lens) {
+ this.lens = lens;
+ }
+
+ public Builder setPrototypeChanges(RewrittenPrototypeDescription prototypeChanges) {
+ this.prototypeChanges = prototypeChanges;
+ return this;
+ }
+
+ public Builder setType(InvokeType type) {
+ this.type = type;
+ return this;
+ }
+
+ public MethodLookupResult build() {
+ assert reference != null;
+ // TODO(b/168282032): All non-identity graph lenses should set the rebound reference.
+ return new MethodLookupResult(reference, reboundReference, type, prototypeChanges);
+ }
+
+ @Override
+ public Builder self() {
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLens.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
rename to src/main/java/com/android/tools/r8/graph/lens/NestedGraphLens.java
index 85bd133..7c921ca 100644
--- a/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLens.java
@@ -1,10 +1,15 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.graph.lens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexDefinitionSupplier;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.utils.IterableUtils;
diff --git a/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
new file mode 100644
index 0000000..fb0c944
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
@@ -0,0 +1,195 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.lens;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.code.InvokeType;
+import com.android.tools.r8.utils.Action;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Predicate;
+
+public abstract class NonIdentityGraphLens extends GraphLens {
+
+ private final DexItemFactory dexItemFactory;
+ private GraphLens previousLens;
+
+ private final Map<DexType, DexType> arrayTypeCache = new ConcurrentHashMap<>();
+
+ public NonIdentityGraphLens(AppView<?> appView) {
+ this(appView.dexItemFactory(), appView.graphLens());
+ }
+
+ public NonIdentityGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
+ this.dexItemFactory = dexItemFactory;
+ this.previousLens = previousLens;
+ }
+
+ public final DexItemFactory dexItemFactory() {
+ return dexItemFactory;
+ }
+
+ public final GraphLens getPrevious() {
+ return previousLens;
+ }
+
+ @SuppressWarnings("unchecked")
+ public final <T extends com.android.tools.r8.graph.lens.NonIdentityGraphLens> T find(
+ Predicate<com.android.tools.r8.graph.lens.NonIdentityGraphLens> predicate) {
+ GraphLens current = this;
+ while (current.isNonIdentityLens()) {
+ com.android.tools.r8.graph.lens.NonIdentityGraphLens nonIdentityGraphLens =
+ current.asNonIdentityLens();
+ if (predicate.test(nonIdentityGraphLens)) {
+ return (T) nonIdentityGraphLens;
+ }
+ current = nonIdentityGraphLens.getPrevious();
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public final <T extends com.android.tools.r8.graph.lens.NonIdentityGraphLens> T findPrevious(
+ Predicate<com.android.tools.r8.graph.lens.NonIdentityGraphLens> predicate) {
+ GraphLens previous = getPrevious();
+ return previous.isNonIdentityLens() ? previous.asNonIdentityLens().find(predicate) : null;
+ }
+
+ public final <T extends com.android.tools.r8.graph.lens.NonIdentityGraphLens> T findPreviousUntil(
+ Predicate<com.android.tools.r8.graph.lens.NonIdentityGraphLens> predicate,
+ Predicate<com.android.tools.r8.graph.lens.NonIdentityGraphLens> stoppingCriterion) {
+ T found = findPrevious(predicate.or(stoppingCriterion));
+ return (found == null || stoppingCriterion.test(found)) ? null : found;
+ }
+
+ public final void withAlternativeParentLens(GraphLens lens, Action action) {
+ GraphLens oldParent = getPrevious();
+ previousLens = lens;
+ action.execute();
+ previousLens = oldParent;
+ }
+
+ @Override
+ public MethodLookupResult lookupMethod(
+ DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens) {
+ if (method.getHolderType().isArrayType()) {
+ assert lookupType(method.getReturnType()) == method.getReturnType();
+ assert method.getParameters().stream()
+ .allMatch(parameterType -> lookupType(parameterType) == parameterType);
+ return MethodLookupResult.builder(this)
+ .setReference(method.withHolder(lookupType(method.getHolderType()), dexItemFactory))
+ .setType(type)
+ .build();
+ }
+ assert method.getHolderType().isClassType();
+ return internalLookupMethod(method, context, type, codeLens, result -> result);
+ }
+
+ @Override
+ public String lookupPackageName(String pkg) {
+ return getPrevious().lookupPackageName(pkg);
+ }
+
+ @Override
+ public final DexType lookupType(DexType type, GraphLens applied) {
+ if (this == applied) {
+ return type;
+ }
+ if (type.isPrimitiveType() || type.isVoidType() || type.isNullValueType()) {
+ return type;
+ }
+ if (type.isArrayType()) {
+ DexType result = arrayTypeCache.get(type);
+ if (result == null) {
+ DexType baseType = type.toBaseType(dexItemFactory);
+ DexType newType = lookupType(baseType);
+ result = baseType == newType ? type : type.replaceBaseType(newType, dexItemFactory);
+ arrayTypeCache.put(type, result);
+ }
+ return result;
+ }
+ return lookupClassType(type);
+ }
+
+ @Override
+ public final DexType lookupClassType(DexType type, GraphLens applied) {
+ assert type.isClassType() : "Expected class type, but was `" + type.toSourceString() + "`";
+ if (this == applied) {
+ return type;
+ }
+ return internalDescribeLookupClassType(getPrevious().lookupClassType(type));
+ }
+
+ @Override
+ protected FieldLookupResult internalLookupField(
+ DexField reference, GraphLens codeLens, LookupFieldContinuation continuation) {
+ if (this == codeLens) {
+ return getIdentityLens().internalLookupField(reference, codeLens, continuation);
+ }
+ return previousLens.internalLookupField(
+ reference,
+ codeLens,
+ previous -> continuation.lookupField(internalDescribeLookupField(previous)));
+ }
+
+ @Override
+ protected MethodLookupResult internalLookupMethod(
+ DexMethod reference,
+ DexMethod context,
+ InvokeType type,
+ GraphLens codeLens,
+ LookupMethodContinuation continuation) {
+ if (this == codeLens) {
+ GraphLens identityLens = getIdentityLens();
+ return identityLens.internalLookupMethod(
+ reference, context, type, identityLens, continuation);
+ }
+ return previousLens.internalLookupMethod(
+ reference,
+ getPreviousMethodSignature(context),
+ type,
+ codeLens,
+ previous -> continuation.lookupMethod(internalDescribeLookupMethod(previous, context)));
+ }
+
+ protected abstract FieldLookupResult internalDescribeLookupField(FieldLookupResult previous);
+
+ protected abstract MethodLookupResult internalDescribeLookupMethod(
+ MethodLookupResult previous, DexMethod context);
+
+ protected abstract DexType internalDescribeLookupClassType(DexType previous);
+
+ public abstract DexMethod getPreviousMethodSignature(DexMethod method);
+
+ /***
+ * The previous mapping for a method often coincides with the previous method signature, but it
+ * may not, for example for bridges inserted in vertically merged classes where the original
+ * signature is used for computing invoke-super but should not be used for mapping output.
+ */
+ public DexMethod getPreviousMethodSignatureForMapping(DexMethod method) {
+ return getPreviousMethodSignature(method);
+ }
+
+ public abstract DexMethod getNextMethodSignature(DexMethod method);
+
+ @Override
+ public final boolean isIdentityLens() {
+ return false;
+ }
+
+ @Override
+ public final boolean isNonIdentityLens() {
+ return true;
+ }
+
+ @Override
+ public final com.android.tools.r8.graph.lens.NonIdentityGraphLens asNonIdentityLens() {
+ return this;
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowingInitClassLens.java b/src/main/java/com/android/tools/r8/graph/lens/ThrowingInitClassLens.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/graph/ThrowingInitClassLens.java
rename to src/main/java/com/android/tools/r8/graph/lens/ThrowingInitClassLens.java
index 730a873..66a60d5 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowingInitClassLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/ThrowingInitClassLens.java
@@ -1,10 +1,12 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.graph.lens;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexType;
public class ThrowingInitClassLens extends InitClassLens {
diff --git a/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfo.java b/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfo.java
index d221385..de74d62 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfo.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.graph.proto;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public abstract class ArgumentInfo {
diff --git a/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java b/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java
index 889f21a..f08d256 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfoFixer;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.BooleanUtils;
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
index 79b3b6c..8d560c5 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.SingleValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Objects;
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
index 7bd6530..9bcda3a 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.SingleValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Objects;
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
index 06c5418..e149d62 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
@@ -10,9 +10,9 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.RewrittenPrototypeDescriptionMethodOptimizationInfoFixer;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.SingleValue;
import com.android.tools.r8.ir.code.ConstInstruction;
import com.android.tools.r8.ir.code.IRCode;
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
index 0f0c49f..d3388bc 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.SingleValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Objects;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
index 1cf6415..459cf9a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
@@ -29,7 +29,7 @@
import com.android.tools.r8.ir.analysis.value.NumberFromIntervalValue;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.utils.SetUtils;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
index 32dd38f..1fbc713 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
@@ -12,13 +12,13 @@
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.horizontalclassmerging.code.SyntheticInitializerConverter;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.profile.art.ArtProfileCompletenessChecker;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.FieldAccessInfoCollectionModifier;
import com.android.tools.r8.shaking.KeepInfoCollection;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
index 53f08a6..72e96a7 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
@@ -10,8 +10,10 @@
import com.android.tools.r8.graph.DexMember;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.NestedGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.ir.conversion.ExtraParameter;
import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.collections.BidirectionalManyToOneHashMap;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java
index 8718185..ab14412 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java
@@ -7,8 +7,8 @@
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteMergedInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteMergedInstanceInitializerCode.java
index 329d43a..15f0d57 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteMergedInstanceInitializerCode.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteMergedInstanceInitializerCode.java
@@ -23,9 +23,9 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.analysis.value.SingleConstValue;
import com.android.tools.r8.ir.analysis.value.SingleDexItemBasedStringValue;
import com.android.tools.r8.ir.code.Position;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java
index 2bd4d6e..6f6a957 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java
@@ -21,8 +21,8 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.horizontalclassmerging.VirtualMethodMerger.SuperMethodReference;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.utils.BooleanUtils;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
index e1a6710..0cf3a94 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
@@ -24,7 +24,7 @@
import com.android.tools.r8.ir.conversion.ExtraConstantIntParameter;
import com.android.tools.r8.ir.conversion.ExtraParameter;
import com.android.tools.r8.ir.conversion.ExtraUnusedNullParameter;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.Box;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
index 948c889..55aad86d 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
@@ -21,7 +21,7 @@
import com.android.tools.r8.graph.TreeFixerBase;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
import com.android.tools.r8.ir.conversion.ExtraUnusedNullParameter;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.shaking.AnnotationFixer;
import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.Box;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
index a9dd719..d937a8e 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
@@ -14,7 +14,7 @@
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.OptionalBool;
import com.android.tools.r8.utils.structural.Ordered;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java
index 93572c6..8685b4a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/SyntheticInitializerConverter.java
@@ -8,8 +8,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
import com.android.tools.r8.horizontalclassmerging.IRCodeProvider;
import com.android.tools.r8.ir.code.IRCode;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java
index ab29351..99707bf 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java
index d62a1d6..b18d02a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java
@@ -8,8 +8,8 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java
index 9d2e36a..e4efd96 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.graph.proto.RemovedArgumentInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java
index 43823c3..6131581 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
index 89e78e5..b0fc54d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Phi;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicType.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicType.java
index 1b9bb1e..e31d2db 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicType.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicType.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java
index 5784e9e..4ed918e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Objects;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ExactDynamicType.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ExactDynamicType.java
index 0cd29f2..0b92334 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ExactDynamicType.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ExactDynamicType.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/NotNullDynamicType.java b/src/main/java/com/android/tools/r8/ir/analysis/type/NotNullDynamicType.java
index a9830ff..7645341 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/NotNullDynamicType.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/NotNullDynamicType.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
index 0efe7d0..6800d1c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.Value;
import java.util.Collections;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java
index d62f8e7..c4e0a83 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.objectstate.ObjectState;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java
index 4253a3d..0653a7c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public class BottomValue extends AbstractValue {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java
index db25101..983708f 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public class NullOrAbstractValue extends AbstractValue {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java
index 94d2d59..11f395b 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.OptionalBool;
import java.util.Objects;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java
index 1c539c9..629ebf1 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.OptionalBool;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
index 80718a7..fc86d70 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
@@ -14,8 +14,8 @@
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.ConstClass;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
index c1e6c43..bc0aef8 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
@@ -11,8 +11,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.DexItemBasedConstString;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
index da02bae..9acf109 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -15,8 +15,8 @@
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.TypeElement;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
index 934f0e6..5327427 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
@@ -7,8 +7,8 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.ConstNumber;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
index f4ce6ae..d51ff72 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
@@ -11,8 +11,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.ConstString;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
index 0f0ff90..51bc690 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java
index 2d090e9..1d46931 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.objectstate.ObjectState;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java
index 8faaea4..e2ef4e0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public class UnknownValue extends AbstractValue {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EmptyObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EmptyObjectState.java
index 0d1255e..1f2b960 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EmptyObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EmptyObjectState.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java
index 8311d1e..3a50ca7 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/KnownLengthArrayState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/KnownLengthArrayState.java
index 8c9e449..f05e962 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/KnownLengthArrayState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/KnownLengthArrayState.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java
index 7133b9c..b9a9933 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/ObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/ObjectState.java
index bc0762a..00165e5 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/ObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/ObjectState.java
@@ -8,8 +8,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.SingleValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index 276150a..bef0a26 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -12,10 +12,10 @@
import com.android.tools.r8.graph.DebugLocalInfo.PrintLevel;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.ir.analysis.VerifyTypesHelper;
import com.android.tools.r8.ir.analysis.type.Nullability;
import com.android.tools.r8.ir.analysis.type.TypeElement;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeType.java b/src/main/java/com/android/tools/r8/ir/code/InvokeType.java
index 214b6db..bed9095 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeType.java
@@ -26,8 +26,8 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexMethodHandle.MethodHandleType;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import org.objectweb.asm.Opcodes;
public enum InvokeType {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
index 9782300..ac5cc44 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.utils.MapUtils;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.collections.ImmutableDeque;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java
index fec53b0..6c7a613 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.ir.conversion.callgraph.CallSiteInformation;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.utils.ThreadUtils;
import com.google.common.collect.Sets;
import java.util.ArrayList;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index c9bc10c..779beba 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -33,8 +33,8 @@
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfo;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.graph.proto.RemovedArgumentInfo;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 362d883..1efe772 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -49,12 +49,12 @@
import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.FieldLookupResult;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.classmerging.VerticallyMergedClasses;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfo;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.graph.proto.RemovedArgumentInfo;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java
index aefb54d..b82af15 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java
@@ -23,10 +23,10 @@
import com.android.tools.r8.graph.DexValue.DexValueMethodHandle;
import com.android.tools.r8.graph.DexValue.DexValueMethodType;
import com.android.tools.r8.graph.DexValue.DexValueType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry.MethodHandleUse;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
import java.util.ArrayList;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java
index a14171a..ac0ca71 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java
@@ -12,8 +12,8 @@
import com.android.tools.r8.ir.optimize.UtilityMethodsForCodeOptimizationsEventConsumer;
import com.android.tools.r8.ir.optimize.api.InstanceInitializerOutlinerEventConsumer;
import com.android.tools.r8.ir.optimize.enums.EnumUnboxerMethodProcessorEventConsumer;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingMethodProcessorEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingMethodProcessorEventConsumer;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public abstract class MethodProcessorEventConsumer
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index e7d3441..fe3085a 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -12,8 +12,8 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.PrimaryMethodProcessor.MethodAction;
import com.android.tools.r8.ir.conversion.callgraph.CallGraph;
import com.android.tools.r8.ir.conversion.callgraph.PartialCallGraphBuilder;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
index cf8e52d..532c129 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
@@ -33,7 +33,7 @@
import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.position.MethodPosition;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.utils.ExceptionUtils;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.ThreadUtils;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
index 0ad28d4..68073e7 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -10,8 +10,8 @@
import com.android.tools.r8.graph.DexApplication.Builder;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.fieldaccess.TrivialFieldAccessReprocessor;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
import com.android.tools.r8.optimize.argumentpropagation.ArgumentPropagator;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
index 34e00ef..38bc387 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
@@ -11,11 +11,11 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.MethodResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringEventConsumer.java
index 0db5e13..ca51bd8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringEventConsumer.java
@@ -14,8 +14,8 @@
import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceSynthesizerEventConsumer.L8ProgramEmulatedInterfaceSynthesizerEventConsumer;
import com.android.tools.r8.ir.desugar.records.RecordDesugaringEventConsumer.RecordClassSynthesizerDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.varhandle.VarHandleDesugaringEventConsumer;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingCfClassSynthesizerDesugaringEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingCfClassSynthesizerDesugaringEventConsumer;
import com.google.common.collect.Sets;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index 509a1ff..3e410e8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -32,8 +32,8 @@
import com.android.tools.r8.ir.desugar.records.RecordDesugaringEventConsumer.RecordInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.twr.TwrCloseResourceDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.varhandle.VarHandleDesugaringEventConsumer;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingCfInstructionDesugaringEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingCfInstructionDesugaringEventConsumer;
import com.android.tools.r8.shaking.Enqueuer.SyntheticAdditions;
import com.android.tools.r8.shaking.KeepMethodInfo.Joiner;
import com.google.common.collect.Sets;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
index adeecfe..1a232e1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
@@ -18,8 +18,8 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterPostProcessingEventConsumer;
import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper;
import com.android.tools.r8.ir.desugar.itf.InterfaceProcessingDesugaringEventConsumer;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingCfPostProcessingDesugaringEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingCfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.shaking.Enqueuer.SyntheticAdditions;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import java.util.Collections;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformerEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformerEventConsumer.java
index 86c74d8..f5c97fe 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformerEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformerEventConsumer.java
@@ -5,8 +5,8 @@
package com.android.tools.r8.ir.desugar;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer;
public interface CovariantReturnTypeAnnotationTransformerEventConsumer {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
index e1e72d8..de9f350 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
@@ -131,6 +131,7 @@
null,
Collections.emptyList(),
Collections.emptyList(),
+ Collections.emptyList(),
null,
Collections.emptyList(),
ClassSignature.noSignature(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
index fd607ee..47a6d30 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
@@ -79,6 +79,7 @@
null,
Collections.emptyList(),
Collections.emptyList(),
+ Collections.emptyList(),
null, // Note that we clear the enclosing and inner class attributes.
Collections.emptyList(),
emulatedInterface.getClassSignature(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index a7562ee..31037b9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -24,11 +24,11 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InvalidCode;
import com.android.tools.r8.graph.MethodCollection;
-import com.android.tools.r8.graph.NestedGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper.InterfaceMethodDesugaringMode;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
index 4e037ad..34d6b95 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
@@ -18,7 +18,7 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.ir.conversion.D8MethodProcessor;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingNestBasedAccessDesugaringEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingNestBasedAccessDesugaringEventConsumer;
import com.android.tools.r8.utils.ThreadUtils;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfToCfRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfToCfRewriter.java
index b5e08d5..d1803d3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfToCfRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfToCfRewriter.java
@@ -19,8 +19,8 @@
import com.android.tools.r8.graph.DexValue.DexValueMethodHandle;
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.graph.DexValue.DexValueType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.desugar.records.RecordRewriterHelper.RecordInvokeDynamic;
import com.android.tools.r8.naming.NamingLens;
import java.util.ArrayList;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 5bdde13..0d20bc3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -18,10 +18,10 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.NestMemberClassAttribute;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.analysis.proto.ProtoInliningReasonStrategy;
import com.android.tools.r8.ir.analysis.type.Nullability;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 3452d98..449bb2e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -17,9 +17,9 @@
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldResolutionResult;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.MethodResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MultiCallerInliner.java b/src/main/java/com/android/tools/r8/ir/optimize/MultiCallerInliner.java
index e111ec0..54c8f61 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MultiCallerInliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MultiCallerInliner.java
@@ -8,9 +8,9 @@
import static com.android.tools.r8.utils.MapUtils.ignoreKey;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java
index bde3a44..6f94842 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.StaticFieldValues;
import com.android.tools.r8.ir.code.IRCode;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index 659d802..cfb23b0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.StaticFieldValues;
import com.android.tools.r8.ir.code.IRCode;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
index 1767d8b..4666036 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -41,10 +41,10 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldResolutionResult;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.StaticFieldValues;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.StaticFieldValues.EnumStaticFieldValues;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
index 51e4191..abc0fde 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
@@ -4,18 +4,27 @@
package com.android.tools.r8.ir.optimize.enums;
+import static com.android.tools.r8.utils.MapUtils.ignoreKey;
+
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMember;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.optimize.enums.eligibility.Reason;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.KeepInfoCollection;
import com.android.tools.r8.utils.InternalOptions;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.Set;
class EnumUnboxingCandidateAnalysis {
@@ -30,6 +39,9 @@
private EnumUnboxingCandidateInfoCollection enumToUnboxCandidates =
new EnumUnboxingCandidateInfoCollection();
+ private final Map<DexType, Set<DexProgramClass>> enumSubclasses = new IdentityHashMap<>();
+ private final Set<DexType> ineligibleCandidates = Sets.newIdentityHashSet();
+
EnumUnboxingCandidateAnalysis(AppView<AppInfoWithLiveness> appView, EnumUnboxerImpl enumUnboxer) {
this.appView = appView;
this.enumUnboxer = enumUnboxer;
@@ -44,32 +56,125 @@
return enumToUnboxCandidates;
}
for (DexProgramClass clazz : appView.appInfo().classes()) {
- if (isEnumUnboxingCandidate(clazz)) {
- enumToUnboxCandidates.addCandidate(appView, clazz, graphLensForPrimaryOptimizationPass);
+ if (clazz.isEnum()) {
+ analyzeEnum(graphLensForPrimaryOptimizationPass, clazz);
}
}
+ removeIneligibleCandidates();
removeEnumsInAnnotations();
removePinnedCandidates();
if (appView.options().protoShrinking().isProtoShrinkingEnabled()) {
enumToUnboxCandidates.removeCandidate(appView.protoShrinker().references.methodToInvokeType);
}
+ setEnumSubclassesOnCandidates();
+ assert enumToUnboxCandidates.verifyAllSubtypesAreSet();
return enumToUnboxCandidates;
}
- private boolean isEnumUnboxingCandidate(DexProgramClass clazz) {
- if (!clazz.isEnum()) {
- return false;
- }
+ private void setEnumSubclassesOnCandidates() {
+ enumToUnboxCandidates.forEachCandidate(
+ candidate ->
+ enumToUnboxCandidates.setEnumSubclasses(
+ candidate.getType(),
+ enumSubclasses.getOrDefault(candidate.getType(), ImmutableSet.of())));
+ }
+ private void removeIneligibleCandidates() {
+ for (DexType ineligibleCandidate : ineligibleCandidates) {
+ enumToUnboxCandidates.removeCandidate(ineligibleCandidate);
+ }
+ }
+
+ private void analyzeEnum(GraphLens graphLensForPrimaryOptimizationPass, DexProgramClass clazz) {
+ if (!appView.options().testing.enableEnumWithSubtypesUnboxing) {
+ if (legacyIsEnumUnboxingCandidate(clazz)) {
+ enumToUnboxCandidates.addCandidate(appView, clazz, graphLensForPrimaryOptimizationPass);
+ }
+ return;
+ }
+ if (clazz.superType == factory.enumType) {
+ if (isSuperEnumUnboxingCandidate(clazz)) {
+ enumToUnboxCandidates.addCandidate(appView, clazz, graphLensForPrimaryOptimizationPass);
+ }
+ } else {
+ if (isSubEnumUnboxingCandidate(clazz)) {
+ enumSubclasses
+ .computeIfAbsent(clazz.superType, ignoreKey(Sets::newIdentityHashSet))
+ .add(clazz);
+ } else {
+ ineligibleCandidates.add(clazz.superType);
+ }
+ }
+ }
+
+ private boolean isSubEnumUnboxingCandidate(DexProgramClass clazz) {
+ assert clazz.isEnum();
boolean result = true;
- if (clazz.superType != factory.enumType || !clazz.isEffectivelyFinal(appView)) {
+ // Javac does not seem to generate enums with more than a single subtype level.
+ // TODO(b/273910479): Stop using isEffectivelyFinal.
+ if (!clazz.isEffectivelyFinal(appView)) {
+ if (!enumUnboxer.reportFailure(clazz.superType, Reason.SUBENUM_SUBTYPES)) {
+ return false;
+ }
+ result = false;
+ }
+ DexClass superEnum = appView.definitionFor(clazz.superType);
+ if (superEnum == null || !superEnum.isEnum() || superEnum.superType != factory.enumType) {
+ if (!enumUnboxer.reportFailure(clazz.superType, Reason.SUBENUM_INVALID_HIERARCHY)) {
+ return false;
+ }
+ result = false;
+ }
+ // TODO(b/271385332): Support subEnums with instance fields.
+ if (!clazz.instanceFields().isEmpty()) {
+ if (!enumUnboxer.reportFailure(clazz.superType, Reason.SUBENUM_INSTANCE_FIELDS)) {
+ return false;
+ }
+ result = false;
+ }
+ // TODO(b/271385332): Support subEnums with static members (JDK16+).
+ if (!clazz.staticFields().isEmpty()
+ || !Iterables.isEmpty(clazz.directMethods(DexEncodedMethod::isStatic))) {
+ if (!enumUnboxer.reportFailure(clazz.superType, Reason.SUBENUM_STATIC_MEMBER)) {
+ return false;
+ }
+ result = false;
+ }
+ return result;
+ }
+
+ private boolean legacyIsEnumUnboxingCandidate(DexProgramClass clazz) {
+ assert clazz.isEnum();
+
+ // This is used in debug mode, where we don't do quick returns to log all the reasons an enum
+ // is not unboxed.
+ boolean result = true;
+
+ if (!clazz.isEffectivelyFinal(appView)) {
if (!enumUnboxer.reportFailure(clazz, Reason.SUBTYPES)) {
return false;
}
- // Record that `clazz` is ineligible, and continue analysis to ensure all reasons are reported
- // for debugging.
result = false;
}
+
+ return isSuperEnumUnboxingCandidate(clazz) && result;
+ }
+
+ private boolean isSuperEnumUnboxingCandidate(DexProgramClass clazz) {
+ assert clazz.isEnum();
+
+ // This is used in debug mode, where we don't do quick returns to log all the reasons an enum
+ // is not unboxed.
+ boolean result = true;
+
+ // TODO(b/271385332): Change this into an assert when legacy is removed.
+ if (clazz.superType != factory.enumType) {
+ if (!enumUnboxer.reportFailure(clazz, Reason.INVALID_LIBRARY_SUPERTYPE)) {
+ return false;
+ }
+ result = false;
+ }
+
if (clazz.instanceFields().size() > MAX_INSTANCE_FIELDS_FOR_UNBOXING) {
if (!enumUnboxer.reportFailure(clazz, Reason.MANY_INSTANCE_FIELDS)) {
return false;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java
index b79dea1..9feeed2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java
@@ -9,8 +9,8 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.collections.LongLivedProgramMethodSetBuilder;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
@@ -38,6 +38,10 @@
new EnumUnboxingCandidateInfo(appView, enumClass, graphLensForPrimaryOptimizationPass));
}
+ public void setEnumSubclasses(DexType superEnum, Set<DexProgramClass> subclasses) {
+ enumTypeToInfo.get(superEnum).setSubclasses(subclasses);
+ }
+
public void addPrunedMethod(ProgramMethod method) {
prunedMethods.add(method.getReference());
}
@@ -128,12 +132,21 @@
enumTypeToInfo.clear();
}
+ public boolean verifyAllSubtypesAreSet() {
+ for (EnumUnboxingCandidateInfo value : enumTypeToInfo.values()) {
+ assert value.subclasses != null;
+ }
+ return true;
+ }
+
private static class EnumUnboxingCandidateInfo {
private final DexProgramClass enumClass;
private final LongLivedProgramMethodSetBuilder<ProgramMethodSet> methodDependencies;
private final Set<DexField> requiredInstanceFieldData = Sets.newConcurrentHashSet();
+ private Set<DexProgramClass> subclasses = null;
+
public EnumUnboxingCandidateInfo(
AppView<AppInfoWithLiveness> appView,
DexProgramClass enumClass,
@@ -146,6 +159,10 @@
graphLensForPrimaryOptimizationPass);
}
+ public void setSubclasses(Set<DexProgramClass> subclasses) {
+ this.subclasses = subclasses;
+ }
+
public DexProgramClass getEnumClass() {
return enumClass;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
index fa272ca..91e6e67 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
@@ -9,8 +9,8 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.NestedGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.graph.proto.RewrittenTypeInfo;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index a186580..67efedd 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -18,11 +18,11 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.TypeElement;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java
index 7cb0290..5f31298 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java
@@ -14,7 +14,14 @@
public static final Reason ANNOTATION = new StringReason("ANNOTATION");
public static final Reason PINNED = new StringReason("PINNED");
public static final Reason DOWN_CAST = new StringReason("DOWN_CAST");
+ public static final Reason INVALID_LIBRARY_SUPERTYPE =
+ new StringReason("INVALID_LIBRARY_SUPERTYPE");
public static final Reason SUBTYPES = new StringReason("SUBTYPES");
+ public static final Reason SUBENUM_SUBTYPES = new StringReason("SUBENUM_SUBTYPES");
+ public static final Reason SUBENUM_INVALID_HIERARCHY =
+ new StringReason("SUBENUM_INVALID_HIERARCHY");
+ public static final Reason SUBENUM_INSTANCE_FIELDS = new StringReason("SUBENUM_INSTANCE_FIELDS");
+ public static final Reason SUBENUM_STATIC_MEMBER = new StringReason("SUBENUM_STATIC_MEMBER");
public static final Reason MANY_INSTANCE_FIELDS = new StringReason("MANY_INSTANCE_FIELDS");
public static final Reason DEFAULT_METHOD_INVOKE = new StringReason("DEFAULT_METHOD_INVOKE");
public static final Reason UNRESOLVABLE_FIELD = new StringReason("UNRESOLVABLE_FIELD");
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
index 3bf8709..89b97ad 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.DynamicType;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
index 8ee971e..d5127e3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
@@ -9,8 +9,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.inlining.NeverSimpleInliningConstraint;
import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraint;
import com.android.tools.r8.ir.analysis.type.DynamicType;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java
index 7694837..1de19ad 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.function.BiConsumer;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java
index 0d28a5c..d737cda 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfo;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.graph.proto.RemovedArgumentInfo;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java
index 6bf9604..856dfc0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.value.SingleValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java
index 772e2d8..d6ab75a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.TreeMap;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
index b494732..3f70c66 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.TypeElement;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
index 19c4ab9..1ecc4df 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.StringUtils;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java
index 0f41427..356926c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextInsensitiveInstanceInitializerInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextInsensitiveInstanceInitializerInfoCollection.java
index 0e5ce2c..0cd8dba 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextInsensitiveInstanceInitializerInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextInsensitiveInstanceInitializerInfoCollection.java
@@ -5,8 +5,8 @@
package com.android.tools.r8.ir.optimize.info.initializer;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextSensitiveInstanceInitializerInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextSensitiveInstanceInitializerInfoCollection.java
index 6a5efbb..de71f01 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextSensitiveInstanceInitializerInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/ContextSensitiveInstanceInitializerInfoCollection.java
@@ -5,8 +5,8 @@
package com.android.tools.r8.ir.optimize.info.initializer;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java
index 59a6141..f16d460 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.UnknownFieldSet;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/EmptyInstanceInitializerInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/EmptyInstanceInitializerInfoCollection.java
index 19fea9a..aaf6701 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/EmptyInstanceInitializerInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/EmptyInstanceInitializerInfoCollection.java
@@ -5,8 +5,8 @@
package com.android.tools.r8.ir.optimize.info.initializer;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java
index cbf442c..abc4a80 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet;
import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoCollection;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfoCollection.java
index fd793a6..ba53dc8 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfoCollection.java
@@ -5,8 +5,8 @@
package com.android.tools.r8.ir.optimize.info.initializer;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java
index 327e46a..2005de2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java
@@ -7,8 +7,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.ConcreteMutableFieldSet;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/multicallerinliner/MultiCallerInlinerInvokeRegistry.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/multicallerinliner/MultiCallerInlinerInvokeRegistry.java
index 06dab92..10d15ca 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/multicallerinliner/MultiCallerInlinerInvokeRegistry.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/multicallerinliner/MultiCallerInlinerInvokeRegistry.java
@@ -9,8 +9,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.conversion.callgraph.InvokeExtractor;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java
index 21d8d33..53dd0bf 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.DynamicType;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.SingleFieldValue;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineCollection.java
index a3782b6..2982c98 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineCollection.java
@@ -9,8 +9,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.optimize.outliner.OutlinerImpl.Outline;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.ListUtils;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineOptimizationEventConsumer.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineOptimizationEventConsumer.java
index d9e8a39..620ce77 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineOptimizationEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlineOptimizationEventConsumer.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingOutlineOptimizationEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingOutlineOptimizationEventConsumer;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Collection;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/Outliner.java
index 472f1b1..9c77201 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/Outliner.java
@@ -5,8 +5,8 @@
package com.android.tools.r8.ir.optimize.outliner;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
index 7a888d8..ef163ad 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
@@ -22,10 +22,10 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.ArrayTypeElement;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.PrimitiveTypeElement;
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
index ad0b54c..2200050 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
@@ -10,9 +10,9 @@
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index f10a6cf..5c92ac9 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -41,6 +41,7 @@
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.PermittedSubclassAttribute;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.RecordComponentInfo;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapId;
@@ -293,14 +294,9 @@
}
if (clazz.isRecord()) {
- // TODO(b/169645628): Strip record components if not kept.
- for (DexEncodedField instanceField : clazz.instanceFields()) {
- String componentName = getNamingLens().lookupName(instanceField.getReference()).toString();
- String componentDescriptor =
- getNamingLens().lookupDescriptor(instanceField.getReference().type).toString();
- String componentSignature =
- instanceField.getGenericSignature().toRenamedString(getNamingLens(), isTypeMissing);
- writer.visitRecordComponent(componentName, componentDescriptor, componentSignature);
+ // TODO(b/274888318): Strip record components if not kept.
+ for (RecordComponentInfo info : clazz.getRecordComponents()) {
+ info.write(writer, getNamingLens(), isTypeMissing, this::writeAnnotation);
}
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
index b6ee8e3..890d89e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.DescriptorUtils;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
index 93735f4..ab3b27f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.Reporter;
import com.google.common.collect.ImmutableList;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
index adbb277..553c174 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.DescriptorUtils;
diff --git a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
index 7686a1e..de480da 100644
--- a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
@@ -11,7 +11,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.kotlin.KotlinClassLevelInfo;
import com.android.tools.r8.kotlin.KotlinMultiFileClassPartInfo;
import com.android.tools.r8.origin.Origin;
diff --git a/src/main/java/com/android/tools/r8/naming/dexitembasedstring/NameComputationInfo.java b/src/main/java/com/android/tools/r8/naming/dexitembasedstring/NameComputationInfo.java
index 8a16fb0..029547e 100644
--- a/src/main/java/com/android/tools/r8/naming/dexitembasedstring/NameComputationInfo.java
+++ b/src/main/java/com/android/tools/r8/naming/dexitembasedstring/NameComputationInfo.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public abstract class NameComputationInfo<T extends DexReference> {
diff --git a/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java b/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java
index 5ad5e27..8c2f8b7 100644
--- a/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java
+++ b/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.StringUtils;
import java.util.ArrayList;
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
index 7b5a3ef..ad239c5 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.graph.GenericSignatureContextBuilder;
import com.android.tools.r8.graph.GenericSignaturePartialTypeArgumentApplier;
import com.android.tools.r8.graph.GenericSignatureTypeRewriter;
+import com.android.tools.r8.graph.RecordComponentInfo;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.ThreadUtils;
import java.util.Collection;
@@ -108,6 +109,10 @@
.visitMethodSignature(method.getGenericSignature())
: method.getGenericSignature()));
});
+ // TODO(b/274888318): Check this.
+ for (RecordComponentInfo recordComponent : clazz.getRecordComponents()) {
+ genericSignatureTypeRewriter.rewrite(recordComponent.getSignature());
+ }
},
executorService);
}
diff --git a/src/main/java/com/android/tools/r8/optimize/AccessModifier.java b/src/main/java/com/android/tools/r8/optimize/AccessModifier.java
index b2d577c..85533d5 100644
--- a/src/main/java/com/android/tools/r8/optimize/AccessModifier.java
+++ b/src/main/java/com/android/tools/r8/optimize/AccessModifier.java
@@ -16,13 +16,13 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldAccessFlags;
import com.android.tools.r8.graph.FieldAccessInfo;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.SubtypingInfo;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.optimize.MemberPoolCollection.MemberPool;
import com.android.tools.r8.ir.optimize.MethodPoolCollection;
import com.android.tools.r8.optimize.PublicizerLens.PublicizedLensBuilder;
diff --git a/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java b/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
index a980c52..2e641f6 100644
--- a/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
@@ -6,11 +6,9 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
-import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
import java.util.IdentityHashMap;
import java.util.Map;
@@ -20,7 +18,7 @@
*
* <p>TODO(b/157616970): All uses of this should be replaced by {@link MemberRebindingIdentityLens}.
*/
-public class FieldRebindingIdentityLens extends NonIdentityGraphLens {
+public class FieldRebindingIdentityLens extends DefaultNonIdentityGraphLens {
private final Map<DexField, DexField> nonReboundFieldReferenceToDefinitionMap;
@@ -55,69 +53,6 @@
return nonReboundFieldReferenceToDefinitionMap.getOrDefault(field, field);
}
- @Override
- public DexType getOriginalType(DexType type) {
- return getPrevious().getOriginalType(type);
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return getPrevious().getOriginalTypes(type);
- }
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return getPrevious().getOriginalFieldSignature(field);
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
- if (this == codeLens) {
- return originalField;
- }
- return getPrevious().getRenamedFieldSignature(originalField);
- }
-
- @Override
- public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
- return getPrevious().getRenamedMethodSignature(originalMethod, applied);
- }
-
- @Override
- public final DexType internalDescribeLookupClassType(DexType previous) {
- return previous;
- }
-
- @Override
- public MethodLookupResult internalDescribeLookupMethod(
- MethodLookupResult previous, DexMethod context) {
- return previous;
- }
-
- @Override
- public DexMethod getPreviousMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public DexMethod getNextMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens) {
- if (this == codeLens) {
- return getIdentityLens().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
- return getPrevious().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
-
- @Override
- public boolean isContextFreeForMethods() {
- return getPrevious().isContextFreeForMethods();
- }
-
public static class Builder {
private final Map<DexField, DexField> nonReboundFieldReferenceToDefinitionMap =
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingEventConsumer.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingEventConsumer.java
index c6d1656..019f204 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingEventConsumer.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingMemberRebindingEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingMemberRebindingEventConsumer;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public interface MemberRebindingEventConsumer {
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
index 2e6fb53..0c6a75a 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
@@ -10,12 +10,13 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldAccessInfo;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
-import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import java.util.IdentityHashMap;
import java.util.Map;
@@ -24,7 +25,7 @@
* both the non-rebound and rebound field and method references are available to all descendants of
* this lens.
*/
-public class MemberRebindingIdentityLens extends NonIdentityGraphLens {
+public class MemberRebindingIdentityLens extends DefaultNonIdentityGraphLens {
private final Map<DexField, DexField> nonReboundFieldReferenceToDefinitionMap;
private final Map<DexMethod, DexMethod> nonReboundMethodReferenceToDefinitionMap;
@@ -96,66 +97,6 @@
}
@Override
- public DexType getOriginalType(DexType type) {
- return getPrevious().getOriginalType(type);
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return getPrevious().getOriginalTypes(type);
- }
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return getPrevious().getOriginalFieldSignature(field);
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
- if (this == codeLens) {
- return originalField;
- }
- return getPrevious().getRenamedFieldSignature(originalField);
- }
-
- @Override
- public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
- if (this == applied) {
- return originalMethod;
- }
- return getPrevious().getRenamedMethodSignature(originalMethod, applied);
- }
-
- @Override
- public final DexType internalDescribeLookupClassType(DexType previous) {
- return previous;
- }
-
- @Override
- public DexMethod getPreviousMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public DexMethod getNextMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens) {
- if (this == codeLens) {
- return getIdentityLens().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
- return getPrevious().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
-
- @Override
- public boolean isContextFreeForMethods() {
- return getPrevious().isContextFreeForMethods();
- }
-
- @Override
public boolean isMemberRebindingIdentityLens() {
return true;
}
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
index 367cd15..21796c5 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
@@ -4,25 +4,26 @@
package com.android.tools.r8.optimize;
-import static com.android.tools.r8.graph.NestedGraphLens.mapVirtualInterfaceInvocationTypes;
+import static com.android.tools.r8.graph.lens.NestedGraphLens.mapVirtualInterfaceInvocationTypes;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldAccessInfo;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
-import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.Map;
-public class MemberRebindingLens extends NonIdentityGraphLens {
+public class MemberRebindingLens extends DefaultNonIdentityGraphLens {
private final AppView<AppInfoWithLiveness> appView;
private final Map<InvokeType, Map<DexMethod, DexMethod>> methodMaps;
@@ -53,55 +54,6 @@
}
@Override
- public DexType getOriginalType(DexType type) {
- return getPrevious().getOriginalType(type);
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return getPrevious().getOriginalTypes(type);
- }
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return getPrevious().getOriginalFieldSignature(field);
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
- if (this == codeLens) {
- return originalField;
- }
- return getPrevious().getRenamedFieldSignature(originalField);
- }
-
- @Override
- public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
- return this != applied
- ? getPrevious().getRenamedMethodSignature(originalMethod, applied)
- : originalMethod;
- }
-
- @Override
- public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens) {
- if (this == codeLens) {
- return getIdentityLens().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
- return getPrevious().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
-
- @Override
- public boolean isContextFreeForMethods() {
- return getPrevious().isContextFreeForMethods();
- }
-
- @Override
- protected DexType internalDescribeLookupClassType(DexType previous) {
- return previous;
- }
-
- @Override
protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
assert !previous.hasReadCastType();
assert !previous.hasReboundReference();
@@ -133,16 +85,6 @@
.build();
}
- @Override
- public DexMethod getPreviousMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public DexMethod getNextMethodSignature(DexMethod method) {
- return method;
- }
-
public FieldRebindingIdentityLens toRewrittenFieldRebindingLens(
AppView<? extends AppInfoWithClassHierarchy> appView,
GraphLens lens,
diff --git a/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java b/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java
index a3365ce..54d66e4 100644
--- a/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java
@@ -7,8 +7,10 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.NestedGraphLens;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.ir.code.InvokeType;
import com.google.common.collect.Sets;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
index 8dd8cb0..eff4f92 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
@@ -16,10 +16,10 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.MethodCollection;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.TreeFixerBase;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfoFixer;
import com.android.tools.r8.ir.optimize.info.MutableFieldOptimizationInfo;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
index 35b3a9c..42213aa 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
@@ -7,7 +7,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.NestedGraphLens;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
index cd962c3..acdb13b 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
@@ -11,11 +11,11 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldResolutionResult;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistryWithResult;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.conversion.PostMethodProcessor;
import com.android.tools.r8.ir.optimize.info.CallSiteOptimizationInfo;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorSyntheticEventConsumer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorSyntheticEventConsumer.java
index 397a23f..f20e6a8 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorSyntheticEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorSyntheticEventConsumer.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingArgumentPropagatorSyntheticEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingArgumentPropagatorSyntheticEventConsumer;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public interface ArgumentPropagatorSyntheticEventConsumer {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java
index 07ffe61..468b735 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java
@@ -8,9 +8,9 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.FieldResolutionResult;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfo;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.BasicBlock;
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java
index d47ecd6..69f9248 100644
--- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java
@@ -5,16 +5,13 @@
package com.android.tools.r8.optimize.bridgehoisting;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
-import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.collections.BidirectionalManyToOneMap;
import java.util.Set;
-class BridgeHoistingLens extends NonIdentityGraphLens {
+class BridgeHoistingLens extends DefaultNonIdentityGraphLens {
// Mapping from non-hoisted bridge methods to hoisted bridge methods.
private final BidirectionalManyToOneMap<DexMethod, DexMethod> bridgeToHoistedBridgeMap;
@@ -44,60 +41,7 @@
}
@Override
- public DexType getOriginalType(DexType type) {
- return getPrevious().getOriginalType(type);
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return getPrevious().getOriginalTypes(type);
- }
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return getPrevious().getOriginalFieldSignature(field);
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
- if (this == codeLens) {
- return originalField;
- }
- return getPrevious().getRenamedFieldSignature(originalField);
- }
-
- @Override
- public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens) {
- if (this == codeLens) {
- return getIdentityLens().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
- return getPrevious().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
-
- @Override
- public boolean isContextFreeForMethods() {
- return getPrevious().isContextFreeForMethods();
- }
-
- @Override
public boolean hasCodeRewritings() {
return getPrevious().hasCodeRewritings();
}
-
- @Override
- protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
- return previous;
- }
-
- @Override
- protected MethodLookupResult internalDescribeLookupMethod(
- MethodLookupResult previous, DexMethod context) {
- return previous;
- }
-
- @Override
- protected DexType internalDescribeLookupClassType(DexType previous) {
- return previous;
- }
}
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/DefaultOpenClosedInterfacesCollection.java b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/DefaultOpenClosedInterfacesCollection.java
index df264e4..6759bca 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/DefaultOpenClosedInterfacesCollection.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/DefaultOpenClosedInterfacesCollection.java
@@ -5,8 +5,8 @@
package com.android.tools.r8.optimize.interfaces.collection;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
/** Default oracle for that answers "maybe open" for each interface. */
public class DefaultOpenClosedInterfacesCollection extends OpenClosedInterfacesCollection {
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/NonEmptyOpenClosedInterfacesCollection.java b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/NonEmptyOpenClosedInterfacesCollection.java
index b3382e0..8553b40 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/NonEmptyOpenClosedInterfacesCollection.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/NonEmptyOpenClosedInterfacesCollection.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.SetUtils;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java
index 755c319..648c8a3 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.DynamicType;
import com.android.tools.r8.ir.analysis.type.TypeElement;
diff --git a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java
index 6f7f61f..5aedebc 100644
--- a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java
@@ -6,11 +6,11 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.graph.proto.ArgumentPermutation;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
@@ -22,7 +22,7 @@
import java.util.IdentityHashMap;
import java.util.Map;
-public class ProtoNormalizerGraphLens extends NonIdentityGraphLens {
+public class ProtoNormalizerGraphLens extends DefaultNonIdentityGraphLens {
private final BidirectionalOneToOneMap<DexMethod, DexMethod> newMethodSignatures;
private final Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges;
@@ -41,37 +41,6 @@
}
@Override
- public DexType getOriginalType(DexType type) {
- return getPrevious().getOriginalType(type);
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return getPrevious().getOriginalTypes(type);
- }
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return getPrevious().getOriginalFieldSignature(field);
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens applied) {
- if (this == applied) {
- return originalField;
- }
- return getPrevious().getRenamedFieldSignature(originalField);
- }
-
- @Override
- public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
- if (this == applied) {
- return originalMethod;
- }
- return getNextMethodSignature(getPrevious().getRenamedMethodSignature(originalMethod));
- }
-
- @Override
public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
DexMethod method, GraphLens codeLens) {
if (this == codeLens) {
@@ -88,16 +57,6 @@
}
@Override
- public boolean isContextFreeForMethods() {
- return getPrevious().isContextFreeForMethods();
- }
-
- @Override
- protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
- return previous;
- }
-
- @Override
protected MethodLookupResult internalDescribeLookupMethod(
MethodLookupResult previous, DexMethod context) {
DexMethod methodSignature = previous.getReference();
@@ -120,11 +79,6 @@
}
@Override
- protected DexType internalDescribeLookupClassType(DexType previous) {
- return previous;
- }
-
- @Override
public DexMethod getPreviousMethodSignature(DexMethod method) {
return newMethodSignatures.getRepresentativeKeyOrDefault(method, method);
}
diff --git a/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemovalLens.java b/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemovalLens.java
index 343cece..427b37e 100644
--- a/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemovalLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemovalLens.java
@@ -6,20 +6,19 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
+import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.InvokeType;
import com.google.common.collect.Sets;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Set;
-public class RedundantBridgeRemovalLens extends NonIdentityGraphLens {
+public class RedundantBridgeRemovalLens extends DefaultNonIdentityGraphLens {
private final Set<DexType> interfaces;
private final Map<DexMethod, DexMethod> methodMap;
@@ -31,26 +30,6 @@
this.methodMap = methodMap;
}
- // Fields.
-
- @Override
- public DexField getOriginalFieldSignature(DexField field) {
- return getPrevious().getOriginalFieldSignature(field);
- }
-
- @Override
- public DexField getRenamedFieldSignature(DexField originalField, GraphLens codeLens) {
- if (this == codeLens) {
- return originalField;
- }
- return getPrevious().getRenamedFieldSignature(originalField, codeLens);
- }
-
- @Override
- protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
- return previous;
- }
-
// Methods.
@Override
@@ -64,16 +43,6 @@
}
@Override
- public DexMethod getNextMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
- public DexMethod getPreviousMethodSignature(DexMethod method) {
- return method;
- }
-
- @Override
protected MethodLookupResult internalDescribeLookupMethod(
MethodLookupResult previous, DexMethod context) {
if (methodMap.containsKey(previous.getReference())) {
@@ -98,39 +67,6 @@
return previous;
}
- @Override
- public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
- DexMethod method, GraphLens codeLens) {
- if (this == codeLens) {
- return RewrittenPrototypeDescription.none();
- }
- return getPrevious().lookupPrototypeChangesForMethodDefinition(method, codeLens);
- }
-
- // Types.
-
- @Override
- public DexType getOriginalType(DexType type) {
- return getPrevious().getOriginalType(type);
- }
-
- @Override
- public Iterable<DexType> getOriginalTypes(DexType type) {
- return getPrevious().getOriginalTypes(type);
- }
-
- @Override
- protected DexType internalDescribeLookupClassType(DexType previous) {
- return previous;
- }
-
- // Misc.
-
- @Override
- public boolean isContextFreeForMethods() {
- return getPrevious().isContextFreeForMethods();
- }
-
public static class Builder {
private final Set<DexType> interfaces = Sets.newIdentityHashSet();
diff --git a/src/main/java/com/android/tools/r8/profile/AbstractProfileRule.java b/src/main/java/com/android/tools/r8/profile/AbstractProfileRule.java
index ad28bfd..6d72137 100644
--- a/src/main/java/com/android/tools/r8/profile/AbstractProfileRule.java
+++ b/src/main/java/com/android/tools/r8/profile/AbstractProfileRule.java
@@ -4,8 +4,8 @@
package com.android.tools.r8.profile;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileRule;
import com.android.tools.r8.profile.art.ArtProfileRule;
+import com.android.tools.r8.profile.startup.profile.StartupProfileRule;
public interface AbstractProfileRule {
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
index e42e8ba..1455800 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
@@ -15,8 +15,8 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.optimize.enums.EnumUnboxingLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.profile.AbstractProfile;
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
index a571922..e6dc68a 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
@@ -8,8 +8,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.InternalOptions;
diff --git a/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
index 744ea4d..2c63d2e 100644
--- a/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
public class EmptyArtProfileCollection extends ArtProfileCollection {
diff --git a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
index 0cb809e..d91ebae 100644
--- a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java
index 6207388..2425ef4 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java
@@ -9,22 +9,24 @@
import com.android.tools.r8.profile.AbstractProfileRule;
import com.android.tools.r8.profile.art.ArtProfile;
import com.android.tools.r8.profile.art.ArtProfileClassRule;
+import com.android.tools.r8.profile.art.ArtProfileClassRule.Builder;
import com.android.tools.r8.profile.art.ArtProfileMethodRule;
import com.android.tools.r8.profile.art.ArtProfileRule;
+import com.android.tools.r8.profile.rewriting.ProfileAdditions;
import java.util.Comparator;
public class ArtProfileAdditions
extends ProfileAdditions<
ArtProfileAdditions,
ArtProfileClassRule,
- ArtProfileClassRule.Builder,
+ Builder,
ArtProfileMethodRule,
ArtProfileMethodRule.Builder,
ArtProfileRule,
ArtProfile,
ArtProfile.Builder> {
- ArtProfileAdditions(ArtProfile profile) {
+ public ArtProfileAdditions(ArtProfile profile) {
super(profile);
}
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ConcreteProfileCollectionAdditions.java b/src/main/java/com/android/tools/r8/profile/rewriting/ConcreteProfileCollectionAdditions.java
similarity index 95%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ConcreteProfileCollectionAdditions.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ConcreteProfileCollectionAdditions.java
index 90cbd6b..cb799fd 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ConcreteProfileCollectionAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ConcreteProfileCollectionAdditions.java
@@ -2,10 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
-import com.android.tools.r8.experimental.startup.StartupProfile;
-import com.android.tools.r8.experimental.startup.rewriting.StartupProfileAdditions;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexMethod;
@@ -16,7 +14,10 @@
import com.android.tools.r8.profile.art.ArtProfile;
import com.android.tools.r8.profile.art.ArtProfileCollection;
import com.android.tools.r8.profile.art.NonEmptyArtProfileCollection;
-import com.android.tools.r8.profile.art.rewriting.ProfileAdditions.ProfileAdditionsBuilder;
+import com.android.tools.r8.profile.art.rewriting.ArtProfileAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileAdditions.ProfileAdditionsBuilder;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
+import com.android.tools.r8.profile.startup.rewriting.StartupProfileAdditions;
import com.android.tools.r8.utils.Box;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/NopProfileCollectionAdditions.java b/src/main/java/com/android/tools/r8/profile/rewriting/NopProfileCollectionAdditions.java
similarity index 89%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/NopProfileCollectionAdditions.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/NopProfileCollectionAdditions.java
index d27a083..fbbccd7 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/NopProfileCollectionAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/NopProfileCollectionAdditions.java
@@ -2,14 +2,14 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.profile.art.ArtProfileCollection;
-import com.android.tools.r8.profile.art.rewriting.ProfileAdditions.ProfileAdditionsBuilder;
+import com.android.tools.r8.profile.rewriting.ProfileAdditions.ProfileAdditionsBuilder;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import java.util.function.Consumer;
import java.util.function.Function;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileAdditions.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileAdditions.java
similarity index 99%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileAdditions.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileAdditions.java
index 3df9866..869f88b 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileAdditions.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import static com.android.tools.r8.utils.MapUtils.ignoreKey;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileCollectionAdditions.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileCollectionAdditions.java
similarity index 91%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileCollectionAdditions.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileCollectionAdditions.java
index 93be945..cd9de9b 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileCollectionAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileCollectionAdditions.java
@@ -2,14 +2,14 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.profile.art.ArtProfileCollection;
-import com.android.tools.r8.profile.art.rewriting.ProfileAdditions.ProfileAdditionsBuilder;
+import com.android.tools.r8.profile.rewriting.ProfileAdditions.ProfileAdditionsBuilder;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import java.util.function.Consumer;
import java.util.function.Function;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
index 4f7f76c..c5bbcf7 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingArgumentPropagatorSyntheticEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingArgumentPropagatorSyntheticEventConsumer.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingArgumentPropagatorSyntheticEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingArgumentPropagatorSyntheticEventConsumer.java
index dece00f..156f392 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingArgumentPropagatorSyntheticEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingArgumentPropagatorSyntheticEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
similarity index 95%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
index 2d0f51c..c16dd21 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
@@ -2,9 +2,9 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
-import static com.android.tools.r8.profile.art.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
+import static com.android.tools.r8.profile.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
similarity index 98%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
index 60a9e96..a9d901a 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -2,9 +2,9 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
-import static com.android.tools.r8.profile.art.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
+import static com.android.tools.r8.profile.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMethod;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
similarity index 98%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
index 5402a78..0d5c835 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer.java
similarity index 96%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer.java
index 32c6d73..ef07715 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCovariantReturnTypeAnnotationTransformerEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CovariantReturnTypeAnnotationTransformerEventConsumer;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingMemberRebindingEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
index 1c9b0a5..c7aa6b9 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingMethodProcessorEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMethodProcessorEventConsumer.java
similarity index 98%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingMethodProcessorEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMethodProcessorEventConsumer.java
index c5193da..5df02c0 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingMethodProcessorEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMethodProcessorEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
similarity index 98%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
index 28552b5..65cce7f 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingOutlineOptimizationEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingOutlineOptimizationEventConsumer.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingOutlineOptimizationEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingOutlineOptimizationEventConsumer.java
index 4343c25..c64cea3 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingOutlineOptimizationEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingOutlineOptimizationEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingRootSetBuilderEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingRootSetBuilderEventConsumer.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingRootSetBuilderEventConsumer.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingRootSetBuilderEventConsumer.java
index 9b9d6a5..2a10ce0 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingRootSetBuilderEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingRootSetBuilderEventConsumer.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.shaking.RootSetBuilderEventConsumer;
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
similarity index 95%
rename from src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
rename to src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
index 8792769..c9ff809 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.rewriting;
+package com.android.tools.r8.profile.rewriting;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java b/src/main/java/com/android/tools/r8/profile/startup/StartupCompleteness.java
similarity index 96%
rename from src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
rename to src/main/java/com/android/tools/r8/profile/startup/StartupCompleteness.java
index f45e4c0..decafac 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/StartupCompleteness.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup;
+package com.android.tools.r8.profile.startup;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -11,6 +11,7 @@
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.ThrowNullCode;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.startup.diagnostic.MissingStartupProfileItemsDiagnostic;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.Sets;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java b/src/main/java/com/android/tools/r8/profile/startup/StartupOptions.java
similarity index 98%
rename from src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
rename to src/main/java/com/android/tools/r8/profile/startup/StartupOptions.java
index 531c50e..4180266 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/StartupOptions.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup;
+package com.android.tools.r8.profile.startup;
import static com.android.tools.r8.utils.SystemPropertyUtils.parseSystemPropertyForDevelopmentOrDefault;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java b/src/main/java/com/android/tools/r8/profile/startup/StartupProfileProviderUtils.java
similarity index 93%
rename from src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
rename to src/main/java/com/android/tools/r8/profile/startup/StartupProfileProviderUtils.java
index ff5b0e9..3b12dfd 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/StartupProfileProviderUtils.java
@@ -2,14 +2,15 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup;
+package com.android.tools.r8.profile.startup;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileRule;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.profile.art.HumanReadableArtProfileParserBuilder;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
+import com.android.tools.r8.profile.startup.profile.StartupProfileRule;
import com.android.tools.r8.startup.StartupProfileBuilder;
import com.android.tools.r8.startup.StartupProfileProvider;
import com.android.tools.r8.startup.diagnostic.MissingStartupProfileItemsDiagnostic;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentation.java b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
similarity index 99%
rename from src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentation.java
rename to src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
index 6e9c218..a64d1c7 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentation.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.instrumentation;
+package com.android.tools.r8.profile.startup.instrumentation;
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
import static com.android.tools.r8.utils.PredicateUtils.not;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentationOptions.java b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentationOptions.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentationOptions.java
rename to src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentationOptions.java
index 0d47783..ad94406 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentationOptions.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentationOptions.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.instrumentation;
+package com.android.tools.r8.profile.startup.instrumentation;
import static com.android.tools.r8.utils.SystemPropertyUtils.getSystemPropertyForDevelopment;
import static com.android.tools.r8.utils.SystemPropertyUtils.parseSystemPropertyForDevelopmentOrDefault;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentationReferences.java b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentationReferences.java
similarity index 93%
rename from src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentationReferences.java
rename to src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentationReferences.java
index 92d3e9c..78d55f0 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/instrumentation/StartupInstrumentationReferences.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentationReferences.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.instrumentation;
+package com.android.tools.r8.profile.startup.instrumentation;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupProfile.java b/src/main/java/com/android/tools/r8/profile/startup/profile/EmptyStartupProfile.java
similarity index 85%
rename from src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupProfile.java
rename to src/main/java/com/android/tools/r8/profile/startup/profile/EmptyStartupProfile.java
index f629224..e585fe6 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/EmptyStartupProfile.java
@@ -2,16 +2,13 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup;
+package com.android.tools.r8.profile.startup.profile;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileClassRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileMethodRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileRule;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.utils.ThrowingConsumer;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/NonEmptyStartupProfile.java b/src/main/java/com/android/tools/r8/profile/startup/profile/NonEmptyStartupProfile.java
similarity index 93%
rename from src/main/java/com/android/tools/r8/experimental/startup/profile/NonEmptyStartupProfile.java
rename to src/main/java/com/android/tools/r8/profile/startup/profile/NonEmptyStartupProfile.java
index 4cec4e9..8f047a4 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/NonEmptyStartupProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/NonEmptyStartupProfile.java
@@ -2,9 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.profile;
+package com.android.tools.r8.profile.startup.profile;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
@@ -12,25 +11,28 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.synthesis.SyntheticItems;
+import com.android.tools.r8.utils.MapUtils;
import com.android.tools.r8.utils.SetUtils;
import com.android.tools.r8.utils.ThrowingConsumer;
import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class NonEmptyStartupProfile extends StartupProfile {
private final Set<DexType> startupClasses;
- private final LinkedHashMap<DexReference, StartupProfileRule> startupRules;
+ private final Map<DexReference, StartupProfileRule> startupRules;
public NonEmptyStartupProfile(LinkedHashMap<DexReference, StartupProfileRule> startupRules) {
assert !startupRules.isEmpty();
this.startupClasses =
- SetUtils.mapIdentityHashSet(startupRules.keySet(), DexReference::getContextType);
- this.startupRules = startupRules;
+ SetUtils.unmodifiableForTesting(
+ SetUtils.mapIdentityHashSet(startupRules.keySet(), DexReference::getContextType));
+ this.startupRules = MapUtils.unmodifiableForTesting(startupRules);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfile.java b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfile.java
similarity index 95%
rename from src/main/java/com/android/tools/r8/experimental/startup/StartupProfile.java
rename to src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfile.java
index 747097f..7a517de 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfile.java
@@ -2,20 +2,16 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup;
+package com.android.tools.r8.profile.startup.profile;
import com.android.tools.r8.TextInputStream;
-import com.android.tools.r8.experimental.startup.profile.NonEmptyStartupProfile;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileClassRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileMethodRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileRule;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.profile.AbstractProfile;
import com.android.tools.r8.profile.AbstractProfileRule;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileClassRule.java b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileClassRule.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileClassRule.java
rename to src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileClassRule.java
index 8da68cf..83aa6c8 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileClassRule.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileClassRule.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.profile;
+package com.android.tools.r8.profile.startup.profile;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileMethodRule.java b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileMethodRule.java
rename to src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
index 54a7b17..e16699f 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileMethodRule.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.profile;
+package com.android.tools.r8.profile.startup.profile;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileRule.java b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileRule.java
similarity index 95%
rename from src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileRule.java
rename to src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileRule.java
index 64dbb2c..369fea5 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfileRule.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileRule.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.profile;
+package com.android.tools.r8.profile.startup.profile;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.profile.AbstractProfileRule;
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/rewriting/StartupProfileAdditions.java b/src/main/java/com/android/tools/r8/profile/startup/rewriting/StartupProfileAdditions.java
similarity index 78%
rename from src/main/java/com/android/tools/r8/experimental/startup/rewriting/StartupProfileAdditions.java
rename to src/main/java/com/android/tools/r8/profile/startup/rewriting/StartupProfileAdditions.java
index 2522234..559be04 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/rewriting/StartupProfileAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/rewriting/StartupProfileAdditions.java
@@ -2,16 +2,16 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.experimental.startup.rewriting;
+package com.android.tools.r8.profile.startup.rewriting;
-import com.android.tools.r8.experimental.startup.StartupProfile;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileClassRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileMethodRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileRule;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.profile.AbstractProfileRule;
-import com.android.tools.r8.profile.art.rewriting.ProfileAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileAdditions;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
+import com.android.tools.r8.profile.startup.profile.StartupProfileClassRule;
+import com.android.tools.r8.profile.startup.profile.StartupProfileMethodRule;
+import com.android.tools.r8.profile.startup.profile.StartupProfileRule;
import java.util.Comparator;
public class StartupProfileAdditions
diff --git a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
index 3bebc24..00e55a7 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -17,11 +17,11 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DirectMappedDexApplication;
import com.android.tools.r8.graph.InnerClassAttribute;
-import com.android.tools.r8.graph.NestedGraphLens;
import com.android.tools.r8.graph.ProgramPackage;
import com.android.tools.r8.graph.ProgramPackageCollection;
import com.android.tools.r8.graph.SortedProgramPackageCollection;
import com.android.tools.r8.graph.TreeFixerBase;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.naming.Minifier.MinificationPackageNamingStrategy;
import com.android.tools.r8.repackaging.RepackagingLens.Builder;
import com.android.tools.r8.shaking.AnnotationFixer;
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java
index d119f1c..3bf5519 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java
@@ -13,8 +13,8 @@
import com.android.tools.r8.graph.DexEncodedAnnotation;
import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexValue;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ParameterAnnotationsList;
+import com.android.tools.r8.graph.lens.GraphLens;
public class RepackagingAnnotationTracer {
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
index 8b4ad76..7a462ed 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.NestedGraphLens;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.collections.BidirectionalOneToOneHashMap;
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
index 16bef88..49eb0a2 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
@@ -18,8 +18,6 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.EnclosingMethodAttribute;
import com.android.tools.r8.graph.FieldResolutionResult;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.graph.MemberResolutionResult;
import com.android.tools.r8.graph.MethodResolutionResult;
@@ -29,6 +27,8 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.SuccessfulMemberResolutionResult;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
import java.util.List;
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java b/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java
index fedb75d..c1a8677 100644
--- a/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java
+++ b/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java
@@ -20,7 +20,7 @@
import com.android.tools.r8.graph.DexValue.DexValueArray;
import com.android.tools.r8.graph.DexValue.DexValueEnum;
import com.android.tools.r8.graph.DexValue.DexValueType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.ArrayUtils;
public class AnnotationFixer {
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
index 9321484..ab4015d 100644
--- a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
+++ b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
@@ -16,10 +16,10 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.EnclosingMethodAttribute;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMember;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.kotlin.KotlinMemberLevelInfo;
import com.android.tools.r8.kotlin.KotlinPropertyInfo;
import com.android.tools.r8.shaking.Enqueuer.Mode;
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index bd42c6a..39d8035 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -32,8 +32,6 @@
import com.android.tools.r8.graph.FieldAccessInfoCollection;
import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl;
import com.android.tools.r8.graph.FieldResolutionResult;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.InstantiatedSubTypeInfo;
import com.android.tools.r8.graph.LookupMethodTarget;
import com.android.tools.r8.graph.LookupResult.LookupResultSuccess;
@@ -47,6 +45,8 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.SubtypingInfo;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.DynamicType;
import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
diff --git a/src/main/java/com/android/tools/r8/shaking/AssumeInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/AssumeInfoCollection.java
index f9cda2f..bc3f728 100644
--- a/src/main/java/com/android/tools/r8/shaking/AssumeInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/AssumeInfoCollection.java
@@ -9,8 +9,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMember;
import com.android.tools.r8.graph.DexMember;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.DynamicType;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.optimize.membervaluepropagation.assume.AssumeInfo;
diff --git a/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java b/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java
index 813328d..848ea2a 100644
--- a/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java
@@ -14,7 +14,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldAccessFlags;
-import com.android.tools.r8.graph.InitClassLens;
+import com.android.tools.r8.graph.lens.InitClassLens;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.Visibility;
import java.util.concurrent.ExecutionException;
diff --git a/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java
index 4c36623..a1129346d 100644
--- a/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java
@@ -13,9 +13,9 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.EnqueuerEvent.ClassEnqueuerEvent;
import com.android.tools.r8.shaking.EnqueuerEvent.UnconditionalKeepInfoEvent;
import com.android.tools.r8.shaking.KeepInfo.Joiner;
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index f45bf9b..ca51281 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -122,7 +122,7 @@
import com.android.tools.r8.naming.identifiernamestring.IdentifierNameStringLookupResult;
import com.android.tools.r8.naming.identifiernamestring.IdentifierNameStringTypeLookupResult;
import com.android.tools.r8.position.Position;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.shaking.AnnotationMatchResult.MatchedAnnotation;
import com.android.tools.r8.shaking.DelayedRootSetActionItem.InterfaceMethodSyntheticBridgeAction;
import com.android.tools.r8.shaking.EnqueuerEvent.ClassEnqueuerEvent;
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java
index 93d5f60..8aea7e4 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
public abstract class EnqueuerEvent {
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerFactory.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerFactory.java
index e09b9be..e5f90c2 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerFactory.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerFactory.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.SubtypingInfo;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.shaking.Enqueuer.Mode;
import java.util.Set;
import java.util.concurrent.ExecutorService;
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
index f13a407..9491483 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
@@ -20,12 +20,12 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMember;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.shaking.KeepFieldInfo.Joiner;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.MapUtils;
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java b/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
index 14d0dba..69bc36a 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
@@ -13,10 +13,10 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.utils.ConsumerUtils;
import com.google.common.collect.Sets;
diff --git a/src/main/java/com/android/tools/r8/shaking/MinimumKeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/MinimumKeepInfoCollection.java
index 5a07f2a..f0ca7f9 100644
--- a/src/main/java/com/android/tools/r8/shaking/MinimumKeepInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/MinimumKeepInfoCollection.java
@@ -13,11 +13,11 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.KeepInfo.Joiner;
import com.android.tools.r8.utils.MapUtils;
import java.util.Collections;
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardCompatibilityActions.java b/src/main/java/com/android/tools/r8/shaking/ProguardCompatibilityActions.java
index eed4fec..b1ec100 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardCompatibilityActions.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardCompatibilityActions.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.google.common.collect.Sets;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilderEventConsumer.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilderEventConsumer.java
index 4102d80..b59961e 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilderEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilderEventConsumer.java
@@ -6,8 +6,8 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodDesugaringBaseEventConsumer;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
-import com.android.tools.r8.profile.art.rewriting.ProfileRewritingRootSetBuilderEventConsumer;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileRewritingRootSetBuilderEventConsumer;
public interface RootSetBuilderEventConsumer extends InterfaceMethodDesugaringBaseEventConsumer {
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index bbb8726..d60e464 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -38,7 +38,6 @@
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DirectMappedDexApplication;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramField;
@@ -46,13 +45,14 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.SubtypingInfo;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.proto.GeneratedMessageLiteBuilderShrinker;
import com.android.tools.r8.ir.analysis.type.DynamicType;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.ir.optimize.membervaluepropagation.assume.AssumeInfo;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.repackaging.RepackagingUtils;
import com.android.tools.r8.shaking.AnnotationMatchResult.AnnotationsIgnoredMatchResult;
import com.android.tools.r8.shaking.AnnotationMatchResult.ConcreteAnnotationMatchResult;
diff --git a/src/main/java/com/android/tools/r8/shaking/RuntimeTypeCheckInfo.java b/src/main/java/com/android/tools/r8/shaking/RuntimeTypeCheckInfo.java
index 67f1c75..cb0f347 100644
--- a/src/main/java/com/android/tools/r8/shaking/RuntimeTypeCheckInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/RuntimeTypeCheckInfo.java
@@ -8,11 +8,12 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.analysis.EnqueuerCheckCastAnalysis;
import com.android.tools.r8.graph.analysis.EnqueuerExceptionGuardAnalysis;
import com.android.tools.r8.graph.analysis.EnqueuerInstanceOfAnalysis;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.utils.SetUtils;
import com.google.common.collect.Sets;
import java.util.Set;
@@ -106,7 +107,7 @@
return isInstanceOfType(clazz) || isCheckCastType(clazz) || isExceptionGuardType(clazz);
}
- public RuntimeTypeCheckInfo rewriteWithLens(GraphLens.NonIdentityGraphLens graphLens) {
+ public RuntimeTypeCheckInfo rewriteWithLens(NonIdentityGraphLens graphLens) {
return new RuntimeTypeCheckInfo(
SetUtils.mapIdentityHashSet(instanceOfTypes, graphLens::lookupType),
SetUtils.mapIdentityHashSet(checkCastTypes, graphLens::lookupType),
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 401d9af..6124e82 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.shaking;
+import static com.google.common.base.Predicates.alwaysFalse;
+
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DefaultInstanceInitializerCode;
import com.android.tools.r8.graph.DexClass;
@@ -21,15 +23,18 @@
import com.android.tools.r8.graph.NestMemberClassAttribute;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.RecordComponentInfo;
import com.android.tools.r8.ir.optimize.info.MutableFieldOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.MutableMethodOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback.OptimizationInfoFixer;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
+import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.CollectionUtils;
import com.android.tools.r8.utils.ExceptionUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.IterableUtils;
+import com.android.tools.r8.utils.PredicateUtils;
import com.android.tools.r8.utils.Timing;
import com.google.common.collect.Sets;
import java.util.ArrayList;
@@ -219,6 +224,13 @@
clazz.removeInnerClasses(this::isAttributeReferencingMissingOrPrunedType);
clazz.removeEnclosingMethodAttribute(this::isAttributeReferencingPrunedItem);
rewriteNestAttributes(clazz, this::isTypeLive, appView::definitionFor);
+ // TODO(b/274888318): Check this.
+ if (reachableInstanceFields != null) {
+ if (!clazz.getRecordComponents().isEmpty()) {
+ clazz.removeRecordComponents(
+ PredicateUtils.not(isReachableInstanceField(reachableInstanceFields)));
+ }
+ }
unusedItemsPrinter.visited();
assert verifyNoDeadFields(clazz);
}
@@ -238,6 +250,24 @@
}
}
+ public static Predicate<RecordComponentInfo> isReachableInstanceField(
+ DexEncodedField[] reachableInstanceFields) {
+ final int ARRAY_LOOKUP_THRESHOLD = 10;
+ if (reachableInstanceFields.length == 0) {
+ return alwaysFalse();
+ } else if (reachableInstanceFields.length < ARRAY_LOOKUP_THRESHOLD) {
+ return info ->
+ ArrayUtils.contains(
+ reachableInstanceFields, DexEncodedField::getReference, info.getField());
+ } else {
+ Set<DexField> reachableInstanceFieldSet = Sets.newIdentityHashSet();
+ for (DexEncodedField reachableInstanceField : reachableInstanceFields) {
+ reachableInstanceFieldSet.add(reachableInstanceField.getReference());
+ }
+ return info -> reachableInstanceFieldSet.contains(info.getField());
+ }
+ }
+
private boolean isTypeMissing(DexType type) {
return appView.appInfo().getMissingClasses().contains(type);
}
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index c0e541b..91c86e3 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -48,9 +48,6 @@
import com.android.tools.r8.graph.GenericSignatureContextBuilder.TypeParameterContext;
import com.android.tools.r8.graph.GenericSignatureCorrectnessHelper;
import com.android.tools.r8.graph.GenericSignaturePartialTypeArgumentApplier;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.LookupResult.LookupResultSuccess;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.MethodResolutionResult;
@@ -63,6 +60,10 @@
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.graph.UseRegistryWithResult;
import com.android.tools.r8.graph.classmerging.VerticallyMergedClasses;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.InvokeType;
import com.android.tools.r8.ir.code.Position.SyntheticPosition;
@@ -73,7 +74,7 @@
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.ir.synthetic.AbstractSynthesizedCode;
import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.utils.Box;
import com.android.tools.r8.utils.CollectionUtils;
import com.android.tools.r8.utils.FieldSignatureEquivalence;
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
index 259c35a..0b4a990 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
@@ -11,8 +11,9 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.NestedGraphLens;
import com.android.tools.r8.graph.classmerging.VerticallyMergedClasses;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
import com.android.tools.r8.ir.code.InvokeType;
diff --git a/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java b/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java
index 0c33a74..144e210 100644
--- a/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java
@@ -6,13 +6,13 @@
import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.Keep;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileClassRule;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileMethodRule;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
+import com.android.tools.r8.profile.startup.profile.StartupProfileClassRule;
+import com.android.tools.r8.profile.startup.profile.StartupProfileMethodRule;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Iterator;
diff --git a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java
index 1c5dd2b..d63bcf5 100644
--- a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java
+++ b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java
@@ -48,6 +48,7 @@
NestHostClassAttribute.none(),
Collections.emptyList(),
Collections.emptyList(),
+ Collections.emptyList(),
EnclosingMethodAttribute.none(),
Collections.emptyList(),
ClassSignature.noSignature(),
diff --git a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java
index e971964..e9d64ab 100644
--- a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java
+++ b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java
@@ -70,6 +70,7 @@
NestHostClassAttribute.none(),
Collections.emptyList(),
Collections.emptyList(),
+ Collections.emptyList(),
EnclosingMethodAttribute.none(),
Collections.emptyList(),
ClassSignature.noSignature(),
diff --git a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
index 02979c5..c4152fa 100644
--- a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
+++ b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
@@ -7,8 +7,8 @@
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.synthesis.SyntheticItems.ContextsForGlobalSynthetics;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.IterableUtils;
diff --git a/src/main/java/com/android/tools/r8/synthesis/Rewritable.java b/src/main/java/com/android/tools/r8/synthesis/Rewritable.java
index 408b3a3..f48e058 100644
--- a/src/main/java/com/android/tools/r8/synthesis/Rewritable.java
+++ b/src/main/java/com/android/tools/r8/synthesis/Rewritable.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.synthesis;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
public interface Rewritable<R extends Rewritable<R>> {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
index e92442b..21fd289 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
@@ -12,8 +12,8 @@
import com.android.tools.r8.graph.ClasspathOrLibraryClass;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.ProgramDefinition;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.origin.GlobalSyntheticOrigin;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.MainDexInfo;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
index e9951c3..da83f1e 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
@@ -22,6 +22,7 @@
import com.android.tools.r8.graph.NestHostClassAttribute;
import com.android.tools.r8.graph.NestMemberClassAttribute;
import com.android.tools.r8.graph.PermittedSubclassAttribute;
+import com.android.tools.r8.graph.RecordComponentInfo;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import java.util.ArrayList;
@@ -173,6 +174,7 @@
NestHostClassAttribute nestHost = null;
List<NestMemberClassAttribute> nestMembers = Collections.emptyList();
List<PermittedSubclassAttribute> permittedSubclasses = Collections.emptyList();
+ List<RecordComponentInfo> recordComponents = Collections.emptyList();
EnclosingMethodAttribute enclosingMembers = null;
List<InnerClassAttribute> innerClasses = Collections.emptyList();
for (SyntheticMethodBuilder builder : methods) {
@@ -201,6 +203,7 @@
nestHost,
nestMembers,
permittedSubclasses,
+ recordComponents,
enclosingMembers,
innerClasses,
signature,
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java
index 72beb13..cd6fcbf 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClasspathClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import java.util.function.Function;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
index 1a75811..1ad0796 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.structural.HasherWrapper;
import com.android.tools.r8.utils.structural.RepresentativeMap;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index efe5d62..68c2918 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -19,11 +19,11 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
-import com.android.tools.r8.graph.NestedGraphLens;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.TreeFixerBase;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.ir.code.NumberGenerator;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.KeepInfoCollection;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 066c144..24dab29 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -11,7 +11,6 @@
import com.android.tools.r8.contexts.CompilationContext.UniqueContext;
import com.android.tools.r8.errors.MissingGlobalSyntheticsConsumerDiagnostic;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.experimental.startup.StartupProfile;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -31,15 +30,16 @@
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.MethodCollection;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.ProgramOrClasspathDefinition;
import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.synthesis.SyntheticFinalization.Result;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java
index d1347f3..8853f7c8 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java
@@ -7,8 +7,8 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import java.util.function.Consumer;
import java.util.function.Function;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java
index d5973f6..4845892 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import java.util.function.Consumer;
import java.util.function.Function;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticReference.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticReference.java
index 9824ebc..801204a 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticReference.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticReference.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import java.util.function.Function;
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index 8715d7d..b1d434a 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -25,14 +25,14 @@
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.DexValue.DexValueArray;
import com.android.tools.r8.graph.FieldResolutionResult;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.FieldLookupResult;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
import com.android.tools.r8.graph.MethodResolutionResult;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.graph.lens.FieldLookupResult;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index ee770f8..7135faa 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -34,8 +34,6 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.experimental.startup.StartupProfile;
-import com.android.tools.r8.experimental.startup.StartupProfileProviderUtils;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
import com.android.tools.r8.features.FeatureSplitConfiguration;
import com.android.tools.r8.graph.DexType;
@@ -44,6 +42,8 @@
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.profile.art.ArtProfileProvider;
import com.android.tools.r8.profile.art.ArtProfileProviderUtils;
+import com.android.tools.r8.profile.startup.StartupProfileProviderUtils;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
import com.android.tools.r8.shaking.FilteredClassPath;
import com.android.tools.r8.startup.StartupProfileProvider;
import com.android.tools.r8.synthesis.SyntheticItems;
diff --git a/src/main/java/com/android/tools/r8/utils/ArrayUtils.java b/src/main/java/com/android/tools/r8/utils/ArrayUtils.java
index e1741af..b8d37cb 100644
--- a/src/main/java/com/android/tools/r8/utils/ArrayUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ArrayUtils.java
@@ -144,6 +144,16 @@
return false;
}
+ public static <T, U> boolean contains(
+ T[] elements, Function<T, U> elementMap, U mappedElementToLookFor) {
+ for (T element : elements) {
+ if (elementMap.apply(element).equals(mappedElementToLookFor)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public static int[] fromPredicate(IntPredicate predicate, int size) {
int[] result = new int[size];
for (int i = 0; i < size; i++) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 8ce6323..1a27736 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -40,8 +40,6 @@
import com.android.tools.r8.errors.MissingNestHostNestDesugarDiagnostic;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.experimental.graphinfo.GraphConsumer;
-import com.android.tools.r8.experimental.startup.StartupOptions;
-import com.android.tools.r8.experimental.startup.instrumentation.StartupInstrumentationOptions;
import com.android.tools.r8.features.FeatureSplitConfiguration;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
@@ -80,6 +78,8 @@
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.profile.art.ArtProfileOptions;
+import com.android.tools.r8.profile.startup.StartupOptions;
+import com.android.tools.r8.profile.startup.instrumentation.StartupInstrumentationOptions;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
@@ -449,6 +449,8 @@
// Flag to allow record annotations in DEX. See b/231930852 for context.
public boolean emitRecordAnnotationsInDex =
System.getProperty("com.android.tools.r8.emitRecordAnnotationsInDex") != null;
+ public boolean emitRecordAnnotationsExInDex =
+ System.getProperty("com.android.tools.r8.emitRecordAnnotationsExInDex") != null;
// Flag to allow nest annotations in DEX. See b/231930852 for context.
public boolean emitNestAnnotationsInDex =
@@ -2144,6 +2146,7 @@
public boolean enableSwitchToIfRewriting = true;
public boolean enableEnumUnboxingDebugLogs =
System.getProperty("com.android.tools.r8.enableEnumUnboxingDebugLogs") != null;
+ public boolean enableEnumWithSubtypesUnboxing = false;
public boolean forceRedundantConstNumberRemoval = false;
public boolean enableExperimentalDesugaredLibraryKeepRuleGenerator = false;
public boolean invertConditionals = false;
diff --git a/src/main/java/com/android/tools/r8/utils/LensUtils.java b/src/main/java/com/android/tools/r8/utils/LensUtils.java
index 2c67ac3..1b88985 100644
--- a/src/main/java/com/android/tools/r8/utils/LensUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/LensUtils.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.google.common.collect.Sets;
import java.util.Set;
import java.util.function.Consumer;
diff --git a/src/main/java/com/android/tools/r8/utils/MapUtils.java b/src/main/java/com/android/tools/r8/utils/MapUtils.java
index e0a915f..7c603b2 100644
--- a/src/main/java/com/android/tools/r8/utils/MapUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/MapUtils.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.utils.StringUtils.BraceType;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMaps;
+import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -121,4 +122,8 @@
}
return true;
}
+
+ public static <K, V> Map<K, V> unmodifiableForTesting(Map<K, V> map) {
+ return InternalOptions.assertionsEnabled() ? Collections.unmodifiableMap(map) : map;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/utils/SemanticVersion.java b/src/main/java/com/android/tools/r8/utils/SemanticVersion.java
index 0bd7b67..e71312c 100644
--- a/src/main/java/com/android/tools/r8/utils/SemanticVersion.java
+++ b/src/main/java/com/android/tools/r8/utils/SemanticVersion.java
@@ -85,14 +85,18 @@
return patch;
}
- public boolean isNewerOrEqual(SemanticVersion other) {
+ public boolean isNewer(SemanticVersion other) {
if (major != other.major) {
return major > other.major;
}
if (minor != other.minor) {
return minor > other.minor;
}
- return patch >= other.patch;
+ return patch > other.patch;
+ }
+
+ public boolean isNewerOrEqual(SemanticVersion other) {
+ return isNewer(other) || equals(other);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/utils/SetUtils.java b/src/main/java/com/android/tools/r8/utils/SetUtils.java
index 834a3df..a0ecdfc 100644
--- a/src/main/java/com/android/tools/r8/utils/SetUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/SetUtils.java
@@ -131,4 +131,8 @@
union.addAll(other);
return union;
}
+
+ public static <K> Set<K> unmodifiableForTesting(Set<K> map) {
+ return InternalOptions.assertionsEnabled() ? Collections.unmodifiableSet(map) : map;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LongLivedClassSetBuilder.java b/src/main/java/com/android/tools/r8/utils/collections/LongLivedClassSetBuilder.java
index fe3361e..44fe24d 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/LongLivedClassSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/LongLivedClassSetBuilder.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.SetUtils;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LongLivedCollectionBuilder.java b/src/main/java/com/android/tools/r8/utils/collections/LongLivedCollectionBuilder.java
index 6c7fdc2..b40d74b 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/LongLivedCollectionBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/LongLivedCollectionBuilder.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.utils.collections;
-import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
import java.util.function.IntFunction;
public abstract class LongLivedCollectionBuilder<BuilderCollection, ResultCollection> {
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMapBuilder.java b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMapBuilder.java
index 1591350..a871a59 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMapBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMapBuilder.java
@@ -10,8 +10,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.IdentityHashMap;
import java.util.Map;
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java
index 735146a..5bc7e56 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java
@@ -10,8 +10,8 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.DeterminismChecker.LineCallback;
import com.android.tools.r8.utils.SetUtils;
diff --git a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java
index 81bb460..57ad688 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java
@@ -8,8 +8,8 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.ForEachable;
import com.google.common.collect.ImmutableMap;
import java.util.IdentityHashMap;
diff --git a/src/main/java/com/android/tools/r8/utils/collections/SortedProgramMethodSet.java b/src/main/java/com/android/tools/r8/utils/collections/SortedProgramMethodSet.java
index d625aae..3a17dc5 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/SortedProgramMethodSet.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/SortedProgramMethodSet.java
@@ -7,8 +7,8 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.ComparatorUtils;
import com.android.tools.r8.utils.ForEachable;
import com.android.tools.r8.utils.ForEachableUtils;
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/EmptyInterfaceTypeToClassTypeLensCodeRewriterHelper.java b/src/main/java/com/android/tools/r8/verticalclassmerging/EmptyInterfaceTypeToClassTypeLensCodeRewriterHelper.java
index dce166b..b4c0163 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/EmptyInterfaceTypeToClassTypeLensCodeRewriterHelper.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/EmptyInterfaceTypeToClassTypeLensCodeRewriterHelper.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.verticalclassmerging;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.BasicBlockIterator;
import com.android.tools.r8.ir.code.FieldPut;
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelper.java b/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelper.java
index 15efa1a..d365ddd 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelper.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelper.java
@@ -6,9 +6,9 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
-import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
+import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.BasicBlockIterator;
import com.android.tools.r8.ir.code.FieldPut;
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java b/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java
index 387788a..3087061 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
+import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.BasicBlockIterator;
diff --git a/src/test/examplesJava17/records/RecordWithAnnotations.java b/src/test/examplesJava17/records/RecordWithAnnotations.java
new file mode 100644
index 0000000..d1648b6
--- /dev/null
+++ b/src/test/examplesJava17/records/RecordWithAnnotations.java
@@ -0,0 +1,73 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package records;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Field;
+import java.lang.reflect.RecordComponent;
+
+public class RecordWithAnnotations {
+
+ @Target({ElementType.FIELD, ElementType.RECORD_COMPONENT})
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface Annotation {
+ String value();
+ }
+
+ @Target(ElementType.FIELD)
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface AnnotationFieldOnly {
+ String value();
+ }
+
+ @Target(ElementType.RECORD_COMPONENT)
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface AnnotationRecordComponentOnly {
+ String value();
+ }
+
+ record Person(
+ @Annotation("a") @AnnotationFieldOnly("b") @AnnotationRecordComponentOnly("c") String name,
+ @Annotation("x") @AnnotationFieldOnly("y") @AnnotationRecordComponentOnly("z") int age) {}
+
+ public static void main(String[] args) {
+ Person janeDoe = new Person("Jane Doe", 42);
+ System.out.println(janeDoe.name);
+ System.out.println(janeDoe.age);
+ System.out.println(janeDoe.name());
+ System.out.println(janeDoe.age());
+ try {
+ Class.class.getDeclaredMethod("isRecord");
+ } catch (NoSuchMethodException e) {
+ System.out.println("Class.isRecord not present");
+ return;
+ }
+ System.out.println(Person.class.isRecord());
+ if (Person.class.isRecord()) {
+ System.out.println(Person.class.getRecordComponents().length);
+ for (int i = 0; i < Person.class.getRecordComponents().length; i++) {
+ RecordComponent c = Person.class.getRecordComponents()[i];
+ System.out.println(c.getName());
+ System.out.println(c.getType().getName());
+ System.out.println(c.getGenericSignature() == null);
+ System.out.println(c.getAnnotations().length);
+ for (int j = 0; j < c.getAnnotations().length; j++) {
+ System.out.println(c.getAnnotations()[j]);
+ }
+ }
+ System.out.println(Person.class.getDeclaredFields().length);
+ for (int i = 0; i < Person.class.getDeclaredFields().length; i++) {
+ Field f = Person.class.getDeclaredFields()[i];
+ System.out.println(f.getDeclaredAnnotations().length);
+ for (int j = 0; j < f.getDeclaredAnnotations().length; j++) {
+ System.out.println(f.getAnnotations()[j]);
+ }
+ }
+ }
+ }
+}
diff --git a/src/test/examplesJava17/records/RecordWithSignature.java b/src/test/examplesJava17/records/RecordWithSignature.java
new file mode 100644
index 0000000..be31024
--- /dev/null
+++ b/src/test/examplesJava17/records/RecordWithSignature.java
@@ -0,0 +1,37 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package records;
+
+import java.lang.reflect.RecordComponent;
+
+public class RecordWithSignature {
+
+ record Person<N extends CharSequence, A>(N name, A age) {}
+
+ public static void main(String[] args) {
+ Person<String, Integer> janeDoe = new Person<>("Jane Doe", 42);
+ System.out.println(janeDoe.name);
+ System.out.println(janeDoe.age);
+ System.out.println(janeDoe.name());
+ System.out.println(janeDoe.age());
+ try {
+ Class.class.getDeclaredMethod("isRecord");
+ } catch (NoSuchMethodException e) {
+ System.out.println("Class.isRecord not present");
+ return;
+ }
+ System.out.println(Person.class.isRecord());
+ if (Person.class.isRecord()) {
+ System.out.println(Person.class.getRecordComponents().length);
+ for (int i = 0; i < Person.class.getRecordComponents().length; i++) {
+ RecordComponent c = Person.class.getRecordComponents()[i];
+ System.out.println(c.getName());
+ System.out.println(c.getType().getName());
+ System.out.println(c.getGenericSignature());
+ System.out.println(c.getAnnotations().length);
+ }
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index 87b5338..f4cbb5d 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -21,10 +21,10 @@
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.dex.Marker;
import com.android.tools.r8.dex.Marker.Tool;
-import com.android.tools.r8.experimental.startup.StartupProfile;
-import com.android.tools.r8.experimental.startup.profile.StartupProfileRule;
import com.android.tools.r8.origin.EmbeddedOrigin;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
+import com.android.tools.r8.profile.startup.profile.StartupProfileRule;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.startup.StartupProfileProvider;
import com.android.tools.r8.startup.diagnostic.MissingStartupProfileItemsDiagnostic;
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 74d850c..4adcef9 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -45,7 +45,7 @@
import com.android.tools.r8.jasmin.JasminBuilder;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index dfdfa9d..ce189e6 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -660,9 +660,11 @@
.add(out.toString())
.build();
Consumer<ArtCommandBuilder> commandConsumer =
- withArt6Plus64BitsLib && vm.getVersion().isNewerThanOrEqual(DexVm.Version.V6_0_1)
- ? builder -> builder.appendArtOption("--64")
- : builder -> {};
+ ToolHelper.force32BitArt()
+ ? builder -> builder.appendArtOption("--32")
+ : withArt6Plus64BitsLib && vm.getVersion().isNewerThanOrEqual(DexVm.Version.V6_0_1)
+ ? builder -> builder.appendArtOption("--64")
+ : builder -> {};
commandConsumer =
commandConsumer.andThen(
builder -> {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 592892a..c9cd81f 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -1907,6 +1907,10 @@
return new ProcessResult(passed ? 0 : -1, "", stdErr);
}
+ public static boolean force32BitArt() {
+ return System.getProperty("force_32_bit_art") != null;
+ }
+
public static boolean dealsWithGoldenFiles() {
return compareAgaintsGoldenFiles() || generateGoldenFiles();
}
diff --git a/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java b/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java
index 0630571..309c226 100644
--- a/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java
+++ b/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java
@@ -119,7 +119,7 @@
builder.startLine().append(imports.getNestHostClassAttribute()).appendLine(".none(),");
- for (int i = 0; i < 2; i++) {
+ for (int i = 0; i < 3; i++) {
builder.startLine().append(imports.getJavaUtilCollections()).appendLine(".emptyList(),");
}
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordComponentAnnotationsTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordComponentAnnotationsTest.java
new file mode 100644
index 0000000..dc3ef4e
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordComponentAnnotationsTest.java
@@ -0,0 +1,332 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.desugar.records;
+
+import static com.android.tools.r8.utils.codeinspector.AnnotationMatchers.hasAnnotationTypes;
+import static com.android.tools.r8.utils.codeinspector.AnnotationMatchers.hasElements;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.Pair;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class RecordComponentAnnotationsTest extends TestBase {
+
+ private static final String RECORD_NAME = "RecordWithAnnotations";
+ private static final byte[][] PROGRAM_DATA = RecordTestUtils.getProgramData(RECORD_NAME);
+ private static final String MAIN_TYPE = RecordTestUtils.getMainType(RECORD_NAME);
+ private static final String EXPECTED_RESULT =
+ StringUtils.lines(
+ "Jane Doe",
+ "42",
+ "Jane Doe",
+ "42",
+ "true",
+ "2",
+ "name",
+ "java.lang.String",
+ "true",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"a\")",
+ "@records.RecordWithAnnotations$AnnotationRecordComponentOnly(\"c\")",
+ "age",
+ "int",
+ "true",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"x\")",
+ "@records.RecordWithAnnotations$AnnotationRecordComponentOnly(\"z\")",
+ "2",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"a\")",
+ "@records.RecordWithAnnotations$AnnotationFieldOnly(\"b\")",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"x\")",
+ "@records.RecordWithAnnotations$AnnotationFieldOnly(\"y\")");
+ private static final String EXPECTED_RESULT_R8 =
+ StringUtils.lines(
+ "Jane Doe",
+ "42",
+ "Jane Doe",
+ "42",
+ "true",
+ "2",
+ "a",
+ "java.lang.String",
+ "true",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"a\")",
+ "@records.RecordWithAnnotations$AnnotationRecordComponentOnly(\"c\")",
+ "b",
+ "int",
+ "true",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"x\")",
+ "@records.RecordWithAnnotations$AnnotationRecordComponentOnly(\"z\")",
+ "2",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"a\")",
+ "@records.RecordWithAnnotations$AnnotationFieldOnly(\"b\")",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"x\")",
+ "@records.RecordWithAnnotations$AnnotationFieldOnly(\"y\")");
+ private static final String EXPECTED_RESULT_R8_NO_KEEP_ANNOTATIONS =
+ StringUtils.lines(
+ "Jane Doe",
+ "42",
+ "Jane Doe",
+ "42",
+ "true",
+ "2",
+ "a",
+ "java.lang.String",
+ "true",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"a\")",
+ "@records.RecordWithAnnotations$AnnotationRecordComponentOnly(\"c\")",
+ "b",
+ "int",
+ "true",
+ "2",
+ "@records.RecordWithAnnotations$Annotation(\"x\")",
+ "@records.RecordWithAnnotations$AnnotationRecordComponentOnly(\"z\")",
+ "2",
+ "0",
+ "0");
+ private static final String EXPECTED_RESULT_DESUGARED =
+ StringUtils.lines("Jane Doe", "42", "Jane Doe", "42", "Class.isRecord not present");
+ private static final String EXPECTED_RESULT_DESUGARED_JVM17 =
+ StringUtils.lines("Jane Doe", "42", "Jane Doe", "42", "false");
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameter(1)
+ public Boolean keepAnnotations;
+
+ @Parameters(name = "{0}, keepAnnotations: {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters()
+ .withDexRuntimesAndAllApiLevels()
+ .withCfRuntimesStartingFromIncluding(CfVm.JDK17)
+ .withAllApiLevelsAlsoForCf()
+ .build(),
+ BooleanUtils.values());
+ }
+
+ @Test
+ public void testJvm() throws Exception {
+ parameters.assumeJvmTestParameters();
+ assumeTrue(keepAnnotations);
+ testForJvm(parameters)
+ .addProgramClassFileData(PROGRAM_DATA)
+ .run(parameters.getRuntime(), MAIN_TYPE)
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
+ @Test
+ public void testDesugaring() throws Exception {
+ parameters.assumeDexRuntime();
+ assumeTrue(keepAnnotations);
+ // Android U will support records.
+ boolean compilingForNativeRecordSupport =
+ parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.U);
+ testForDesugaring(
+ parameters,
+ options -> {
+ if (compilingForNativeRecordSupport) {
+ // TODO(b/231930852): When Art 14 support records this will be controlled by API
+ // level.
+ options.emitRecordAnnotationsInDex = true;
+ options.emitRecordAnnotationsExInDex = true;
+ }
+ })
+ .addProgramClassFileData(PROGRAM_DATA)
+ .run(parameters.getRuntime(), MAIN_TYPE)
+ .applyIf(
+ parameters.isDexRuntime() && compilingForNativeRecordSupport,
+ // Current Art 14 build does not support the java.lang.Record class.
+ r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+ compilingForNativeRecordSupport,
+ r -> r.assertSuccessWithOutput(EXPECTED_RESULT),
+ r ->
+ r.assertSuccessWithOutput(
+ !parameters.isCfRuntime()
+ ? EXPECTED_RESULT_DESUGARED
+ : EXPECTED_RESULT_DESUGARED_JVM17)
+ .inspect(
+ inspector -> {
+ ClassSubject person =
+ inspector.clazz("records.RecordWithAnnotations$Person");
+ FieldSubject name = person.uniqueFieldWithOriginalName("name");
+ assertThat(name, isPresentAndNotRenamed());
+ FieldSubject age = person.uniqueFieldWithOriginalName("age");
+ assertThat(age, isPresentAndNotRenamed());
+ if (compilingForNativeRecordSupport) {
+ assertEquals(2, person.getFinalRecordComponents().size());
+
+ assertEquals(
+ name.getFinalName(),
+ person.getFinalRecordComponents().get(0).getName());
+ assertTrue(
+ person
+ .getFinalRecordComponents()
+ .get(0)
+ .getType()
+ .is("java.lang.String"));
+ assertNull(person.getFinalRecordComponents().get(0).getSignature());
+ assertEquals(
+ 2,
+ person.getFinalRecordComponents().get(0).getAnnotations().size());
+ assertThat(
+ person.getFinalRecordComponents().get(0).getAnnotations(),
+ hasAnnotationTypes(
+ inspector.getTypeSubject(
+ "records.RecordWithAnnotations$Annotation"),
+ inspector.getTypeSubject(
+ "records.RecordWithAnnotations$AnnotationRecordComponentOnly")));
+ assertThat(
+ person.getFinalRecordComponents().get(0).getAnnotations().get(0),
+ hasElements(new Pair<>("value", "a")));
+ assertThat(
+ person.getFinalRecordComponents().get(0).getAnnotations().get(1),
+ hasElements(new Pair<>("value", "c")));
+
+ assertEquals(
+ age.getFinalName(),
+ person.getFinalRecordComponents().get(1).getName());
+ assertTrue(
+ person.getFinalRecordComponents().get(1).getType().is("int"));
+ assertNull(person.getFinalRecordComponents().get(1).getSignature());
+ assertEquals(
+ 2,
+ person.getFinalRecordComponents().get(1).getAnnotations().size());
+ assertThat(
+ person.getFinalRecordComponents().get(1).getAnnotations(),
+ hasAnnotationTypes(
+ inspector.getTypeSubject(
+ "records.RecordWithAnnotations$Annotation"),
+ inspector.getTypeSubject(
+ "records.RecordWithAnnotations$AnnotationRecordComponentOnly")));
+ assertThat(
+ person.getFinalRecordComponents().get(1).getAnnotations().get(0),
+ hasElements(new Pair<>("value", "x")));
+ assertThat(
+ person.getFinalRecordComponents().get(1).getAnnotations().get(1),
+ hasElements(new Pair<>("value", "z")));
+ } else {
+ assertEquals(0, person.getFinalRecordComponents().size());
+ }
+ }));
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ parameters.assumeR8TestParameters();
+ // Android U will support records.
+ boolean compilingForNativeRecordSupport =
+ parameters.isCfRuntime()
+ || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.U);
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(PROGRAM_DATA)
+ // TODO(b/231930852): Change to android.jar for Androud U when that contains
+ // java.lang.Record.
+ .addLibraryFiles(RecordTestUtils.getJdk15LibraryFiles(temp))
+ .addKeepMainRule(MAIN_TYPE)
+ .addKeepClassAndMembersRulesWithAllowObfuscation("records.RecordWithAnnotations$Person")
+ .addKeepClassAndMembersRules(
+ "records.RecordWithAnnotations$Annotation",
+ "records.RecordWithAnnotations$AnnotationFieldOnly",
+ "records.RecordWithAnnotations$AnnotationRecordComponentOnly")
+ .applyIf(keepAnnotations, TestShrinkerBuilder::addKeepRuntimeVisibleAnnotations)
+ .setMinApi(parameters)
+ .applyIf(
+ compilingForNativeRecordSupport,
+ // TODO(b/231930852): When Art 14 support records this will be controlled by API level.
+ b ->
+ b.addOptionsModification(options -> options.emitRecordAnnotationsInDex = true)
+ .addOptionsModification(options -> options.emitRecordAnnotationsExInDex = true))
+ .compile()
+ .inspect(
+ inspector -> {
+ ClassSubject person = inspector.clazz("records.RecordWithAnnotations$Person");
+ FieldSubject name = person.uniqueFieldWithOriginalName("name");
+ FieldSubject age = person.uniqueFieldWithOriginalName("age");
+ if (compilingForNativeRecordSupport) {
+ assertEquals(2, person.getFinalRecordComponents().size());
+
+ assertEquals(
+ name.getFinalName(), person.getFinalRecordComponents().get(0).getName());
+ assertTrue(
+ person.getFinalRecordComponents().get(0).getType().is("java.lang.String"));
+ assertNull(person.getFinalRecordComponents().get(0).getSignature());
+ assertEquals(2, person.getFinalRecordComponents().get(0).getAnnotations().size());
+ assertThat(
+ person.getFinalRecordComponents().get(0).getAnnotations(),
+ hasAnnotationTypes(
+ inspector.getTypeSubject("records.RecordWithAnnotations$Annotation"),
+ inspector.getTypeSubject(
+ "records.RecordWithAnnotations$AnnotationRecordComponentOnly")));
+ assertThat(
+ person.getFinalRecordComponents().get(0).getAnnotations().get(0),
+ hasElements(new Pair<>("value", "a")));
+ assertThat(
+ person.getFinalRecordComponents().get(0).getAnnotations().get(1),
+ hasElements(new Pair<>("value", "c")));
+
+ assertEquals(
+ age.getFinalName(), person.getFinalRecordComponents().get(1).getName());
+ assertTrue(person.getFinalRecordComponents().get(1).getType().is("int"));
+ assertNull(person.getFinalRecordComponents().get(1).getSignature());
+ assertEquals(2, person.getFinalRecordComponents().get(1).getAnnotations().size());
+ assertThat(
+ person.getFinalRecordComponents().get(1).getAnnotations(),
+ hasAnnotationTypes(
+ inspector.getTypeSubject("records.RecordWithAnnotations$Annotation"),
+ inspector.getTypeSubject(
+ "records.RecordWithAnnotations$AnnotationRecordComponentOnly")));
+ assertThat(
+ person.getFinalRecordComponents().get(1).getAnnotations().get(0),
+ hasElements(new Pair<>("value", "x")));
+ assertThat(
+ person.getFinalRecordComponents().get(1).getAnnotations().get(1),
+ hasElements(new Pair<>("value", "z")));
+ } else {
+ assertEquals(0, person.getFinalRecordComponents().size());
+ }
+ })
+ .run(parameters.getRuntime(), MAIN_TYPE)
+ .applyIf(
+ parameters.isCfRuntime(),
+ // TODO(b/274888318): EXPECTED_RESULT_R8_NO_KEEP_ANNOTATIONS still has component
+ // annotations.
+ r ->
+ r.assertSuccessWithOutput(
+ keepAnnotations ? EXPECTED_RESULT_R8 : EXPECTED_RESULT_R8_NO_KEEP_ANNOTATIONS),
+ // r -> r.assertSuccessWithOutput(EXPECTED_RESULT_R8),
+ compilingForNativeRecordSupport,
+ // Current Art 14 build does not support the java.lang.Record class.
+ r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+ r -> r.assertSuccessWithOutput(EXPECTED_RESULT_DESUGARED));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordComponentSignatureTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordComponentSignatureTest.java
new file mode 100644
index 0000000..5ce845f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordComponentSignatureTest.java
@@ -0,0 +1,205 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.desugar.records;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class RecordComponentSignatureTest extends TestBase {
+
+ private static final String RECORD_NAME = "RecordWithSignature";
+ private static final byte[][] PROGRAM_DATA = RecordTestUtils.getProgramData(RECORD_NAME);
+ private static final String MAIN_TYPE = RecordTestUtils.getMainType(RECORD_NAME);
+ private static final String EXPECTED_RESULT =
+ StringUtils.lines(
+ "Jane Doe",
+ "42",
+ "Jane Doe",
+ "42",
+ "true",
+ "2",
+ "name",
+ "java.lang.CharSequence",
+ "TN;",
+ "0",
+ "age",
+ "java.lang.Object",
+ "TA;",
+ "0");
+ private static final String EXPECTED_RESULT_R8 =
+ StringUtils.lines(
+ "Jane Doe", "42", "Jane Doe", "42", "true", "1", "a", "java.lang.Object", "TA;", "0");
+ private static final String EXPECTED_RESULT_R8_NO_KEEP_SIGNATURE =
+ StringUtils.lines(
+ "Jane Doe", "42", "Jane Doe", "42", "true", "1", "a", "java.lang.Object", "null", "0");
+ private static final String EXPECTED_RESULT_DESUGARED =
+ StringUtils.lines("Jane Doe", "42", "Jane Doe", "42", "Class.isRecord not present");
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameter(1)
+ public Boolean keepSignatures;
+
+ @Parameters(name = "{0}, keepSignatures: {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters()
+ .withDexRuntimesAndAllApiLevels()
+ .withCfRuntimesStartingFromIncluding(CfVm.JDK17)
+ .withAllApiLevelsAlsoForCf()
+ .build(),
+ BooleanUtils.values());
+ }
+
+ @Test
+ public void testJvm() throws Exception {
+ parameters.assumeJvmTestParameters();
+ assumeTrue(keepSignatures);
+ testForJvm(parameters)
+ .addProgramClassFileData(PROGRAM_DATA)
+ .run(parameters.getRuntime(), MAIN_TYPE)
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
+ @Test
+ public void testDesugaring() throws Exception {
+ parameters.assumeDexRuntime();
+ assumeTrue(keepSignatures);
+ // Android U will support records.
+ boolean compilingForNativeRecordSupport =
+ parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.U);
+ testForDesugaring(
+ parameters,
+ options -> {
+ if (compilingForNativeRecordSupport) {
+ // TODO(b/231930852): When Art 14 support records this will be controlled by API
+ // level.
+ options.emitRecordAnnotationsInDex = true;
+ options.emitRecordAnnotationsExInDex = true;
+ }
+ })
+ .addProgramClassFileData(PROGRAM_DATA)
+ .run(parameters.getRuntime(), MAIN_TYPE)
+ .applyIf(
+ compilingForNativeRecordSupport,
+ // Current Art 14 build does not support the java.lang.Record class.
+ r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+ r ->
+ r.assertSuccessWithOutput(EXPECTED_RESULT_DESUGARED)
+ .inspect(
+ inspector -> {
+ ClassSubject person =
+ inspector.clazz("records.RecordWithSignature$Person");
+ if (compilingForNativeRecordSupport) {
+ assertEquals(2, person.getFinalRecordComponents().size());
+
+ assertEquals(
+ "name", person.getFinalRecordComponents().get(0).getName());
+ assertTrue(
+ person
+ .getFinalRecordComponents()
+ .get(0)
+ .getType()
+ .is("java.lang.CharSequence"));
+ assertEquals(
+ "TN;", person.getFinalRecordComponents().get(0).getSignature());
+ assertEquals(
+ 0,
+ person.getFinalRecordComponents().get(0).getAnnotations().size());
+
+ assertEquals("age", person.getFinalRecordComponents().get(1).getName());
+ assertTrue(
+ person
+ .getFinalRecordComponents()
+ .get(1)
+ .getType()
+ .is("java.lang.Object"));
+ assertEquals(
+ "TA;", person.getFinalRecordComponents().get(1).getSignature());
+ assertEquals(
+ 0,
+ person.getFinalRecordComponents().get(1).getAnnotations().size());
+ } else {
+ assertEquals(0, person.getFinalRecordComponents().size());
+ }
+ }));
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ parameters.assumeR8TestParameters();
+ boolean compilingForNativeRecordSupport =
+ parameters.isCfRuntime()
+ || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.U);
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(PROGRAM_DATA)
+ // TODO(b/231930852): Change to android.jar for Androud U when that contains
+ // java.lang.Record.
+ .addLibraryFiles(RecordTestUtils.getJdk15LibraryFiles(temp))
+ .addKeepMainRule(MAIN_TYPE)
+ .applyIf(keepSignatures, TestShrinkerBuilder::addKeepAttributeSignature)
+ .setMinApi(parameters)
+ .applyIf(
+ compilingForNativeRecordSupport,
+ // TODO(b/231930852): When Art 14 support records this will be controlled by API level.
+ b ->
+ b.addOptionsModification(options -> options.emitRecordAnnotationsInDex = true)
+ .addOptionsModification(options -> options.emitRecordAnnotationsExInDex = true))
+ .compile()
+ .inspect(
+ inspector -> {
+ ClassSubject person = inspector.clazz("records.RecordWithSignature$Person");
+ FieldSubject age = person.uniqueFieldWithOriginalName("age");
+ assertThat(age, isPresentAndRenamed());
+ if (compilingForNativeRecordSupport) {
+ assertEquals(1, person.getFinalRecordComponents().size());
+ assertEquals(
+ age.getFinalName(), person.getFinalRecordComponents().get(0).getName());
+ assertTrue(
+ person.getFinalRecordComponents().get(0).getType().is("java.lang.Object"));
+ if (keepSignatures) {
+ assertEquals("TA;", person.getFinalRecordComponents().get(0).getSignature());
+ } else {
+ assertNull(person.getFinalRecordComponents().get(0).getSignature());
+ }
+ assertEquals(0, person.getFinalRecordComponents().get(0).getAnnotations().size());
+ } else {
+ assertEquals(0, person.getFinalRecordComponents().size());
+ }
+ })
+ .run(parameters.getRuntime(), MAIN_TYPE)
+ // No Art VM actually supports the java.lang.Record class.
+ .applyIf(
+ parameters.isCfRuntime(),
+ r ->
+ r.assertSuccessWithOutput(
+ keepSignatures ? EXPECTED_RESULT_R8 : EXPECTED_RESULT_R8_NO_KEEP_SIGNATURE),
+ compilingForNativeRecordSupport,
+ // Current Art 14 build does not support the java.lang.Record class.
+ r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+ r -> r.assertSuccessWithOutput(EXPECTED_RESULT_DESUGARED));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
index e09c293..37deb3c 100644
--- a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
+++ b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
@@ -15,8 +15,8 @@
import com.android.tools.r8.graph.DexDebugInfo.EventBasedDebugInfo;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
+import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
import com.android.tools.r8.utils.InternalOptions;
diff --git a/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java b/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java
index 2527b81..a8cf85a 100644
--- a/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java
@@ -18,7 +18,7 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ThrowableConsumer;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.experimental.startup.StartupProfileProviderUtils;
+import com.android.tools.r8.profile.startup.StartupProfileProviderUtils;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.ZipUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index bd6303e..d89807c 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -23,7 +23,7 @@
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.profile.art.rewriting.ProfileCollectionAdditions;
+import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
import com.android.tools.r8.shaking.Enqueuer;
import com.android.tools.r8.shaking.EnqueuerFactory;
import com.android.tools.r8.shaking.EnqueuerResult;
diff --git a/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java b/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
index d5f5e91..c7c00b8 100644
--- a/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
@@ -35,6 +35,7 @@
null,
Collections.emptyList(),
Collections.emptyList(),
+ Collections.emptyList(),
null,
Collections.emptyList(),
ClassSignature.noSignature(),
diff --git a/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java b/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java
index 2450204..276e660 100644
--- a/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java
@@ -86,8 +86,8 @@
equalTo("Resource 'META-INF/MANIFEST.MF' already exists."))))
.run(parameters.getRuntime(), TestClass.class)
.applyIf(
- // TODO(b/227162584): Fails to find any engine on JDK17.
- parameters.isCfRuntime(CfVm.JDK17),
+ // No default JS engine starting from JDK-14 where Nashorn was removed, see b/227162584.
+ parameters.isCfRuntime() && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14),
r -> r.assertFailureWithErrorThatThrows(NullPointerException.class),
r ->
r.assertSuccessWithOutput(
diff --git a/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java b/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java
index 839e03e..81a977b 100644
--- a/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java
@@ -107,8 +107,10 @@
// comes with "Oracle Nashorn" included.
.assertSuccessWithOutput(
parameters.isCfRuntime()
- // TODO(b/227162584): It looks like the JS engine is not in the jdk anymore.
- ? (parameters.isCfRuntime(CfVm.JDK17)
+ // No default JS engine starting from JDK-14 where Nashorn was removed,
+ // see b/227162584.
+ ? (parameters.isCfRuntime()
+ && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14)
? StringUtils.lines("MyEngine1", "MyEngine2")
: StringUtils.lines("MyEngine1", "MyEngine2", "Oracle Nashorn"))
: StringUtils.lines("Mozilla Rhino", "MyEngine1", "MyEngine2"));
diff --git a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesR8SpecificTest.java b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesR8SpecificTest.java
index 419ebfc..884de68 100644
--- a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesR8SpecificTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesR8SpecificTest.java
@@ -76,16 +76,16 @@
if (libraryType.hasRulesInJar()) {
jarBuilder.addText("META-INF/com.android.tools/r8/test1.pro", "-keep class A1");
jarBuilder.addText("META-INF/com.android.tools/r8/test2.pro", "-keep class A2");
- jarBuilder.addText("META-INF/com.android.tools/r8-min-4.0.0/test1.pro", "-keep class B1");
- jarBuilder.addText("META-INF/com.android.tools/r8-min-4.0.0/test2.pro", "-keep class B2");
- jarBuilder.addText("META-INF/com.android.tools/r8-max-8.1.0/test1.pro", "-keep class C1");
- jarBuilder.addText("META-INF/com.android.tools/r8-max-8.1.0/test2.pro", "-keep class C2");
+ jarBuilder.addText("META-INF/com.android.tools/r8-from-4.0.0/test1.pro", "-keep class B1");
+ jarBuilder.addText("META-INF/com.android.tools/r8-from-4.0.0/test2.pro", "-keep class B2");
+ jarBuilder.addText("META-INF/com.android.tools/r8-upto-8.1.0/test1.pro", "-keep class C1");
+ jarBuilder.addText("META-INF/com.android.tools/r8-upto-8.1.0/test2.pro", "-keep class C2");
jarBuilder.addText(
- "META-INF/com.android.tools/r8-min-5.0.0-max-8.0.0/test1.pro", "-keep class D1");
+ "META-INF/com.android.tools/r8-from-5.0.0-upto-8.0.0/test1.pro", "-keep class D1");
jarBuilder.addText(
- "META-INF/com.android.tools/r8-min-5.0.0-max-8.0.0/test2.pro", "-keep class D2");
- jarBuilder.addText("META-INF/com.android.tools/r8-min-10.5.0/test1.pro", "-keep class E1");
- jarBuilder.addText("META-INF/com.android.tools/r8-min-10.5.0/test2.pro", "-keep class E2");
+ "META-INF/com.android.tools/r8-from-5.0.0-upto-8.0.0/test2.pro", "-keep class D2");
+ jarBuilder.addText("META-INF/com.android.tools/r8-from-10.5.0/test1.pro", "-keep class E1");
+ jarBuilder.addText("META-INF/com.android.tools/r8-from-10.5.0/test2.pro", "-keep class E2");
jarBuilder.addText("META-INF/proguard/test1.pro", "-keep class X1");
jarBuilder.addText("META-INF/proguard/test2.pro", "-keep class X2");
}
@@ -171,18 +171,31 @@
}
@Test
- public void runTestVersion8() throws Exception {
+ public void runTestVersion7_99_99() throws Exception {
runTest(
- SemanticVersion.create(8, 0, 0),
+ SemanticVersion.create(7, 99, 99),
StringUtils.lines(
EXPECTED_A.trim(), EXPECTED_B.trim(), EXPECTED_C.trim(), EXPECTED_D.trim()));
}
@Test
+ public void runTestVersion8() throws Exception {
+ runTest(
+ SemanticVersion.create(8, 0, 0),
+ StringUtils.lines(EXPECTED_A.trim(), EXPECTED_B.trim(), EXPECTED_C.trim()));
+ }
+
+ @Test
+ public void runTestVersion8_0_99() throws Exception {
+ runTest(
+ SemanticVersion.create(8, 0, 99),
+ StringUtils.lines(EXPECTED_A.trim(), EXPECTED_B.trim(), EXPECTED_C.trim()));
+ }
+
+ @Test
public void runTestVersion8_1() throws Exception {
runTest(
- SemanticVersion.create(8, 1, 0),
- StringUtils.lines(EXPECTED_A.trim(), EXPECTED_B.trim(), EXPECTED_C.trim()));
+ SemanticVersion.create(8, 1, 0), StringUtils.lines(EXPECTED_A.trim(), EXPECTED_B.trim()));
}
@Test
@@ -286,14 +299,14 @@
public void testUnusedProguardOnlyRules() throws Exception {
for (String directory :
ImmutableList.of(
- "proguard-min-6.1.0",
- "proguard-max-7.0.0",
- "proguard-min-6.1.0-max-7.0.0",
+ "proguard-from-6.1.0",
+ "proguard-upto-7.0.0",
+ "proguard-from-6.1.0-upto-7.0.0",
"proguard610",
"com.android.tools/proguard",
- "com.android.tools/proguard-min-6.1.0",
- "com.android.tools/proguard-max-7.0.0",
- "com.android.tools/proguard-min-6.1.0-max-7.0.0",
+ "com.android.tools/proguard-from-6.1.0",
+ "com.android.tools/proguard-upto-7.0.0",
+ "com.android.tools/proguard-from-6.1.0-upto-7.0.0",
"com.android.tools/proguard610")) {
Path library = buildLibraryProguardOnlyRules(directory);
testForR8(Backend.DEX)
@@ -311,14 +324,14 @@
public void testUnusedProguardOnlyRulesVersionMain() throws Exception {
for (String directory :
ImmutableList.of(
- "proguard-min-6.1.0",
- "proguard-max-7.0.0",
- "proguard-min-6.1.0-max-7.0.0",
+ "proguard-from-6.1.0",
+ "proguard-upto-7.0.0",
+ "proguard-from-6.1.0-upto-7.0.0",
"proguard610",
"com.android.tools/proguard",
- "com.android.tools/proguard-min-6.1.0",
- "com.android.tools/proguard-max-7.0.0",
- "com.android.tools/proguard-min-6.1.0-max-7.0.0",
+ "com.android.tools/proguard-from-6.1.0",
+ "com.android.tools/proguard-upto-7.0.0",
+ "com.android.tools/proguard-from-6.1.0-upto-7.0.0",
"com.android.tools/proguard610")) {
Path library = buildLibraryProguardOnlyRules(directory);
testForR8(Backend.DEX)
diff --git a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
index 93dc0a0..3ee4a45 100644
--- a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
+++ b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
@@ -17,12 +17,12 @@
import com.android.tools.r8.TextInputStream;
import com.android.tools.r8.ThrowableConsumer;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.experimental.startup.instrumentation.StartupInstrumentationOptions;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.profile.art.ArtProfileBuilder;
import com.android.tools.r8.profile.art.ArtProfileBuilderUtils;
import com.android.tools.r8.profile.art.HumanReadableArtProfileParser;
import com.android.tools.r8.profile.art.HumanReadableArtProfileParserBuilder;
+import com.android.tools.r8.profile.startup.instrumentation.StartupInstrumentationOptions;
import com.android.tools.r8.startup.StartupClassBuilder;
import com.android.tools.r8.startup.StartupMethodBuilder;
import com.android.tools.r8.startup.StartupProfileBuilder;
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index 0d8f6d0..39e3174 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -235,6 +235,11 @@
}
@Override
+ public List<RecordComponentSubject> getFinalRecordComponents() {
+ throw new Unreachable("Cannot determine RecordComponents attribute of an absent class");
+ }
+
+ @Override
public KmClassSubject getKmClass() {
return null;
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java
index bb1c57a..4a0f1ac 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationMatchers.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.utils.codeinspector;
+import com.android.tools.r8.graph.DexAnnotationElement;
+import com.android.tools.r8.utils.Pair;
import com.android.tools.r8.utils.StringUtils;
import java.util.Arrays;
import java.util.List;
@@ -101,4 +103,50 @@
}
};
}
+
+ @SafeVarargs
+ public static Matcher<FoundAnnotationSubject> hasElements(
+ Pair<String, String>... expectedElements) {
+ return new TypeSafeMatcher<FoundAnnotationSubject>() {
+
+ @Override
+ protected boolean matchesSafely(FoundAnnotationSubject subject) {
+ if (expectedElements.length != subject.getAnnotation().elements.length) {
+ return false;
+ }
+ for (int i = 0; i < expectedElements.length; i++) {
+ DexAnnotationElement element = subject.getAnnotation().elements[i];
+ if (!element.name.toString().equals(expectedElements[i].getFirst())
+ || !element.value.isDexValueString()
+ || !element
+ .value
+ .asDexValueString()
+ .getValue()
+ .toString()
+ .equals(expectedElements[i].getSecond())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ StringBuilder builder = new StringBuilder("has elements ");
+ for (Pair<String, String> expectedElement : expectedElements) {
+ builder
+ .append(expectedElement.getFirst())
+ .append(" = ")
+ .append(expectedElement.getSecond())
+ .append(", ");
+ }
+ description.appendText(builder.toString());
+ }
+
+ @Override
+ public void describeMismatchSafely(FoundAnnotationSubject subject, Description description) {
+ description.appendText("annotation did not");
+ }
+ };
+ }
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index 1aebbdd..99dd879 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -250,6 +250,8 @@
public abstract List<TypeSubject> getFinalPermittedSubclassAttributes();
+ public abstract List<RecordComponentSubject> getFinalRecordComponents();
+
public abstract KmClassSubject getKmClass();
public abstract KmPackageSubject getKmPackage();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index fcfe160..457e4a2 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -525,6 +525,15 @@
}
@Override
+ public List<RecordComponentSubject> getFinalRecordComponents() {
+ List<RecordComponentSubject> result = new ArrayList<>(dexClass.getRecordComponents().size());
+ for (int i = 0; i < dexClass.getRecordComponents().size(); i++) {
+ result.add(new RecordComponentSubject(codeInspector, dexClass, i));
+ }
+ return result;
+ }
+
+ @Override
public int hashCode() {
int result = codeInspector.hashCode();
result = 31 * result + dexClass.hashCode();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/RecordComponentSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/RecordComponentSubject.java
new file mode 100644
index 0000000..87b36df
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/RecordComponentSubject.java
@@ -0,0 +1,67 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.utils.codeinspector;
+
+import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.DexAnnotation;
+import com.android.tools.r8.graph.DexClass;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class RecordComponentSubject extends Subject {
+
+ private final CodeInspector codeInspector;
+ private final DexClass clazz;
+ private final int index;
+
+ public RecordComponentSubject(CodeInspector codeInspector, DexClass clazz, int index) {
+ this.codeInspector = codeInspector;
+ this.clazz = clazz;
+ this.index = index;
+ }
+
+ public int size() {
+ return clazz.getRecordComponents().size();
+ }
+
+ public String getName() {
+ return clazz.getRecordComponents().get(index).getName().toString();
+ }
+
+ public TypeSubject getType() {
+ return new TypeSubject(codeInspector, clazz.getRecordComponents().get(index).getType());
+ }
+
+ public String getSignature() {
+ return clazz.getRecordComponents().get(index).getSignature().toString();
+ }
+
+ public List<FoundAnnotationSubject> getAnnotations() {
+ int size = clazz.getRecordComponents().get(index).getAnnotations().size();
+ if (size == 0) {
+ return Collections.emptyList();
+ }
+ List<FoundAnnotationSubject> result = new ArrayList<>(size);
+ for (DexAnnotation annotation : clazz.getRecordComponents().get(index).getAnnotations()) {
+ result.add(new FoundAnnotationSubject(annotation, codeInspector));
+ }
+ return result;
+ }
+
+ @Override
+ public boolean isPresent() {
+ return true;
+ }
+
+ @Override
+ public boolean isRenamed() {
+ throw new Unreachable("Cannot determine if a record component is renamed");
+ }
+
+ @Override
+ public boolean isSynthetic() {
+ throw new Unreachable("Cannot determine if a record component is synthetic");
+ }
+}
diff --git a/tools/test.py b/tools/test.py
index 2f0254c..3c52be4 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -82,6 +82,9 @@
result.add_option('--slow-tests', '--slow_tests',
help='Also run slow tests.',
default=False, action='store_true')
+ result.add_option('--force-32-bit-art', '--force_32_bit_art',
+ help='Force art to run 32 bits.',
+ default=False, action='store_true')
result.add_option('-v', '--verbose',
help='Print test stdout to, well, stdout.',
default=False, action='store_true')
@@ -290,6 +293,8 @@
gradle_args.append('-Pall_tests')
if options.slow_tests:
gradle_args.append('-Pslow_tests=1')
+ if options.force_32_bit_art:
+ gradle_args.append('-Pforce_32_bit_art=1')
if options.tool:
gradle_args.append('-Ptool=%s' % options.tool)
if options.one_line_per_test: