diff options
author | kmb <kmb@google.com> | 2018-02-07 11:35:54 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-02-07 11:37:58 -0800 |
commit | 005affa263e01afecf913a18edf830670f09c5f3 (patch) | |
tree | 163d0d2d787f072d1c81256397af444e1e0a376f /src/tools/android/java/com/google/devtools/build/android/desugar | |
parent | 5b35c5cea86d45c382f8e13c07a59f961ded4070 (diff) |
Reflect renamed classes in desugar output file names
RELNOTES: None.
PiperOrigin-RevId: 184869773
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/desugar')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java | 21 | ||||
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java | 31 |
2 files changed, 41 insertions, 11 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java b/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java index 456fdb531e..698fc53a39 100644 --- a/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java +++ b/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java @@ -15,6 +15,7 @@ package com.google.devtools.build.android.desugar; import java.io.IOException; import java.io.InputStream; +import javax.annotation.Nullable; import org.objectweb.asm.Attribute; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -156,6 +157,8 @@ class CoreLibraryRewriter { public class UnprefixingClassWriter extends ClassVisitor { private final ClassWriter writer; + private String finalClassName; + UnprefixingClassWriter(int flags) { super(Opcodes.ASM6); this.writer = new ClassWriter(flags); @@ -173,8 +176,26 @@ class CoreLibraryRewriter { } } + /** Returns the (unprefixed) name of the class once written. */ + @Nullable + String getClassName() { + return finalClassName; + } + byte[] toByteArray() { return writer.toByteArray(); } + + @Override + public void visit( + int version, + int access, + String name, + String signature, + String superName, + String[] interfaces) { + finalClassName = unprefix(name); + super.visit(version, access, name, signature, superName, interfaces); + } } } 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 c86b4068ac..ab7a336c66 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 @@ -482,16 +482,16 @@ class Desugar { ClassVsInterface interfaceCache, ImmutableSet.Builder<String> interfaceLambdaMethodCollector) throws IOException { - for (String filename : inputFiles) { - if (OutputFileProvider.DESUGAR_DEPS_FILENAME.equals(filename)) { + for (String inputFilename : inputFiles) { + if (OutputFileProvider.DESUGAR_DEPS_FILENAME.equals(inputFilename)) { // TODO(kmb): rule out that this happens or merge input file with what's in depsCollector continue; // skip as we're writing a new file like this at the end or don't want it } - try (InputStream content = inputFiles.getInputStream(filename)) { + try (InputStream content = inputFiles.getInputStream(inputFilename)) { // We can write classes uncompressed since they need to be converted to .dex format // for Android anyways. Resources are written as they were in the input jar to avoid // any danger of accidentally uncompressed resources ending up in an .apk. - if (filename.endsWith(".class")) { + if (inputFilename.endsWith(".class")) { ClassReader reader = rewriter.reader(content); UnprefixingClassWriter writer = rewriter.writer(ClassWriter.COMPUTE_MAXS); ClassVisitor visitor = @@ -507,13 +507,17 @@ class Desugar { reader); if (writer == visitor) { // Just copy the input if there are no rewritings - outputFileProvider.write(filename, reader.b); + outputFileProvider.write(inputFilename, reader.b); } else { reader.accept(visitor, 0); + String filename = writer.getClassName() + ".class"; + checkState( + (options.coreLibrary && coreLibrarySupport != null) + || filename.equals(inputFilename)); outputFileProvider.write(filename, writer.toByteArray()); } } else { - outputFileProvider.copyFrom(filename, inputFiles); + outputFileProvider.copyFrom(inputFilename, inputFiles); } } } @@ -569,9 +573,12 @@ class Desugar { writer, reader); reader.accept(visitor, 0); - String filename = - rewriter.unprefix(lambdaClass.getValue().desiredInternalName()) + ".class"; - outputFileProvider.write(filename, writer.toByteArray()); + checkState( + (options.coreLibrary && coreLibrarySupport != null) + || rewriter + .unprefix(lambdaClass.getValue().desiredInternalName()) + .equals(writer.getClassName())); + outputFileProvider.write(writer.getClassName() + ".class", writer.toByteArray()); } } } @@ -599,8 +606,10 @@ class Desugar { visitor = new Java7Compatibility(visitor, (ClassReaderFactory) null, bootclasspathReader); generated.getValue().accept(visitor); - String filename = rewriter.unprefix(generated.getKey()) + ".class"; - outputFileProvider.write(filename, writer.toByteArray()); + checkState( + (options.coreLibrary && coreLibrarySupport != null) + || rewriter.unprefix(generated.getKey()).equals(writer.getClassName())); + outputFileProvider.write(writer.getClassName() + ".class", writer.toByteArray()); } } |