diff --git a/src/main/java/org/jcnc/snow/compiler/ir/common/GlobalConstTable.java b/src/main/java/org/jcnc/snow/compiler/ir/common/GlobalConstTable.java new file mode 100644 index 0000000..ad9795b --- /dev/null +++ b/src/main/java/org/jcnc/snow/compiler/ir/common/GlobalConstTable.java @@ -0,0 +1,70 @@ +package org.jcnc.snow.compiler.ir.common; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 全局常量表,用于跨模块编译期常量查询和折叠。 + * + *

+ * 主要功能: + *

+ *

+ * 常量的 key 格式为“模块名.常量名”,如 "ModuleA.a",以便唯一标识。 + * + *

+ * 典型用法: + *

+ *   GlobalConstTable.register("ModuleA.a", 10);    // 注册常量
+ *   Object val = GlobalConstTable.get("ModuleA.a"); // 查询常量
+ * 
+ */ +public final class GlobalConstTable { + + /** 存储全局常量: “ModuleName.constName” → 常量值。线程安全。 */ + private static final Map CONSTS = new ConcurrentHashMap<>(); + + /** + * 工具类构造器,防止实例化。 + */ + private GlobalConstTable() { /* utility class */ } + + /** + * 注册一个全局常量到表中(只在首次注册时生效,避免被覆盖)。 + * + * @param qualifiedName 常量的全限定名(如 "ModuleA.a") + * @param value 常量的字面值(如 10、字符串、布尔等) + * @throws IllegalArgumentException 名称为 null 或空串时抛出 + */ + public static void register(String qualifiedName, Object value) { + if (qualifiedName == null || qualifiedName.isBlank()) { + throw new IllegalArgumentException("常量名不能为空"); + } + CONSTS.putIfAbsent(qualifiedName, value); + } + + /** + * 获取指定全局常量的值。 + * + * @param qualifiedName 常量的全限定名(如 "ModuleA.a") + * @return 查到的常量值,如果未注册则返回 null + */ + public static Object get(String qualifiedName) { + return CONSTS.get(qualifiedName); + } + + /** + * 返回全部已注册常量的不可变视图(快照)。 + *

注意:只读,不可修改。

+ * + * @return key=常量名,value=常量值的不可变 Map + */ + public static Map all() { + return Map.copyOf(CONSTS); + } +}