// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/writer/msl/namer.h"

namespace tint {
namespace writer {
namespace msl {
namespace {

const char* kNames[] = {"access",
                        "alignas",
                        "alignof",
                        "and",
                        "and_eq",
                        "array",
                        "array_ref",
                        "as_type",
                        "asm",
                        "atomic",
                        "atomic_bool",
                        "atomic_int",
                        "atomic_uint",
                        "auto",
                        "bitand",
                        "bitor",
                        "bool",
                        "bool2",
                        "bool3",
                        "bool4",
                        "break",
                        "buffer",
                        "case",
                        "catch",
                        "char",
                        "char16_t",
                        "char2",
                        "char3",
                        "char32_t",
                        "char4",
                        "class",
                        "compl",
                        "const",
                        "const_cast",
                        "const_reference",
                        "constant",
                        "constexpr",
                        "continue",
                        "decltype",
                        "default",
                        "delete",
                        "depth2d",
                        "depth2d_array",
                        "depth2d_ms",
                        "depth2d_ms_array",
                        "depthcube",
                        "depthcube_array",
                        "device",
                        "discard_fragment",
                        "do",
                        "double",
                        "dynamic_cast",
                        "else",
                        "enum",
                        "explicit",
                        "extern",
                        "extern",
                        "false",
                        "final",
                        "float",
                        "float2",
                        "float2x2",
                        "float2x3",
                        "float2x4",
                        "float3",
                        "float3x2",
                        "float3x3",
                        "float3x4",
                        "float4",
                        "float4x2",
                        "float4x3",
                        "float4x4",
                        "for",
                        "fragment",
                        "friend",
                        "goto",
                        "half",
                        "half2",
                        "half2x2",
                        "half2x3",
                        "half2x4",
                        "half3",
                        "half3x2",
                        "half3x3",
                        "half3x4",
                        "half4",
                        "half4x2",
                        "half4x3",
                        "half4x4",
                        "if",
                        "imageblock",
                        "inline",
                        "inline",
                        "int",
                        "int16_t",
                        "int2",
                        "int3",
                        "int32_t",
                        "int4",
                        "int64_t",
                        "int8_t",
                        "kernel",
                        "long",
                        "long2",
                        "long3",
                        "long4",
                        "main",
                        "metal",
                        "mutable"
                        "mutable",
                        "namespace",
                        "new",
                        "noexcept"
                        "not",
                        "not_eq",
                        "nullptr",
                        "operator",
                        "or",
                        "or_eq",
                        "override",
                        "packed_bool2",
                        "packed_bool3",
                        "packed_bool4",
                        "packed_char2",
                        "packed_char3",
                        "packed_char4",
                        "packed_float2",
                        "packed_float3",
                        "packed_float4",
                        "packed_half2",
                        "packed_half3",
                        "packed_half4",
                        "packed_int2",
                        "packed_int3",
                        "packed_int4",
                        "packed_short2",
                        "packed_short3",
                        "packed_short4",
                        "packed_uchar2",
                        "packed_uchar3",
                        "packed_uchar4",
                        "packed_uint2",
                        "packed_uint3",
                        "packed_uint4",
                        "packed_ushort2",
                        "packed_ushort3",
                        "packed_ushort4",
                        "patch_control_point",
                        "private",
                        "protected",
                        "ptrdiff_t",
                        "public",
                        "r16snorm",
                        "r16unorm",
                        "r8unorm",
                        "reference",
                        "register",
                        "reinterpret_cast",
                        "return",
                        "rg11b10f",
                        "rg16snorm",
                        "rg16unorm",
                        "rg8snorm",
                        "rg8unorm",
                        "rgb10a2",
                        "rgb9e5",
                        "rgba16snorm",
                        "rgba16unorm",
                        "rgba8snorm",
                        "rgba8unorm",
                        "sampler",
                        "short",
                        "short2",
                        "short3",
                        "short4",
                        "signed",
                        "size_t",
                        "sizeof",
                        "srgba8unorm",
                        "static",
                        "static_assert",
                        "static_cast",
                        "struct",
                        "switch",
                        "template",
                        "texture",
                        "texture1d",
                        "texture1d_array",
                        "texture2d",
                        "texture2d_array",
                        "texture2d_ms",
                        "texture2d_ms_array",
                        "texture3d",
                        "texture_buffer",
                        "texturecube",
                        "texturecube_array",
                        "this",
                        "thread",
                        "thread_local",
                        "threadgroup",
                        "threadgroup_imageblock",
                        "throw",
                        "true",
                        "try",
                        "typedef",
                        "typeid",
                        "typename",
                        "uchar",
                        "uchar2",
                        "uchar3",
                        "uchar4",
                        "uint",
                        "uint16_t",
                        "uint2",
                        "uint3",
                        "uint32_t",
                        "uint4",
                        "uint64_t",
                        "uint8_t",
                        "ulong2",
                        "ulong3",
                        "ulong4",
                        "uniform",
                        "union",
                        "unsigned",
                        "ushort",
                        "ushort2",
                        "ushort3",
                        "ushort4",
                        "using",
                        "vec",
                        "vertex",
                        "virtual",
                        "virtual",
                        "void",
                        "volatile",
                        "wchar_t",
                        "while",
                        "xor",
                        "xor_eq"};

}  // namespace

Namer::Namer() = default;

Namer::~Namer() = default;

std::string Namer::NameFor(const std::string& name) {
  // If it's in the name map we can just return it. There are no shadow names
  // in WGSL so this has to be unique in the WGSL names, and we've already
  // checked the name collisions with MSL.
  auto it = name_map_.find(name);
  if (it != name_map_.end()) {
    return it->second;
  }

  std::string ret_name = name;
  if (std::binary_search(std::begin(kNames), std::end(kNames), ret_name)) {
    uint32_t i = 0;
    // Make sure there wasn't already a tint variable with the new name we've
    // now created.
    while (true) {
      ret_name = name + "_tint_" + std::to_string(i);
      it = name_map_.find(ret_name);
      if (it == name_map_.end()) {
        break;
      }
      i++;
    }
    remapped_names_.insert(ret_name);
  } else {
    uint32_t i = 0;
    // Make sure the ident name wasn't assigned by a remapping.
    while (true) {
      auto remap_it = remapped_names_.find(ret_name);
      if (remap_it == remapped_names_.end()) {
        break;
      }
      ret_name = name + "_" + std::to_string(i);
      i++;
    }
    remapped_names_.insert(ret_name);
  }

  name_map_[name] = ret_name;
  return ret_name;
}

}  // namespace msl
}  // namespace writer
}  // namespace tint
