// 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/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);
  }
}
