Automated rollback of commit bb34deeb2949ef19ea383301ed991a117c0e9328.

*** Reason for rollback ***

Breaks aGMM build.

*** Original change description ***

Remove DesugarClassAttribute

- No longer used, the functionality has been moved to an method attribute

PiperOrigin-RevId: 311490509
diff --git a/src/test/java/com/google/devtools/build/android/desugar/BUILD b/src/test/java/com/google/devtools/build/android/desugar/BUILD
index 50f27ee..55c1831 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/BUILD
+++ b/src/test/java/com/google/devtools/build/android/desugar/BUILD
@@ -281,6 +281,23 @@
 )
 
 java_test(
+    name = "DesugarFunctionalTestFromDirectoryToDirectory",
+    size = "small",
+    srcs = [
+        "DesugarFunctionalTest.java",
+    ],
+    tags = ["no_windows"],
+    test_class = "com.google.devtools.build.android.desugar.DesugarFunctionalTest",
+    deps = [
+        ":testdata_desugared_from_directory_to_directory",  # Make tests run against desugared library
+        "//third_party:guava",
+        "//third_party:jsr305",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
     name = "DesugarFunctionalTestWithClasspathDirectory",
     size = "small",
     srcs = [
@@ -1323,6 +1340,47 @@
 )
 
 genrule(
+    name = "desugar_testdata_from_directory_to_directory",
+    srcs = [
+        "//third_party:guava-jars",
+        ":separate",
+        ":testdata_like_in_android_studio",
+        # Depend on Jacoco runtime in case testdata was built with coverage
+        # instrumentation
+        "//third_party/java/jacoco:blaze-agent-0.8.3",
+        "@bazel_tools//tools/android:android_jar",
+    ],
+    outs = [
+        "testdata_desugared_from_directory_to_directory.jar",
+    ],
+    cmd = """
+    tmpdirIn=$$(mktemp -d)
+    tmpdirOut=$$(mktemp -d)
+    # unzip input jar in order to pass a folder to desugar
+    pwddir=$$PWD
+    (cd $$tmpdirIn; $$pwddir/$(location //tools/zip:zipper) x $$pwddir/$(location :testdata_like_in_android_studio))
+    $(location //src/tools/android/java/com/google/devtools/build/android/desugar:Desugar) \
+          --min_sdk_version 23 --nodesugar_interface_method_bodies_if_needed \
+          -i $$tmpdirIn  -o $$tmpdirOut \
+          --copy_bridges_from_classpath \
+          --classpath_entry $(location :separate) \
+          --classpath_entry $(location //third_party:guava-jars) \
+          --classpath_entry $(location //third_party/java/jacoco:blaze-agent-0.8.3) \
+          --bootclasspath_entry $(location @bazel_tools//tools/android:android_jar)
+     pushd $$tmpdirOut
+     $$pwddir/$(location //tools/zip:zipper) c $$pwddir/$(location testdata_desugared_from_directory_to_directory.jar) $$(find *)
+     popd
+     rm -rf $$tmpdirIn
+     rm -rf $$tmpdirOut
+    """,
+    tags = ["no_windows"],
+    tools = [
+        "//src/tools/android/java/com/google/devtools/build/android/desugar:Desugar",
+        "//tools/zip:zipper",
+    ],
+)
+
+genrule(
     name = "desugar_testdata_with_classpath_directory",
     srcs = [
         "//third_party:guava-jars",
@@ -1529,6 +1587,12 @@
 )
 
 java_import(
+    name = "testdata_desugared_from_directory_to_directory",
+    jars = ["testdata_desugared_from_directory_to_directory.jar"],
+    deps = [":separate"],
+)
+
+java_import(
     name = "testdata_desugared_with_classpath_directory",
     jars = ["testdata_desugared_with_classpath_directory.jar"],
     deps = [":separate"],
@@ -1711,7 +1775,7 @@
 
 sh_test(
     name = "desugar_idempotency_test",
-    srcs = ["diff_zip.sh"],
+    srcs = ["diff.sh"],
     args = [
         "$(location :capture_lambda_desugared.jar)",
         "$(location :capture_lambda_desugared_twice.jar)",
diff --git a/src/test/java/com/google/devtools/build/android/desugar/diff_zip.sh b/src/test/java/com/google/devtools/build/android/desugar/diff_zip.sh
deleted file mode 100755
index f1ed636..0000000
--- a/src/test/java/com/google/devtools/build/android/desugar/diff_zip.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2020 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-function zip_content {
-  # compare CRC-32, striped out title line, sort by name column name.
-  unzip -lv "$1" | grep -v 'META-INF/desugar_log/' | sort -k 8 | tail -n +5
-}
-
-diff -y <(zip_content "$1")  <(zip_content "$2")
diff --git a/src/test/java/com/google/devtools/build/android/desugar/testdata_desugared_jar_test.sh b/src/test/java/com/google/devtools/build/android/desugar/testdata_desugared_jar_test.sh
index a64c886..4649170 100755
--- a/src/test/java/com/google/devtools/build/android/desugar/testdata_desugared_jar_test.sh
+++ b/src/test/java/com/google/devtools/build/android/desugar/testdata_desugared_jar_test.sh
@@ -42,7 +42,6 @@
 # Dump Jar file contents but drop coverage artifacts in case coverage is enabled
 $JAVABASE/bin/jar tf "$1" \
     | grep -v '\.uninstrumented$' \
-    | grep -v 'META-INF/desugar_log/' \
     | grep -v '\-paths\-for\-coverage\.txt$' >"${output}/actual_toc.txt"
 # sorting can be removed when cl/145334839 is released
 diff <(sort "$2") <(sort "${output}/actual_toc.txt")
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java b/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
index 63e0b65..7845e72 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
@@ -54,6 +54,7 @@
 import com.google.devtools.build.android.desugar.langmodel.ClassMemberRecord;
 import com.google.devtools.build.android.desugar.langmodel.ClassMemberUseCounter;
 import com.google.devtools.build.android.desugar.langmodel.ClassName;
+import com.google.devtools.build.android.desugar.langmodel.DesugarClassAttribute;
 import com.google.devtools.build.android.desugar.langmodel.DesugarMethodAttribute;
 import com.google.devtools.build.android.desugar.nest.NestAnalyzer;
 import com.google.devtools.build.android.desugar.nest.NestDesugaring;
@@ -69,7 +70,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
-import java.nio.charset.Charset;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -106,7 +106,9 @@
       new ResourceBasedClassFiles();
   private static final String RUNTIME_LIB_PACKAGE =
       "com/google/devtools/build/android/desugar/runtime/";
-  private static final Attribute[] customAttributes = {new DesugarMethodAttribute()};
+  private static final Attribute[] customAttributes = {
+    new DesugarClassAttribute(), new DesugarMethodAttribute()
+  };
   private final DesugarOptions options;
   private final CoreLibraryRewriter rewriter;
   private final LambdaClassMaker lambdas;
@@ -345,12 +347,6 @@
       if (depsInfo != null) {
         outputFileProvider.write(OutputFileProvider.DESUGAR_DEPS_FILENAME, depsInfo);
       }
-
-      outputFileProvider.write(
-          String.format(
-              "%s%s_%d.log",
-              OutputFileProvider.DESUGAR_LOG_PREFIX, inputOutputPair, System.nanoTime()),
-          options.toString().getBytes(Charset.defaultCharset()));
     }
 
     ImmutableMap<Path, LambdaInfo> lambdasLeftBehind = lambdas.drain();
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/io/OutputFileProvider.java b/src/tools/android/java/com/google/devtools/build/android/desugar/io/OutputFileProvider.java
index fa9121f..9198699 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/io/OutputFileProvider.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/io/OutputFileProvider.java
@@ -22,10 +22,7 @@
 public interface OutputFileProvider extends AutoCloseable {
 
   /** Filename to use to write out dependency metadata for later consistency checking. */
-  String DESUGAR_DEPS_FILENAME = "META-INF/desugar_deps";
-
-  /** In-archive path to use to write out desugaring processing logs. */
-  String DESUGAR_LOG_PREFIX = "META-INF/desugar_log/";
+  public static final String DESUGAR_DEPS_FILENAME = "META-INF/desugar_deps";
 
   /**
    * Copy {@code filename} from {@code inputFileProvider} to this output, possibly with new name. If
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/io/ZipOutputFileProvider.java b/src/tools/android/java/com/google/devtools/build/android/desugar/io/ZipOutputFileProvider.java
index d0c01b4..45a7749 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/io/ZipOutputFileProvider.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/io/ZipOutputFileProvider.java
@@ -65,9 +65,7 @@
   @Override
   public void write(String filename, byte[] content) throws IOException {
     checkArgument(
-        filename.equals(DESUGAR_DEPS_FILENAME)
-            || filename.startsWith(DESUGAR_LOG_PREFIX)
-            || filename.endsWith(".class"),
+        filename.equals(DESUGAR_DEPS_FILENAME) || filename.endsWith(".class"),
         "Expect file to be copied: %s",
         filename);
     writeStoredEntry(out, filename, content);
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/BUILD b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/BUILD
index 137dcd5..d9c5f88 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/BUILD
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/BUILD
@@ -25,6 +25,7 @@
 proto_library(
     name = "desugar_class_attr_proto",
     srcs = [
+        "desugar_class_attr.proto",
         "desugar_method_attr.proto",
     ],
 )
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/DesugarClassAttribute.java b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/DesugarClassAttribute.java
new file mode 100644
index 0000000..2aeb9a0
--- /dev/null
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/DesugarClassAttribute.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2020 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.devtools.build.android.desugar.langmodel;
+
+import com.google.protobuf.ExtensionRegistryLite;
+import com.google.protobuf.InvalidProtocolBufferException;
+import java.io.IOError;
+import org.objectweb.asm.Attribute;
+import org.objectweb.asm.ByteVector;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+
+/** A custom class file attribute for desugar-specific operations. */
+public class DesugarClassAttribute extends Attribute {
+
+  private static final String ATTRIBUTE_TYPE = "DesugarClassInfo";
+
+  private final DesugarClassInfo desugarClassInfo;
+
+  public DesugarClassAttribute() {
+    this(DesugarClassInfo.getDefaultInstance());
+  }
+
+  public DesugarClassAttribute(DesugarClassInfo desugarClassInfo) {
+    super(ATTRIBUTE_TYPE);
+    this.desugarClassInfo = desugarClassInfo;
+  }
+
+  public DesugarClassInfo getDesugarClassInfo() {
+    return desugarClassInfo;
+  }
+
+  @Override
+  protected Attribute read(
+      ClassReader classReader,
+      int offset,
+      int length,
+      char[] charBuffer,
+      int codeAttributeOffset,
+      Label[] labels) {
+    byte[] classAttrBytes = new byte[length];
+    for (int i = 0; i < length; i++) {
+      classAttrBytes[i] = (byte) classReader.readByte(i + offset);
+    }
+    try {
+      DesugarClassInfo attr =
+          DesugarClassInfo.parseFrom(classAttrBytes, ExtensionRegistryLite.getEmptyRegistry());
+      return new DesugarClassAttribute(attr);
+    } catch (InvalidProtocolBufferException e) {
+      throw new IOError(e);
+    }
+  }
+
+  @Override
+  protected ByteVector write(
+      ClassWriter classWriter, byte[] code, int codeLength, int maxStack, int maxLocals) {
+    ByteVector byteVector = new ByteVector();
+    byte[] classAttrBytes = desugarClassInfo.toByteArray();
+    byteVector.putByteArray(classAttrBytes, 0, classAttrBytes.length);
+    return byteVector;
+  }
+}
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodKey.java b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodKey.java
index fb30fbd..a3fbdcb 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodKey.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/MethodKey.java
@@ -54,6 +54,18 @@
     return MethodKey.create(ClassName.create(payloads.get(0)), payloads.get(1), payloads.get(2));
   }
 
+  public static MethodKey from(MethodId methodId) {
+    return create(ClassName.create(methodId.getOwner()), methodId.getName(), methodId.getDesc());
+  }
+
+  public MethodId toMethodIdProto() {
+    return MethodId.newBuilder()
+        .setOwner(ownerName())
+        .setName(name())
+        .setDesc(descriptor())
+        .build();
+  }
+
   /** The return type of a method. */
   public Type getReturnType() {
     return Type.getReturnType(descriptor());
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/desugar_class_attr.proto b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/desugar_class_attr.proto
new file mode 100644
index 0000000..274576a
--- /dev/null
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/desugar_class_attr.proto
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+package android.desugar;
+
+option java_package = "com.google.devtools.build.android.desugar.langmodel";
+option java_multiple_files = true;
+
+message DesugarClassInfo {
+  repeated SyntheticMethod synthetic_method = 1;
+}
+
+// TODO(b/155052379): Move this method attribute and remove method sub message.
+message SyntheticMethod {
+  enum SyntheticReason {
+    UNKNOWN = 0;
+    NEST_BRIDGE = 1;
+    SHADOWED_API_ADAPTER = 2;
+    OVERRIDING_BRIDGE = 3;
+  }
+
+  MethodId method = 1;
+  SyntheticReason reason = 2;
+}
+
+message MethodId {
+  string owner = 1;
+  string name = 2;
+  string desc = 3;
+}
\ No newline at end of file
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/preanalysis/ClassMetadataCollector.java b/src/tools/android/java/com/google/devtools/build/android/desugar/preanalysis/ClassMetadataCollector.java
index 60b0774..0f4f903 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/preanalysis/ClassMetadataCollector.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/preanalysis/ClassMetadataCollector.java
@@ -22,10 +22,13 @@
 import com.google.devtools.build.android.desugar.langmodel.ClassMemberRecord;
 import com.google.devtools.build.android.desugar.langmodel.ClassMemberRecord.ClassMemberRecordBuilder;
 import com.google.devtools.build.android.desugar.langmodel.ClassName;
+import com.google.devtools.build.android.desugar.langmodel.DesugarClassAttribute;
 import com.google.devtools.build.android.desugar.langmodel.DesugarMethodAttribute;
 import com.google.devtools.build.android.desugar.langmodel.FieldKey;
 import com.google.devtools.build.android.desugar.langmodel.LangModelHelper;
 import com.google.devtools.build.android.desugar.langmodel.MethodKey;
+import com.google.devtools.build.android.desugar.langmodel.SyntheticMethod;
+import com.google.devtools.build.android.desugar.langmodel.SyntheticMethod.SyntheticReason;
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
@@ -84,6 +87,21 @@
   }
 
   @Override
+  public void visitAttribute(Attribute attribute) {
+    if (attribute instanceof DesugarClassAttribute) {
+      DesugarClassAttribute desugarClassAttribute = (DesugarClassAttribute) attribute;
+      for (SyntheticMethod syntheticMethod :
+          desugarClassAttribute.getDesugarClassInfo().getSyntheticMethodList()) {
+        if (SyntheticReason.OVERRIDING_BRIDGE.equals(syntheticMethod.getReason())) {
+          classAttributesBuilder.addDesugarIgnoredMethods(
+              MethodKey.from(syntheticMethod.getMethod()));
+        }
+      }
+    }
+    super.visitAttribute(attribute);
+  }
+
+  @Override
   public FieldVisitor visitField(
       int access, String name, String descriptor, String signature, Object value) {
     if ((access & Opcodes.ACC_PRIVATE) != 0) {