package org.jcnc.snow.compiler.semantic.error;

import org.jcnc.snow.compiler.parser.ast.base.Node;

/**
 * {@code SemanticError} 表示语义分析过程中发现的错误信息。
 * <p>
 * 语义错误是编译器无法接受的程序逻辑问题，例如：
 * <ul>
 *   <li>使用了未声明的变量；</li>
 *   <li>类型不兼容的赋值；</li>
 *   <li>函数返回类型与实际返回值不一致；</li>
 *   <li>调用了不存在的函数或模块。</li>
 * </ul>
 * <p>
 * 访问器方法（{@code node()} / {@code message()}）、相等性判断等功能。
 *
 * <p>主要字段说明：
 * <ul>
 *   <li>{@code node}：发生语义错误的 AST 节点，可用于定位源代码位置；</li>
 *   <li>{@code message}：具体的错误描述，适合用于报错提示、日志输出、IDE 集成等。</li>
 * </ul>
 *
 * @param node    发生错误的抽象语法树节点 {@link Node}
 * @param message 错误描述信息
 */
public record SemanticError(Node node, String message) {

    /**
     * 返回格式化后的语义错误信息字符串。
     * <p>
     * 输出格式：
     * <pre>
     * Semantic error at [节点]: [错误信息]
     * </pre>
     * 适用于命令行编译器输出、调试日志或错误收集器展示。
     *
     * @return 格式化的错误信息字符串
     */
    @Override
    public String toString() {
        return "Semantic error at " + node + ": " + message;
    }
}
