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);
+}