feat: 添加结构体定义的 AST 节点

- 新增 StructNode 类,表示结构体定义
- 包含结构体名称、字段列表、构造函数和方法列表等信息
- 实现了 toString 方法,便于调试和日志查看
This commit is contained in:
Luke 2025-08-29 17:58:51 +08:00
parent 1835b85c5c
commit f03a44d2a5

View File

@ -0,0 +1,71 @@
package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.Node;
import org.jcnc.snow.compiler.parser.ast.base.NodeContext;
import java.util.List;
import java.util.StringJoiner;
/**
* {@code StructNode}
* <p>
* AST 节点 结构体定义struct
* </p>
*
* <p>
* 描述一个结构体类型包括字段可选构造函数方法列表等
* 结构体可声明零个或多个字段可选构造函数init
* 以及零个或多个方法
* </p>
*
* <p>
* 字段说明
* <ul>
* <li>{@code name} 结构体名称类型定义的唯一标识</li>
* <li>{@code fields} 字段声明列表每个字段为 {@link DeclarationNode}</li>
* <li>{@code init} 构造函数FunctionNode可为 null</li>
* <li>{@code methods} 方法列表每个为 {@link FunctionNode}可空列表</li>
* <li>{@code context} 源代码位置信息行号文件名等</li>
* </ul>
* </p>
*
* <p>
* 本类型为 Java record不可变构造参数即为字段名自动生成 getter
* </p>
*
* @param name 结构体名称
* @param fields 字段声明列表
* @param init 构造函数可为 null
* @param methods 方法列表
* @param context 源码位置信息
*/
public record StructNode(
String name,
List<DeclarationNode> fields,
FunctionNode init,
List<FunctionNode> methods,
NodeContext context
) implements Node {
/**
* 输出结构体节点的简明字符串表示便于调试和日志查看
*
* @return 结构体节点的简要信息包括名称字段构造函数方法
*/
@Override
public String toString() {
// 1) 构造字段声明的字符串类型+名称
StringJoiner fj = new StringJoiner(", ");
fields.forEach(d -> fj.add(d.getType() + " " + d.getName()));
// 2) 构造方法名列表字符串
StringJoiner mj = new StringJoiner(", ");
methods.forEach(f -> mj.add(f.name()));
// 3) 合成最终输出
return "Struct(name=" + name +
", fields=[" + fj + "], init=" +
(init == null ? "null" : init.name()) +
", methods=[" + mj + "])";
}
}