// Copyright 2023 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "src/tint/lang/core/ir/function_param.h"

#include "src/tint/lang/core/ir/clone_context.h"
#include "src/tint/lang/core/ir/module.h"
#include "src/tint/utils/ice/ice.h"

TINT_INSTANTIATE_TYPEINFO(tint::core::ir::FunctionParam);

namespace tint::core::ir {

FunctionParam::FunctionParam(const core::type::Type* ty) : type_(ty) {
    TINT_ASSERT(ty != nullptr);
}

FunctionParam::~FunctionParam() = default;

std::string_view ToString(enum FunctionParam::Builtin value) {
    switch (value) {
        case FunctionParam::Builtin::kVertexIndex:
            return "vertex_index";
        case FunctionParam::Builtin::kInstanceIndex:
            return "instance_index";
        case FunctionParam::Builtin::kPosition:
            return "position";
        case FunctionParam::Builtin::kFrontFacing:
            return "front_facing";
        case FunctionParam::Builtin::kLocalInvocationId:
            return "local_invocation_id";
        case FunctionParam::Builtin::kLocalInvocationIndex:
            return "local_invocation_index";
        case FunctionParam::Builtin::kGlobalInvocationId:
            return "global_invocation_id";
        case FunctionParam::Builtin::kWorkgroupId:
            return "workgroup_id";
        case FunctionParam::Builtin::kNumWorkgroups:
            return "num_workgroups";
        case FunctionParam::Builtin::kSampleIndex:
            return "sample_index";
        case FunctionParam::Builtin::kSampleMask:
            return "sample_mask";
        case FunctionParam::Builtin::kSubgroupInvocationId:
            return "subgroup_invocation_id";
        case FunctionParam::Builtin::kSubgroupSize:
            return "subgroup_size";
    }
    return "<unknown>";
}

FunctionParam* FunctionParam::Clone(CloneContext& ctx) {
    auto* out = ctx.ir.values.Create<FunctionParam>(type_);
    out->builtin_ = builtin_;
    out->location_ = location_;
    out->binding_point_ = binding_point_;
    out->invariant_ = invariant_;

    auto name = ctx.ir.NameOf(this);
    if (name.IsValid()) {
        ctx.ir.SetName(out, name);
    }
    return out;
}

}  // namespace tint::core::ir
