diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/core/ModuleInfo.java b/src/main/java/org/jcnc/snow/compiler/semantic/core/ModuleInfo.java index d71dd42..7312415 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/core/ModuleInfo.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/core/ModuleInfo.java @@ -2,6 +2,7 @@ package org.jcnc.snow.compiler.semantic.core; import org.jcnc.snow.compiler.semantic.symbol.SymbolTable; import org.jcnc.snow.compiler.semantic.type.FunctionType; +import org.jcnc.snow.compiler.semantic.type.StructType; import java.util.HashMap; import java.util.HashSet; @@ -9,106 +10,155 @@ import java.util.Map; import java.util.Set; /** - * {@code ModuleInfo} 表示单个模块在语义分析阶段的元信息封装。 - *

- * 用于在分析期间管理模块间依赖、函数签名查找、全局符号表等关键任务。 - * 每个模块对应一个唯一的 {@code ModuleInfo} 实例,贯穿整个语义分析流程。 + * {@code ModuleInfo} 表示单个模块在语义分析阶段的所有元信息封装。 * - *

包含信息: + *

+ * 每个模块对应一个唯一的 ModuleInfo 实例,在语义分析期间用于管理和查询: *

+ *

* - *

典型用途: + *

主要用途: *

+ *

*/ public class ModuleInfo { /** - * 模块名称,作为全局唯一标识 + * 模块名称,作为全局唯一标识符。 + * 不可为空。通常为文件名或逻辑模块名。 */ private final String name; /** - * 该模块显式导入的模块名集合(用于跨模块访问符号) + * 该模块显式导入的模块名集合。 + *

+ * 仅存储本模块 import 的模块名(如 import foo;), + * 用于限制跨模块访问符号时的合法性校验。 + *

+ *

+ * 注意:集合为内部引用,允许外部直接添加或删除导入关系。 + *

*/ private final Set imports = new HashSet<>(); /** - * 该模块中定义的函数名 → 函数类型映射 + * 该模块中声明的所有函数签名映射。 + *

+ * 键为函数名,值为函数类型。 + * 支持跨模块函数引用、重名检测和类型推断。 + *

*/ private final Map functions = new HashMap<>(); /** - * 模块级全局符号表(常量 / 全局变量) + * 该模块中声明的所有结构体类型(struct)。 + *

+ * 键为结构体名称,值为结构体类型。 + * 用于跨模块/跨作用域结构体查找与类型检查。 + *

+ */ + private final Map structs = new HashMap<>(); + + /** + * 模块级全局符号表。 + *

+ * 记录本模块声明的所有常量和全局变量。 + * 支持类型推断、跨模块常量折叠、全局符号查找。 + * 由 FunctionChecker 阶段注入。 + *

*/ private SymbolTable globals; /** - * 构造模块信息对象。 + * 构造函数:根据模块名初始化模块元信息。 * - * @param name 模块名称,必须唯一且不可为空 + * @param name 模块名称,要求全局唯一,且不可为空。 */ public ModuleInfo(String name) { this.name = name; } /** - * 获取模块名称。 + * 获取当前模块的全局唯一名称。 * - * @return 当前模块的唯一名称 + * @return 模块名字符串 */ public String getName() { return name; } /** - * 获取该模块导入的模块名称集合。 - *

- * 返回集合为内部数据的直接引用,调用方可通过 {@code add}/{@code remove} 方法动态维护导入信息。 + * 获取本模块导入的所有模块名称集合。 * - * @return 可变集合,包含所有导入模块名 + *

+ * 注意:返回为内部集合引用,调用方可直接对集合进行 add/remove 操作维护导入依赖关系。 + *

+ * + * @return 可变集合,包含所有导入模块名(如 "foo", "bar") */ public Set getImports() { return imports; } /** - * 获取模块中已声明的函数签名表。 - *

- * 映射键为函数名,值为对应的 {@link FunctionType}。 - * 返回对象为内部引用,可用于添加、修改或删除函数定义。 + * 获取模块内所有函数签名表。 * - * @return 模块内函数定义映射表 + *

+ * 键为函数名,值为函数类型。 + * 返回对象为内部映射,可用于动态添加/修改/删除函数定义。 + *

+ * + * @return 函数名 → 函数类型映射表 */ public Map getFunctions() { return functions; } /** - * 获取模块的全局符号表(包含常量与全局变量)。 - *

- * 该符号表由语义分析的 FunctionChecker 阶段构建完成并注入。 - * 提供跨模块类型检查、常量折叠等能力。 + * 获取模块定义的所有结构体类型。 * - * @return 当前模块的全局符号表 + *

+ * 键为结构体名,值为结构体类型描述。 + *

+ * + * @return 结构体名 → 结构体类型映射 + */ + public Map getStructs() { + return structs; + } + + /** + * 获取当前模块的全局符号表(包含常量与全局变量)。 + * + *

+ * 该符号表通常由 FunctionChecker 阶段在全局扫描时构建并注入。 + * 提供后续类型检查、常量折叠、跨模块全局符号访问等能力。 + *

+ * + * @return 本模块全局符号表 */ public SymbolTable getGlobals() { return globals; } /** - * 设置模块的全局符号表。 - *

- * 仅应由 FunctionChecker 在语义分析全局扫描阶段调用。 + * 设置模块的全局符号表(仅限 FunctionChecker 构建时注入)。 * - * @param globals 全局符号表实例 + *

+ * 通常仅语义分析的全局阶段由框架内部调用, + * 不建议外部用户主动修改此符号表。 + *

+ * + * @param globals 新的全局符号表实例 */ public void setGlobals(SymbolTable globals) { this.globals = globals;