Expose the type of quasiquotes
It happens with inline-java that
[java| 0.0 |]
produces a static method in java
Object fresh_name() { return 0.0; }
where
double fresh_name() { return 0.0; }
would be preferred. This is better because the user would get an error if the expression does not match the expected result type.
Examining the type that GHC expects of the quasiquote would allow to build the later variant. However, GHC provides no access to it.
The quasiquote desugars as follows:
[java| 0.0 |]
====>
$(quoteExp java " 0.0 ")
We have experimented with a patch that desugars instead like
[java| 0.0 |]
====>
let __ghc_qq_<loc_hash> = $(quoteExp java " 0.0 ")
in __ghc_qq_<loc_hash>
The quasiquoter can learn then of the expected type by doing:
do qqName <- getCurrentQuasiQuoteName
addModFinalizer $ reify qqName >>= ...
where
getCurrentQuasiQuoteName :: Q Name
getCurrentQuasiQuoteName = do
loc <- TH.location
return $ mkName $ "__ghc_qq_" ++ hash loc
Where getCurrentQuasiQuoteName
can be provided in Language.Haskell.TH.Quote
.
This addresses the same concern that I initially intended to solve with the more complex proposal in #12778.
I hope to submit a patch this week, but it would be useful if people want to provide some feedback meanwhile.