#regex #linter #rules #flexible #defined #braces #path

app flexlint

使用正则表达式定义规则的灵活代码检查器

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 每月下载量

MIT 许可证

36KB
806

flexlint

flexlint 是一个使用正则表达式定义规则的灵活代码检查器。

Actions Status Crates.io codecov

安装

发布页面下载,并将其解压到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,则会在匹配到的点尝试匹配requiredforbidden。因此,如果required模式没有匹配到,或者forbidden模式匹配到了,则检查失败。requiredforbidden是可选的,但如果两者都没有定义,则检查将被跳过。如果匹配到的点包含在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