Commit Graph
941 Commits
Author SHA1 Message Date
TermiNexus b38d103c17 fix(lsp): 点号导入逐段高亮与 project includes 路径修复
import a.b.c / from a.b import X 的每个模块段都有 namespace token 并可跳转到对应模块文件;预绑定出现点不再被重解析覆盖;project source/includes 规范化为无 .. 的路径,避免索引路径失配后按需反复解析导致崩溃。
2026-10-27 12:55:43 +08:00
TermiNexus c6b0b03bdc feat(build-self): forward traceback and asan modes to the rebuilt compiler 2026-10-27 12:49:10 +08:00
TermiNexus 8367b5f65b fix(defines): resolve chained define references in vpi stubs 2026-10-27 12:49:00 +08:00
TermiNexus d13eb6b063 feat(lsp): 支持 from module import * 与相对 includes
通配导入的名字通过索引解析(高亮/悬停/跳转/成员),typedef 使用 type token;project.vpj 中任意相对 source/includes 按项目目录解析;修复通配符号表步长导致的越界崩溃;关闭文档释放文档对象,didOpen 不再强制重建索引。
2026-10-27 02:41:45 +08:00
TermiNexus 879cf7ab9f feat(lsp): 跨模块语义高亮与 project.vpj includes 生效
语义 token 通过索引解析导入符号/成员(class/function/method/property/constant/macro);采纳 project.vpj 后刷新索引 roots;语义 token 数组改为 O(1) 追加,避免大文件序列化退化。
2026-10-27 01:45:49 +08:00
TermiNexus 7f90ec984c feat(lsp): 高亮基本类型与数组元素类型
int/str/list 等内建类型在注解与表达式中使用 class token;补上返回注解遍历,修正属性基址与字典键值的出现点顺序,避免语义 token 被重叠丢弃。
2026-10-27 00:09:13 +08:00
TermiNexus bb72ed0971 feat(lsp): Gate 12 协议与诊断增强
新增 textDocument/diagnostic pull(full 报告);响应超出上限返回 -32603 而非关闭连接;记录 \$/cancelRequest 并在派发边界返回 -32800;补充 gate12 探针。
2026-10-26 23:15:10 +08:00
TermiNexus 3c8bd49292 feat(lsp): Gate 11 索引与重命名安全
打开的文档统一使用实时分析,跨文件 references/rename 支持多开文档;索引条目记录内容哈希,watched-files 变更使索引失效;引用/重命名结果去重并对齐未保存内容。
2026-10-26 22:49:04 +08:00
TermiNexus 1251c8ceab feat(lsp): Gate 10 成员解析深度
注解类型驱动成员解析(含 PtrT/ConstT 等包装);支持 module.Class.member 与 .vpi 成员链;跨文件 references/rename 覆盖字段与方法,修复 includeDeclaration 布尔解析与重复位置;索引增加解析缓存并按出现点容量扩大 arena。
2026-10-26 22:18:27 +08:00
TermiNexus 95a8da86e4 feat(lsp): Gate 9 语义高亮保真
define 宏函数与调用点使用 macro token;常量保持 variable+readonly;多行字符串按行拆分;修正符号/出现点合并顺序导致整行 token 丢失;大文档诊断 scratch 按源大小扩容。
2026-10-26 21:04:10 +08:00
TermiNexus e837306159 fix(lsp): 关键字交给 TextMate,避免 def 被语义色覆盖
语义 token 不再输出普通关键字(Vipeye 也只补充软关键字);def/class/define/extern 的颜色由语法高亮决定,探针断言关键字位置没有语义 token。
2026-10-26 20:23:30 +08:00
TermiNexus 8dbf2415d4 feat(lsp): 支持跨文件引用与重命名
索引记录已解析出现点;references/rename 按文件分组,支持 from-import 与 module.Member;路径比较归一化;多开文档时跨文件重命名返回 null。
2026-10-26 20:13:23 +08:00
TermiNexus bc98d61b64 feat(lsp): 自动识别项目根并为常量加 readonly
工作区根无 project.vpj 时从首个打开文件向上采纳项目并重建索引;全大写/define 常量输出 variable+readonly,配合插件的 semanticTokenScopes 使用常量色。
2026-10-26 19:14:33 +08:00
TermiNexus 1183f92344 fix(lsp): 修正 define/extern 声明的名称偏移
声明节点的位置可能落在修饰符或行首;按行内整词重新定位名称,并让无冒号的 extern 头解析出函数名。语义高亮对不匹配源文本的声明 token 直接跳过。
2026-10-26 18:51:01 +08:00
TermiNexus 08c817f5ec feat(lsp): 增加重命名、语义高亮与导入整理
prepareRename/rename 同文件全量出现点;semanticTokens full/range 的 AST+词法+注释 token;organize imports 排序去重。探针新增响应 envelope 校验。
2026-10-26 18:19:05 +08:00
TermiNexus 7eb20dfae0 fix(lsp): 克隆响应 id,避免污染响应 envelope
json.object_set 会接管节点;直接复用请求 id 会把 method/params 链接进响应,使 vscode-languageclient 把它当成服务端请求并报 -32600。
2026-10-26 18:18:58 +08:00
TermiNexus edd9b1c151 fix(defines): resolve package-level from-import symbols to the package module 2026-10-26 18:11:51 +08:00
TermiNexus a2e9b1848e fix(defines): isolate same-name cross-module DefineT lookups 2026-10-26 17:40:06 +08:00
TermiNexus ebb291daeb feat(lsp): 增加补全与签名帮助
作用域/成员/import 路径补全;签名帮助支持当前参数与同名重载;成员来自 live 文档、索引或按需解析的 .vpi。
2026-10-26 17:11:51 +08:00
TermiNexus 4aba50d60e feat(lsp): 支持 ping 并宽容未知协议方法
健康检查在 initialize 前即可响应;未知请求记录 stderr 后返回 null,未知通知记录后忽略,避免插件因 MethodNotFound 判定服务端故障。
2026-10-26 16:31:52 +08:00
TermiNexus 1b21ef14d5 feat(lsp): 增加符号索引与导航
documentSymbol、workspace/symbol、definition、references、documentHighlight、hover 全部基于 includes/ast;索引使用独立池并在打开/关闭/保存时失效。
2026-10-26 16:21:44 +08:00
TermiNexus dee324ed06 feat(lsp): 发布解析诊断
didOpen/didChange/didSave 推送 publishDiagnostics,didClose 清空;诊断解析使用按次重置的 scratch 池。
2026-10-26 14:55:23 +08:00
TermiNexus 93cd0f1ea5 feat(lsp): 增加 UTF-16 位置往返验证
- viper/lspPosition:line/character -> offset -> line/character
- probe Gate 1:随机 10k 个有效位置往返,覆盖 CRLF/中文/emoji
2026-10-26 14:27:33 +08:00
TermiNexus c42ae889d1 feat(lsp): Gate 1 文档同步、UTF-16 位置与工作区
- LspPositions:UTF-8 字节列 / UTF-16 code unit 转换,支持 LF/CRLF/emoji
- LspDocuments:didOpen/didChange/didClose/didSave,增量与全量替换,双池复用
- LspWorkspace:file URI 解码、project.vpj 向上查找、source_dir/includes
- LspServer:请求池 mark/reset、textDocumentSync、viper/lspStats 与 viper/lspDocument
- probe --gate1:文档编辑、UTF-16 代理对、10k 次编辑与池稳定性
- 依赖 includes/memhub 的 NewMemBuddy 堆构造工厂(单独提交 fa7591e)
2026-10-26 14:23:12 +08:00
TermiNexus 3f54946af9 fix(pure): format pure_str in print, printf and f-strings 2026-10-26 13:52:09 +08:00
TermiNexus d88cafa12c feat(pure): integrate pure_str with lifetime and NLL 2026-10-26 13:52:00 +08:00
TermiNexus ab562764b4 feat(lsp): Gate 0 协议骨架与生命周期
- 新增 lib/lsp:协议常量、stdio framing、JSON-RPC 响应、lifecycle server
- viperc --lsp:独立池、互斥校验、stdout 仅输出协议帧
- 新增 Tools/lsp/probe.py 与 ast_check.py
- Gate 0 行为验证:--build-self 后 lifecycle 探针通过
2026-10-26 13:48:07 +08:00
TermiNexus 782b4d63ff feat(build): 增加 --build-self 与 copyself
- 新增 copyself:延迟后删除目标并复制文件/目录
- ViperC 新增 --build-self:自举到 __vpcbuild_2__ 后由 copyself 替换 __vpcbuild__
- 同步当前 ViperC 工作区已有的 Gen/Diag/Stub 改动
- .gitignore 忽略 __vpcbuild_* 与 _sha1_map.txt
2026-10-26 02:09:45 +08:00
TermiNexus da636a5422 fix(cif): 平台宏按目标 triple 求值,属性形式不再依赖跨模块 define
- _cif_attr_value 先查平台内建宏(triple 是唯一真相源),再查本地/跨模块 DefineT:
  跨模块查不到时会静默得到 0,曾把 platmacro.IS_WINDOWS 判成 0,
  导致 Windows 构建误走非 Windows 分支(_io 选了 posix.fileio)
