Version 1.5.52
Cherry pick: Test and fix for Jstyle kotlin lambdas with private
methods
CL: https://r8-review.googlesource.com/c/r8/+/39981
Bug: 134858535
Change-Id: Idb251f65fa6c6d5e8790fb46906e76d9ffa1a697
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 14b53f4..76c37ab 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "1.5.51";
+ public static final String LABEL = "1.5.52";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
index 7f7643b..568a8cb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.ir.optimize.lambda.kotlin;
-import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AccessFlags;
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexClass;
@@ -175,7 +174,6 @@
} else if (method.isStatic()) {
throw new LambdaStructureError(
"unexpected static method: " + method.method.toSourceString());
-
} else if (method.isInstanceInitializer()) {
// Lambda class is expected to have one constructor
// with parameters matching capture signature.
@@ -197,8 +195,13 @@
method.accessFlags, CONSTRUCTOR_FLAGS, CONSTRUCTOR_FLAGS_RELAXED);
checkDirectMethodAnnotations(method);
+ } else if (method.isPrivateMethod()) {
+ // TODO(b/135975229)
+ throw new LambdaStructureError("private method: " + method.method.toSourceString());
} else {
- throw new Unreachable();
+ assert false;
+ throw new LambdaStructureError(
+ "unexpected method encountered: " + method.method.toSourceString());
}
}
}
diff --git a/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisher$b.java b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisher$b.java
new file mode 100644
index 0000000..ef6c780
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisher$b.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2019, 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.shaking.b134858535;
+
+public class EventPublisher$b {
+
+ public final Object apply(java.lang.Object foo) {
+ return foo;
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisher$bDump.java b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisher$bDump.java
new file mode 100644
index 0000000..df725af
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisher$bDump.java
@@ -0,0 +1,149 @@
+// Copyright (c) 2019, 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.shaking.b134858535;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+public class EventPublisher$bDump implements Opcodes {
+
+ public static byte[] dump() {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V1_6,
+ ACC_FINAL | ACC_SUPER,
+ "com/android/tools/r8/shaking/b134858535/EventPublisher$b",
+ null,
+ "java/lang/Object",
+ new String[] {"com/android/tools/r8/shaking/b134858535/Interface"});
+
+ classWriter.visitSource("SourceFile", null);
+
+ {
+ annotationVisitor0 = classWriter.visitAnnotation("Lkotlin/Metadata;", true);
+ annotationVisitor0.visit("mv", new int[] {1, 1, 15});
+ annotationVisitor0.visit("bv", new int[] {1, 0, 3});
+ annotationVisitor0.visit("k", new Integer(3));
+ {
+ AnnotationVisitor annotationVisitor1 = annotationVisitor0.visitArray("d1");
+ annotationVisitor1.visit(
+ null,
+ "\u0000 \n"
+ + "\u0000\n"
+ + "\u0002\u0018\u0002\n"
+ + "\u0002\u0018\u0002\n"
+ + "\u0002\u0018\u0002\n"
+ + "\u0000\n"
+ + "\u0002\u0018\u0002\n"
+ + "\u0000\n"
+ + "\u0002\u0010 \n"
+ + "\u0002\u0018\u0002\n"
+ + "\u0000\u0010\u0000\u001a\u0096\u0001\u0012D\u0012B\u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00030\u0003\u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00050\u0005 \u0004* \u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00030\u0003\u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00050\u0005\u0018\u00010\u00020\u0002"
+ + " \u0004*J\u0012D\u0012B\u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00030\u0003\u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00050\u0005 \u0004* \u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00030\u0003\u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00050\u0005\u0018\u00010\u00020\u0002\u0018\u00010\u00010\u00012"
+ + " \u0010\u0006\u001a\u001c\u0012\n"
+ + "\u0012\u0008\u0012\u0004\u0012\u00020\u00030\u0007\u0012\u000c\u0012\n"
+ + " \u0004*\u0004\u0018\u00010\u00080\u00080\u0002H\n"
+ + "\u00a2\u0006\u0002\u0008\u0009");
+ annotationVisitor1.visitEnd();
+ }
+ {
+ AnnotationVisitor annotationVisitor1 = annotationVisitor0.visitArray("d2");
+ annotationVisitor1.visit(null, "<anonymous>");
+ annotationVisitor1.visit(null, "Lio/reactivex/Flowable;");
+ annotationVisitor1.visit(null, "Lkotlin/Pair;");
+ annotationVisitor1.visit(null, "Lcom/permutive/android/event/db/model/EventEntity;");
+ annotationVisitor1.visit(null, "kotlin.jvm.PlatformType");
+ annotationVisitor1.visit(
+ null, "Lcom/permutive/android/event/api/model/TrackBatchEventResponse;");
+ annotationVisitor1.visit(null, "<name for destructuring parameter 0>");
+ annotationVisitor1.visit(null, "");
+ annotationVisitor1.visit(null, "Lcom/permutive/android/config/api/model/SdkConfiguration;");
+ annotationVisitor1.visit(null, "apply");
+ annotationVisitor1.visitEnd();
+ }
+ annotationVisitor0.visitEnd();
+ }
+ classWriter.visitInnerClass(
+ "com/permutive/android/event/EventPublisher$b", null, null, ACC_FINAL | ACC_STATIC);
+
+ {
+ fieldVisitor =
+ classWriter.visitField(
+ ACC_FINAL | ACC_SYNTHETIC,
+ "a",
+ "Lcom/permutive/android/event/EventPublisher;",
+ null,
+ null);
+ fieldVisitor.visitEnd();
+ }
+ {
+ fieldVisitor =
+ classWriter.visitField(ACC_FINAL | ACC_SYNTHETIC, "b", "Ljava/util/Set;", null, null);
+ fieldVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PUBLIC | ACC_FINAL | ACC_SYNTHETIC,
+ "apply",
+ "(Ljava/lang/Object;)Ljava/lang/Object;",
+ null,
+ null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(28, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitTypeInsn(CHECKCAST, "kotlin/Pair");
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL,
+ "com/android/tools/r8/shaking/b134858535/EventPublisher$b",
+ "a",
+ "(Ljava/lang/Object;)Ljava/lang/Object;",
+ false);
+ methodVisitor.visitInsn(ARETURN);
+ methodVisitor.visitMaxs(2, 2);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PRIVATE, "a", "(Ljava/lang/Object;)Ljava/lang/Object;", null, null);
+ methodVisitor.visitCode();
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(ARETURN);
+ methodVisitor.visitMaxs(4, 9);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ methodVisitor.visitInsn(RETURN);
+ methodVisitor.visitMaxs(2, 3);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisherTest.java b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisherTest.java
new file mode 100644
index 0000000..6d0d767
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisherTest.java
@@ -0,0 +1,31 @@
+// Copyright (c) 2019, 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.shaking.b134858535;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.junit.Test;
+
+public class EventPublisherTest extends TestBase {
+
+ public static class Main {
+
+ public static void main(String[] args) {
+ new EventPublisher$b().apply("foo");
+ }
+ }
+
+ @Test
+ public void testPrivateMethodsInLambdaClass() throws CompilationFailedException {
+ testForR8(Backend.DEX)
+ .addProgramClasses(Main.class, Interface.class)
+ .addProgramClassFileData(EventPublisher$bDump.dump())
+ .addKeepClassRules(Interface.class)
+ .addKeepMainRule(Main.class)
+ .setMinApi(AndroidApiLevel.L)
+ .compile();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/b134858535/Interface.java b/src/test/java/com/android/tools/r8/shaking/b134858535/Interface.java
new file mode 100644
index 0000000..77c5ccb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/b134858535/Interface.java
@@ -0,0 +1,10 @@
+// Copyright (c) 2019, 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.shaking.b134858535;
+
+public interface Interface {
+
+ Object apply(Object foo);
+}