diff options
author | kmb <kmb@google.com> | 2018-02-07 11:35:54 -0800 |
---|---|---|
committer | Ivan Gavrilovic <gavra@google.com> | 2018-05-04 10:37:16 +0100 |
commit | c69bee050bf45cc49fc500dd4a495181cb23a645 (patch) | |
tree | 1e987f4b94fe9331e3cdf01fb0cc08a37c1ad0df | |
parent | 40fa0d9a56e8b29219f37cdc8743b63c7b65ab55 (diff) | |
download | desugar-c69bee050bf45cc49fc500dd4a495181cb23a645.tar.gz |
Reflect renamed classes in desugar output file names
RELNOTES: None.
PiperOrigin-RevId: 184869773
GitOrigin-RevId: 005affa263e01afecf913a18edf830670f09c5f3
Change-Id: Ic36dfcf021efdcc29540791af52fa9f19054c671
-rw-r--r-- | java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java | 21 | ||||
-rw-r--r-- | java/com/google/devtools/build/android/desugar/Desugar.java | 31 |
2 files changed, 41 insertions, 11 deletions
diff --git a/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java b/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java index 456fdb5..698fc53 100644 --- a/java/com/google/devtools/build/android/desugar/CoreLibraryRewriter.java +++ b/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/java/com/google/devtools/build/android/desugar/Desugar.java b/java/com/google/devtools/build/android/desugar/Desugar.java index c86b406..ab7a336 100644 --- a/java/com/google/devtools/build/android/desugar/Desugar.java +++ b/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()); } } |