12 Commits
Author SHA1 Message Date
shuiyu67 260eb23cb1 fix: 修复建议质量打磨 (用户审查发现)
- W004: 修复代码里的「默认值」占位符 → ast.unparse 提取真实默认值 (def f(items=None): items = items if items is not None else [])
- E004 del 场景: 专门建议「删了别再用 / 去掉 del」而非笼统赋初值 (del_flag 通过 analyzer._flow_del_names 传递)
- 拼写纠错保持「你是不是想写」提示性质 (语义上不一定正确, 措辞已保守)
- 304 passed 零回归
2026-08-07 09:14:40 +08:00
shuiyu67 1049370231 fix: 反啃 CPython 标准库全量 (630 文件) 修复函数内 import 漏注册
- _ScopeAnalyzer 缺 visit_Import/visit_ImportFrom → 函数内 import (局部导入) 的名字没注册进作用域
  → aifc.py math/audioop、argparse.py copy/shutil/textwrap 等 763 个 E002 误报消除
- E002 无 jedi 全量: 2332 → 1569 (剩余为 import* 盲区 + 模块级条件导入, jedi 会消大半)
- E004 216 条抽查: enum i(空串真炸)/gzip buf(else 不赋) 为合理保留; functools candidate/dataclasses value 为条件关联盲区
- 新增 2 回归测试 (函数内 import / import from); 304 passed
2026-08-07 09:04:53 +08:00
shuiyu67 e16234aba9 fix: 顶级库压测 (pydantic/fastapi/click) 修复 posonlyargs/常量迭代源/for-else 终止
- posonlyargs (/ 位置专用参数) 漏收集 → pydantic 45 个 E002 归零 (config.py class_、networks.py input_value)
- 常量非空迭代源 for x in ('a','b','c')/range(n>0): 循环体必执行 → 变量确定 (pydantic v1 host)
- for-else else 终止 → 仅 break 路径流出 → 循环变量确定 (click/utils.py i)
- 效果: pydantic E002 45→0 E004 18→7 (剩闭包盲区); Web 栈 E004 27→22; 新增 3 回归测试; 302 passed
2026-08-07 08:50:31 +08:00
shuiyu67 082efd62cc fix: 第三方库压测 (aiohttp) 修复 async/星号/while True/嵌套推导式
- 星号解包 a, *rest = ... 漏收集 → E002 (aiohttp multipart parts); 修复 _collect_target/_collect_tuple_names/_flow_collect_stores 三处
- async with / async for 完全未处理 → E004 一片 (aiohttp client resp/msg); 修复 L1 visit_AsyncWith/AsyncFor + L3 (With,AsyncWith)/(For,AsyncFor) 分支
- while True: 循环体必执行至少一次 → 其赋值确定 (client_reqrep message)
- 嵌套推导式按 gen 交错 (内层 iter 可用外层 target) (cookiejar cookie); 推导式 if 的 walrus 先于 elt 登记 (cookiejar key)
- 效果: aiohttp 67 文件 E004 59→2, E002 8→1; 新增 6 回归测试; 299 passed
2026-08-07 03:27:25 +08:00
shuiyu67 7494d57aec fix: 标准库压测修复 (walrus 登记 + match/case 绑定 + import* 提示)
- _flow_check_loads: NamedExpr(walrus) 先登记 target → ast.py end_lineno / doctest.py loader 误报消除
- _match_bound_names: match/case 模式绑定变量收集 (MatchAs/MatchStar/MatchMapping/MatchSequence/MatchClass), L1+L3 双收集 → dataclasses iterable 误报消除
- import * 文件: E002 补提示「可能来自星号导入」 (ast.py Expression 等)
- 剩余 E004 为固有盲区: 数值条件关联(difflib best_ratio<cutoff 恒真) / 闭包 / locals() 防御, 需符号执行级别, 接受
- 新增 3 项回归测试; 291 passed
2026-08-07 03:16:43 +08:00
shuiyu67 9badbf30b7 fix: L1 元组解包漏收集 + L3 for-else/try-else 路径误报 (外部真实项目扫描)
- L1: a, b = ... 解包赋值目标未收集 → xq_r/xq_i 等误报 E002 (xiaoli_chat.py 27 条误报归零)
- L3: for-else 的 else 在无 break 时必执行(含 0 次) → 其赋值确定 (renpy gamedir)
- L3: try/except/else: else return 终止 → handler 变量确定 (jinja2 asyncsupport); 无 else → handler 变量正常路径不确定保留 (jinja2 debug 真问题)
- 新增 6 项回归测试; 78 passed; xiaoli 自测 E002 误报 27→0, Ren'Py E004 194→182
2026-08-07 03:04:48 +08:00
shuiyu67 08f26cdcfd fix: L3 数据流误报大修 (真实项目扫描发现 E004 从 422 降到 3)
- with ... as f: 上下文变量未登记 → with 块内 f 全误报
- 推导式/生成器变量: target 未登记, elt 里变量全误报 (修复: 独立作用域副本)
- lambda 参数未登记 → key=lambda d 全误报
- except ... as e: handler 变量未登记 → e 全误报
- if 分支 return 提前终止未识别 → else return 后变量误报 (修复: _flow_terminates + 合并三分支)
- 剩余 3 条为已知盲区: locals() 动态检查 / try handler 保守策略 (宁误勿漏)
- 新增 7 项误报回归测试; 相关套件 283 passed
2026-08-07 02:54:13 +08:00
shuiyu67 fa29e0339f fix: 修复 L1+L3 合并时诊断全部重复 (extend 两次)
- analyze() 里 issues.extend(analyzer.issues) 被调用两次 → 每条诊断重复出现
- 综合测试发现 20 个问题实际应为 11 个; 修复为只 extend 一次
- 新增回归测试 test_no_duplicate_diagnostics; 276 passed
2026-08-07 02:44:27 +08:00
shuiyu67 413f66deb8 feat: py_detect L3 数据流引擎 (部分路径未定义就用 E004)
- _dataflow_check: 对每个函数收集局部变量(参数+赋值目标, 排除 global/nonlocal), 按路径合并扫描
  - if/elif: 合并点 defined = 两分支交集 (只有都赋值才确定)
  - for/while: 循环体赋值可能 0 次执行 → 不贡献确定; 循环体内 target 确定有值; orelse 用进入前集合
  - try: 主路径赋值算确定, except 分支独立不合并; with/delete/return/raise 处理
  - 保守原则: 宁漏勿误, 只报确定会炸的路径
