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

75 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 代码审查报告
**文件:** `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 */`