- 新增三个 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 种规则全覆盖)
75 lines
5.8 KiB
Markdown
75 lines
5.8 KiB
Markdown
# 代码审查报告
|
||
|
||
**文件:** `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.globals` 为 `globals.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`,请改用 `let` 或 `const`。
|
||
建议: `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 参数传递 `cause`:`throw 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` 不会移除该绑定,在非严格模式下通常静默失败并返回 `false`,`deletable` 仍然是 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.mjs` 中 `languageOptions.globals` 引入 `globals.node`;或在本文件顶部增加 `/* global console */`。
|