- _get_platform_macro_value 补齐 platmacro 的平台名:IS_WINDOWS/IS_WIN64/IS_LINUX/
  IS_MACOS/IS_X86_64/IS_ARM64

注:本文件含此前未提交的既有改动,按整文件一并提交。
2026-10-25 13:05:51 +08:00
TermiNexus 3febb87abf refactor(app): 改为直接 import io,用 io.File / io.MODE
不再用 'import io as fileio' 别名:20 个文件统一 'import io',
所有 fileio.X 调用点改为 io.X(win32.fileio 等模块路径出现在注释里的保持原样)。
2026-10-25 12:51:28 +08:00
TermiNexus 94515ddf12 refactor(app): win32.fileio 全部切换到跨平台 io
20 个文件把 'import win32.fileio as fileio' 改为 'import io as fileio',
文件 IO 统一走 includes/io.vp(编译期 cif 选择 win32.fileio / posix.fileio)。
依赖编译器新增的模块级 cif 条件 import(a282918)。

注:这些文件中存在此前未提交的既有改动,按整文件一并提交。
2026-10-25 12:45:49 +08:00
TermiNexus a2829182b8 feat(imports): 支持模块级 cif 条件 import
- ImportsGenMixin 新增 translate_cif_imports / _collect_cif_imports_in:
  用 cif 求值只收集选中分支的 Import/ImportFrom,celif 的 orelse 递归求值,
  celse 按普通语句收集;普通模块级 if 原样忽略
