Fix for issue 197625454
Bug: 197625454
Change-Id: I689e6f7d4136f70564a1e5b7a20cd9cfa5c43ded
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 3b5a40b..08324c3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.ir.desugar.lambda.ForcefullyMovedLambdaMethodConsumer.emptyForcefullyMovedLambdaMethodConsumer;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
+import static com.android.tools.r8.utils.DesugarUtils.appendFullyQualifiedHolderToMethodName;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.errors.Unimplemented;
@@ -347,17 +348,14 @@
} else {
// Otherwise we need to ensure the method can be reached publicly by virtual dispatch.
// To avoid potential conflicts on the name of the lambda method once dispatch becomes virtual
- // we add the method-holder name as suffix to the lambda-method name.
+ // we add the fully qualified method-holder name as suffix to the lambda-method name.
return new InstanceLambdaImplTarget(
appView
.dexItemFactory()
.createMethod(
implMethod.holder,
implMethod.proto,
- appView
- .dexItemFactory()
- .createString(
- implMethod.name.toString() + "$" + implMethod.holder.getName())));
+ appendFullyQualifiedHolderToMethodName(implMethod, appView.dexItemFactory())));
}
}
diff --git a/src/main/java/com/android/tools/r8/utils/DesugarUtils.java b/src/main/java/com/android/tools/r8/utils/DesugarUtils.java
new file mode 100644
index 0000000..7b8fba2
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/DesugarUtils.java
@@ -0,0 +1,17 @@
+// Copyright (c) 2021, 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;
+
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexString;
+
+public class DesugarUtils {
+ public static DexString appendFullyQualifiedHolderToMethodName(
+ DexMethod method, DexItemFactory factory) {
+ return factory.createString(
+ method.name.toString() + "$" + method.holder.getTypeName().replace('.', '-'));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java
index 72549c5..c71f19c 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java
@@ -34,7 +34,8 @@
private List<String> EXPECTED_D8_DESUGARED_RESULT =
ImmutableList.of(
- "Hello from inside lambda$test$0$DesugarLambdaWithAnonymousClass$TestClass",
+ "Hello from inside"
+ + " lambda$test$0$com-android-tools-r8-desugar-DesugarLambdaWithAnonymousClass$TestClass",
"Hello from inside lambda$testStatic$1");
@Parameterized.Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java
index 62c36fd..60fde2f 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java
@@ -33,7 +33,8 @@
private List<String> EXPECTED_D8_DESUGARED_RESULT =
ImmutableList.of(
- "Hello from inside lambda$test$0$DesugarLambdaWithLocalClass$TestClass",
+ "Hello from inside"
+ + " lambda$test$0$com-android-tools-r8-desugar-DesugarLambdaWithLocalClass$TestClass",
"Hello from inside lambda$testStatic$1");
@Parameterized.Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/desugar/lambdas/OverlappingLambdaMethodInSubclassWithSameNameTest.java b/src/test/java/com/android/tools/r8/desugar/lambdas/OverlappingLambdaMethodInSubclassWithSameNameTest.java
index 3dd750e..9f5fa37 100644
--- a/src/test/java/com/android/tools/r8/desugar/lambdas/OverlappingLambdaMethodInSubclassWithSameNameTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/lambdas/OverlappingLambdaMethodInSubclassWithSameNameTest.java
@@ -23,9 +23,6 @@
static final String EXPECTED =
StringUtils.lines("Superclass lambda: Hello!", "Superclass lambda: Hello!");
- static final String UNEXPECTED_D8_B197625454 =
- StringUtils.lines("Subclass lambda: Hello!", "Superclass lambda: Hello!");
-
private static final Class<?> MAIN_CLASS =
com.android.tools.r8.desugar.lambdas.b197625454.subpackage
.OverlappingLambdaMethodInSubclassWithSameNameTestA.class;
@@ -58,7 +55,7 @@
OverlappingLambdaMethodInSubclassWithSameNameTestB.class)
.setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), MAIN_CLASS)
- .assertSuccessWithOutput(UNEXPECTED_D8_B197625454);
+ .assertSuccessWithOutput(EXPECTED);
}
@Test