feat: 丰富 ModuleInfo 类以支持结构体和更广泛的语义分析

- 新增 structs 字段,用于存储模块中定义的结构体类型
- 扩展类注释,明确 ModuleInfo 的功能和用途
- 优化字段和方法注释,增强代码可读性和易维护性
- 调整部分方法实现,提高模块信息管理的灵活性和安全性
This commit is contained in:
Luke 2025-08-29 17:52:42 +08:00
parent 258d1909e6
commit 8902748cde

View File

@ -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.symbol.SymbolTable;
import org.jcnc.snow.compiler.semantic.type.FunctionType; import org.jcnc.snow.compiler.semantic.type.FunctionType;
import org.jcnc.snow.compiler.semantic.type.StructType;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -9,106 +10,155 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
/** /**
* {@code ModuleInfo} 表示单个模块在语义分析阶段的元信息封装 * {@code ModuleInfo} 表示单个模块在语义分析阶段的所有元信息封装
* <p>
* 用于在分析期间管理模块间依赖函数签名查找全局符号表等关键任务
* 每个模块对应一个唯一的 {@code ModuleInfo} 实例贯穿整个语义分析流程
* *
* <p><b>包含信息</b> * <p>
* 每个模块对应一个唯一的 ModuleInfo 实例在语义分析期间用于管理和查询
* <ul> * <ul>
* <li>模块名称全局唯一标识</li> * <li>模块名称全局唯一标识</li>
* <li>该模块导入的其他模块名集合跨模块引用支持</li> * <li>本模块导入的其他模块名集合跨模块依赖支持</li>
* <li>该模块中定义的所有函数签名 {@code Map<String, FunctionType>}</li> * <li>该模块中所有函数签名用于查找/重名检测/类型推断</li>
* <li>模块级全局符号表 {@link SymbolTable}常量 / 全局变量支持跨模块类型推断</li> * <li>模块级全局符号表常量全局变量支持类型推断和常量折叠</li>
* <li>本模块定义的结构体类型struct</li>
* </ul> * </ul>
* </p>
* *
* <p><b>典型用途</b> * <p><b>主要用途</b>
* <ul> * <ul>
* <li>用于函数签名类型查找重名检测跨模块引用校验等</li> * <li>跨模块语义分析符号查找类型推断常量查找函数/类型重名校验等</li>
* <li>全局符号表为类型检查与后端 IR 常量折叠等模块级分析提供支撑</li> * <li>所有对该模块的引用类型检查全局变量访问等均依赖本类提供的索引信息</li>
* </ul> * </ul>
* </p>
*/ */
public class ModuleInfo { public class ModuleInfo {
/** /**
* 模块名称作为全局唯一标识 * 模块名称作为全局唯一标识符
* 不可为空通常为文件名或逻辑模块名
*/ */
private final String name; private final String name;
/** /**
* 该模块显式导入的模块名集合用于跨模块访问符号 * 该模块显式导入的模块名集合
* <p>
* 仅存储本模块 import 的模块名 import foo;
* 用于限制跨模块访问符号时的合法性校验
* </p>
* <p>
* 注意集合为内部引用允许外部直接添加或删除导入关系
* </p>
*/ */
private final Set<String> imports = new HashSet<>(); private final Set<String> imports = new HashSet<>();
/** /**
* 该模块中定义的函数名 函数类型映射 * 该模块中声明的所有函数签名映射
* <p>
* 键为函数名值为函数类型
* 支持跨模块函数引用重名检测和类型推断
* </p>
*/ */
private final Map<String, FunctionType> functions = new HashMap<>(); private final Map<String, FunctionType> functions = new HashMap<>();
/** /**
* 模块级全局符号表常量 / 全局变量 * 该模块中声明的所有结构体类型struct
* <p>
* 键为结构体名称值为结构体类型
* 用于跨模块/跨作用域结构体查找与类型检查
* </p>
*/
private final Map<String, StructType> structs = new HashMap<>();
/**
* 模块级全局符号表
* <p>
* 记录本模块声明的所有常量和全局变量
* 支持类型推断跨模块常量折叠全局符号查找
* FunctionChecker 阶段注入
* </p>
*/ */
private SymbolTable globals; private SymbolTable globals;
/** /**
* 构造模块信息对象 * 构造函数根据模块名初始化模块元信息
* *
* @param name 模块名称必须唯一且不可为空 * @param name 模块名称要求全局唯一且不可为空
*/ */
public ModuleInfo(String name) { public ModuleInfo(String name) {
this.name = name; this.name = name;
} }
/** /**
* 获取模块名称 * 获取当前模块的全局唯一名称
* *
* @return 当前模块的唯一名称 * @return 模块名字符串
*/ */
public String getName() { public String getName() {
return name; return name;
} }
/** /**
* 获取该模块导入的模块名称集合 * 获取本模块导入的所有模块名称集合
* <p>
* 返回集合为内部数据的直接引用调用方可通过 {@code add}/{@code remove} 方法动态维护导入信息
* *
* @return 可变集合包含所有导入模块名 * <p>
* 注意返回为内部集合引用调用方可直接对集合进行 add/remove 操作维护导入依赖关系
* </p>
*
* @return 可变集合包含所有导入模块名 "foo", "bar"
*/ */
public Set<String> getImports() { public Set<String> getImports() {
return imports; return imports;
} }
/** /**
* 获取模块中已声明的函数签名表 * 获取模块内所有函数签名表
* <p>
* 映射键为函数名值为对应的 {@link FunctionType}
* 返回对象为内部引用可用于添加修改或删除函数定义
* *
* @return 模块内函数定义映射表 * <p>
* 键为函数名值为函数类型
* 返回对象为内部映射可用于动态添加/修改/删除函数定义
* </p>
*
* @return 函数名 函数类型映射表
*/ */
public Map<String, FunctionType> getFunctions() { public Map<String, FunctionType> getFunctions() {
return functions; return functions;
} }
/** /**
* 获取模块的全局符号表包含常量与全局变量 * 获取模块定义的所有结构体类型
* <p>
* 该符号表由语义分析的 FunctionChecker 阶段构建完成并注入
* 提供跨模块类型检查常量折叠等能力
* *
* @return 当前模块的全局符号表 * <p>
* 键为结构体名值为结构体类型描述
* </p>
*
* @return 结构体名 结构体类型映射
*/
public Map<String, StructType> getStructs() {
return structs;
}
/**
* 获取当前模块的全局符号表包含常量与全局变量
*
* <p>
* 该符号表通常由 FunctionChecker 阶段在全局扫描时构建并注入
* 提供后续类型检查常量折叠跨模块全局符号访问等能力
* </p>
*
* @return 本模块全局符号表
*/ */
public SymbolTable getGlobals() { public SymbolTable getGlobals() {
return globals; return globals;
} }
/** /**
* 设置模块的全局符号表 * 设置模块的全局符号表仅限 FunctionChecker 构建时注入
* <p>
* 仅应由 FunctionChecker 在语义分析全局扫描阶段调用
* *
* @param globals 全局符号表实例 * <p>
* 通常仅语义分析的全局阶段由框架内部调用
* 不建议外部用户主动修改此符号表
* </p>
*
* @param globals 新的全局符号表实例
*/ */
public void setGlobals(SymbolTable globals) { public void setGlobals(SymbolTable globals) {
this.globals = globals; this.globals = globals;