From cc66eee75f0bc3e4894aea83db4dd72eafc40e07 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 26 Aug 2025 11:37:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=B7=A8=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=85=A8=E5=B1=80=E5=B8=B8=E9=87=8F=E6=9F=A5=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 externalConsts 字典用于存放跨模块导入的全局常量 - 修改 getConstValue 方法以支持查找外部常量 - 添加 importExternalConst 方法用于导入外部常量 --- .../compiler/ir/builder/IRBuilderScope.java | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRBuilderScope.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRBuilderScope.java index 774c883..7d277ca 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRBuilderScope.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRBuilderScope.java @@ -15,30 +15,25 @@ import java.util.Map; *
  • 支持变量与虚拟寄存器的重新绑定与查找
  • *
  • 支持变量的类型信息记录与查询
  • *
  • 支持变量的编译期常量值记录与查询(便于常量折叠等优化)
  • + *
  • 支持跨模块全局常量(如 ModuleA.a)查找
  • * */ final class IRBuilderScope { - /** - * 变量名到虚拟寄存器的映射表。 - * 用于跟踪所有声明和分配的变量。 - */ + /** 变量名到虚拟寄存器的映射表(本地变量) */ private final Map vars = new HashMap<>(); + /** 变量名到类型字符串的映射表 */ + private final Map varTypes = new HashMap<>(); + /** 变量名到编译期常量值的映射表(本作用域) */ + private final Map varConstValues = new HashMap<>(); /** - * 变量名到类型字符串的映射表。 - * 用于类型分析与推断。 - */ - private final Map varTypes = new HashMap<>(); - /** - * 变量名到编译期常量值的映射表。 - * 用于常量折叠优化(如 int、string、数组等常量)。 - */ - private final Map varConstValues = new HashMap<>(); - /** - * 当前作用域所绑定的 IRFunction 实例。 - * 用于申请新的虚拟寄存器。 + * 额外:存放跨模块导入的全局常量 + * key 形如 "ModuleA.a" value 为其常量值 */ + private final Map externalConsts = new HashMap<>(); + + /** 当前作用域所绑定的 IRFunction 实例 */ private IRFunction fn; /** @@ -118,7 +113,7 @@ final class IRBuilderScope { // ---------------- 编译期常量相关接口 ---------------- /** - * 设置变量的编译期常量值。 + * 设置变量的编译期常量值(本地变量)。 * * @param name 变量名称 * @param value 常量值(null 表示清除) @@ -129,21 +124,38 @@ final class IRBuilderScope { } /** - * 获取变量的编译期常量值(如没有则返回 null)。 + * 获取变量的编译期常量值(本地变量或导入的外部常量)。 + *
    + * 优先查找本地常量,未命中再查外部(如 "ModuleA.a")。 * - * @param name 变量名称 + * @param name 变量名称或"模块名.常量名" * @return 编译期常量值,或 null */ Object getConstValue(String name) { - return varConstValues.get(name); + Object v = varConstValues.get(name); + if (v != null) return v; + // 支持跨模块常量/全局变量 + return externalConsts.get(name); } /** - * 清除变量的编译期常量值绑定。 + * 清除变量的编译期常量值绑定(本地)。 * * @param name 变量名称 */ void clearConstValue(String name) { varConstValues.remove(name); } + + // ---------------- 跨模块常量导入支持 ---------------- + + /** + * 导入外部(其他模块)的全局常量/变量。 + * + * @param qualifiedName 形如 "ModuleA.a" + * @param value 其常量值 + */ + void importExternalConst(String qualifiedName, Object value) { + externalConsts.put(qualifiedName, value); + } }