Support U apis in desugared library

- Support for StackWalker#walk

Bug: b/242548283
Change-Id: I33bcff5e84133e8642412c600d07fce994646183
diff --git a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
index 2b46e36..d412e52 100644
--- a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
+++ b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
@@ -21,6 +21,7 @@
           "j$/util/stream/Collector$Characteristics");
   private static final Set<String> WRAP_CONVERT_OWNER =
       ImmutableSet.of(
+          "j$/util/stream/Stream",
           "j$/nio/file/spi/FileSystemProvider",
           "j$/nio/file/spi/FileTypeDetector",
           "j$/nio/file/Path",
diff --git a/src/library_desugar/java/j$/util/stream/Stream.java b/src/library_desugar/java/j$/util/stream/Stream.java
new file mode 100644
index 0000000..70c761a
--- /dev/null
+++ b/src/library_desugar/java/j$/util/stream/Stream.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package j$.util.stream;
+
+public class Stream<T> {
+
+  public static java.util.stream.Stream<?> inverted_wrap_convert(j$.util.stream.Stream<?> stream) {
+    return null;
+  }
+
+  public static j$.util.stream.Stream<?> inverted_wrap_convert(java.util.stream.Stream<?> stream) {
+    return null;
+  }
+}
diff --git a/src/library_desugar/java/java/util/stream/StackWalkerApiFlips.java b/src/library_desugar/java/java/util/stream/StackWalkerApiFlips.java
new file mode 100644
index 0000000..300c5ad
--- /dev/null
+++ b/src/library_desugar/java/java/util/stream/StackWalkerApiFlips.java
@@ -0,0 +1,44 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package java.util.stream;
+
+import static java.util.ConversionRuntimeException.exception;
+
+import java.util.function.Function;
+
+public class StackWalkerApiFlips {
+
+  public static Function<?, ?> flipFunctionStream(Function<?, ?> stackWalker) {
+    return new FunctionStreamWrapper<>(stackWalker);
+  }
+
+  public static class FunctionStreamWrapper<T, R> implements Function<T, R> {
+
+    public Function<T, R> function;
+
+    public FunctionStreamWrapper(Function<T, R> function) {
+      this.function = function;
+    }
+
+    private T flipStream(T maybeStream) {
+      if (maybeStream == null) {
+        return null;
+      }
+      if (maybeStream instanceof java.util.stream.Stream<?>) {
+        return (T)
+            j$.util.stream.Stream.inverted_wrap_convert((java.util.stream.Stream<?>) maybeStream);
+      }
+      if (maybeStream instanceof j$.util.stream.Stream<?>) {
+        return (T)
+            j$.util.stream.Stream.inverted_wrap_convert((j$.util.stream.Stream<?>) maybeStream);
+      }
+      throw exception("java.util.stream.Stream", maybeStream.getClass());
+    }
+
+    public R apply(T arg) {
+      return function.apply(flipStream(arg));
+    }
+  }
+}
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index 5f68c31..3eaff97 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -99,8 +99,12 @@
         "java.util.Spliterator java.util.LinkedHashSet#spliterator()": "java.util.DesugarLinkedHashSet"
       },
       "api_generic_types_conversion": {
-        "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"]
+        "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"],
+        "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)": [0, "java.util.function.Function java.util.stream.StackWalkerApiFlips#flipFunctionStream(java.util.function.Function)"]
       },
+      "never_outline_api": [
+        "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)"
+      ],
       "wrapper_conversion": [
         "java.util.PrimitiveIterator$OfDouble",
         "java.util.PrimitiveIterator$OfInt",
@@ -226,6 +230,9 @@
         },
         "java.util.Optional": {
           "j$.util.Optional": "java.util.Optional"
+        },
+        "java.util.stream.Stream": {
+          "j$.util.stream.Stream": "java.util.stream.Stream"
         }
       }
     }
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_path.json b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
index db95ccf..6b258dd 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_path.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
@@ -236,8 +236,12 @@
         "java.util.Spliterator java.util.LinkedHashSet#spliterator()": "java.util.DesugarLinkedHashSet"
       },
       "api_generic_types_conversion": {
-        "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"]
+        "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"],
+        "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)": [0, "java.util.function.Function java.util.stream.StackWalkerApiFlips#flipFunctionStream(java.util.function.Function)"]
       },
