5个版本

0.2.0 2021年9月16日
0.1.3 2020年10月21日
0.1.2 2020年10月6日
0.1.1 2020年10月3日
0.1.0 2020年10月2日

474解析器实现 中排名

Download history 70/week @ 2024-02-29 121/week @ 2024-03-07 122/week @ 2024-03-14 116/week @ 2024-03-21 100/week @ 2024-03-28 189/week @ 2024-04-04 147/week @ 2024-04-11 151/week @ 2024-04-18 140/week @ 2024-04-25 220/week @ 2024-05-02 124/week @ 2024-05-09 212/week @ 2024-05-16 179/week @ 2024-05-23 117/week @ 2024-05-30 83/week @ 2024-06-06 115/week @ 2024-06-13

每月522次下载
7 仓库中使用(3个直接使用)

MIT 协议

290KB
6.5K SLoC

RSLint

一个快速、可定制且易于使用的JavaScriptTypeScript代码检查器

build status Documentation Status

指南 | 贡献 | 网站 | 代码检查规则

⚠️ RSLint处于早期开发阶段,不应在生产环境中使用,可能存在错误!🐛

安装

通过Cargo

$ cargo install rslint_cli
$ rslint --help

预构建的二进制文件

我们为每个版本发布Windows、Linux和MacOS的预构建二进制文件,您可以在这里找到它们。

从源代码构建

$ git clone https://github.com/rslint/rslint.git
$ cd rslint
$ cargo run --release -- --help

使用方法

要使用代码检查器,只需将需要检查的文件传递给CLI

$ echo "let a = foo.hasOwnProperty('bar');" > foo.js
$ rslint ./foo.js
error[no-prototype-builtins]: do not access the object property `hasOwnProperty` directly from `foo`
  ┌─ ./foo.js:1:9
  
1 │ let a = foo.hasOwnProperty('bar');
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  
help: get the function from the prototype of `Object` and call it
  
1 │ let a = Object.prototype.hasOwnProperty.call(foo, 'bar');
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  
   note: the method may be shadowed and cause random bugs and denial of service vulnerabilities

Outcome: 1 fail, 0 warn, 0 success

help: for more information about the errors try the explain command: `rslint explain <rules>`

RSLint CLI无需配置文件即可工作,并将选择推荐的非样式规则来运行。

特性

速度。RSLint通过并行使用多个线程来加速代码检查,同时还编译为原生代码。

低内存占用。RSLint的语法树使用interning和其他方法,在代码检查过程中大幅减少内存使用。

合理的默认值。CLI在没有指定配置文件的情况下假定推荐的非样式规则,并忽略如node_modules之类的目录。

错误恢复。RSLint的自定义解析器可以从语法错误中恢复,即使在语句的某些部分缺失的情况下也能生成可用的语法树。允许在输入时进行准确的即时代码检查。

无混淆选项。解析器的 ECMAScript 版本无需配置,解析器假定使用最新语法,并假定 *.js 为脚本和 *.mjs 为模块。

原生 TypeScript 支持*.ts 文件将自动进行代码检查,无需对不同的解析器或规则进行配置。

规则组。为了便于配置、理解和更清晰的项目文件结构,规则按作用域分组。

易于理解的错误。代码检查器发出的每个错误都会以易于理解和清晰的方式指出源代码中的区域,并包含标签、注释和建议,说明如何修复每个问题。还可以使用 -F 标志或配置文件中的 formatter 键,使用类似于 ESLint 的格式化程序。

强类型规则配置。RSLint 随附 JSON 架构,并将其链接到 rslintrc.json,以在 Visual Studio Code 中为配置文件提供自动完成功能。JSON 架构详细描述了规则配置选项,允许轻松配置。此外,RSLint 的语言服务器协议实现也为 rslintrc.toml 文件提供自动完成功能。

强大的指令。指令(通过注释中的命令)使用基于内部 JavaScript 词法分析器的解析器,允许我们提供

  • 语言服务器协议中对指令如 // rslint-ignore no-empty 的自动完成。
  • 指令的悬停支持,以在悬停时提供有关命令的信息。
  • 对错误指令的易于理解。

独立。RSLint 编译为单个独立二进制文件,无需 Node、v8 或任何其他运行时。RSLint 可在任何可以被 LLVM 定位的平台上运行。

强大的自动修复。提供了一些错误的自动修复功能,并通过 --fix 标志或 IDE 中的操作应用。即使文件包含语法错误,也可以通过 --dirty 标志应用修复。

内置文档。RSLint 在其二进制文件中包含规则文档,允许通过 explain 子命令在终端显示文档,例如 rslint explain no-empty, for-direction

内部功能

整洁清晰的项目布局。RSLint 项目以 monorepo 形式布局,每个 crate 有一个明确的工作,每个 crate 都可以在其他 Rust 项目中使用,并且每个 crate 都有良好的文档和 API。

易于规则声明。使用 declare_lint! 宏声明规则。宏接受文档注释、结构名称、分组名称、规则代码和配置选项。宏生成结构定义和 Rule 实现以及将文档注释处理为结构的文档以及每个规则上的 docs() 方法上的静态字符串。一切都很简洁,并放在一个地方。

完整的语法树。与 ESTree 不同,RSLint 的自定义语法树保留了

  • 所有空白
  • 所有注释
  • 所有标记

允许它在不需要依赖 ESLint 的 SourceCode 等单独结构的情况下进行强大的分析。

无类型语法树。RSLint的语法树在底层由无类型节点和无类型标记组成,这使得对树进行强大、高效的遍历成为可能,例如 if_stmt.cons()?.child_with_ast::<SwitchStmt>()

易于使用的API。RSLint为复杂的错误和自动修复提供了易于使用的构建器,所有内容都安排得尽可能减少实现规则所需的工作量。

性能

基准测试可以在benchmarks目录中找到。您可以使用deno run -A --quiet benchmarks/bench.ts在您的机器上运行它们。它们也在CI上运行,如果您点击最新的GitHub Actions运行,您可以看到最新的结果。

项目 RSLint eslint
engine262 (~42k LOC JavaScript) 414ms 46.9s
Oak (~11k LOC TypeScript) 53ms 399ms

(这些基准测试是在AMD Ryzen 7 2700x,8核3.9MHz的机器上运行的)

许可证

本项目采用MIT许可证授权。


lib.rs:

一个极快的基于查找表的ECMAScript词法分析器,它为rslint_parse解析器提供SyntaxKind标记。
为了错误恢复的目的,标记可能附加了错误,这反映在迭代器项中。
词法分析器还将产生COMMENTWHITESPACE标记。

词法分析器在原始字节上操作,以充分利用查找表优化,这些字节必须是有效的utf8,因此从&[u8]创建词法分析器是不安全的,因为您必须确保字节是有效的utf8。不要使用此功能学习如何分析JavaScript,这只是无谓地快,因为我不受控制 :)

基本ANSI语法高亮也通过highlight功能提供。

警告 ⚠️

>>>>>不是作为单个标记发出,它们作为多个>标记发出。这是由于TypeScript解析和生产,如T<U<N>>

依赖项

~2–12MB
~85K SLoC