diff options
author | kmb <kmb@google.com> | 2018-02-21 21:34:01 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-02-21 21:36:41 -0800 |
commit | deb99ccfb4e6b236c21e6d425281870aa598804a (patch) | |
tree | daf1155b4cdcbf9af657d79a3fa8fea843fd9e5e /src/tools/android/java/com/google/devtools/build/android/desugar/CoreLibrarySupport.java | |
parent | cfb8a74908459d839c755abcc1c68bfa2ed25f2a (diff) |
add ability to move individual core library methods
RELNOTES: None.
PiperOrigin-RevId: 186565673
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 | 30 |
1 files changed, 29 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 9f0163814e..76eb346b66 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 @@ -16,9 +16,12 @@ package com.google.devtools.build.android.desugar; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; +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.LinkedHashSet; +import java.util.List; import java.util.Objects; import java.util.Set; import javax.annotation.Nullable; @@ -36,9 +39,12 @@ class CoreLibrarySupport { private final ImmutableList<String> renamedPrefixes; /** Internal names of interfaces whose default and static interface methods we'll emulate. */ private final ImmutableList<Class<?>> emulatedInterfaces; + /** Map from {@code owner#name} core library members to their new owners. */ + private final ImmutableMap<String, String> memberMoves; public CoreLibrarySupport(CoreLibraryRewriter rewriter, ClassLoader targetLoader, - ImmutableList<String> renamedPrefixes, ImmutableList<String> emulatedInterfaces) { + ImmutableList<String> renamedPrefixes, ImmutableList<String> emulatedInterfaces, + List<String> memberMoves) { this.rewriter = rewriter; this.targetLoader = targetLoader; checkArgument( @@ -52,6 +58,23 @@ class CoreLibrarySupport { classBuilder.add(clazz); } this.emulatedInterfaces = classBuilder.build(); + + // We can call isRenamed and rename below b/c we initialized the necessary fields above + ImmutableMap.Builder<String, String> movesBuilder = ImmutableMap.builder(); + Splitter splitter = Splitter.on("->").trimResults().omitEmptyStrings(); + for (String move : memberMoves) { + List<String> pair = splitter.splitToList(move); + checkArgument(pair.size() == 2, "Doesn't split as expected: %s", move); + checkArgument(pair.get(0).startsWith("java/"), "Unexpected member: %s", move); + int sep = pair.get(0).indexOf('#'); + checkArgument(sep > 0 && sep == pair.get(0).lastIndexOf('#'), "invalid member: %s", move); + checkArgument(!isRenamedCoreLibrary(pair.get(0).substring(0, sep)), + "Original renamed, no need to move it: %s", move); + checkArgument(isRenamedCoreLibrary(pair.get(1)), "Target not renamed: %s", move); + + movesBuilder.put(pair.get(0), renameCoreLibrary(pair.get(1))); + } + this.memberMoves = movesBuilder.build(); } public boolean isRenamedCoreLibrary(String internalName) { @@ -73,6 +96,11 @@ class CoreLibrarySupport { : internalName; } + @Nullable + public String getMoveTarget(String owner, String name) { + return memberMoves.get(rewriter.unprefix(owner) + '#' + name); + } + /** * Returns {@code true} for java.* classes or interfaces that are subtypes of emulated interfaces. * Note that implies that this method always returns {@code false} for user-written classes. |