// 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 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/DoubleStream",
          "j$/util/stream/IntStream",
          "j$/util/stream/LongStream",
          "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/WatchEvent$Kind",
          "j$/nio/file/OpenOption",
          "j$/nio/file/attribute/FileAttribute");

  static Map<String, String> getWrapConvertOwnerMap() {
    HashMap<String, String> map = new HashMap<>();
    for (String theEnum : ENUM_WRAP_CONVERT_OWNER) {
      map.put(theEnum, theEnum + "$EnumConversion");
      map.put(withJavaPrefix(theEnum), theEnum + "$EnumConversion");
    }
    for (String owner : WRAP_CONVERT_OWNER) {
      map.put(withJavaPrefix(owner), owner + "$Wrapper");
      map.put(owner, owner + "$VivifiedWrapper");
    }
    return map;
  }

  private static String withJavaPrefix(String descriptor) {
    return "java" + descriptor.substring(2);
  }
}
