Files
2026Technology-Competition/data/demo-eslint/reports/legacysyntax-review.md
T
范智鹏 c92249a044 docs: 归档 demo 工程样例与插件实测报告
- 新增三个 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 种规则全覆盖)
2026-08-25 22:00:19 +08:00

5.8 KiB
Raw Blame History

代码审查报告

文件: data\demo-eslint\src\legacysyntax.cjs 语言: javascript 耗时: 152.1s 分析工具: eslint


总计: 18 | 错误: 14 | 警告: 2 | 建议: 2

静态分析 · 14 个问题

  • 🔴 eslint:no-nonoctal-decimal-escape L8 不要使用 '\8' 转义序列。 建议: 在非严格模式字符串中 \8 会被静默当作普通字符 8。如果只是要字符 8,请直接写 '8 and 9';如果要表示反斜杠加数字,请使用 String.raw 或双反斜杠转义。
  • 🔴 eslint:no-nonoctal-decimal-escape L8 不要使用 '\9' 转义序列。 建议: 在非严格模式字符串中 \9 会被静默当作普通字符 9。如果只是要字符 9,请直接写 '8 and 9';如果要表示反斜杠加数字,请使用 String.raw 或双反斜杠转义。
  • 🔴 eslint:no-octal L11 不应使用旧式八进制字面量。 建议: 010 是旧式八进制字面量,值为十进制 8,且在严格模式下是语法错误。若要表示八进制值 8,应写 0o10;若要表示十进制 10,应写 10
  • 🔴 eslint:no-with L16 不应使用 with 语句。 建议: with 会动态修改作用域链,难以静态分析和优化,在严格模式或 ESM 中还是语法错误。建议先解构出所需属性:const { pi, e } = { pi: 3.14, e: 2.72 }; 再使用。
  • 🔴 eslint:no-undef L17 未定义变量 console。 建议: ESLint 配置中没有声明 console 全局变量。建议在 eslint.config.mjs 中设置 languageOptions.globalsglobals.node,或在本文件中使用 globalThis.console
  • 🔴 eslint:no-undef L17 未定义变量 pi。 建议: with 对象中的属性 pi 不会成为真正的词法作用域变量,因此静态分析无法识别。请参考 no-with 的修复:先解构出 pi 再使用。
  • 🔴 eslint:no-undef L17 未定义变量 e。 建议: with 对象中的属性 e 不会成为真正的词法作用域变量,因此静态分析无法识别。请参考 no-with 的修复:先解构出 e 再使用。
  • 🔴 eslint:no-var L21 不应使用 var,请改用 letconst。 建议: deletable 后续会被置空,使用 let deletable = 42;;如果确定不再重新赋值,可考虑 const
  • 🔴 eslint:no-delete-var L22 不应删除变量。 建议: delete 只能删除对象属性,不能移除 var/let/const 声明的变量绑定。若要清理引用,请改为 deletable = null;;若要真正可删除,请把数据放进对象属性再 delete
  • 🔴 eslint:no-dupe-args L25 函数参数名重复:a。 建议: 重命名第二个参数,并保持函数行为不变:function duplicateArgs(a, b) { return b; }
  • 🔴 eslint:no-redeclare L25 a 已重复声明。 建议: 移除重复参数名,将第二个参数改名为 b,并返回 b
  • 🔴 eslint:no-unused-vars L32 变量 err 已被声明但从未使用。 建议: 如果要保留原始错误,请把它作为 cause 传给新错误:throw new Error('parse failed', { cause: err });;如果确实不需要原始错误,可使用省略绑定参数的 catch { ... }
  • 🔴 eslint:preserve-caught-error L33 抛出的新错误没有附带原始错误作为 cause。 建议: 在抛出 Error 时使用第二个 options 参数传递 causethrow new Error('parse failed', { cause: err });,以保留原始错误链和堆栈信息。
  • 🔴 eslint:no-undef L36 未定义变量 console。 建议: 在 ESLint 配置中声明 console 全局变量,或使用 globalThis.console.log(...)

AI 审查 · 4 条建议

  • 🟡 [AI] [bug] legacy-octal-value-confusion L11 旧式八进制字面量 010 的实际值是 8,而非 10 在宽松模式下,010 会被解析为旧式八进制字面量,等于十进制 8。如果写 010 的人以为是十进制 10,就会引入静默的数值错误;即使确实想表示八进制,也应使用明确的 0o10,避免歧义并绕过 no-octal 规则。 建议: 若语义是十进制 10,改为 10;若语义是八进制 8,改为 0o10
  • 🟡 [AI] [bug] delete-var-no-op L22 delete deletable 不会删除变量,清理意图不生效 delete 操作符只对对象属性有意义;对 var 声明的标识符执行 delete 不会移除该绑定,在非严格模式下通常静默失败并返回 falsedeletable 仍然是 42。这样的代码会给维护者造成“变量已被删除”的错觉。 建议: 如果只想清空引用,改为 deletable = null;;如果需要“可删除”的数据,请改为 const data = { deletable: 42 }; 然后 delete data.deletable;
  • 🔵 [AI] [design] legacy-syntax-in-production-fixture L3 演示旧式语法的代码不应混入生产/业务源码 该文件故意依靠 .cjs 和 sloppy mode 来使用 with、旧式八进制、重复参数等旧式语法。一旦文件被加入 "use strict",或迁移为 ESM/被复制进严格模式环境,这些代码会立即变成 SyntaxError。作为语法规则演示/回归样例,应放在测试 fixtures 中并由 ESLint 显式配置解析。 建议: 将这类 legacy 语法样例移动到 tests/fixtures/legacy/,在测试配置中明确 sourceType: 'script' 和适用的 ecmaVersion,不要放在主代码目录。
  • 🔵 [AI] [design] missing-node-globals-config L17 ESLint 未声明 Node 全局变量,导致 console 反复触发 no-undef 第 17、36 行的 console 在 Node 运行时是合法的全局变量,但当前 ESLint 配置没有引入 globals.node 或文件级注释,所以被重复报告为未定义。逐个改成 globalThis.console 会掩盖根因:ESLint 环境配置缺失。 建议: 在 eslint.config.mjslanguageOptions.globals 引入 globals.node;或在本文件顶部增加 /* global console */