10个版本
0.2.7 | 2023年11月1日 |
---|---|
0.2.6 | 2019年11月13日 |
0.2.4 | 2018年11月12日 |
0.2.2 | 2018年10月23日 |
0.1.1 | 2018年10月21日 |
#206 在 开发工具
29 每月下载量
36KB
806 行
flexlint
flexlint 是一个使用正则表达式定义规则的灵活代码检查器。
安装
从发布页面下载,并将其解压到PATH目录中。
或者您可以使用cargo进行安装。
cargo install flexlint
用法
选项
flexlint 0.1.0
dalance <dalance@gmail.com>
A flexible linter with rules specified by regular expression
USAGE:
flexlint [FLAGS] [OPTIONS]
FLAGS:
-h, --help Prints help information
-s, --simple Show results by simple format
-V, --version Prints version information
-v, --verbose Show verbose message
OPTIONS:
-r, --rule <rule> Rule file [default: .flexlint.toml]
规则文件会在上层目录中搜索,直到找到根目录。因此,您可以将规则文件(.flexlint.toml
)放在存储库的根目录中,就像.gitignore
。
规则定义
规则定义如下
[[rules]]
name = "" # name of rule
pattern = "" # check pattern by regexp
required = "" # required pattern by regexp [Optional]
forbidden = "" # forbidden pattern by regexp [Optional]
ignore = "" # ignore pattern by regexp [Optional]
hint = "" # hint message
includes = [""] # include file globs
excludes = [""] # exclude file globs [Optional]
如果匹配到pattern
,则会在匹配到的点尝试匹配required
或forbidden
。因此,如果required
模式没有匹配到,或者forbidden
模式匹配到了,则检查失败。required
和forbidden
是可选的,但如果两者都没有定义,则检查将被跳过。如果匹配到的点包含在ignore
匹配的范围内,则检查将被跳过。如果文件匹配到includes
也匹配到excludes
,则文件将被跳过。
以下是一个使用C/C++花括号的if
的示例
[[rules]]
name = "'if' with brace"
pattern = '(?m)(^|[\t ])if\s'
forbidden = '(?m)(^|[\t ])if\s[^;{]*$'
ignore = '(/\*/?([^/]|[^*]/)*\*/)|(//.*\n)'
hint = "multiline 'if' must have brace"
includes = ["**/*.c", "**/*.cpp"]
excludes = ["external/*.c"]
pattern
匹配到if
关键字,并进行禁止检查,要求if
必须以分号;
或左花括号{
开始,直到行尾。(此示例不支持某些花括号样式,您可以进行修改)
ignore
被定义为跳过单行注释(// ...
)和多行注释(/* ... */
)。
正则表达式
正则表达式的语法遵循Rust regex crate。
输出示例
如果将flexlint在仓库的example
目录中执行,输出如下
$ cd example
$ flexlint
Fail: 'if' with brace
--> test.c:4:4
|
4 | if ( hoge )
| ^^^^ hint: multiline 'if' must have brace
Fail: verilog 'always' forbidden
--> test.sv:7:4
|
7 | always @ ( posedge clk ) begin
| ^^^^^^^^ hint: 'always' must be replaced to 'always_comb'/'always_ff'
Fail: 'if' with 'begin'
--> test.sv:13:8
|
13 | if ( rst )
| ^^^^ hint: 'if' statement must have 'begin'
Fail: 'else' with 'begin'
--> test.sv:15:8
|
15 | else
| ^^^^^^ hint: 'else' statement must have 'begin'
依赖项
~5–17MB
~165K SLoC