Ensure that all classes in desugared library starts with j$
This reverts commit 0ae3dc2f3b30289a9dfa06b262d771f99b57761b.
Bug: 176085729
Bug: 175291954
Change-Id: Ib8318b0811ab19028a62ac3858570d2537e377c7
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
index e14573d..eddbf6d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
@@ -99,6 +99,7 @@
// }
public class DesugaredLibraryWrapperSynthesizer {
+ public static final String WRAPPER_PACKAGE = "wrappers/";
public static final String WRAPPER_PREFIX = "$r8$wrapper$";
public static final String TYPE_WRAPPER_SUFFIX = "$-WRP";
public static final String VIVIFIED_TYPE_WRAPPER_SUFFIX = "$-V-WRP";
@@ -125,6 +126,7 @@
.options()
.desugaredLibraryConfiguration
.getSynthesizedLibraryClassesPackagePrefix()
+ + WRAPPER_PACKAGE
+ WRAPPER_PREFIX;
dexWrapperPrefixDexString = factory.createString(dexWrapperPrefixString);
this.converter = converter;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
index 6b6e4b0..eb42231 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
@@ -172,6 +172,8 @@
protected abstract boolean shouldProcessClassInNest(DexClass clazz, List<DexType> nest);
private DexProgramClass createNestAccessConstructor() {
+ // TODO(b/176900254): The class generated should be in a package that has lower change of
+ // collisions (and perhaps be unique by some hash from the nest).
return new DexProgramClass(
appView.dexItemFactory().nestConstructorType,
null,
diff --git a/src/test/java/com/android/tools/r8/ProguardTestBuilder.java b/src/test/java/com/android/tools/r8/ProguardTestBuilder.java
index 622d595..0e65de1 100644
--- a/src/test/java/com/android/tools/r8/ProguardTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/ProguardTestBuilder.java
@@ -167,8 +167,14 @@
@Override
public ProguardTestBuilder addProgramClassFileData(Collection<byte[]> classes) {
- throw new Unimplemented(
- "No support for adding class files directly (we need to compute the descriptor)");
+ try {
+ Path out = getState().getNewTempFolder().resolve("out.jar");
+ TestBase.writeClassFileDataToJar(out, classes);
+ injars.add(out);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return self();
}
@Override
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index ccfaeaf..8379927 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -24,11 +24,13 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.ir.desugar.DesugaredLibraryConfiguration;
import com.android.tools.r8.ir.desugar.DesugaredLibraryConfigurationParser;
+import com.android.tools.r8.ir.desugar.NestBasedAccessDesugaring;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.tracereferences.TraceReferences;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
@@ -148,6 +150,15 @@
.startsWith(
"Invalid parameter counts in MethodParameter attributes.")));
}
+ // TODO(b/176900254): The nest check should not be necessary.
+ new CodeInspector(desugaredLib)
+ .forAllClasses(
+ clazz ->
+ assertTrue(
+ clazz.getFinalName().startsWith("j$.")
+ || clazz
+ .getFinalName()
+ .startsWith(NestBasedAccessDesugaring.NEST_CONSTRUCTOR_NAME)));
return desugaredLib;
} catch (Exception e) {
// Don't wrap assumption violation so junit can catch it.
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
index fcc2124..dc13cb2 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
@@ -30,7 +30,7 @@
private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.N;
private static final String EXPECTED_RESULT =
- StringUtils.lines("[5, 6, 7]", "j$.$r8$wrapper$java$util$stream$IntStream$-V-WRP");
+ StringUtils.lines("[5, 6, 7]", "j$.wrappers.$r8$wrapper$java$util$stream$IntStream$-V-WRP");
@Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
public static List<Object[]> data() {
diff --git a/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java b/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java
new file mode 100644
index 0000000..309ab55
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java
@@ -0,0 +1,74 @@
+// Copyright (c) 2020, 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.naming.keeppackagenames;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import com.android.tools.r8.ProguardVersion;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestShrinkerBuilder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class KeepPackageNameRootTest extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ public KeepPackageNameRootTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testR8Compat() throws Exception {
+ run(testForR8Compat(Backend.CF));
+ }
+
+ @Test
+ public void testR8Full() throws Exception {
+ run(testForR8(Backend.CF));
+ }
+
+ @Test
+ public void testR8PG() throws Exception {
+ run(testForProguard(ProguardVersion.V7_0_0).addKeepRules("-dontwarn"));
+ }
+
+ private TestCompileResult<?, ?> run(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder)
+ throws Exception {
+ return testBuilder
+ .addProgramClassFileData(
+ transformer(Main.class)
+ .setClassDescriptor("Lfoo/Main;")
+ .removeInnerClasses()
+ .transform())
+ .addKeepRules("-keeppackagenames foo.**")
+ .addKeepClassRulesWithAllowObfuscation("foo.Main")
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .inspect(
+ inspector -> {
+ assertEquals(1, inspector.allClasses().size());
+ inspector.forAllClasses(
+ clazz -> {
+ assertNotEquals("foo", clazz.getDexProgramClass().getType().getPackageName());
+ });
+ });
+ }
+
+ /* Will be in package foo */
+ public static class Main {}
+}