+      "never_outline_api": [
+        "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)"
+      ],
       "wrapper_conversion": [
         "java.nio.channels.SeekableByteChannel",
         "java.util.PrimitiveIterator$OfDouble",
@@ -436,6 +440,9 @@
         },
         "java.util.Optional": {
           "j$.util.Optional": "java.util.Optional"
+        },
+        "java.util.stream.Stream": {
+          "j$.util.stream.Stream": "java.util.stream.Stream"
         }
       }
     },
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index b4ece95..eeebd32 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -148,6 +148,14 @@
     if (isAlreadyDesugared(invoke, context)) {
       return false;
     }
+    if (appView
+            .options()
+            .machineDesugaredLibrarySpecification
+            .getApiGenericConversion()
+            .get(invokedMethod.getReference())
+        != null) {
+      return true;
+    }
     return appView.typeRewriter.hasRewrittenTypeInSignature(invokedMethod.getProto(), appView);
   }
 
@@ -262,6 +270,15 @@
     }
     DexClassAndMethod methodForDesugaring = getMethodForDesugaring(invoke, context);
     assert methodForDesugaring != null;
+    // Specific apis that we never want to outline, namely, apis for stack introspection since it
+    // confuses developers in debug mode.
+    if (appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .getNeverOutlineApi()
+        .contains(methodForDesugaring.getReference())) {
+      return false;
+    }
     return methodForDesugaring.getAccessFlags().isPublic();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
index 0e6bd6a..94bd06b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
@@ -586,6 +586,11 @@
                 appView.dexItemFactory().createProto(newReturnType, newParameterTypes),
                 method.name);
     assert convertedAPI == methodWithVivifiedTypeInSignature(method, newHolder, appView)
+        || appView
+            .options()
+            .machineDesugaredLibrarySpecification
+            .getApiGenericConversion()
+            .containsKey(method)
         || invalidType(method, returnConversion, parameterConversions, appView) != null;
     return convertedAPI;
   }
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 0be57c5..16c578b 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
@@ -56,6 +56,7 @@
   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 NEVER_OUTLINE_API_KEY = "never_outline_api";
   static final String COVARIANT_RETARGET_METHOD_KEY = "covariant_retarget_method";
   static final String RETARGET_METHOD_KEY = "retarget_method";
   static final String RETARGET_METHOD_EMULATED_DISPATCH_KEY =
@@ -264,6 +265,11 @@
         builder.putDontRewritePrefix(dontRewritePrefix.getAsString());
       }
     }
+    if (jsonFlagSet.has(NEVER_OUTLINE_API_KEY)) {
+      for (JsonElement neverOutlineApi : jsonFlagSet.get(NEVER_OUTLINE_API_KEY).getAsJsonArray()) {
+        builder.neverOutlineApi(parseMethod(neverOutlineApi.getAsString()));
+      }
+    }
     if (jsonFlagSet.has(API_GENERIC_TYPES_CONVERSION)) {
       for (Map.Entry<String, JsonElement> methodAndDescription :
           jsonFlagSet.get(API_GENERIC_TYPES_CONVERSION).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 a927cdf..8c4316f 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
@@ -40,6 +40,7 @@
   private final Set<DexMethod> dontRewriteInvocation;
   private final Set<DexType> dontRetarget;
   private final Map<DexType, Set<DexMethod>> wrapperConversions;
+  private final Set<DexMethod> neverOutlineApi;
   private final Map<DexMethod, MethodAccessFlags> amendLibraryMethod;
   private final Map<DexField, FieldAccessFlags> amendLibraryField;
 
@@ -59,6 +60,7 @@
       Set<DexMethod> dontRewriteInvocation,
       Set<DexType> dontRetarget,
       Map<DexType, Set<DexMethod>> wrapperConversion,
+      Set<DexMethod> neverOutlineApi,
       Map<DexMethod, MethodAccessFlags> amendLibraryMethod,
       Map<DexField, FieldAccessFlags> amendLibraryField) {
     this.rewritePrefix = rewritePrefix;
@@ -76,6 +78,7 @@
     this.dontRewriteInvocation = dontRewriteInvocation;
     this.dontRetarget = dontRetarget;
     this.wrapperConversions = wrapperConversion;
+    this.neverOutlineApi = neverOutlineApi;
     this.amendLibraryMethod = amendLibraryMethod;
     this.amendLibraryField = amendLibraryField;
   }
@@ -97,6 +100,7 @@
         ImmutableSet.of(),
         ImmutableSet.of(),
         ImmutableMap.of(),
+        ImmutableSet.of(),
         ImmutableMap.of(),
         ImmutableMap.of());
   }
