diff options
author | Colin Cross <ccross@android.com> | 2017-03-14 10:45:24 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2017-03-14 12:38:17 -0700 |
commit | e8cc22765a3016e1dc64008612c123aaf4d36a80 (patch) | |
tree | 3d73cbb2c0f93d2163e3a2ceb4ee55a0a6b42898 /java/com/google/devtools/build/android/desugar/ClassReaderFactory.java | |
parent | 14eebfcc4518e66afc961c6ec053a3531deb8d35 (diff) | |
parent | 52f7c03d041742e9a5aa5a00e26a4ef0c7de2848 (diff) | |
download | desugar-e8cc22765a3016e1dc64008612c123aaf4d36a80.tar.gz |
Merge remote-tracking branch 'aosp/upstream-master' into master
* aosp/upstream-master:
Clean up android desugar tool's flags a bit
Change how desugar finds desugared classes to have it working on Windows
Remove bootclasspath fallback in Android desugaring tool
Add an --copy_bridges_from_classpath argument
Desugar calls to Objects.requireNonNull(Object o) to o.getClass()
Avoid factory methods when desugaring stateless lambdas for Android RELNOTES: Avoid factory methods when desugaring stateless lambdas for Android
Remove duplicate class.
More stable naming scheme for lambda classes in desugared android code RELNOTES: More stable naming scheme for lambda classes in desugared android code
Test: m -j ANDROID_COMPILE_WITH_JACK=false
Change-Id: I0ff5b9eb3cac6a020f347c51b79633af13b0576f
Diffstat (limited to 'java/com/google/devtools/build/android/desugar/ClassReaderFactory.java')
-rw-r--r-- | java/com/google/devtools/build/android/desugar/ClassReaderFactory.java | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/java/com/google/devtools/build/android/desugar/ClassReaderFactory.java b/java/com/google/devtools/build/android/desugar/ClassReaderFactory.java index 6ec4e0d..56f99a3 100644 --- a/java/com/google/devtools/build/android/desugar/ClassReaderFactory.java +++ b/java/com/google/devtools/build/android/desugar/ClassReaderFactory.java @@ -15,31 +15,39 @@ package com.google.devtools.build.android.desugar; import java.io.IOException; import java.io.InputStream; +import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.annotation.Nullable; import org.objectweb.asm.ClassReader; class ClassReaderFactory { - private final ZipFile jar; + private final IndexedJars indexedJars; private final CoreLibraryRewriter rewriter; - public ClassReaderFactory(ZipFile jar, CoreLibraryRewriter rewriter) { - this.jar = jar; + public ClassReaderFactory(IndexedJars indexedJars, CoreLibraryRewriter rewriter) { this.rewriter = rewriter; + this.indexedJars = indexedJars; } /** * Returns a reader for the given/internal/Class$Name if the class is defined in the wrapped Jar - * and {@code null} otherwise. For simplicity this method turns checked into runtime excpetions + * and {@code null} otherwise. For simplicity this method turns checked into runtime exceptions * under the assumption that all classes have already been read once when this method is called. */ @Nullable public ClassReader readIfKnown(String internalClassName) { - ZipEntry entry = jar.getEntry(rewriter.unprefix(internalClassName) + ".class"); - if (entry == null) { - return null; + String filename = rewriter.unprefix(internalClassName) + ".class"; + JarFile jarFile = indexedJars.getJarFile(filename); + + if (jarFile != null) { + return getClassReader(internalClassName, jarFile, jarFile.getEntry(filename)); } + + return null; + } + + private ClassReader getClassReader(String internalClassName, ZipFile jar, ZipEntry entry) { try (InputStream bytecode = jar.getInputStream(entry)) { // ClassReader doesn't take ownership and instead eagerly reads the stream's contents return rewriter.reader(bytecode); |