[GHC] #7918: SrcSpan's associated with expanded quasi-quotes are inconsistent
GHC
ghc-devs at haskell.org
Mon Sep 2 17:33:01 CEST 2013
#7918: SrcSpan's associated with expanded quasi-quotes are inconsistent
-------------------------------------+------------------------------------
Reporter: edsko | Owner: edsko
Type: bug | Status: new
Priority: high | Milestone: 7.8.1
Component: Compiler | Version: 7.7
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-------------------------------------+------------------------------------
Comment (by edsko):
So here's what's happening: we have
{{{
runQuasiQuoteExpr :: HsQuasiQuote RdrName -> RnM (LHsExpr RdrName)
}}}
which executes a quasi-quote. Note that `runQuasiQuoteExpr` returns a
''located'' expression; it makes an attempt to set the location of the
expanded quasi-quote to something sensible. However, `runQuasiQuoteExpr`
gets called by `rnExpr`, which ''ignores'' the outermost location returned
by `runQuasiQuoteExpr`:
{{{
rnExpr (HsQuasiQuoteE qq)
= runQuasiQuoteExpr qq `thenM` \ (L _ expr') ->
rnExpr expr'
}}}
The result is that the outermost location is whatever location of the
quasi-quote was, while all inner locations have been set by
`runQuasiQuoteExpr`. That's why in the test case the case of a single
`True` or `False` is different from a compound expression; in all cases
the `runQuasiQuoteExpr` sets the location of all identifiers to the same
thing, but in the case of a non-compound expression (a single `True` or
`False`) this is then overwritten by `rnExpr`; for the compound expression
it's the location of the compound expression (`HsApp` or `HsPar`) which
gets overwritten instead.
Now, we can fix this by adding a special case to `rnLExpr` instead:
{{{
rnLExpr :: LHsExpr RdrName -> RnM (LHsExpr Name, FreeVars)
-- Don't ignore the new location set by runQuasiQuoteExpr (#7918)
#ifndef GHCI
rnLExpr (L _ e@(HsQuasiQuoteE _)) =
pprPanic "Cant do quasiquotation without GHCi" (ppr e)
#else
rnLExpr (L loc (HsQuasiQuoteE qq)) = setSrcSpan loc $
runQuasiQuoteExpr qq `thenM` rnLExpr
#endif /* GHCI */
rnLExpr e = wrapLocFstM rnExpr e
}}}
I have done this and it works and it fixes the problem for the case of
expressions. I've done it too for the case of types but there seems to be
another location override in that case; still looking for that.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7918#comment:8>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list