- E004 动态修复建议: 建议使用前赋初值 x = None 或确保所有分支赋值
- 版本 1.3.0; 新增 12 项数据流测试; 相关套件 275 passed 零回归
- 至此 L1 规则 + L2 jedi 语义 + L3 数据流 三代引擎齐备
2026-08-07 02:41:33 +08:00
shuiyu67 5008d431c9 feat: py_detect L2 语义验证后端 (可选 jedi, 自动降级)
- _jedi_validate(): 检测到 jedi 时用语义推断二次确认 E002 未定义变量
  - 消除 from x import * / 跨文件符号 / 类型别名 的规则引擎误报
  - 真未定义保留; 无 jedi 时原样返回 (纯标准库模式行为完全不变)
- 关键坑: jedi 的 infer line/column 是 1-based (与 ast 一致, 与 LSP 0-based 不同), 之前按 0-based 传导致位置全错
- 版本 1.1.0 → 1.2.0; 新增 4 项测试 (import* 误报消除/真未定义保留/无 jedi 降级/跨文件无错)
- 相关套件 263 passed 零回归
2026-08-07 02:25:36 +08:00
shuiyu67 917ba25902 feat: py_detect 升级算法智能解释 (零 AI 模型, 纯算法动态生成)
- 拼写纠错: 未定义变量用 difflib 相似度推荐最近名字 (totl -> 你是不是想写「total」)
- 动态修复示例: W004 生成 def f(items=None) 改写; W005 生成 x is None; W006 生成 lst[:] 复制
- 动态注入上下文: 函数名/参数名/列表名/比较对象/首次定义行号/return 行号
- W005 扩展支持 != None; I001 从 type(x) 参数正确提取对象与类型
- 定位: 连 1B 模型都跑不动的设备也秒级运行, 永不联网, 不依赖任何 AI
- 新增 9 项智能解释测试; 相关套件 259 passed 零回归
2026-08-07 02:13:43 +08:00
shuiyu67 9a133dcf88 feat: py_detect 纯本地 Python 智能检测插件 + code_editor 写 .py 后自动检测
- 零第三方依赖 (仅标准库 ast/tokenize),低配电脑无压力
- 三层检测: 语法错误精确定位 / 作用域语义检测(未定义变量/重复定义/未使用导入) / 反模式扫描(可变默认参数/裸except/==None/迭代中修改/覆盖内置/import*/除零/缺self/死代码)
- 每条诊断带中文解释 + 修复建议 (规则模板, 零 AI)
- code_editor 所有写文件操作 (edit/multi_edit/insert/delete_lines/create/write/append) 改完 .py 自动调用检测, 仅有问题时输出前6条
- 40 项测试 (含 5 项 code_editor 自动检测集成)
2026-08-07 01:41:38 +08:00