GHC includes span information in compiler errors, but not in a format suitable for vim:
src/Jacinda/Backend/TreeWalk.hs:319:58: error:
• The constructor ‘TyArr’ should have 3 arguments, but has been given 4
• In the pattern:
TyArr _ _ (TyArr _ (TyApp _ (TyB _ TyStream) _)) _
In the pattern:
TyArr _ _ (TyArr _ _ (TyArr _ (TyApp _ (TyB _ TyStream) _)) _)
In the pattern:
TBuiltin (TyArr _ _
(TyArr _ _ (TyArr _ (TyApp _ (TyB _ TyStream) _)) _))
Fold
|
319 | eWith re i (EApp _ (EApp _ (EApp _ (TBuiltin (TyArr _ _ (TyArr _ _ (TyArr _ (TyApp _ (TyB _ TyStream) _)) _)) Fold) op) seed) stream) = foldWithCtx re i op seed stream
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
We can handle this with awk (in fact, vim
ships with mve.awk
, a script to do something similar for C compilers), viz.
BEGIN { FS="\|" }
/ *\^+/ {
p=match($2, "\^+")
colstart=RSTART-1
col=colstart+RLENGTH
printf("%d-%d\n", colstart, col)
}
On the above example, this gives
58-108
Since this is a nontrivial (useful) demonstration of awk, I figured I would try something similar with my own jacinda:
:set fs:=/\|/;
fn printSpan(str) :=
let
val p := match str /\^+/
val str := option '(none)' (sprintf '%i-%i') p
in str end;
printSpan¨{% / *\^+/}{`2}
This avoids the strangeness of setting RSTART
and RLENGTH
(global
variables) after a function call (match
), instead returning multiple values
with a tuple.