From 49cb89c9f242494494dd5457c0318bef70a66885 Mon Sep 17 00:00:00 2001
From: Luke
Date: Fri, 29 Aug 2025 18:01:38 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?=
=?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=BB=93=E6=9E=84=E4=BD=93=E7=B1=BB?=
=?UTF-8?q?=E5=9E=8B=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增 StructType 类,用于描述结构体的静态类型信息
- 实现了结构体类型的唯一标识、字段定义、方法签名和构造函数等功能
- 支持跨模块同名结构体的类型检查和兼容性判断
---
.../compiler/semantic/type/StructType.java | 135 ++++++++++++++++++
1 file changed, 135 insertions(+)
create mode 100644 src/main/java/org/jcnc/snow/compiler/semantic/type/StructType.java
diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/type/StructType.java b/src/main/java/org/jcnc/snow/compiler/semantic/type/StructType.java
new file mode 100644
index 0000000..31bd504
--- /dev/null
+++ b/src/main/java/org/jcnc/snow/compiler/semantic/type/StructType.java
@@ -0,0 +1,135 @@
+package org.jcnc.snow.compiler.semantic.type;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * {@code StructType}
+ *
+ * 表示用户自定义结构体类型,在类型系统中用于描述结构体实例的静态类型信息。
+ *
+ * - 由 (moduleName, structName) 唯一标识(支持跨模块同名 struct)。
+ * - 包含字段定义、方法签名、构造函数等全部类型元信息。
+ *
+ *
+ */
+public class StructType implements Type {
+ /**
+ * 所属模块名称,用于唯一标识、支持跨模块同名结构体
+ */
+ private final String moduleName;
+ /**
+ * 结构体类型名称(如 "Person")
+ */
+ private final String name;
+ /**
+ * 字段定义表:字段名 -> 字段类型
+ */
+ private final Map fields = new HashMap<>();
+ /**
+ * 方法签名表:方法名 -> 函数类型
+ */
+ private final Map methods = new HashMap<>();
+ /**
+ * 构造函数(init)的函数类型;可为 null(表示无参默认构造)
+ */
+ private FunctionType constructor;
+
+ /**
+ * 构造函数:创建结构体类型描述。
+ *
+ * @param moduleName 所属模块名(不可为空)
+ * @param name 结构体名称(不可为空)
+ */
+ public StructType(String moduleName, String name) {
+ this.moduleName = moduleName;
+ this.name = name;
+ }
+
+ /**
+ * 获取结构体所属模块名
+ */
+ public String moduleName() {
+ return moduleName;
+ }
+
+ /**
+ * 获取结构体名称
+ */
+ @Override
+ public String name() {
+ return name;
+ }
+
+ /**
+ * 获取构造函数签名(可为 null,表示默认无参构造)
+ */
+ public FunctionType getConstructor() {
+ return constructor;
+ }
+
+ /**
+ * 设置构造函数签名
+ */
+ public void setConstructor(FunctionType ctor) {
+ this.constructor = ctor;
+ }
+
+ /**
+ * 获取所有字段定义(字段名 → 字段类型)
+ */
+ public Map getFields() {
+ return fields;
+ }
+
+ /**
+ * 获取所有方法签名(方法名 → 函数类型)
+ */
+ public Map getMethods() {
+ return methods;
+ }
+
+ /**
+ * 判断类型兼容性:
+ *
+ * - 仅模块名与结构体名都相等才视为兼容。
+ * - 跨模块同名 struct 不兼容。
+ *
+ *
+ * @param other 另一个类型
+ * @return 类型兼容返回 true,否则 false
+ */
+ @Override
+ public boolean isCompatible(Type other) {
+ if (!(other instanceof StructType s)) return false;
+ return Objects.equals(this.name, s.name)
+ && Objects.equals(this.moduleName, s.moduleName);
+ }
+
+ /**
+ * 判断类型相等:模块名+结构体名全等。
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof StructType s)) return false;
+ return Objects.equals(name, s.name) && Objects.equals(moduleName, s.moduleName);
+ }
+
+ /**
+ * 哈希值定义,和 equals 保持一致(用于 Map/Set 索引)
+ */
+ @Override
+ public int hashCode() {
+ return Objects.hash(moduleName, name);
+ }
+
+ /**
+ * 字符串表示:返回结构体名(调试用)
+ */
+ @Override
+ public String toString() {
+ return name;
+ }
+}