// 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 desugaredlibrary;

import com.google.common.collect.ImmutableSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class CustomConversionAsmRewriteDescription {

  static final String WRAP_CONVERT = "wrap_convert";
  static final String INVERTED_WRAP_CONVERT = "inverted_wrap_convert";
  static final String CONVERT = "convert";

  private static final Set<String> ENUM_WRAP_CONVERT_OWNER =
      ImmutableSet.of(
          "j$/nio/file/attribute/PosixFilePermission",
          "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",
          "j$/nio/file/WatchEvent",
          "j$/nio/file/OpenOption");

  static Map<String, String> getJavaWrapConvertOwnerMap() {
    return computeConvertOwnerMap("$Wrapper");
  }

  static Map<String, String> getJ$WrapConvertOwnerMap() {
    return computeConvertOwnerMap("$VivifiedWrapper");
  }

  private static HashMap<String, String> computeConvertOwnerMap(String suffix) {
    HashMap<String, String> map = new HashMap<>();
    for (String theEnum : ENUM_WRAP_CONVERT_OWNER) {
      map.put(theEnum, theEnum + "$EnumConversion");
    }
    for (String owner : WRAP_CONVERT_OWNER) {
      map.put(owner, owner + suffix);
    }
    return map;
  }
}
