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} + *

+ * 表示用户自定义结构体类型,在类型系统中用于描述结构体实例的静态类型信息。 + *

+ *

+ */ +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; + } +}