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) {