Fix FileChannelMapMode rewriting

Bug: 222647019
Change-Id: If4fefc393ad5a46f95fb72535228870c489bce35
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_path.json b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
index 010492e..d8bf9f2 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_path.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
@@ -128,6 +128,9 @@
         "java.util.function.": "j$.util.function.",
         "java.util.stream.": "j$.util.stream."
       },
+      "dont_rewrite_prefix": [
+        "java.nio.channels.FileChannel$MapMode"
+      ],
       "maintain_prefix": [
         "java.io.UncheckedIOException"
       ],
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
index 1663694..027a2ae 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
@@ -52,6 +52,7 @@
   static final String WRAPPER_CONVERSION_EXCLUDING_KEY = "wrapper_conversion_excluding";
   static final String CUSTOM_CONVERSION_KEY = "custom_conversion";
   static final String REWRITE_PREFIX_KEY = "rewrite_prefix";
+  static final String DONT_REWRITE_PREFIX_KEY = "dont_rewrite_prefix";
   static final String MAINTAIN_PREFIX_KEY = "maintain_prefix";
   static final String RETARGET_STATIC_FIELD_KEY = "retarget_static_field";
   static final String RETARGET_METHOD_KEY = "retarget_method";
@@ -255,6 +256,12 @@
         builder.putMaintainPrefix(maintainPrefix.getAsString());
       }
     }
