aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android
diff options
context:
space:
mode:
authorGravatar kmb <kmb@google.com>2018-02-10 12:16:21 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-10 12:18:15 -0800
commitf13a7ef7c9eb7ce400ffbbaca0bdc7945172a332 (patch)
tree2705764c389273db06932ceb62e151dd4a2447c0 /src/tools/android
parentd707135d5381a230218e3050a7d1b23e37911020 (diff)
Desugar fixes:
- make Objects.requireNonNull and Long.compare rewrites compatible with --core_library - apply those and try-with-resources rewrites to generated companion classes RELNOTES: None. PiperOrigin-RevId: 185262256
Diffstat (limited to 'src/tools/android')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java35
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/desugar/LongCompareMethodRewriter.java19
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/desugar/ObjectsRequireNonNullMethodRewriter.java30
3 files changed, 56 insertions, 28 deletions
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 109093c978..053e55e760 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
@@ -412,7 +412,9 @@ class Desugar {
interfaceLambdaMethodCollector.build(),
bridgeMethodReader);
- desugarAndWriteGeneratedClasses(outputFileProvider, bootclasspathReader, coreLibrarySupport);
+ desugarAndWriteGeneratedClasses(
+ outputFileProvider, loader, bootclasspathReader, coreLibrarySupport);
+
copyThrowableExtensionClass(outputFileProvider);
byte[] depsInfo = depsCollector.toByteArray();
@@ -586,6 +588,7 @@ class Desugar {
private void desugarAndWriteGeneratedClasses(
OutputFileProvider outputFileProvider,
+ ClassLoader loader,
ClassReaderFactory bootclasspathReader,
@Nullable CoreLibrarySupport coreLibrarySupport)
throws IOException {
@@ -605,6 +608,26 @@ class Desugar {
visitor = new CoreLibraryInvocationRewriter(visitor, coreLibrarySupport);
}
+ if (!allowTryWithResources) {
+ CloseResourceMethodScanner closeResourceMethodScanner = new CloseResourceMethodScanner();
+ generated.getValue().accept(closeResourceMethodScanner);
+ visitor =
+ new TryWithResourcesRewriter(
+ visitor,
+ loader,
+ visitedExceptionTypes,
+ numOfTryWithResourcesInvoked,
+ closeResourceMethodScanner.hasCloseResourceMethod());
+ }
+ if (!allowCallsToObjectsNonNull) {
+ // Not sure whether there will be implicit null check emitted by javac, so we rerun
+ // the inliner again
+ visitor = new ObjectsRequireNonNullMethodRewriter(visitor, rewriter);
+ }
+ if (!allowCallsToLongCompare) {
+ visitor = new LongCompareMethodRewriter(visitor, rewriter);
+ }
+
visitor = new Java7Compatibility(visitor, (ClassReaderFactory) null, bootclasspathReader);
generated.getValue().accept(visitor);
checkState(
@@ -651,10 +674,10 @@ class Desugar {
if (!allowCallsToObjectsNonNull) {
// Not sure whether there will be implicit null check emitted by javac, so we rerun
// the inliner again
- visitor = new ObjectsRequireNonNullMethodRewriter(visitor);
+ visitor = new ObjectsRequireNonNullMethodRewriter(visitor, rewriter);
}
if (!allowCallsToLongCompare) {
- visitor = new LongCompareMethodRewriter(visitor);
+ visitor = new LongCompareMethodRewriter(visitor, rewriter);
}
if (outputJava7) {
// null ClassReaderFactory b/c we don't expect to need it for lambda classes
@@ -730,10 +753,10 @@ class Desugar {
closeResourceMethodScanner.hasCloseResourceMethod());
}
if (!allowCallsToObjectsNonNull) {
- visitor = new ObjectsRequireNonNullMethodRewriter(visitor);
+ visitor = new ObjectsRequireNonNullMethodRewriter(visitor, rewriter);
}
if (!allowCallsToLongCompare) {
- visitor = new LongCompareMethodRewriter(visitor);
+ visitor = new LongCompareMethodRewriter(visitor, rewriter);
}
if (!options.onlyDesugarJavac9ForLint) {
if (outputJava7) {
@@ -840,7 +863,7 @@ class Desugar {
return dumpDirectory;
}
- private static DesugarOptions parseCommandLineOptions(String[] args) throws IOException {
+ private static DesugarOptions parseCommandLineOptions(String[] args) {
OptionsParser parser = OptionsParser.newOptionsParser(DesugarOptions.class);
parser.setAllowResidue(false);
parser.enableParamsFileSupport(new ShellQuotedParamsFilePreProcessor(FileSystems.getDefault()));
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/LongCompareMethodRewriter.java b/src/tools/android/java/com/google/devtools/build/android/desugar/LongCompareMethodRewriter.java
index f66d862365..6ac415df5b 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/LongCompareMethodRewriter.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/LongCompareMethodRewriter.java
@@ -26,8 +26,11 @@ import org.objectweb.asm.MethodVisitor;
*/
public class LongCompareMethodRewriter extends ClassVisitor {
- public LongCompareMethodRewriter(ClassVisitor cv) {
+ private final CoreLibraryRewriter rewriter;
+
+ public LongCompareMethodRewriter(ClassVisitor cv, CoreLibraryRewriter rewriter) {
super(ASM6, cv);
+ this.rewriter = rewriter;
}
@Override
@@ -37,7 +40,7 @@ public class LongCompareMethodRewriter extends ClassVisitor {
return visitor == null ? visitor : new LongCompareMethodVisitor(visitor);
}
- private static class LongCompareMethodVisitor extends MethodVisitor {
+ private class LongCompareMethodVisitor extends MethodVisitor {
public LongCompareMethodVisitor(MethodVisitor visitor) {
super(ASM6, visitor);
@@ -45,14 +48,14 @@ public class LongCompareMethodRewriter extends ClassVisitor {
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
- if (opcode != INVOKESTATIC
- || !owner.equals("java/lang/Long")
- || !name.equals("compare")
- || !desc.equals("(JJ)I")) {
+ if (opcode == INVOKESTATIC
+ && rewriter.unprefix(owner).equals("java/lang/Long")
+ && name.equals("compare")
+ && desc.equals("(JJ)I")) {
+ super.visitInsn(LCMP);
+ } else {
super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
}
- super.visitInsn(LCMP);
}
}
}
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/ObjectsRequireNonNullMethodRewriter.java b/src/tools/android/java/com/google/devtools/build/android/desugar/ObjectsRequireNonNullMethodRewriter.java
index 86465d6bfa..5e0a3441a7 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/ObjectsRequireNonNullMethodRewriter.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/ObjectsRequireNonNullMethodRewriter.java
@@ -29,8 +29,11 @@ import org.objectweb.asm.MethodVisitor;
*/
public class ObjectsRequireNonNullMethodRewriter extends ClassVisitor {
- public ObjectsRequireNonNullMethodRewriter(ClassVisitor cv) {
+ private final CoreLibraryRewriter rewriter;
+
+ public ObjectsRequireNonNullMethodRewriter(ClassVisitor cv, CoreLibraryRewriter rewriter) {
super(ASM6, cv);
+ this.rewriter = rewriter;
}
@Override
@@ -40,7 +43,7 @@ public class ObjectsRequireNonNullMethodRewriter extends ClassVisitor {
return visitor == null ? visitor : new ObjectsMethodInlinerMethodVisitor(visitor);
}
- private static class ObjectsMethodInlinerMethodVisitor extends MethodVisitor {
+ private class ObjectsMethodInlinerMethodVisitor extends MethodVisitor {
public ObjectsMethodInlinerMethodVisitor(MethodVisitor mv) {
super(ASM6, mv);
@@ -48,20 +51,19 @@ public class ObjectsRequireNonNullMethodRewriter extends ClassVisitor {
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
- if (opcode != INVOKESTATIC
- || !owner.equals("java/util/Objects")
- || !name.equals("requireNonNull")
- || !desc.equals("(Ljava/lang/Object;)Ljava/lang/Object;")) {
+ if (opcode == INVOKESTATIC
+ && rewriter.unprefix(owner).equals("java/util/Objects")
+ && name.equals("requireNonNull")
+ && desc.equals("(Ljava/lang/Object;)Ljava/lang/Object;")) {
+ // a call to Objects.requireNonNull(Object o)
+ // duplicate the first argument 'o', as this method returns 'o'.
+ super.visitInsn(DUP);
+ super.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+ super.visitInsn(POP);
+ } else {
super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
}
-
- // a call to Objects.requireNonNull(Object o)
- // duplicate the first argument 'o', as this method returns 'o'.
- super.visitInsn(DUP);
- super.visitMethodInsn(
- INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
- super.visitInsn(POP);
}
}
}