- Translator._translate_module_level 的 import 预扫描新增 If 分支(mode 0)
- TranslatorGenMixin.translate_children 在 declare/import-scan 模式补收集(mode != 0),
  避免与预扫描重复写入 from_imports
- GenApi 增加 translate_cif_imports 转发

未选中分支的模块不进入依赖闭包,因此不会被编译/链接,
可用于在平台专有模块之间二选一(如 win32.fileio / posix.fileio)。
2026-10-25 12:28:29 +08:00
TermiNexus a20bc312ab docs(classgen): 声明前置注释示例 FileW -> File
FileW 已在 includes/win32/fileio.vp 中删除,示例改用 File.__init__(同样在 self.seek 之前定义)。
2026-10-25 12:07:59 +08:00
TermiNexus 9c3ebc8a2c fix(ffilib): 为 runtime CDLL thunk 创建 entry block 并移除失败静默返回
- new_builder 的 CurBlock 初值为 None,_emit 会静默丢弃指令,导致 thunk 生成空函数体(mlir-opt: empty block)
- 补 create_block + position_at_end,随后再把全部静默 return None 改为 fatal_error
- 移除两处 [ffiprobe] 调试探针
2026-10-24 23:57:09 +08:00
TermiNexus 2caf6f0795 fix(ffilib): runtime=True 时把 _ffilib 登记为导入模块,进入可达性扫描
Pass 0 的 _AddPending 只影响 viperbuild 的闭包 BFS,不影响 Phase1/Phase2 的 includes 可达性扫描(后者由 tr._imported_modules 驱动),所以 _ffilib 仍然没被收录、拿不到 SHA1。改为在 translate_import 里判断:若存在 runtime=True 的句柄(ViperBuild.HasRuntimeFfiHandle),则随 import ffilib 一并 NotePlainImport("_ffilib")。
2026-10-24 23:20:14 +08:00
TermiNexus 796a2f5921 fix(ffilib): 仅在 runtime=True 时引入 _ffilib 运行时依赖
runtime CDLL 的 thunk 需要 _ffilib.Load/Sym,但 includes 是按需可达性扫描:没有 import _ffilib 就不会收录、拿不到 SHA1。改为在 _RegisterFfiHandle 里按 runtime 判定——runtime=True 才 _AddPending("_ffilib"),纯链接期(runtime=False)的工程不会多编译这个运行时库。_check_import_sha1 也放行 _ffilib(它由生成代码引用,不是用户手写 import)。
2026-10-24 23:16:06 +08:00
TermiNexus 2411ceff8c fix(ffilib): 把 _ffilib 拉进依赖闭包(Pass 0 pending + import 白名单)
thunk 生成时报 module _ffilib 未在 includes 扫描中:includes 是按需可达性扫描,没有任何文件 import _ffilib 就不会收录它。Pass 0 的 import 处理里对 ffilib 追加 pending(_ffilib);_check_import_sha1 也放行 _ffilib(防止显式 import 时报无 SHA1)。若可达性仍不生效,改用方案 B:thunk 直接调 LoadLibraryA/GetProcAddress(裸名、无需模块 SHA1),去掉对 _ffilib 的依赖。
2026-10-24 23:15:31 +08:00
TermiNexus ecd4a0b14a fix(ffilib): thunk 复用已有 declare,而不是遇到同名就跳过
探针显示 ffi_lib=add_c2 / rt=1 都已正确,说明断点在去重守卫:@add 在 declaration 阶段/vpi 注入已存在为 declare,find_func_in_module 命中后跳过了 thunk,最终留下普通 declare 导致 undefined symbol。改为按状态区分:已存在 declare -> IsDeclared 置 0 并复用(形参类型与名称沿用它的,否则函数体引用不到入参);已是指令体 define 才跳过;不存在则新建 define。
2026-10-24 23:03:14 +08:00
TermiNexus 1508563f1c chore(ffilib): 临时探针(CDLL 抽取 + extern 分支的 ffi_lib/runtime)
现象与"exe 已含最新提交"矛盾:add_c2 仍生成全局、@add 无 thunk、无 _ffilib 引用。加两处 printf 定位断点:_HandleCDLL 入口打印句柄名;translate_function_def 的 extern 分支打印 fd.ffi_lib 与 FfiHandleRuntime 结果。定位后立即移除。
2026-10-24 22:51:31 +08:00
TermiNexus c765cfa9d4 fix(ffilib): 模块级 ffilib.CDLL(...) 赋值不再生成全局变量
现场 main.vp 的 text.ll 里出现 @"<sha1>.add_c2"() : i32 全局,说明纯编译期配置的 CDLL 声明被当成普通模块级变量翻译了。ViperBuild 增加 IsCdlLDeclCall(复用 _IsCDLLCall,认别名与全名);TranslatorGenMixin 的模块级 Assign 分支先判它,命中则整条跳过 Pass 0 已抽取的声明。
2026-10-24 22:34:54 +08:00
TermiNexus 522075097e fix(ffilib): translate_function_def 的 extern 分支也生成 runtime thunk
现场 temp/02/029af3a930989beb.text.ll 里 @add 是普通直接调用、没有 _ffilib 引用,说明 App 文件的 extern 走的是 translate_function_def 而不是 forward_declare_functions,thunk 校验挂错了地方。两处都挂:各自先查 find_func_in_module 去重;runtime=True 生成 thunk,runtime=False 保持原 declare 路径。
2026-10-24 22:33:14 +08:00
TermiNexus 36bfa4e061 fix(ffilib): runtime=True 不再把库路径写进 dynamic_libs
runtime=True 的库由 thunk 在运行期按绝对路径 LoadLibraryA,若同时进 dynamic_libs 会成为链接输入、生成 PE 导入表依赖,既与 thunk 重复又会重新带回 exe 同目录/PATH 的限制。改为只登记句柄与路径。
2026-10-24 22:31:10 +08:00
TermiNexus 0acbefafd8 feat(ffilib): runtime CDLL 生成 thunk(绝对路径 LoadLibraryA + 间接调用)
_emit_runtime_ffi_thunk 生成 define <name>(%p0..): Load(path) -> Sym(h,name) -> bitcast 成 <ret>(<params>)* -> call_indirect -> ret;符号名与普通 extern 一致(裸名),调用点零改动。路径与符号名用 ExprGenConst.create_global_string 落成常量操作数(GEP 由该助手处理)。约束:仅标量参数/返回值,结构体按值与变参 fail-fast;declare-only 阶段仍走普通 declare,避免同模块 define/declare 同名并存。
2026-10-24 22:20:55 +08:00
TermiNexus 5e038eae5e feat(ffilib): 句柄表补记库路径,供 runtime thunk 使用
CDLL 句柄登记从 (名字, runtime) 扩为 (名字, runtime, 路径):_ffi_handles_path 与另外两张表平行,_RegisterFfiHandle 增加 path 参数(四条登记路径全部更新),新增 FfiHandlePath(name) 查询。runtime=True 的 thunk 将用该绝对路径调用 _ffilib.Load,从而绕开 PE 导入表的文件名查找规则。
2026-10-24 22:01:07 +08:00
TermiNexus 74a9d96d3c feat(ffilib): extern <lib> name(...) 校验库句柄并按 runtime 决定行为
Pass 0 新增 CDLL 句柄表(变量名 -> runtime):_HandleCDLL 接收赋值目标名,_RegisterFfiHandle 登记,FfiHandleRuntime 提供查询(1=运行时/0=链接期/-1=未登记)。FuncGenDef 在前置声明阶段校验 ffi_lib:未绑定 ffilib.CDLL 报 NameError;runtime=True 报 NotImplementedError(需要 _ffilib 运行时符号绑定,绝不静默退化为静态链接);runtime=False 照常生成裸名 declare。
2026-10-24 21:12:55 +08:00
TermiNexus 1885370920 feat(ffilib): import 白名单登记 ffilib 宏模块
_check_import_sha1 对宏库有一份硬编码白名单(ctraits / viperbuild),宏库不产生代码也就没有模块 SHA1。ffilib 走同一条路,加入白名单后 import ffilib 不再报 has no registered SHA1;配置仍由 Pass 0 抽取。
2026-10-24 20:00:31 +08:00
TermiNexus d2833f6e0c fix(overload): _PyiClass 补传内存池,修复 undefined name mb
类内方法的重载后缀要调用 GenApi.overload_sig_suffix(pool, ...),但 _PyiClass 之前没有内存池参数。追加可选参数 mb 并从 _GeneratePyiFromAst 的两个调用点(模块级类、嵌套类)传下去;未传时 _PyiOverloadSuffix 返回 None,非重载路径行为不变。
2026-10-24 19:46:54 +08:00
TermiNexus af445058b4 fix(overload): _translate_method 补传 ClassDef,修复 undefined name cd
方法重载需要在类体内统计同名 def 才能决定是否追加 _v{hash},但 _translate_method 之前没有 ClassDef 参数。改为从 _translate_oop_methods 把 cd 传下去(两处调用点:sig_only 预扫描与正式翻译),未传时 _method_slot_name 退回原方法名,保持非重载路径行为不变。
2026-10-24 19:34:22 +08:00
TermiNexus 51b30d3413 feat(ffilib): Pass 0 抽取 CDLL 构建配置
import ffilib 只记别名、不进 BFS;_ScanFile 的 Assign/Expr 分发先判 _IsCDLLCall,是则交给 _HandleCDLL。四分支:Project.StaticLib -> static_libs、Project.DynamicLib -> dynamic_libs、字符串 + runtime(True=dynamic/False=static,位置参数或关键字)、list 回退形式编译期 fail-fast。路径追加沿用 static_libs/dynamic_libs 的空格拼接格式,_ResetAll 同步清零 _ffi_alias。
2026-10-24 19:15:59 +08:00
TermiNexus 850bad4e8a feat(overload): 跨模块调用 Mod.f(...) 接入重载决议
模块限定调用分支先按接收者路径解析目标模块 SHA1(含 from-import 别名),再以 prefix 模式在同名候选集里决议;vpi 注入的重载符号 {sha1}.f_v{hash} 与函数表项名 f_v{hash} 均能命中。单候选/非重载保持原 find_func_in_module 路径。至此模块级、实例方法、Class.m、静态方法、跨模块五条调用路径全部接入同一套 C++ 部分序决议。
2026-10-24 18:00:18 +08:00