Skip to content

Commit e8e23e4

Browse files
author
Wojciech Rozowski
committed
feat: find declaration name inside of linters
1 parent 03d7a4e commit e8e23e4

3 files changed

Lines changed: 32 additions & 0 deletions

File tree

src/Lean/Linter/Util.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,17 @@ def getNewDecls (t : InfoTree) : List Name :=
7474
else
7575
acc
7676
| _ => acc
77+
78+
open Elab in
79+
def findMatchingDecl? [Monad m] [MonadInfoTree m] [MonadEnv m] [MonadFileMap m]
80+
(stx : Syntax) : m (Option Name) := do
81+
let some stxRange ← getDeclarationRange? stx | return none
82+
let mut best? : Option (Name × DeclarationRange) := none
83+
for t in ← getInfoTrees do
84+
for declName in getNewDecls t do
85+
let some ranges ← findDeclarationRangesCore? declName | continue
86+
let r := ranges.range
87+
unless !r.pos.lt stxRange.pos && !stxRange.endPos.lt r.endPos do continue
88+
if best?.all fun (_, b) => r.pos.lt b.pos then
89+
best? := some (declName, r)
90+
return best?.map (·.1)

tests/pkg/module_linter/ModLinter.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,14 @@ import ModLinter.Def
33
def a := 1
44
def b := 2
55
def c := 3
6+
7+
inductive Foo where
8+
| mk : Foo
9+
10+
mutual
11+
def hello2 : Option Nat := hello1
12+
partial_fixpoint
13+
14+
def hello1 : Option Nat := hello2
15+
partial_fixpoint
16+
end

tests/pkg/module_linter/ModLinter/Def.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Lean.Elab.Command
2+
import Lean.Linter.Util
23

34
open Lean Elab Command
45

@@ -7,4 +8,10 @@ def dummyModuleLinter : ModuleLinter where
78
let ref := cmds[0]?.getD .missing
89
logWarningAt ref m!"cmds: {cmds}"
910

11+
def myLinter : Linter where
12+
run stx := do
13+
if let some decl := (← Linter.findMatchingDecl? stx) then
14+
logInfoAt stx m!"best match is: {decl}"
15+
1016
initialize addModuleLinter dummyModuleLinter
17+
initialize addLinter myLinter

0 commit comments

Comments
 (0)