90 Commits
Author SHA1 Message Date
TermiNexus 5463fac3d2 feat(vipeye-internal): 支持 match-case 内裸 break 与 fallthrough
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- break:parser 新增 _isInMatchCase(解析 case body 期间置位,与 _isInLoop 同法),_parseBreakStatement 判据放宽为 !_isInLoop && !_isInMatchCase,不再误报 breakOutsideLoop

- fallthrough:新增 ParseNodeType.Fallthrough / FallthroughNode;作为软关键字仅在「viper 方言 + case 体内 + 独占简单语句」时成立,其它位置仍是普通标识符

- 同步 parseTreeWalker 两处 switch 与 visitor、parseNodeUtils 的 ParseNodeTypeMap、binder 流程终止、flowChartBuilder 终止语句、completion 关键字、TextMate 高亮

- 测试 viperMatchBreakFallthrough.test.ts(2 用例),全量 jest 825 -> 827 通过
2026-10-02 22:29:53 +08:00
TermiNexus 9e0d12553d feat(viper): 以选中编译器 exe 目录为基准自动发现 includes 目录
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- 工程未在 .vpj/project.json 声明 includes 时的兜底:从选中编译器 exe 所在目录向上最多 4 层,只查直接子目录 includes/include(不递归),仅收真实存在的绝对路径目录

- 落点 packages/viper/src/api.ts 的 GetCompilerIncludePaths(并加入 ViperApi 接口);由 vscode-vipeye 的 workspace.configuration 中间件追加进 extraPaths(兼容 section 为 viper / viper.analysis 两种回执形状)

