lean4-htt/src/Lean/Linter/Builtin.lean
2024-02-20 01:49:55 +00:00

41 lines
1.4 KiB
Text

/-
Copyright (c) 2022 Lars König. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Lars König
-/
prelude
import Lean.Linter.Util
import Lean.Elab.Command
namespace Lean.Linter
register_builtin_option linter.suspiciousUnexpanderPatterns : Bool := {
defValue := true,
descr := "enable the 'suspicious unexpander patterns' linter"
}
def getLinterSuspiciousUnexpanderPatterns (o : Options) : Bool := getLinterValue linter.suspiciousUnexpanderPatterns o
def suspiciousUnexpanderPatterns : Linter where
run cmdStx := do
unless getLinterSuspiciousUnexpanderPatterns (← getOptions) do
return
-- check `[app_unexpander _]` defs defined by pattern matching
let `($[$_:docComment]? @[$[$attrs:attr],*] $(_vis)? def $_ : $_ $[| $pats => $_]*) := cmdStx | return
unless attrs.any (· matches `(attr| app_unexpander $_)) do
return
for pat in pats do
let patHead ← match pat with
| `(`($patHead:ident $_args*)) => pure patHead
| `(`($patHead:ident)) => pure patHead
| _ => continue
logLint linter.suspiciousUnexpanderPatterns patHead
"Unexpanders should match the function name against an antiquotation `$_` so as to be independent of the specific pretty printing of the name."
builtin_initialize addLinter suspiciousUnexpanderPatterns
end Lean.Linter