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

/**
 * {@code SymbolKind} 枚举用于标识符号表中不同类型的命名实体。
 * <p>
 * 在语义分析过程中，编译器需要根据符号的种类（Kind）采用不同的处理策略：
 * 例如变量参与类型推导、函数用于调用匹配、模块用于跨作用域引用等。
 * <p>
 * 当前支持的符号种类包括：
 * <ul>
 *   <li>{@link #VARIABLE}：变量符号（局部变量、全局变量、成员变量等）；</li>
 *   <li>{@link #FUNCTION}：函数符号（自由函数、方法、构造函数等）；</li>
 *   <li>{@link #MODULE}：模块符号（代表命名空间、库或逻辑模块）；</li>
 * </ul>
 */
public enum SymbolKind {

    /**
     * 变量符号，表示在作用域中声明的可赋值实体。
     * <p>
     * 包括函数参数、局部变量、全局变量、常量等，
     * 分析器会基于其类型参与表达式类型校验和赋值检查。
     */
    VARIABLE,

    /**
     * 函数符号，表示可调用的过程实体。
     * <p>
     * 包括普通函数、方法、构造器等。
     * 用于函数签名注册、函数调用检查及返回值推导。
     */
    FUNCTION,

    /**
     * 模块符号，表示一个命名空间或模块单元。
     * <p>
     * 在跨模块调用、导入语句校验、作用域隔离中发挥作用。
     */
    MODULE
}