- 切换编译器后补发 workspace/didChangeConfiguration,使新搜索根无需重载窗口即生效
2026-10-02 20:31:42 +08:00
TermiNexus 065ab18231 fix(viper): --version 判定跳过 [ 开头的诊断行(ASan traceback 横幅)
用户实测:带 ASan 运行时的编译器 <exe> --version 会先在 stderr 打三行
[traceback] …(stack dump / DbgHelp note / ready 提示),之后才是
"Viper 1.0.5-dev.970 2026-09-28 Non-LTS"。

Node 侧 stdout/stderr 是两条流、到达顺序不定,按"整个缓冲前 5 字符"判定会
误报 PREFIX_ERR。改为 FirstMeaningfulLine:跳过空行与以 [ 开头的行继续往下读,
取第一行有效内容判前缀(同时对行首空白宽容)。VET 把两条流接进同一管道,
不存在该问题,故口径仍是"第一行内容以 Viper 开头"。

已用等价 Node 脚本对真实 exe 实测(脚本已删):
* TransPyV\output\TransPyV.exe:PE 头 5a4d/lfanew=120/4550/magic 20b/
  machine 8664→x86_64,命中 .PRVERSN(rawPtr=4574208/rawSize=512)→
  版本串 0.0.5-dev.479;--version 捕获跳过 3 行 [traceback] 后判定通过。
* notepad.exe → NO_PRVERSN、.js 文本 → NOT_EXE、不存在路径 → NOT_FOUND。

顺带把 ViperCheckResult 改为 import type(类型专用导入,运行时不再 require
./types,便于独立转译/校验)。
2026-10-02 19:48:21 +08:00
TermiNexus 4c30604ecd feat(viper): VET 未启用时仍可校验/选择编译器(TS 模拟 check)
手动「选择编译器…」原先只能走 VET 的 check 通道(stdin 写
{"check": path, "id": N} → stdout 单行回执),该通道依附常驻进程与心跳看门狗:
VET 被禁用 / 手动停止 / 启动失败 / confirmSeconds=0 时选编译器直接失败。

现在 EnvironmentTool.CheckExecutable 先看 CanUseCheckChannel()(要求
state === 'running' && confirmSeconds > 0 && 进程在 && stdin 可写;启动中/重启中
也走本地路径,否则要等它扫完一轮才可能进确认窗口、白等超时),不满足即回退
本地模拟:

* 新增 packages/viper/src/executableProbe.ts(LocalCheckExecutable):
  ① 读 PE:DOS MZ → e_lfanew → PE\0\0 → 可选头 Magic → 节表 → .PRVERSN 段,
     取版本串;COFF Machine → arch。小端字段一律用逐字节「或 + 移位」位操作解码
     (与 VET VPe.ReadU16/ReadU32 同口径)。
  ② 跑 <exe> --version:合并捕获 stdout+stderr、5 秒超时(= VET 的
     VERSION_PROBE_TIMEOUT_MS)、输出前 5 字符须为 Viper。
* 失败原因串与 VET 的 check_msg 逐字一致(NOT_FOUND / NO_PERMISSION / NOT_EXE /
  NO_PRVERSN / PRVERSN_ERR / PREFIX_ERR / TIMEOUT / EXE_ERR,0x<HEX>),故文案与
  选择/回报流程完全复用;本地路径只读,不写缓存、不入库。
* VET 处于 running 时行为不变(仍由 VET 校验并写回它的缓存)。

配套文案:进度标题与提示去掉「VET」前缀(正在检查… / 检查未通过:…);
状态栏 tooltip 增加「VET 未运行,选择时由扩展本地检查该 exe」说明。
2026-10-02 18:57:40 +08:00
TermiNexus 3fd61c2594 feat(vipeye-internal): 支持泛型类型参数带界 class GSList[T: GSListNode]
includes/linkedlist.vp 的 GSList 泛型链表 body 依赖 T 的上界解析成员,原先
共 4 条误报(GSList[T]* 的 Head/Tail 赋值「GSListNode* 不可分配给
rawptr[type[T@GSList]]」+ CPtr[T] 上查 Next「属性 Next 未知」)。补齐三处:

① CPtr 解引用把 TypeVar pointee 具体化为上界(成员访问 / applyAttributeAccess
   Override / 下标三处 Viper CPtr 分支):否则 self.Tail.Next(base = CPtr[T])
   在 CPtr 上找 Next 失败。
② assignType 新增「泛型类型参数值 → CPtr[T]」放行(紧跟既有「类实例 → CPtr[T]
   隐式取地址语义」之后):判据为目标 pointee 与源是同一类型参数
   (TypeVarType.getNameWithScope 相等),或把源具体化后按普通规则递归比较。
   依据:Viper 中类类型的值本身就是指针,覆盖 self.Head = node / self.Tail = node。
③ 未特化泛型基类上解析出的成员类型会退化成 CPtr[builtins.type 实例]
   (即"某个类对象"),按「指针目标未知」放行(与 rawptr/void* 同口径)。

无界(GSList[T])仍报 Next 未知 —— 带界才是修复手段,测试固定该差异。
TransPyC 无需改动(includes/ast/parser.vp 本就跳过 bound)。

新增 viperGenericBound.test.ts 2 用例(带界 0 报错;无界报错行恰为 [20,24])。
jest 823 → 825。
2026-09-29 00:32:18 +08:00
TermiNexus b8101947cf fix(vipeye-internal): 同一继承体系内结构体指针双向转换(放行下转型)
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
指针隐式转换收紧后,结构体分支只认 isDerivedFrom(src, dest) 的**上转型**,
把下转型判为非法,导致 TransPyV 真实代码误报:

  TransPyV/App/lib/core/Gen/Call/CallGenDispatch.vp:824
    len_arg_node: ast.AST* = cargs.get(0)
    self.Gen.CallGenProp._is_list_builtin_receiver(pool, len_val, len_cls_nm,
                                                   "__len__", len_arg_node)
    形参声明 cl: rawptr[ast.Call](Call 派生自 AST)
  → 无法将"rawptr[AST]"类型的参数分配给函数"_is_list_builtin_receiver"中
    类型为"rawptr[Call]"的参数"cl"

Viper 指针运行期不带静态类型(都是 i8*),同一继承体系内的 reinterpret
(含下转型)是既有代码的常规写法,编译器也接受,故改为**继承体系内双向**:
isDerivedFrom(src, dest) || isDerivedFrom(dest, src)(仍在 cloneAsInstantiable
之后比较)。不相关结构体(Node* → Other*)、结构体 ↔ 基本类型仍拒绝。

viperPointerConversion.test.ts 增至 3 用例:新增「AST*↔Call* 放行 + 不相关结构体
报 L28」,既有 2 用例断言([19] / [36,46,49])不变。jest 822 → 823。
2026-09-28 17:37:23 +08:00
TermiNexus bc5bd3a425 fix(vipeye-internal): REnum 变体指针与根指针互转放行(修复 llvmlite 误判)
指针隐式转换收紧后,「pointee 必须兼容」把 REnum 变体指针
rawptr[LLVMType.Ptr] 判为与 rawptr[LLVMType] 不兼容,导致 llvmlite 的
build_load(builder, ty: rawptr[LLVMType], ...) 误报「无法将 rawptr[Ptr]
类型的参数分配给类型为 rawptr[LLVMType] 的参数 ty」。

成因:变体类(class LLVMType(t.REnum) 内的 class Ptr / class Int ...)是
**嵌套类**而非根类的子类,isDerivedFrom 判不出关系;而 match 的变体模式收窄
(patternMatching.narrowTypeBasedOnClassPattern)会把 CPtr[LLVMType] 收窄成
CPtr[LLVMType.Ptr],CallGenCall.vp 里的 lb_inner 正是这样被收窄后传回根指针形参。

TransPyV 对二者只 emit bitcast(tagged-union 负载地址 ↔ 联合地址),故放行同一
REnum 家族内的指针双向互转:新增 isViperREnumFamilyPointee(fullName 前缀嵌套
判定 + isViperREnumRootClass 判 mro 含 .REnum),与收窄判据同口径。
跨变体(Ptr* → Int*)与 REnum ↔ 无关结构体仍拒绝。

新增 viperREnumPointer.test.ts 2 用例:嵌套 match 收窄形状 0 报错;转换矩阵
断言报错行恰为 [32,36,37]。jest 820 → 822。
2026-09-28 17:17:36 +08:00
TermiNexus f31ff4904c chore: 版本号提升至 1.1.427,移除函数 hover 调试信息并更新 README
- 移除 hover 函数时附加的「函数调试信息」区块(位置/修饰符/泛型参数/
  参数/返回类型),hover 只保留签名;删除 _addViperFunctionDebugPart /
  _getViperParamDebugText / _getViperFunctionReturnType 与随之无用的
  ParamCategory / ParameterNode 导入
- viperFunctionHover.test.ts 改为断言「只显示签名、不再含调试信息字段」
- CHANGELOG 拆分:baec16e(1.1.426 发布)之后 14 个提交追加的 16 条
  未发布条目移入新增的 ## 1.1.427 段,## 1.1.426 段保留发布时内容
- 版本号 1.1.426 → 1.1.427(vipeye / vscode-vipeye / vipeye-internal 的
  package.json 与 package-lock.json 共 6 个文件)
- README(根 + 扩展)更新:修正指针隐式转换规则(同级 + pointee 兼容,
  结构体仅允许上转型),补充声明/注解修饰符、[SIZE]T 与 C 风格强转、
  virtual class 方法槽赋值、属性名补全/悬停、状态栏分析进度与 LOC 命令
2026-09-28 17:01:18 +08:00
TermiNexus bc500d060f feat(vipeye-internal): 放行 virtual class 方法槽位赋值(vtable)
ViperOS devfs.vp 的 `serial0_file.open = serial0_open` 原先误报
「无法为类"devfs_file"的属性"open"赋值 / 参数名称不匹配 /
额外参数 "flags"」。

根因:devfs_file 是 virtual class,open/close/read/write/ioctl 是虚方法
(vtable 槽)。该赋值写的是 vtable 槽;编译器只把 RHS 函数 bitcast i8*
后 store,不校验签名与 self。而 LSP 走普通成员赋值路径,比较的是
**绑定方法类型**(self 已剥掉),于是 RHS 显式写的 self: rawptr 成了多余参数。

修法:typeEvaluator 的 usage.method === 'set' 分支里,assignType 之前加
isViperVtableMethodSlotAssignment 命中即视为兼容、跳过报错与收窄。判据:
- 类是 virtual class(ClassNode.d.viperClassModifier === 'virtual'
  或 @t.CVTable 装饰器);注意传入的 classType 是**实例**形态,必须先转
  可实例化形态(第一版没生效的原因)
- 成员在类里声明为方法(FunctionType)
- RHS 的 self 为泛指针(rawptr / t.CPtr / void*)或该类本身/父类的指针
- 其余非变参参数逐个 name + isTypeSame 相同,返回类型 isTypeSame 相同
  (*args / **kwargs 不参与比较)

未放行:非 virtual class、self 非指针、参数名/类型/个数不符、返回类型不符。

- 新增 viperVtableMethodAssign.test.ts(3 用例)
- .gitignore:新增 3 个 __viper_vtable_assign_* 产物目录
- CHANGELOG:1.1.426 追加 1 条
2026-09-28 15:35:47 +08:00
TermiNexus d91fc2d67e feat(vipeye-internal): 指针隐式转换收紧为「同级 + pointee 兼容」
原先「同级指针无条件允许转换」,现改为:级数必须相同,且 pointee 必须兼容。

规则(canImplicitlyConvertCType + 新增 isViperCPtrPointeeAssignable):
- 任一侧 pointee 是 void*/未定(rawptr)→ 允许
  (裸 rawptr 的实参是类自身的 TypeVar,不是 UnknownType,必须一并认)
- pointee 规范化后相同 → 允许(先剥联合里的 C 修饰符、
  再统一实例形态,否则 volatile int / type[ParamNode] 会误报)
- 两侧 pointee 都是基本类型(数值标量)→ 复用 T 的转换规则
- 结构体等非基本类型 → 仅允许上转型(源类派生自目标类,
  比较须 cloneAsInstantiable;MemBuddy* → MemManager* 是真实依赖),
  不相关结构体 / 向下转型 / 结构体↔基本类型一律拒绝
- 单级指针 ↔ t.CVoid(void*)双向允许;多级(Node** → void*)禁止

要点:CPtr↔CPtr 分支必须放在「同名即允许」快捷判断之前(两 CPtr 的
shared.name 都是 'CPtr',否则 pointee 完全不看)。

`&x` / `*x` 的返回类型本就正确(x: T* → *x: T、&x: T**),本次确认它们
已参与上述拦截:a(&x)(x: T*,T** 传给 void*)仍报错。

- 新增 viperPointerConversion.test.ts(2 用例:一元 &/* 类型 + 拦截;
  同级 pointee 兼容矩阵,断言报错行恰为 [36,46,49])
- .gitignore:新增 __viper_ptr_unary__/ __viper_ptr_convert__/
- CHANGELOG:1.1.426 追加 1 条
2026-09-28 15:26:51 +08:00
TermiNexus c7878ab9d7 feat(vipeye-internal): __attribute__ 补全/hover 列出未声明的属性名
属性名是编译器级开放集合,补全/hover 原先只枚举 `t.attr`,故 codegen 支持
但未声明的名字(唯一已知例子 stackrealign)看不到。

- viperAttributeUtils:新增 VIPER_UNDECLARED_ATTRIBUTE_NAMES(来源
  TransPyV FuncGenBase.vp 的 stackrealign 映射、ViperOS main.vp 实际使用),
  以及 getViperAttributeNames(全集,供 hover)与
  getViperUndeclaredAttributeNames(仅未声明,供补全注入)——两处共用同一来源,
  不会与 t.attr 符号表漂移
- hoverProvider:属性清单改用 getViperAttributeNames
- completionProvider:符号表循环后注入未声明属性名(43 项)
- 不改存根 t.vpi(沿用既有决定)

- viperAttribute.test.ts:既有补全/hover 两用例各加 stackrealign 断言
- CHANGELOG:1.1.426 追加 1 条
2026-09-28 15:04:26 +08:00
TermiNexus 71cb333549 feat(vipeye-internal): __attribute__ 属性名结构化高亮(未声明的也不报错)
`@__attribute__(section(".text.startup"), aligned(16), stackrealign)` 里
`stackrealign` 原先不高亮(白色)且误报「无法访问类"type[attr]"的属性」。

根因:属性名脱糖成 `t.attr.<name>`,高亮完全依赖能否解析到 `class attr`
的声明。而 `stackrealign` 在真实 t.py 与 LSP 存根 t.vpi 的 attr 类里都没有
(两边一致、无缺失),只在 TransPyV 的 codegen 映射(FuncGenBase.vp:181)
里支持,ViperOS main.vp:347 在用。

改法(结构化,不依赖存根声明):
- parseNodes:NameNode.d 新增 isViperAttrMarkerName
- parser._makeViperAttrMarker:给合成的属性名成员名打该标记
- semanticTokenProvider._classifyNameNode:该标记直接按 function 着色
  (与 section/aligned/naked 等已声明属性同款)
- typeEvaluator:新增 isViperAttrMarkerMember,与
  isViperBracketArraySyntheticMember 一起跳过 memberAccess 诊断
  (编译器对未知属性是静默丢弃,不是报错,故这是误报)

- viperAttribute.test.ts:增至 9 用例(新增未声明属性名 stackrealign 的
  高亮 + 不报错断言)
- .gitignore:新增 __viper_attribute_unknown__/
- CHANGELOG:1.1.426 追加 1 条
2026-09-28 14:59:44 +08:00
TermiNexus b4808c2821 fix(vipeye-internal): [SIZE]T 数组不要求源码 import t(元素成员可解析)
ViperOS 协程调度器里 `coroutines: [8]Coroutine` 字段在**没 import t** 的
文件中,`m.coroutines[prev_cid].rsp` 报「无法解析类型上的成员“rsp”访问」,
`.rsp` 拿不到语义 token(黄标、无法跳转)。

根因:`[SIZE]T` 脱糖出的合成 `t` 名(isViperBracketArraySynthetic)在
typeEvaluator 的 Name 分支里解析不到时直接降级为 Unknown,于是
`t.CArray[Coroutine, 8]` 整条塌成 Unknown → 字段类型 Unknown → 元素成员访问全断。

修法:该分支改为 `getViperImplicitModuleType(node, name) ?? Unknown`,
回退到 builtins 作用域里绑定的 `t` 模块(与 `T*` 的 rawptr 回退、
`__attribute__` 的隐式模块根同口径);仍取不到才静默 Unknown。

- viperBracketArrayAndConstPtr.test.ts:增至 7 用例(新增「无 import t 时
  [SIZE]StructT 仍解析元素类型、.rsp 得到 variable(3) 语义 token」)
- .gitignore:新增 __viper_bracket_array_no_import_t__/
- CHANGELOG:1.1.426 追加 1 条
2026-09-28 14:22:38 +08:00
TermiNexus f234e38701 fix(vipeye-internal): 撤销注解内 static 前缀写法,只认语句起始形态
不再允许 `memory_regions: static memory_region* = None`,改为
`static memory_regions: memory_region* = None`(仅 Vipeye 侧改动)。

- parser:`_parseViperTypeAnnotationCore` 改为调用新增的
  `_checkViperStaticInAnnotationPosition()`,命中就报
  `viperStaticInAnnotationNotAllowed` 并跳过 static、继续解析剩余类型
  (错误恢复,不再连带报 "static" is not defined)
- 删除 `_parseViperStaticTypeDescriptorPrefix()`、
  `_viperStaticDescriptorInAnnotation` 字段与 `_parseExpressionStatement`
  里的标记读取块
- localize + nls(zh-cn/en-us):新增 viperStaticInAnnotationNotAllowed
- viperStaticModifier.test.ts:原两个注解内 static 用例换成
  「语句起始 static 合法」+「注解内 static 报专用错误」两个用例
2026-09-28 13:46:12 +08:00
TermiNexus 0bc7a7c4d4 feat(vipeye-internal): 支持 export/extern 变量声明(extern 禁止初始值)
- export NAME: T [= v] -> T | t.CExport(裸名定义,不加模块 SHA1 头),允许初始值;
  extern NAME: T -> T | t.State(= CExtern | CExport 仅声明),不允许初始值:
  extern a: int = 1 报「extern 变量声明不能带初始值(符号定义在外部)」
- 与函数形态由第三个 token 区分(`:` 变量 / `(` `[` 函数),与 TPC
  _is_export_extern_var 同判据;export def / export f() 形态逐字不变
- 存储类标记按修饰符处理:Struct|CPtr 折叠与联合下标 skip 列表改用
  isCModifierType(避免 extern p: t.CPtr 折成 CPtr[State]、str|State 下标误报);
  CArray 元素访问快路径放宽到"联合里的 CArray 成员"(gdt[i].access 仍解析)
- typePrinter 增加 CExport->export / State->extern 前缀渲染(hover 显示 export int)
- 新增 viperExportExternVar.test.ts 4 用例,jest 809 -> 813
2026-09-27 18:13:37 +08:00
TermiNexus c8817cacb1 fix(vipeye-internal): CArray 元素访问解析出元素类型(成员可高亮)
- kbd_buf: [KBD_BUF_SIZE]usb_kbd_event 的 kbd_buf[i].modifier 原先报
  「无法解析类型上的成员“modifier”访问」且该成员拿不到语义 token(纯白)
- 根因:t.vpi 的 CArray 是 Generic[T, N] + __getitem__ -> T,但 Viper 侧
  TypeVar(...) 不产出可替换类型变量(类型参数落到合成参数 __P0/__P1),
  返回类型永远具体化不了 → 下标恒为 Unknown
- 修法:getTypeOfIndexedObjectOrClass 新增 Viper 分支,按 C 语义直接取
  CArray 第一个类型实参(与 CPtr 分支读 priv.typeArgs[0] 同法),
  `[SIZE]T` 与显式 t.CArray[T, N] 两种写法都覆盖
- 回归用例 +1(元素类型 + modifier 语义 token),jest 808 -> 809
2026-09-27 18:02:53 +08:00
TermiNexus 5808a76b23 fix(vipeye-internal): 支持注解内 static 前缀;*args 在未 import t 时仍是 va_list 指针
- `x: static T = v`(ViperOS VKernel/Kernel/drivers/** 全仓写法,如
  `buf_head: static uint32 = 0`)脱糖为与语句起始形态相同的 `t.CStatic | T`,
  并在声明节点打 isViperStatic,跨模块取参检查同判据;此前 `static` 在注解里
  被当普通名引用,误报「"static" is not defined」。软关键字边界不变
  (`static: int` / `static = 1` 仍按标识符),tmLanguage 一并高亮注解内 static
- `getViperCPtrType` 增加 builtins `rawptr` 回退:文件没有 `import t` 时
  `*args` 不再退回 Python tuple 语义,`viperlib.vsnprintf(&buf, 1024, fmt, args)`
  不再误报「tuple 不能赋给参数 ap(str)」(与 T* 注解 / [SIZE]T 同机制)
- 回归用例 +3:注解内 static 解析/展示/跨模块拦截 + 软关键字边界、
  未 import t 的 *args 透传;jest 805 -> 808
2026-09-27 14:26:42 +08:00
TermiNexus 2a7757e3b7 fix(vipeye-internal): 拦截 const 指针下标赋值并放行 const 指针迭代
- const 指针的 p[i] = v 下标赋值与 *p = v 解引用赋值共用
  viperConstDerefAssignment 诊断,指向只读数据一律报错;
  非 const 指针(buf: str)的下标/解引用赋值仍合法
- 迭代判据改认全 Viper 指针(CPtr / str / bytes):新增
  viperTypeContainsPointer 并替换 getTypeOfIterator / getTypeOfIterable
  里只认 CPtr 的旧写法,path: const str 的 for ch in path: 不再
  误报「“CConst”不可迭代 / 未定义 __iter__」;const int 仍不可迭代
- 补 2 个回归用例(下标读写、const 指针可迭代),jest 803 -> 805
2026-09-27 13:49:50 +08:00
TermiNexus a7a00a23d5 fix(vipeye-internal): [SIZE]T 支持整型常量运算;const 指针只读(解引用可读不可写)
- [SIZE]T 的 SIZE 是值表达式,允许任意整型常量运算(如
  [MAX_VOLUMES * MAX_PARTITIONS]uint8 / [N - 1]uint8 / [1 << 3]uint8)。
  parser:解析 SIZE 期间清除 _isParsingTypeAnnotation,否则 Viper 的
  「星号是指针后缀 + 注解中停止解析」分支会吞掉 '*',误报「[ 未关闭」与
  「类型表达式中不允许使用解包运算符」。
  evaluator:operations 的 TypeExpression 分支新增整型常量算术放行
  (isViperIntegerConstantArithmetic),此前注释已写明但代码未实现,
  t.CArray[T, MAX_ORDER + 1] 同样受益;类名相加仍报 binaryOperationNotAllowed。
- const 指针(lfn: const str = CConst | str)只读:解引用读允许
  (*lfn / lfn[0] → char,getTypeOfViperDeref 跳过 C 修饰符子类型,
  不再误报 类型"const str"不支持运算符"*"),解引用赋值报新诊断
  viperConstDerefAssignment(*lfn = c);非 const 指针 *buf = c 仍合法。
- 新增 viperBracketArrayAndConstPtr.test.ts(3 用例);全量 jest 800 → 803 通过。
2026-09-27 13:44:30 +08:00
TermiNexus 90f4118603 feat(vipeye-internal): 支持 static 修饰符(禁止跨模块取参)与 f-string 前缀高亮
- static 是软关键字:`static def f` / `static fn f`(走 virtual 同一机制,记在
  FunctionNode.d.viperModifier)与 `static x: T = v`(注解脱糖为 `t.CStatic | T`,
  与 TPC _parse_type_ann 同形,展示为 `static int`)。其余位置仍是普通标识符
  (`static = 1` / `static: int` / `static(x)` / `def f(static: int)`)。
- 语义 = C 的 internal linkage:跨模块取参报错。两处拦截:模块成员访问
  (`mod.name` / `mod.fn()`)与 `from mod import name`;按声明所在文件判定,
  同模块自引用/自导入放行。新增诊断 viperStaticUsedOutsideOfModule(zh-cn/en-us)。
  判据 parseTreeUtils.isViperStaticDeclarationNode 供两处共用。
- static 并入补全关键字与 TextMate 修饰符高亮。
- f-string 的 r/u/b/f 前缀以 storage.type.string.viper 高亮(默认深色主题下为蓝色),
  之前该前缀不在字符串范围内、无任何规则命中,显示为白色。
- 新增 viperStaticModifier.test.ts(4 用例);全量 jest 796 → 800 通过。
2026-09-27 13:19:57 +08:00
TermiNexus 4d5a0d203b feat(vipeye-internal): __attribute__ 免 import t/c 与状态栏分析进度
- __attribute__ 脱糖出的 t / c 模块根改为「隐式模块根」(零长度合成名 +
  isViperImplicitModule 标记),作用域链取不到时回退 builtins 直接查
  symbolTable,故不再要求源码 import t / import c;手写裸 t / c 仍报未定义。
  补上 builtins.vpi 缺失的 import c(原先只有 import t,装饰器路径一直报
  「未定义 c」)。
- 新增左下角状态栏分析进度:逐文件回调 → 后台线程节流 50ms 回传
  analysisProgress 消息 → 前台 sendNotification('viper/analysisStatus')
  → 客户端 StatusBarItem 显示 `C:\xxx\1.vp (4/90) 4.44% loading...`,
  分析结束自动隐藏,让用户能区分「插件在忙」与「插件卡死」。
- viperAttribute.test.ts 补回被误删的 hover 用例并新增 2 个回归用例;
  jest 794 → 796 通过。
2026-09-27 13:03:03 +08:00
TermiNexus baec16e540 feat(vipeye-internal): Viper 1.1.426 语法/语义/补全增强
把 TransPyC 现行语法与 Viper 的类型组合语义补齐到 LSP 侧(编译器 TPC/TPV 不改动):

- 类型描述符:`const` / `volatile` 可前缀任意类型注解并成为硬关键字(仅注解前缀
  合法,`const = 1` / `a: const` 报语法错误),解析层脱糖为等价的 `CConst | T` /
  `CVolatile | T`,与手写 TypeSet 完全同形;`const T*` 得 `CConst | CPtr[T]`;
  `T*` / `&x` 不再要求 import t(回退 builtins 的 rawptr);描述符按「前缀限定符」
  渲染(`const int` / `const volatile int` / `const rawptr[int]`)而不泄漏为联合成员
- 新增 `inline while` / `inline for`;`const` / `volatile` / `inline` 高亮为修饰符
- 新增内建类型名 uint / uchar,并把 rawptr / sizet / int8..uint64 / uintfast* /
  uintleast* 等内建到 builtins.vpi,任意 Viper 工程无需配置 includes
- 新增 `virtual` / `novirtual` 声明修饰符(等价 @t.CVTable / @t.NoVTable),
  含放置位置校验,并并入补全与高亮
- `(T**)x` 两级指针强转修复:指针类型后缀统一按类型表达式求值,不再被当成解引用
- 裸内置内联汇编 / LLVM IR:`__asm__` / `asminp` / `asmout` / `__llvmir__` /
  `irinp` / `irout` / `ASM_DESCR`,与 c.* / t.ASM_DESCR 写法等价
- `X | t.CPtr` 在 X 本身是指针时再包一层(HANDLE | t.CPtr = void**),
  修复 CreatePipe 一类 LPHANDLE 的「跨级指针隐式转换不允许」误报
- 补全并入 Viper 专有关键字(define / const / volatile / typedef / inline / export /
  extern / virtual / novirtual / enum / rnum / union / struct / fn / fun / func / function)
- `T*(x)`:裸模块名 + 模块内同名类归一为 CPtr[bootinfo];并按 TPC `_AtPtrSuffixCall`
  的判据把「类型原子 + 紧贴星串 + 紧贴 (」解析为调用,使
  `uint32*(info.vendor_id)[0] = res.ebx` 成为合法赋值目标
- 新增「重复声明」检查:模块级已有同名运行期变量时,函数内再用类型注解声明同名
  变量无条件报 TypeError(与 TPV AssignGenMixin 同口径);排除 CDefine 宏、CTypedef
  别名、同名函数/类与类体成员。合法写法只剩 `global x` + 无注解赋值,或换名
- 支持 `__attribute__`:装饰器 `@__attribute__(...)` 脱糖为
  `@c.Attribute(t.attr.X, ...)`;注解修饰器 `a: __attribute__(...) const int`
  脱糖为 `t.attr.X | (CConst | int)`;注解联合中的 `t.attr.*` 标记求值为 t.CAttr
  修饰符(运算/下标/赋值/展示均按被修饰的基础类型处理);值位置
  `volatile f()` / `volatile 结构体()` 前缀;`__a` 补全、括号内属性名补全与悬停、
  TextMate 高亮
- 注解位置小写 `callable[[A, B], R]` 等价 t.Callable:parser 仅在类型注解位置把裸名
  `callable` 脱糖为 `Callable`,builtins.vpi 内建 `Callable` 别名(无需 import t);
  值位置 `callable(x)` 仍是内置函数
- 版本号提升至 1.1.426 并更新 CHANGELOG;新增 6 个回归测试文件、更新 4 个,
  全量 64 套件 / 794 用例全绿(另有 1 套件 8 用例为既有 skip)
2026-09-27 12:50:02 +08:00
TermiNexus b98102b78f feat(viper): 新增「统计项目 LOC」命令与报表 Webview
- 右键 .vpj → Count Project LOC(viper.countLines):递归扫描项目的 source_dir,
  统计文件数 / 总行 / 代码行 / 注释行 / 空行 / 注释率 / 平均行长 / 字符数
- 先打开 Viper LOC Webview 面板再扫描:确定性进度条(先收集文件,再按 N/M 处理
  并显示当前文件),完成后渲染 KPI 卡片、按语言的堆叠条形图(代码/注释/空行,
  以最大语言为基准缩放)、语言筛选(勾选后重算 KPI/图表/表格)与明细表(含合计行)
- 同一份报表以纯文本写入 Viper LOC 输出通道,便于复制
- 计入本扩展注册的语言扩展名 .vp / .vpi / .vpnci / .vpj,并按需求支持 .def
  (; 与 // 行注释、/* */ 块注释,跨行块注释按注释计)
- 跳过项目 build_dir、隐藏目录、node_modules、.git、__pycache__,不跟随符号链接
2026-09-27 12:49:25 +08:00
TermiNexus aa1c84a326 feat(vipeye-internal): 支持 typedef 语句与 (T)x 强转写法
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- typedef:新增 `typedef T1 = T2` 软关键字语句,与 `T1: t.CTypedef = T2` 完全等价。
  解析层脱糖为同形「带注解赋值」(合成零长 t.CTypedef 紧贴别名名之后,满足
  AST 子节点位置递增不重叠的不变量),绑定/类型求值/hover/语义高亮全部复用
  既有 TypeAlias 通路,且不要求文件 import t(合成 t 标记 isViperTypedef,
  未导入时静默退化,与 [SIZE]T 脱糖同一取舍)。仅 `typedef <Name> =` 形状生效,
  `typedef = 1` / `typedef(x)` 行为不变
- 高亮:viper.tmLanguage.json 为 typedef 增加 storage.type 规则(带 `\s+Name\s*=`
  前瞻,避免误伤赋值);语义高亮无需改动(合成名零长,被既有过滤跳过)
- 强转:`(T)x` 与 `(T*)x` 统一按「括号内为类型原子 + 紧跟操作数起点」归一为
  Call,等价既有 T(x) 通路;`(T*)[i]` 仍是下标、`(a)*b` 仍是乘法
- 回归用例:viperBuiltinsVpTypedef.test.ts 新增 typedef 3 例(含不 import t 与
  typedef 作普通标识符),viperUnaryPointer.test.ts 新增 (T)x 2 例
- 版本号提升至 1.1.425 并更新 CHANGELOG;全量 57 套件 / 764 用例全绿(0 失败)
2026-09-22 22:26:07 +08:00
TermiNexus e7cf7643de feat(vipeye-internal): 支持 (T*)x、(T*)(x)、T*(x) 三种 C 风格强转写法
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
TransPyC 的"新语法类型强转"除已有的调用形式(T(x) / T(x, t.CPtr) / (T)(x) /
(T1|T2)(x))外,还使用指针写法,本次一并支持,三者结果均为指针类型 CPtr[T]:

- operations.getTypeOfUnaryOperation:值上下文里一元 '*' 的操作数是「类型对象」
  (可实例化类,如 t.CInt / ast.AST)时,按指针类型表达式求值(CPtr[T]),
  不再当作对类对象的解引用而报「不支持运算符 *」
- parser:`(T*)operand` 归一为 CallNode(func = 括号内指针类型, args = [operand]),
  与已支持的 `(T*)(x)` 通路完全一致;仅当括号内由 _parseViperPointerTypeSuffix
  标记时才生效,`(a)*b`、`(a) * (b)` 等乘法不受影响
- operations.validateBinaryOperation:二元 '*' 的左操作数是类型对象时按强转
  (等价 (T*)(x))处理,从而 T*(x) 成立;真值乘法(2 * 3 / offset * 2)零影响
- typeEvaluator:callee 为被标记的指针类型后缀且类型为 CPtr[T] 时按强转返回
  CPtr[T] 实例,跳过可调用性/参数校验(函数指针变量调用 fn(x) 不受影响)
- 回归用例:viperUnaryPointer.test.ts 新增「三种 C 风格强转」测试块,
  含真实乘法与既有强转通路的对照断言
- 版本号提升至 1.1.424 并更新 CHANGELOG;全量 57 套件 / 759 用例全绿
2026-09-22 22:07:58 +08:00
TermiNexus cef653b637 chore: 忽略测试运行生成的产物
__ty_narrow_dump.txt 与 __unary_ptr__/unary_ptr.vp 每次跑 jest 都会被重写,
从版本库移除并加入 .gitignore,避免每次测试后工作区都变脏。
2026-09-22 22:07:44 +08:00
TermiNexus 36dab6433b fix(vipeye-internal): 打通 TransPyC 现行语法的解析/类型检查并清理全部既有失败用例
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- parser:C 指针后缀(T* / T**)不再限定于类型注解上下文,调用实参同样识别
  (va_arg(ap, int64*) / short* / int*),a * b、a ** b、N * 2 等真实运算行为不变
- types:str | t.CPtr、bytes | t.CPtr 折叠为 CPtr[str] / CPtr[bytes](i8**,如 argv),
  与 TransPyC 的类型契约一致
- typeEvaluator:CPtr[str|bytes] 下标返回 pointee(str/bytes)而非 char,修 argparse.vp
  `token: str = entry[0]` 误报;新增 C 风格强转识别 Type(value, t.CPtr),修
  char(addr, t.CPtr) 在 memhub.vp / requests.vp 的误报(int("12", 16) 不受影响)
- flowChartCommand:补 AnalyzerService.run 的 CancellationToken 实参(TS2554),
  此前被该编译错误阻塞的 5 个测试套件恢复运行
- 测试维护:ord 断言改为 TransPyC 现行的 def ord(s: char) -> int;
  AssignGenMixin.vp 收窄守卫改为不写死行号,抗源码漂移
- 版本号提升至 1.1.423 并更新 CHANGELOG;全量 57 套件 / 758 用例全绿(0 失败)
2026-09-22 21:50:58 +08:00
TermiNexus 988ba922f4 refactor(vipeye-internal): str/bytes 迭代元素类型统一为 char
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
接上次下标统一:`for ch in s` 的迭代元素,以及 str/bytes 作为 Iterable/Iterator 实参
时的泛型推断(enumerate/zip/map/filter/reversed/sorted/list() 等)也由 t.CChar 别名
int 改为内置 char。至此 `s[i]`、`*s`、迭代三种取字符方式元素类型一致。
删除已无引用的 getViperCCharType 辅助函数。

回归用例:viperEnumerate.test.ts 断言改为 enumerate[char] / ch 为 char。
版本号提升至 1.1.422 并更新 CHANGELOG。
2026-09-22 21:28:50 +08:00
TermiNexus d2f66811fb refactor(vipeye-internal): str/bytes 下标统一返回 char(与 *s 解引用一致)
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
`s[i]` 原返回 t.CChar,而 `*s` 返回 char,同一 i8 元素出现两种显示。现把 str/bytes
的下标通路(普通下标 + TypeSet 下标)统一改为内置 char 对象,二者本就可隐式互转。
迭代(for ch in s)与 Iterable 实参推断仍保持 t.CChar,待确认是否一并统一。

回归用例:viperUnaryPointer.test.ts 中 fmt[0] 断言改为 char。
版本号提升至 1.1.421 并更新 CHANGELOG。
2026-09-22 21:26:16 +08:00
TermiNexus 1aa1b1f2f0 feat(vipeye-internal): str/bytes 指针算术与写入解引用,并补齐 short/ushort/ulong/ulonglong 内建 typedef
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- 指针算术:str/bytes(char*,i8*)的 `p + n` / `p - n` / `n + p` 返回指针本身,
  不再报 reportOperatorIssue(与增强赋值 `dest += n` 的处理对齐)
- 写入解引用:`*p = v` 走 getTypeOfViperDeref 的解引用类型(str/bytes → char),
  赋值目标校验的 Viper 通路上次已就位,本次补回归用例
- 内建 typedef 补齐 short/ushort/ulong/ulonglong(t.CShort/t.CUnsignedShort/
  t.CUnsignedLong/t.CUnsignedLongLong),与已有 long/longlong 同处
- 回归用例:viperUnaryPointer.test.ts 新增「指针算术与下标」用例、解引用读写道,
  viperBuiltinsVpTypedef.test.ts 扩展开 g() 参数断言
- 版本号提升至 1.1.420 并更新 CHANGELOG
2026-09-22 21:23:21 +08:00
TermiNexus 00b781a5cc fix(vipeye-internal): str/bytes 支持一元 '*' 解引用,结果为 char
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
Viper 里 str 与 bytes 都是 C 的 char*(i8*),`*s` 应取首字符且类型为 char(i8);
此前被当成非指针类型处理,报「类型 "str" 不支持运算符 "*"」(reportOperatorIssue)。
在 getTypeOfViperDeref 中把 str/bytes 与已有的 CPtr[X] 分支并列处理。

回归用例:viperUnaryPointer.test.ts 新增 *fmt(str)与 *buf(bytes)→ char,
并断言不报运算符错误。版本号提升至 1.1.419 并更新 CHANGELOG。
2026-09-22 21:01:18 +08:00
TermiNexus 4bc462e0f3 feat(vipeye-internal): long/longlong 也作为内置 C 基本类型 typedef
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
对齐编译器 t.py 的 _CNAME_ALIAS(char/short/long/unsigned 等是语言内置名称,
无需 import):在 builtins.vpi 内置 long → t.CLong、longlong → t.CLongLong。
C 的 "long long" 含空格不能作标识符,故 Viper 写作 longlong;无符号形式仍可用
t.CUnsignedLongLong。

回归用例补充 g(e: long, h: longlong) -> long 的注解类型断言(CLong/CLongLong)。
版本号提升至 1.1.418 并更新 CHANGELOG。
2026-09-22 20:39:52 +08:00
TermiNexus f547737cf0 fix(vipeye-internal): C 整型 typedef 内建到 builtins.vpi,修复 uint32 报未定义
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
TransPyC 的 includes/builtins.vp 提供 sizet/size_t/uzt/int8..uint64 以及
intfast*/uintfast*/intleast*/uintleast* 等 typedef。LSP 侧原先只靠 program.ts
的 _mergeViperBuiltinsVpSymbols 定位并合并该文件,而查找依赖工作区根与打开的
文件集合,在 Trae 等环境下找不到时这些注解会集体报"未定义"(同一工程在不同
编辑器/不同打开顺序下表现不一致)。

现把等价声明内建进 typeshed-fallback/stdlib/builtins.vpi:任意 Viper 工程无需
配置 includes 即可解析;工程自带 builtins.vp 时仍以工程声明为准(合并逻辑覆盖
同名符号,行为不变)。

新增回归用例:无 includes/builtins.vp 的工程可解析 uint32/sizet/int8/uint64
并得到 CUInt32T/CSizeT/CInt8T/CUInt64T。版本号提升至 1.1.417 并更新 CHANGELOG。
2026-09-22 19:30:55 +08:00
TermiNexus de2d49cc4a feat(vscode-vipeye): 新增「清理并临时关停」命令并修复字符串内括号着色
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- 新增命令 viper.cleanupAndDeactivate(Viper: Cleanup and Deactivate):终结本窗口的
  语言服务进程、释放全部已注册资源(命令/视图/状态栏/文件监视/流程图面板),可选
  清除全局语义高亮磁盘缓存(~/.vipeye/cache/semantic-tokens)。多窗口下服务端进程
  会 chdir 占住扩展目录(Windows 无法删除),磁盘缓存又跨窗口共享,导致卸载删不
  干净、其它实例读到半删残留且重启扩展宿主无效
- 修复字符串/注释/f-string 插值内的 []{}() 被编辑器内置括号配对着色误染:viper
  grammar 贡献补 balancedBracketScopes 与 unbalancedBracketScopes
- 语义高亮缓存路径改由 common/pathUtils 统一提供,服务端与客户端共用一份定义
- 版本号提升至 1.1.416 并更新 CHANGELOG
2026-09-22 18:23:01 +08:00
TermiNexus 86fc6c541f feat(vipeye-internal): [SIZE]T 支持泛型实参位置与嵌套
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- 下标实参以 '[' 开头时按 token 前瞻判定是否为数组类型:匹配的 ']' 之后
  紧跟元素类型(标识符或嵌套 '[')则是数组,故 `list[[4]int]` 可用,
  而 `t.Callable[[int, str], None]`(带逗号)与 `t.Callable[[], None]` 不受影响
- `[SIZE]T` 的元素类型内允许再次出现 `[SIZE]T`,支持 `list[[2][3]int]`
- 测试:新增与显式写法 `list[t.CArray[int, 4]]` 的类型等价断言及 Callable 回归
2026-09-22 16:21:32 +08:00
TermiNexus a7844d359f chore: 版本号提升至 1.1.415 并更新 CHANGELOG
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- [SIZE]T 数组类型语法(等价 t.CArray[T, SIZE]、[]T 不定长)
- 修复字符串转义引号导致的作用域泄漏
- 修复 builtins.vp typedef 合并被首个绑定文件环境"污染"
2026-09-22 16:13:54 +08:00
TermiNexus 91f668a033 fix(vscode-vipeye): 字符串转义引号导致 TextMate 作用域泄漏
字符串规则没有转义子规则,`'\''` / `"\""` 会被提前闭合:后续关键字
(如 or/def/return/pass)被渲染成字符串颜色。

- 新增 string-escape(constant.character.escape.viper)并让 4 条字符串规则 include
- 单行字符串 end 由引号改为「引号或行尾」,即使写错也不会把作用域拖到下一行
2026-09-22 16:13:49 +08:00
TermiNexus d9559869e7 feat(vipeye-internal): 新增 [SIZE]T 数组类型语法(脱糖为 t.CArray[T, SIZE])
- `[SIZE]T` 等价 t.CArray[T, SIZE],`[]T` 等价 t.CArray[T](不定长)
- 支持整数字面量 / t.CDefine 常量长度、多维嵌套 [2][3]T、指针元素 [4]T*
- 支持变量、参数、返回值、类成员与 type X = 注解位置
- 解析层脱糖:AST 与手写 t.CArray[T, SIZE] 完全一致,元素类型/索引返回 T/
  数组名退化为指针/字符数组降级 str·bytes 等语义零分叉
- 下标实参按源码位置排序(AST 子节点不重叠不变量),getTypeArgs 内按语义
  顺序重排实参;合成 t/CArray 名为零长度,不产生多余语义高亮
- 不在下标实参内生效,避免把 t.Callable[[], T] 误判为数组语法
- 源文件未 import t 时静默退化为 Unknown(不报未定义 t/成员访问失败)
- hover 与诊断按源码原形显示(如 buf: [4]t.CInt)
2026-09-22 16:13:43 +08:00
TermiNexus a6299ab878 fix(vipeye-internal): builtins.vp typedef 合并改为按执行环境+文件目录缓存
合并缓存原本只用 typeshed builtins 存根的 uri 作键(全工程共用一个),
且在查找 builtins.vp 之前就标记为已合并:若第一个被绑定的文件所在环境
找不到 includes/builtins.vp(工程外散落文件、多根工作区另一根等),
后续所有文件都会永久失去 typedef,导致 uint32/int8/sizet 等集体报
"未定义"(同一工程在 VSCode 与 Trae 因打开顺序不同而表现不一致)。

- 缓存键改为(typeshed 存根 + 执行环境 root/extraPaths + 被分析文件目录)
- 新增 _isMergingViperBuiltinsVp 递归保护,替代原先"先标记"顺带承担的防重入
- 新增回归测试:先绑定其它环境文件后,本工程 typedef 仍可解析
2026-09-22 16:13:26 +08:00
TermiNexus f100f585d0 chore: 版本号提升至 1.1.414 并更新 CHANGELOG
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
2026-09-21 23:13:45 +08:00
TermiNexus 525a654f5c feat(vipeye-internal): 支持 enum X: 枚举语法与 define 常量声明
- enum:`enum NAME:` 识别为 Viper 枚举(等价 class NAME(t.CEnum)),
  成员支持裸名与逗号分隔(enum X: a, b, c),并支持同行声明后换行 TAB 续写
- enum:取值按编译期规则推导(从 0 递增,中间显式赋值后从该值 +1 续推),
  hover 显示 (variable) IsAsync: ASTFlag = 0,成员可隐式转换为 int
- enum:成员推导值超出声明类型位宽时报错(如 i1 存不下 2)
- define:`define NAME: 类型 = 值` / `define NAME = 值` 解析为常量声明,
  `define f(...)` 宏函数行为不变
- 新增整数字面量位宽校验:字面量无法存入声明类型时提示扩容,
  define 与普通声明均生效(位宽表源自 wiki 02-type-system.md)
- 新增 viperEnumFlag.test.ts(5 项)与 viperDefineConst.test.ts(4 项)
2026-09-21 23:13:38 +08:00
TermiNexus 70a4405294 chore(viper): 选择列表首项去掉手动指定 exe 路径描述并修正过时注释
该入口已改为文件选择对话框,原描述与输入框取路径等注释不再贴切。
2026-09-20 18:56:16 +08:00
TermiNexus 95a0dbf0ad feat(viper): 选择列表加「选择编译器…」,关闭 VET 后清单与选中仍可用
- 选择列表首项为「选择编译器…」(文件选择对话框 → VET check → 并入清单并切换),其后一条分隔线才是 VET 搜到的环境
- 状态栏在 VET 关闭时显示 VET 已关闭,且点击仍打开选择列表(重启改走命令面板)
- EnvironmentManager 新增 AddEnvironment:check 通过的环境无需等下一轮快照即可选中
- 抽出 PickAndCheckExecutable,去掉 check 命令与该入口的重复实现
2026-09-20 18:54:09 +08:00
TermiNexus ad3fd9810c feat(viper): VET 启动参数加 --first-no-pace,首次扫描不节流
VET 常驻模式默认对扫盘节流(每 16 个目录项 / 64 个文件 Sleep 20ms),首次全盘搜索明显变慢,正是 Viper 搜索很慢的来源。带上该开关后首轮全速、后续轮次仍按 VET 自身节流跑。
2026-09-20 18:54:03 +08:00
TermiNexus 26216889de feat(viper): 新增手动指定 exe 的 VET check 检查
- 新增 viper.checkEnvironment(命令面板 + Environments 视图标题按钮):选择 exe 后经 check 通道校验 PE/.PRVERSN 与 --version 前缀
- 回执按回带的 id 配对;check_msg 九种原因(NOT_FOUND/NO_PRVERSN/TIMEOUT/CHANNEL_UNAVAILABLE 等)映射为可读说明
- stdin 写入改为入队后仅在心跳窗口内逐行送出(check 在前、心跳最后、行间 300ms、按窗口时长限量),规避看门狗对同批多行的读取行为
- 进程退出/停止时唤醒等待中的请求,避免调用方悬挂
2026-09-20 18:19:52 +08:00
TermiNexus 5d6fcf7c82 feat(viper): 接入 VET 环境发现,支持停止/查看输出与粘性选择
- 新增 EnvironmentTool / EnvironmentManager:常驻 scan 进程客户端(启动、心跳确认、快照解析、异常退出的指数退避重启)与全量快照 diff
- 侧边栏新增 Environments 视图(按 source 分组、选中项打勾);状态栏只保留 VET 环境项,移除硬编码 C:\v.exe
- 默认复用上次使用的环境 uuid,VET 未给出该 uuid 时取发现的第一个,一个都没发现时回退配置/兜底路径
- VET 的 stdout 与 stderr 全量转发到 Vipeye VET 输出通道,彻底移除日志文件落盘
- 新增 Stop VET / Restart VET / Show VET Output / Select Environment 命令,并补回被回写覆盖丢失的 contributes
2026-09-20 18:19:18 +08:00
TermiNexus b0f4b8b5fd chore(vipeye): 同步 package-lock 中的包版本号到 1.1.413 2026-09-19 17:59:23 +08:00
TermiNexus 640d7e4a07 feat(viper): 新增函数跳转图(Ctrl+Alt+G,面板渲染 Mermaid,可拖动缩放并导出 PNG)
- vipeye-internal/flowChartBuilder:AST -> 语句级控制流图(基本块合并)输出 Mermaid,
  覆盖 if/elif/else、for/for-else、while/while-else、match-case、try/except/else/finally、
  break/continue/return/raise、with;嵌套 def/class 折叠为单节点
- finally 穿透:return/raise/break/continue 与未匹配异常都先经过 finally 再继续,
  嵌套 finally 由 _routeThroughFinally 按最内层到最外层串联,并对边去重
- vipeye-internal/flowChartCommand:新增 viper.showFunctionFlowChart 命令,按 offset
  取最内层函数,返回 Mermaid 与「节点 -> 行号」映射
- vscode-vipeye:底部停靠面板 WebviewView 渲染 mermaid(外部脚本 media/flowChartWebview.js,
  数据经 postMessage 下发),支持拖拽平移(指针锁定无限拖 + 视口内保留可见图块)、
  滚轮缩放、适应宽度/重置、点击节点跳转源码行
- 导出 PNG:倍率/宽高/裁剪空白边距/透明或白色背景 + 实时预计尺寸,
  经 data: URL -> canvas 光栅化(导出前用 htmlLabels:false 重渲染,避开 foreignObject)
- 入口:快捷键 Ctrl+Alt+G、编辑器右键菜单、命令面板
- 依赖与构建:新增 mermaid 依赖,rspack 拷贝 mermaid 预构建产物与面板脚本到 dist/media
- 新增 9 个用例覆盖上述语句结构与 finally 穿透
- 同步 package-lock 中的版本号与 mermaid 依赖
2026-09-19 17:58:59 +08:00
TermiNexus cfccbac6f4 feat(vipeye-internal): 类型展示保留源码书写的完整 module 路径
- typePrinter 新增 ViperSourceQualifiedNames(1<<15),打印类名时优先取
  ClassDetailsPriv.displayName(源码里实际书写的 ast.AST 形式),未写限定路径的
  裸名(list/str)保持短名;UniqueNameMap 与打印共用 getPrintableClassName,
  避免名字唯一性判定与实际打印名不一致导致误降级
- types 新增 displayName 字段与 cloneForDisplayName(仅用于展示,不参与类型判定)
- typeEvaluator 在成员访问处记录点号路径(getDottedNamePath),仅 Viper 方言生效
- hoverProvider / tooltipUtils 透传 PrintTypeOptions.sourceQualifiedNames
- 修正 hover 与补全的代码围栏注释:```viper 实际可着色,但只有通用 scope 能命中
  主题规则(def/class 的 storage.type.*.viper 与按 Python 精调的主题规则不匹配),
  故继续使用 ```python
- 同步 viperUnaryPointer / viperFunctionHover 用例的展示断言
2026-09-19 17:58:49 +08:00
TermiNexus c9acd4ecb8 chore(vipeye-internal): 修剪 samples 残留与孤儿测试辅助
Validation / Typecheck (push) Has been cancelled
Validation / Style (push) Has been cancelled
Validation / Test macos-latest (push) Has been cancelled
Validation / Test ubuntu-latest (push) Has been cancelled
Validation / Test windows-latest (push) Has been cancelled
Validation / Build (push) Has been cancelled
Validation / Required (push) Has been cancelled
- samples 根目录 1277 个散落 .py/.pyi 夹具删除,仅保留被现存用例引用的 15 个
  (badToken1/test_file1/lines1/parser1-2/suiteExpectedColon1-3/maxParseDepth1-2/
   parserRecovery1-3/fstring6/finallyExit1)+ 2 个 viper_*.vp;子目录夹具不动
- 删除已无引用的 harness/fourslash/runner.ts(fourslash 夹具与 testState.test 已删)
- 保留 tests/lsp/languageServerTestUtils.ts:仍被 typeServer.virtualFileRedirect 引用

验证: 全量串行 53 套件通过、1 跳过,732 用例全绿
2026-09-18 23:10:41 +08:00