- 新增三个 demo 工程(demo-eslint / demo-sqlfluff / demo-stylelint):各含 src/ 样例代码与覆盖率映射(run-coverage.mjs、coverage_map.json、stylelint_line_map.json) - 归档各 demo 的插件实测导出报告(reports/): - demo-eslint:common.js / esm-demo.js / legacysyntax.cjs / typescript.ts 审查报告 + 覆盖率报告(292/292 条零偏差,126 种规则全覆盖) - demo-sqlfluff:11 个 SQL 样例审查报告 + 覆盖率报告(113/113 条零偏差,57 种规则全覆盖,含 JJ01 行号缺陷修复后的复测验证) - demo-stylelint:common.css / empty-source.css 审查报告 + 覆盖率报告(145/145 条零偏差,68 种规则全覆盖)
5.8 KiB
5.8 KiB
代码审查报告
文件: data\demo-eslint\src\legacysyntax.cjs
语言: javascript
耗时: 152.1s
分析工具: eslint
总计: 18 | 错误: 14 | 警告: 2 | 建议: 2
静态分析 · 14 个问题
- 🔴
eslint:no-nonoctal-decimal-escapeL8 不要使用 '\8' 转义序列。 建议: 在非严格模式字符串中\8会被静默当作普通字符8。如果只是要字符 8,请直接写'8 and 9';如果要表示反斜杠加数字,请使用String.raw或双反斜杠转义。 - 🔴
eslint:no-nonoctal-decimal-escapeL8 不要使用 '\9' 转义序列。 建议: 在非严格模式字符串中\9会被静默当作普通字符9。如果只是要字符 9,请直接写'8 and 9';如果要表示反斜杠加数字,请使用String.raw或双反斜杠转义。 - 🔴
eslint:no-octalL11 不应使用旧式八进制字面量。 建议:010是旧式八进制字面量,值为十进制 8,且在严格模式下是语法错误。若要表示八进制值 8,应写0o10;若要表示十进制 10,应写10。 - 🔴
eslint:no-withL16 不应使用with语句。 建议:with会动态修改作用域链,难以静态分析和优化,在严格模式或 ESM 中还是语法错误。建议先解构出所需属性:const { pi, e } = { pi: 3.14, e: 2.72 };再使用。 - 🔴
eslint:no-undefL17 未定义变量console。 建议: ESLint 配置中没有声明console全局变量。建议在eslint.config.mjs中设置languageOptions.globals为globals.node,或在本文件中使用globalThis.console。 - 🔴
eslint:no-undefL17 未定义变量pi。 建议:with对象中的属性pi不会成为真正的词法作用域变量,因此静态分析无法识别。请参考no-with的修复:先解构出pi再使用。 - 🔴
eslint:no-undefL17 未定义变量e。 建议:with对象中的属性e不会成为真正的词法作用域变量,因此静态分析无法识别。请参考no-with的修复:先解构出e再使用。 - 🔴
eslint:no-varL21 不应使用var,请改用let或const。 建议:deletable后续会被置空,使用let deletable = 42;;如果确定不再重新赋值,可考虑const。 - 🔴
eslint:no-delete-varL22 不应删除变量。 建议:delete只能删除对象属性,不能移除var/let/const声明的变量绑定。若要清理引用,请改为deletable = null;;若要真正可删除,请把数据放进对象属性再delete。 - 🔴
eslint:no-dupe-argsL25 函数参数名重复:a。 建议: 重命名第二个参数,并保持函数行为不变:function duplicateArgs(a, b) { return b; }。 - 🔴
eslint:no-redeclareL25a已重复声明。 建议: 移除重复参数名,将第二个参数改名为b,并返回b。 - 🔴
eslint:no-unused-varsL32 变量err已被声明但从未使用。 建议: 如果要保留原始错误,请把它作为cause传给新错误:throw new Error('parse failed', { cause: err });;如果确实不需要原始错误,可使用省略绑定参数的catch { ... }。 - 🔴
eslint:preserve-caught-errorL33 抛出的新错误没有附带原始错误作为cause。 建议: 在抛出Error时使用第二个 options 参数传递cause:throw new Error('parse failed', { cause: err });,以保留原始错误链和堆栈信息。 - 🔴
eslint:no-undefL36 未定义变量console。 建议: 在 ESLint 配置中声明console全局变量,或使用globalThis.console.log(...)。
AI 审查 · 4 条建议
- 🟡 [AI] [bug]
legacy-octal-value-confusionL11 旧式八进制字面量010的实际值是 8,而非 10 在宽松模式下,010会被解析为旧式八进制字面量,等于十进制 8。如果写010的人以为是十进制 10,就会引入静默的数值错误;即使确实想表示八进制,也应使用明确的0o10,避免歧义并绕过no-octal规则。 建议: 若语义是十进制 10,改为10;若语义是八进制 8,改为0o10。 - 🟡 [AI] [bug]
delete-var-no-opL22delete deletable不会删除变量,清理意图不生效delete操作符只对对象属性有意义;对var声明的标识符执行delete不会移除该绑定,在非严格模式下通常静默失败并返回false,deletable仍然是 42。这样的代码会给维护者造成“变量已被删除”的错觉。 建议: 如果只想清空引用,改为deletable = null;;如果需要“可删除”的数据,请改为const data = { deletable: 42 };然后delete data.deletable;。 - 🔵 [AI] [design]
legacy-syntax-in-production-fixtureL3 演示旧式语法的代码不应混入生产/业务源码 该文件故意依靠.cjs和 sloppy mode 来使用with、旧式八进制、重复参数等旧式语法。一旦文件被加入"use strict",或迁移为 ESM/被复制进严格模式环境,这些代码会立即变成SyntaxError。作为语法规则演示/回归样例,应放在测试 fixtures 中并由 ESLint 显式配置解析。 建议: 将这类 legacy 语法样例移动到tests/fixtures/legacy/,在测试配置中明确sourceType: 'script'和适用的ecmaVersion,不要放在主代码目录。 - 🔵 [AI] [design]
missing-node-globals-configL17 ESLint 未声明 Node 全局变量,导致console反复触发no-undef第 17、36 行的console在 Node 运行时是合法的全局变量,但当前 ESLint 配置没有引入globals.node或文件级注释,所以被重复报告为未定义。逐个改成globalThis.console会掩盖根因:ESLint 环境配置缺失。 建议: 在eslint.config.mjs中languageOptions.globals引入globals.node;或在本文件顶部增加/* global console */。