fix: improve finer-grained term infos for do blocks

see #1248

This commit adds a small hack to fix the term info for the following `do`-elements
```lean
   let (x, y) := ...
   let (x, y) ← ...
   let mut (x, y) ← ...
   let some x ← ... | ...
```
This commit is contained in:
Leonardo de Moura 2022-07-26 18:18:05 -07:00
parent fffd61cf98
commit 3e7d45aaba

View file

@ -1312,16 +1312,16 @@ mutual
let optElse := decl[3]
if optElse.isNone then withFreshMacroScope do
let auxDo ← if isMutableLet doLetArrow then
`(do let discr ← $doElem; let mut $pattern:term := discr)
`(do let%$doLetArrow discr ← $doElem; let%$doLetArrow mut $pattern:term := discr)
else
`(do let discr ← $doElem; let $pattern:term := discr)
`(do let%$doLetArrow discr ← $doElem; let%$doLetArrow $pattern:term := discr)
doSeqToCode <| getDoSeqElems (getDoSeq auxDo) ++ doElems
else
if isMutableLet doLetArrow then
throwError "`mut` is currently not supported in let-decls with `else` case"
let contSeq := mkDoSeq doElems.toArray
let elseSeq := mkSingletonDoSeq optElse[1]
let auxDo ← `(do let discr ← $doElem; match discr with | $pattern:term => $contSeq | _ => $elseSeq)
let auxDo ← `(do let%$doLetArrow discr ← $doElem; match%$doLetArrow discr with | $pattern:term => $contSeq | _ => $elseSeq)
doSeqToCode <| getDoSeqElems (getDoSeq auxDo)
else
throwError "unexpected kind of `do` declaration"