// Copyright 2023 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.

////////////////////////////////////////////////////////////////////////////////
// File generated by tools/src/cmd/gen
// using the template:
//   src/tint/ast/diagnostic_control.h.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#ifndef SRC_TINT_AST_DIAGNOSTIC_CONTROL_H_
#define SRC_TINT_AST_DIAGNOSTIC_CONTROL_H_

#include <ostream>
#include <string>
#include <unordered_map>

#include "src/tint/ast/node.h"

// Forward declarations
namespace tint::ast {
class IdentifierExpression;
}  // namespace tint::ast

namespace tint::ast {

/// The diagnostic severity control.
enum class DiagnosticSeverity {
    kUndefined,
    kError,
    kInfo,
    kOff,
    kWarning,
};

/// @param out the std::ostream to write to
/// @param value the DiagnosticSeverity
/// @returns `out` so calls can be chained
std::ostream& operator<<(std::ostream& out, DiagnosticSeverity value);

/// ParseDiagnosticSeverity parses a DiagnosticSeverity from a string.
/// @param str the string to parse
/// @returns the parsed enum, or DiagnosticSeverity::kUndefined if the string could not be parsed.
DiagnosticSeverity ParseDiagnosticSeverity(std::string_view str);

constexpr const char* kDiagnosticSeverityStrings[] = {
    "error",
    "info",
    "off",
    "warning",
};

/// The diagnostic rule.
enum class DiagnosticRule {
    kUndefined,
    kChromiumUnreachableCode,
    kDerivativeUniformity,
};

/// @param out the std::ostream to write to
/// @param value the DiagnosticRule
/// @returns `out` so calls can be chained
std::ostream& operator<<(std::ostream& out, DiagnosticRule value);

/// ParseDiagnosticRule parses a DiagnosticRule from a string.
/// @param str the string to parse
/// @returns the parsed enum, or DiagnosticRule::kUndefined if the string could not be parsed.
DiagnosticRule ParseDiagnosticRule(std::string_view str);

constexpr const char* kDiagnosticRuleStrings[] = {
    "chromium_unreachable_code",
    "derivative_uniformity",
};

/// Convert a DiagnosticSeverity to the corresponding diag::Severity.
diag::Severity ToSeverity(DiagnosticSeverity sc);

/// DiagnosticRuleSeverities is a map from diagnostic rule to diagnostic severity.
using DiagnosticRuleSeverities = std::unordered_map<DiagnosticRule, DiagnosticSeverity>;

/// A diagnostic control used for diagnostic directives and attributes.
class DiagnosticControl : public Castable<DiagnosticControl, Node> {
  public:
    /// Constructor
    /// @param pid the identifier of the program that owns this node
    /// @param nid the unique node identifier
    /// @param src the source of this node
    /// @param sev the diagnostic severity
    /// @param rule the diagnostic rule name
    DiagnosticControl(ProgramID pid,
                      NodeID nid,
                      const Source& src,
                      DiagnosticSeverity sev,
                      const IdentifierExpression* rule)
        : Base(pid, nid, src), severity(sev), rule_name(rule) {}

    ~DiagnosticControl() override;

    /// Clones this node and all transitive child nodes using the `CloneContext` `ctx`.
    /// @param ctx the clone context
    /// @return the newly cloned node
    const DiagnosticControl* Clone(CloneContext* ctx) const override;

    /// The diagnostic severity control.
    DiagnosticSeverity severity;

    /// The diagnostic rule name.
    const IdentifierExpression* rule_name;
};

}  // namespace tint::ast

#endif  // SRC_TINT_AST_DIAGNOSTIC_CONTROL_H_
