fix(transpyv): 5.5 步补「类定义中」回退,字段侧特化名不再留在裸名
类别:a(编译器缺陷 —— 同一特化在字段侧/构造侧仍分裂,方向相反)
现场:includes/ast/base.vp:357
if self.children is None: self.children = list[rawptr[AST]](self.pool, 8)
CastError:非基本类型指针不可隐式转换
源(构造调用结果) %"7e2b6dda6e423bfb.list[rawptr[d1ed020479454541.AST]]"*
目标(字段声明类型) %"7e2b6dda6e423bfb.list[rawptr[AST]]"*
上一处(stmts.vp:60)是"形参侧裸名 vs 实参侧带前缀",本处反向:**字段侧**
仍是裸名。字段 children: list[rawptr[AST]] | t.CPtr 写在**类 AST 自己体内**
(自引用),解析该字段类型时类正在定义中:find_struct('AST') 按名查不到(登记项
尚未命名)⇒ 5.5 首条查法落空 ⇒ 仍返回裸名;而 :357 的构造调用发生在类已注册之后
⇒ 带前缀,两侧再度分裂。
改动:5.5 步在 find_struct 未命中 / ModuleSha1 为空时,回退用与
resolve_annotation_type 的 Name 分支**同一处证据**认定本模块类:
find_struct_by_module(name, self.Gen.TypeGenBase.CurrentModuleSha1) 命中即以当前
模块 SHA1 加前缀。对同一模块的类,"按名取定义模块 SHA1"与"当前模块身份"给出同一
SHA1,故不引入新分裂。文档串规则表同步补该回退。
This commit is contained in:
1 parent
65d7f7cc31
commit
dddaba3254
1 file changed
+26
-10
@@ -279,11 +279,14 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase):
|
||||
完整模块名 → SHA1;再尝试 mod 直接查 SHA1(无别名 import 的完整路径)
|
||||
5. 裸名 "Class":经 from_imports 查所属模块 SHA1
|
||||
5.5 裸名 "Class" 是**本模块/已注册类**但不在 from_imports 里(典型:本模块
|
||||
自己声明的类):经结构体表的登记项取其**定义模块 SHA1**(StructEntry.
|
||||
ModuleSha1)加前缀。缺这一步会让同一类型"本模块内是裸名、被引用模块里
|
||||
带前缀"分裂成两个特化名(现场:includes/ast/stmts.vp:60
|
||||
`_set_parent_list(targets, self)`:源 %"…list[rawptr[d1ed020479454541.AST]]"*
|
||||
vs 目标 %"…list[rawptr[AST]]"*,被"非基本类型指针不可隐式转换"拦下)
|
||||
自己声明的类):先按名取结构体登记项的**定义模块 SHA1**(StructEntry.
|
||||
ModuleSha1);类正在定义中(自引用字段)按名查不到时,回退用与 Name
|
||||
分支同一处证据 find_struct_by_module(name, 当前模块 SHA1) 认定本模块类。
|
||||
缺这一步会让同一类型"本模块内是裸名、被引用模块里带前缀"分裂成两个
|
||||
特化名(现场:includes/ast/stmts.vp:60 `_set_parent_list(targets, self)`
|
||||
源 %"…list[rawptr[d1ed020479454541.AST]]"* vs 目标 %"…list[rawptr[AST]]"*;
|
||||
includes/ast/base.vp:357 `children = list[rawptr[AST]](self.pool, 8)`
|
||||
同族反向:字段侧裸名 vs 构造侧带前缀)
|
||||
6. 仍查不到:返回原串(内置类型名等,保持原样)
|
||||
|
||||
返回 None 表示 type_name 为 None。
|
||||
@@ -501,13 +504,26 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase):
|
||||
# 仅处理**简单裸名**(不含 '[' / '.'):泛型特化名(list[...])与限定名
|
||||
# 各有自己的分支,不在此重复加工。
|
||||
if string.strchr(type_name, '[') is None and string.strchr(type_name, '.') is None:
|
||||
_def_sha1: str = None
|
||||
_bare_entry: GenTypes.StructEntry* = self.Gen.StructGen.find_struct(type_name)
|
||||
if _bare_entry is not None:
|
||||
_def_sha1: str = _bare_entry.ModuleSha1
|
||||
if _def_sha1 is not None:
|
||||
res_d: str = self._concat_sha1_class(pool, _def_sha1, type_name)
|
||||
if res_d is not None:
|
||||
return res_d
|
||||
_def_sha1 = _bare_entry.ModuleSha1
|
||||
if _def_sha1 is None:
|
||||
# 类**正在定义中**(自引用字段,如 base.vp `AST.children: list[rawptr[AST]]`)
|
||||
# 时按名查不到/登记项尚无 ModuleSha1 ⇒ 用与 resolve_annotation_type 的
|
||||
# Name 分支**同一处证据**认定"本模块类":find_struct_by_module(name,
|
||||
# 当前模块 SHA1)。缺这条回退时,字段类型留在裸名、而同类在
|
||||
# 构造调用(类已注册)处已带 SHA1 ⇒ 同一 list[rawptr[AST]] 又分裂
|
||||
# (现场:base.vp:357 `self.children = list[rawptr[AST]](self.pool, 8)`)。
|
||||
_cur_sha1: str = self.Gen.TypeGenBase.CurrentModuleSha1
|
||||
if _cur_sha1 is not None:
|
||||
_own_entry: GenTypes.StructEntry* = self.Gen.StructGen.find_struct_by_module(type_name, _cur_sha1)
|
||||
if _own_entry is not None:
|
||||
_def_sha1 = _cur_sha1
|
||||
if _def_sha1 is not None:
|
||||
res_d: str = self._concat_sha1_class(pool, _def_sha1, type_name)
|
||||
if res_d is not None:
|
||||
return res_d
|
||||
# ---- 6. 查不到:保持原样(内置类型名等)----
|
||||
return type_name
|
||||
|
||||
|
||||
Reference in new issue
Block a user