@@ -124,6 +128,7 @@
         dontRewriteInvocation,
         dontRetarget,
         wrapperConversions,
+        neverOutlineApi,
         amendLibraryMethod,
         amendLibraryField);
   }
@@ -164,6 +169,10 @@
     return retargetMethodEmulatedDispatch;
   }
 
+  public Set<DexMethod> getNeverOutlineApi() {
+    return neverOutlineApi;
+  }
+
   public Map<DexMethod, DexMethod[]> getApiGenericConversion() {
     return apiGenericTypesConversion;
   }
@@ -227,6 +236,7 @@
     private final Set<DexMethod> dontRewriteInvocation;
     private final Set<DexType> dontRetarget;
     private final Map<DexType, Set<DexMethod>> wrapperConversions;
+    private final Set<DexMethod> neverOutlineApi;
     private final Map<DexMethod, MethodAccessFlags> amendLibraryMethod;
     private final Map<DexField, FieldAccessFlags> amendLibraryField;
 
@@ -249,6 +259,7 @@
           Sets.newIdentityHashSet(),
           Sets.newIdentityHashSet(),
           new IdentityHashMap<>(),
+          Sets.newIdentityHashSet(),
           new IdentityHashMap<>(),
           new IdentityHashMap<>());
     }
@@ -271,6 +282,7 @@
         Set<DexMethod> dontRewriteInvocation,
         Set<DexType> dontRetargetLibMember,
         Map<DexType, Set<DexMethod>> wrapperConversions,
+        Set<DexMethod> neverOutlineApi,
         Map<DexMethod, MethodAccessFlags> amendLibraryMethod,
         Map<DexField, FieldAccessFlags> amendLibraryField) {
       this.reporter = reporter;
@@ -292,6 +304,8 @@
       this.dontRetarget = Sets.newIdentityHashSet();
       this.dontRetarget.addAll(dontRetargetLibMember);
       this.wrapperConversions = new IdentityHashMap<>(wrapperConversions);
+      this.neverOutlineApi = Sets.newIdentityHashSet();
+      this.neverOutlineApi.addAll(neverOutlineApi);
       this.amendLibraryMethod = new IdentityHashMap<>(amendLibraryMethod);
       this.amendLibraryField = new IdentityHashMap<>(amendLibraryField);
     }
@@ -439,6 +453,11 @@
       return this;
     }
 
+    public Builder neverOutlineApi(DexMethod method) {
+      neverOutlineApi.add(method);
+      return this;
+    }
+
     public Builder amendLibraryField(DexField member, FieldAccessFlags flags) {
       amendLibraryField.put(member, flags);
       return this;
@@ -462,6 +481,7 @@
           ImmutableSet.copyOf(dontRewriteInvocation),
           ImmutableSet.copyOf(dontRetarget),
           ImmutableMap.copyOf(wrapperConversions),
+          ImmutableSet.copyOf(neverOutlineApi),
           ImmutableMap.copyOf(amendLibraryMethod),
           ImmutableMap.copyOf(amendLibraryField));
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
index 3de3ac0..e93c6c6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
@@ -143,7 +143,10 @@
   }
 
   private static Path getAndroidJarPath(AndroidApiLevel apiLevel) {
-    String jar = String.format(ANDROID_JAR_PATTERN, apiLevel.getLevel());
+    String jar =
+        apiLevel == AndroidApiLevel.MASTER
+            ? "third_party/android_jar/lib-master/android.jar"
+            : String.format(ANDROID_JAR_PATTERN, apiLevel.getLevel());
     return Paths.get(jar);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 1b83bf8..0278766 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -180,6 +180,10 @@
     return rewritingFlags.getCustomConversions();
   }
 
