summaryrefslogtreecommitdiff
path: root/java/com/google/devtools/build/android/desugar/ClassReaderFactory.java
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2017-03-14 10:45:24 -0700
committerColin Cross <ccross@android.com>2017-03-14 12:38:17 -0700
commite8cc22765a3016e1dc64008612c123aaf4d36a80 (patch)
tree3d73cbb2c0f93d2163e3a2ceb4ee55a0a6b42898 /java/com/google/devtools/build/android/desugar/ClassReaderFactory.java
parent14eebfcc4518e66afc961c6ec053a3531deb8d35 (diff)
parent52f7c03d041742e9a5aa5a00e26a4ef0c7de2848 (diff)
downloaddesugar-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.java22
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);