From 3dd71ff742baac9d667cc119733d57264fc38817 Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 29 Aug 2025 15:22:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Struct=20=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=9A=84=E5=BA=8F=E5=88=97=E5=8C=96=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 ModuleNode 中添加 structs 字段,支持结构体定义的序列化 - 新增 StructNode 处理逻辑,实现结构体节点的序列化 - 为结构体添加字段、初始化方法和成员方法的序列化支持 --- .../parser/utils/ASTJsonSerializer.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java b/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java index b3094c1..80618ce 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java @@ -83,7 +83,7 @@ public class ASTJsonSerializer { return switch (n) { // 模块节点 case ModuleNode( - String name, List imports, List globals, List functions, NodeContext _ + String name, List imports, List globals,List structs, List functions, NodeContext _ ) -> { Map map = newNodeMap("Module"); map.put("name", name); @@ -105,9 +105,39 @@ public class ASTJsonSerializer { for (FunctionNode f : functions) { funcs.add(nodeToMap(f)); } + + List lStructs = new ArrayList<>(); + structs.forEach(s -> lStructs.add(nodeToMap(s))); + map.put("structs", lStructs); + map.put("functions", funcs); yield map; } + + // Struct 节点 + case StructNode( + String name, List fields, + FunctionNode init, List methods, NodeContext _ + ) -> { + Map map = newNodeMap("Struct"); + map.put("name", name); + + List lFields = new ArrayList<>(); + fields.forEach(d -> lFields.add(Map.of( + "type", "Field", + "name", d.getName(), + "varType", d.getType()))); + map.put("fields", lFields); + + map.put("init", init == null ? null : nodeToMap(init)); + + List lMethods = new ArrayList<>(); + methods.forEach(f -> lMethods.add(nodeToMap(f))); + map.put("methods", lMethods); + yield map; + } + + // 函数定义节点 case FunctionNode f -> { Map map = newNodeMap("Function");