diff options
author | kmb <kmb@google.com> | 2018-02-22 14:32:56 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-02-22 14:34:35 -0800 |
commit | f13d6f5b153d8713a8af7e2ba0d5dce0e9a577e8 (patch) | |
tree | 820407fa003f8940aa80852a5e84472bbcd594f0 /src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java | |
parent | 702429bbc4d84c0da2499297a2d249237f5e6257 (diff) |
Add a check to avoid core library default methods that (accidentally) aren't being desugared.
RELNOTES: None.
PiperOrigin-RevId: 186675372
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java b/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java index 76eb346b66..72c7eddaad 100644 --- a/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java +++ b/src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java @@ -20,6 +20,7 @@ import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import java.lang.reflect.Method; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -159,7 +160,24 @@ class CoreLibrarySupport { // we can only get here if its a default method, and invokestatic we handled above. Method callee = findInterfaceMethod(clazz, name, desc); if (callee != null && callee.isDefault()) { - return callee.getDeclaringClass(); + Class<?> result = callee.getDeclaringClass(); + if (isRenamedCoreLibrary(result.getName().replace('.', '/')) + || emulatedInterfaces.stream().anyMatch(emulated -> emulated.isAssignableFrom(result))) { + return result; + } + // We get here if the declaring class is a supertype of an emulated interface. In that case + // use the emulated interface instead (since we don't desugar the supertype). Fail in case + // there are multiple possibilities. + Iterator<Class<?>> roots = + emulatedInterfaces + .stream() + .filter( + emulated -> emulated.isAssignableFrom(clazz) && result.isAssignableFrom(emulated)) + .iterator(); + checkState(roots.hasNext()); // must exist + Class<?> substitute = roots.next(); + checkState(!roots.hasNext(), "Ambiguous emulation substitute: %s", callee); + return substitute; } else { checkArgument(opcode != Opcodes.INVOKESPECIAL, "Couldn't resolve interface super call %s.super.%s : %s", owner, name, desc); |