+    if (jsonFlagSet.has(DONT_REWRITE_PREFIX_KEY)) {
+      for (JsonElement dontRewritePrefix :
+          jsonFlagSet.get(DONT_REWRITE_PREFIX_KEY).getAsJsonArray()) {
+        builder.putDontRewritePrefix(dontRewritePrefix.getAsString());
+      }
+    }
     if (jsonFlagSet.has(REWRITE_DERIVED_PREFIX_KEY)) {
       for (Map.Entry<String, JsonElement> prefixToMatch :
           jsonFlagSet.get(REWRITE_DERIVED_PREFIX_KEY).getAsJsonObject().entrySet()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
index 50e98e1..fc5bcca 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
@@ -26,6 +26,7 @@
 public class HumanRewritingFlags {
 
   private final Map<String, String> rewritePrefix;
+  private final Set<String> dontRewritePrefix;
   private final Set<String> maintainPrefix;
   private final Map<String, Map<String, String>> rewriteDerivedPrefix;
   private final Map<DexType, DexType> emulatedInterfaces;
@@ -42,6 +43,7 @@
 
   HumanRewritingFlags(
       Map<String, String> rewritePrefix,
+      Set<String> dontRewritePrefix,
       Set<String> maintainPrefix,
       Map<String, Map<String, String>> rewriteDerivedPrefix,
       Map<DexType, DexType> emulateLibraryInterface,
@@ -56,6 +58,7 @@
       Map<DexMethod, MethodAccessFlags> amendLibraryMethod,
       Map<DexField, FieldAccessFlags> amendLibraryField) {
     this.rewritePrefix = rewritePrefix;
+    this.dontRewritePrefix = dontRewritePrefix;
     this.maintainPrefix = maintainPrefix;
     this.rewriteDerivedPrefix = rewriteDerivedPrefix;
     this.emulatedInterfaces = emulateLibraryInterface;
@@ -75,6 +78,7 @@
     return new HumanRewritingFlags(
         ImmutableMap.of(),
         ImmutableSet.of(),
+        ImmutableSet.of(),
         ImmutableMap.of(),
         ImmutableMap.of(),
         ImmutableMap.of(),
@@ -98,6 +102,7 @@
         reporter,
         origin,
         rewritePrefix,
+        dontRewritePrefix,
         maintainPrefix,
         rewriteDerivedPrefix,
         emulatedInterfaces,
@@ -117,6 +122,10 @@
     return rewritePrefix;
   }
 
+  public Set<String> getDontRewritePrefix() {
+    return dontRewritePrefix;
+  }
+
   public Set<String> getMaintainPrefix() {
     return maintainPrefix;
   }
@@ -185,6 +194,7 @@
     private final Origin origin;
 
     private final Map<String, String> rewritePrefix;
+    private final Set<String> dontRewritePrefix;
     private final Set<String> maintainPrefix;
     private final Map<String, Map<String, String>> rewriteDerivedPrefix;
     private final Map<DexType, DexType> emulatedInterfaces;
@@ -205,6 +215,7 @@
           origin,
           new HashMap<>(),
           Sets.newIdentityHashSet(),
+          Sets.newIdentityHashSet(),
           new HashMap<>(),
           new IdentityHashMap<>(),
           new IdentityHashMap<>(),
@@ -223,6 +234,7 @@
         Reporter reporter,
         Origin origin,
         Map<String, String> rewritePrefix,
+        Set<String> dontRewritePrefix,
         Set<String> maintainPrefix,
         Map<String, Map<String, String>> rewriteDerivedPrefix,
         Map<DexType, DexType> emulateLibraryInterface,
@@ -239,6 +251,7 @@
       this.reporter = reporter;
       this.origin = origin;
       this.rewritePrefix = new HashMap<>(rewritePrefix);
+      this.dontRewritePrefix = Sets.newHashSet(dontRewritePrefix);
       this.maintainPrefix = Sets.newHashSet(maintainPrefix);
       this.rewriteDerivedPrefix = new HashMap<>(rewriteDerivedPrefix);
       this.emulatedInterfaces = new IdentityHashMap<>(emulateLibraryInterface);
@@ -281,6 +294,11 @@
       return this;
     }
 
+    public Builder putDontRewritePrefix(String prefix) {
+      dontRewritePrefix.add(prefix);
+      return this;
+    }
+
     public Builder putMaintainPrefix(String prefix) {
       maintainPrefix.add(prefix);
       return this;
@@ -385,6 +403,7 @@
       validate();
       return new HumanRewritingFlags(
           ImmutableMap.copyOf(rewritePrefix),
+          ImmutableSet.copyOf(dontRewritePrefix),
           ImmutableSet.copyOf(maintainPrefix),
           ImmutableMap.copyOf(rewriteDerivedPrefix),
           ImmutableMap.copyOf(emulatedInterfaces),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
index 50a0190..8cb5743 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
@@ -27,6 +27,7 @@
   private final boolean libraryCompilation;
   private final Map<DexString, DexString> descriptorPrefix;
   private final Set<DexString> descriptorMaintainPrefix;
+  private final Set<DexString> descriptorDontRewritePrefix;
   private final Map<DexString, Map<DexString, DexString>> descriptorDifferentPrefix;
   private final Set<DexString> usedPrefix = Sets.newIdentityHashSet();
 
@@ -40,7 +41,8 @@
     this.synthesizedPrefix = humanSpec.getSynthesizedLibraryClassesPackagePrefix();
     this.libraryCompilation = humanSpec.isLibraryCompilation();
     this.descriptorPrefix = convertRewritePrefix(rewritingFlags.getRewritePrefix());
-    this.descriptorMaintainPrefix = convertMaintainPrefix(rewritingFlags.getMaintainPrefix());
+    this.descriptorDontRewritePrefix = convertPrefixSet(rewritingFlags.getDontRewritePrefix());
+    this.descriptorMaintainPrefix = convertPrefixSet(rewritingFlags.getMaintainPrefix());
     this.descriptorDifferentPrefix =
         convertRewriteDifferentPrefix(rewritingFlags.getRewriteDerivedPrefix());
   }
@@ -115,6 +117,9 @@
   private void registerType(DexType type) {
     DexType rewrittenType = rewrittenType(type);
     if (rewrittenType != null) {
+      if (prefixMatching(type, descriptorDontRewritePrefix) != null) {
+        return;
+      }
       builder.rewriteType(type, rewrittenType);
     }
   }
@@ -179,7 +184,7 @@
     return mapBuilder.build();
   }
 
-  private ImmutableSet<DexString> convertMaintainPrefix(Set<String> maintainPrefix) {
+  private ImmutableSet<DexString> convertPrefixSet(Set<String> maintainPrefix) {
     ImmutableSet.Builder<DexString> builder = ImmutableSet.builder();
     for (String prefix : maintainPrefix) {
       builder.add(toDescriptorPrefix(prefix));