+  public Set<DexMethod> getNeverOutlineApi() {
+    return rewritingFlags.getNeverOutlineApi();
+  }
+
   public Map<DexMethod, MethodAccessFlags> getAmendLibraryMethods() {
     return rewritingFlags.getAmendLibraryMethod();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
index 523042f..6d3f489 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -42,6 +42,7 @@
       Map<DexType, DexType> legacyBackport,
       Set<DexType> dontRetarget,
       Map<DexType, CustomConversionDescriptor> customConversions,
+      Set<DexMethod> neverOutlineApi,
       Map<DexMethod, MethodAccessFlags> amendLibraryMethods,
       Map<DexField, FieldAccessFlags> amendLibraryFields) {
     this.rewriteType = rewriteType;
@@ -60,6 +61,7 @@
     this.legacyBackport = legacyBackport;
     this.dontRetarget = dontRetarget;
     this.customConversions = customConversions;
+    this.neverOutlineApi = neverOutlineApi;
     this.amendLibraryMethod = amendLibraryMethods;
     this.amendLibraryField = amendLibraryFields;
   }
@@ -106,6 +108,7 @@
   private final Map<DexType, DexType> legacyBackport;
   private final Set<DexType> dontRetarget;
   private final Map<DexType, CustomConversionDescriptor> customConversions;
+  private final Set<DexMethod> neverOutlineApi;
   private final Map<DexMethod, MethodAccessFlags> amendLibraryMethod;
   private final Map<DexField, FieldAccessFlags> amendLibraryField;
 
@@ -183,6 +186,10 @@
     return customConversions;
   }
 
+  public Set<DexMethod> getNeverOutlineApi() {
+    return neverOutlineApi;
+  }
+
   public Map<DexMethod, MethodAccessFlags> getAmendLibraryMethod() {
     return amendLibraryMethod;
   }
@@ -253,6 +260,7 @@
     private final ImmutableSet.Builder<DexType> dontRetarget = ImmutableSet.builder();
     private final ImmutableMap.Builder<DexType, CustomConversionDescriptor> customConversions =
         ImmutableMap.builder();
+    private final ImmutableSet.Builder<DexMethod> neverOutlineApi = ImmutableSet.builder();
     private final ImmutableMap.Builder<DexMethod, MethodAccessFlags> amendLibraryMethod =
         ImmutableMap.builder();
     private final ImmutableMap.Builder<DexField, FieldAccessFlags> amendLibraryField =
@@ -311,6 +319,10 @@
       this.wrappers.put(type, descriptor);
     }
 
+    public void neverOutlineApi(DexMethod method) {
+      neverOutlineApi.add(method);
+    }
+
     public void putLegacyBackport(DexType src, DexType target) {
       legacyBackport.put(src, target);
     }
@@ -370,6 +382,7 @@
           legacyBackport.build(),
           dontRetarget.build(),
           customConversions.build(),
+          neverOutlineApi.build(),
           amendLibraryMethod.build(),
           amendLibraryField.build());
     }
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 51262ef..520533b 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
@@ -55,6 +55,7 @@
     rewriteValues(rewritingFlags.getCustomConversions());
     rewriteEmulatedInterface(rewritingFlags.getEmulatedInterfaces());
     rewriteRetargetKeys(rewritingFlags.getRetargetMethodEmulatedDispatch());
+    rewriteApiConversions(rewritingFlags.getApiGenericConversion());
     warnIfUnusedPrefix(warnConsumer);
   }
 
@@ -85,6 +86,17 @@
     }
   }
 
+  private void rewriteApiConversions(Map<DexMethod, DexMethod[]> apiGenericConversions) {
+    apiGenericConversions.forEach(
+        (k, v) -> {
+          for (DexMethod dexMethod : v) {
+            if (dexMethod != null) {
+              registerClassType(dexMethod.getHolderType());
+            }
+          }
+        });
+  }
+
   private void rewriteEmulatedInterface(Map<DexType, DexType> emulateLibraryInterface) {
     emulateLibraryInterface.forEach(builder::rewriteDerivedTypeOnly);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
index eb333a7..2773de6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
@@ -129,6 +129,7 @@
     rewritingFlags.getAmendLibraryMethod().forEach(builder::amendLibraryMethod);
     rewritingFlags.getAmendLibraryField().forEach(builder::amendLibraryField);
     rewritingFlags.getApiGenericConversion().forEach(builder::addApiGenericTypesConversion);
+    rewritingFlags.getNeverOutlineApi().forEach(builder::neverOutlineApi);
     new HumanToMachineRetargetConverter(appInfo)
         .convertRetargetFlags(rewritingFlags, builder, this::warnMissingReferences);
     new HumanToMachineEmulatedInterfaceConverter(appInfo)
diff --git a/src/test/examplesJava9/stackwalker/Example.java b/src/test/examplesJava9/stackwalker/Example.java
new file mode 100644
index 0000000..6208060
--- /dev/null
+++ b/src/test/examplesJava9/stackwalker/Example.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package stackwalker;
+
+import java.lang.StackWalker.StackFrame;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Example {
+  public static void main(String[] args) {
+    List<String> OneFrameStack =
+        StackWalker.getInstance()
+            .walk(s -> s.limit(7).map(StackFrame::getMethodName).collect(Collectors.toList()));
+    System.out.println(OneFrameStack);
+    frame1();
+  }
+
+  public static void frame1() {
+    frame2();
+  }
+
+  public static void frame2() {
+    List<String> ThreeFrameStack =
+        StackWalker.getInstance()
+            .walk(s -> s.limit(7).map(StackFrame::getMethodName).collect(Collectors.toList()));
+    System.out.println(ThreeFrameStack);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
index 581a96c..90f6ec1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
@@ -147,7 +147,7 @@
 
   // TODO: parameterize to check both api<=23 as well as 23<api<26 for which the spec differs.
   private final AndroidApiLevel minApi = AndroidApiLevel.B;
-  private final AndroidApiLevel targetApi = AndroidApiLevel.T;
+  private final AndroidApiLevel targetApi = AndroidApiLevel.MASTER;
 
   private Set<String> getMissingGenericTypeConversions() {
     HashSet<String> missing = new HashSet<>(MISSING_GENERIC_TYPE_CONVERSION);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
new file mode 100644
index 0000000..0b8c8d4
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
@@ -0,0 +1,92 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
+
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_MINIMAL;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestBuilder;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class StackWalkerTest extends DesugaredLibraryTestBase {
+
+  private final TestParameters parameters;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+  private final CompilationSpecification compilationSpecification;
+
+  private static final Path INPUT_JAR =
+      Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stackwalker.jar");
+  private static final String EXPECTED_OUTPUT =
+      StringUtils.lines("[main]", "[frame2, frame1, main]");
+  private static final String MAIN_CLASS = "stackwalker.Example";
+
+  @Parameters(name = "{0}, spec: {1}, {2}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withDexRuntime(Version.MASTER).withAllApiLevels().build(),
+        ImmutableList.of(JDK11_MINIMAL, JDK11, JDK11_PATH),
+        DEFAULT_SPECIFICATIONS);
+  }
+
+  public StackWalkerTest(
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
+    this.parameters = parameters;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
+    this.compilationSpecification = compilationSpecification;
+  }
+
+  @Test
+  public void testReference() throws Exception {
+    Assume.assumeTrue(
+        "Run only once",
+        compilationSpecification == D8_L8DEBUG && libraryDesugaringSpecification == JDK11);
+    // No desugared library, this should work.
+    testForD8()
+        .setMinApi(parameters.getApiLevel())
+        .addProgramFiles(INPUT_JAR)
+        .run(parameters.getRuntime(), MAIN_CLASS)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  @Test
+  public void testDesugaredLibrary() throws Throwable {
+    Assume.assumeTrue(
+        "TODO(b/242948951): Issue with maintain type on function",
+        !compilationSpecification.isL8Shrink());
+    testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
+        .addProgramFiles(INPUT_JAR)
+        .addKeepMainRule(MAIN_CLASS)
+        .overrideLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.MASTER))
+        // Missing class java.lang.StackWalker$StackFrame.
+        .addOptionsModification(opt -> opt.ignoreMissingClasses = true)
+        .applyIf(
+            libraryDesugaringSpecification != JDK11_MINIMAL,
+            DesugaredLibraryTestBuilder::allowDiagnosticWarningMessages)
+        .run(parameters.getRuntime(), MAIN_CLASS)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java
index 56bfcd6..0d44dc3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java
@@ -51,7 +51,7 @@
   }
 
   @Test
-  public void test() throws Exception {
+  public void test() throws Throwable {
     testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
         .addProgramClasses(TestClass.class)
         .addKeepMainRule(TestClass.class)