summaryrefslogtreecommitdiff
path: root/compiler/GHC/Utils/Binary.hs
diff options
context:
space:
mode:
authorAlp Mestanogullari <alpmestan@gmail.com>2020-03-13 17:41:37 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-07-14 21:30:52 -0400
commit118e1c3da622f17c67b4e0fbc12ed7c7084055dc (patch)
tree2468e0ab92966c06663c95b2de7f2e0702432312 /compiler/GHC/Utils/Binary.hs
parent7f0b671ee8a65913891c07f157b21d77d6c63036 (diff)
downloadhaskell-118e1c3da622f17c67b4e0fbc12ed7c7084055dc.tar.gz
compiler: re-engineer the treatment of rebindable if
Executing on the plan described in #17582, this patch changes the way if expressions are handled in the compiler in the presence of rebindable syntax. We get rid of the SyntaxExpr field of HsIf and instead, when rebindable syntax is on, we rewrite the HsIf node to the appropriate sequence of applications of the local `ifThenElse` function. In order to be able to report good error messages, with expressions as they were written by the user (and not as desugared by the renamer), we make use of TTG extensions to extend GhcRn expression ASTs with an `HsExpansion` construct, which keeps track of a source (GhcPs) expression and the desugared (GhcRn) expression that it gives rise to. This way, we can typecheck the latter while reporting the former in error messages. In order to discard the error context lines that arise from typechecking the desugared expressions (because they talk about expressions that the user has not written), we carefully give a special treatment to the nodes fabricated by this new renaming-time transformation when typechecking them. See Note [Rebindable syntax and HsExpansion] for more details. The note also includes a recipe to apply the same treatment to other rebindable constructs. Tests 'rebindable11' and 'rebindable12' have been added to make sure we report identical error messages as before this patch under various circumstances. We also now disable rebindable syntax when processing untyped TH quotes, as per the discussion in #18102 and document the interaction of rebindable syntax and Template Haskell, both in Note [Template Haskell quotes and Rebindable Syntax] and in the user guide, adding a test to make sure that we do not regress in that regard.
Diffstat (limited to 'compiler/GHC/Utils/Binary.hs')
-rw-r--r--compiler/GHC/Utils/Binary.hs17
1 files changed, 17 insertions, 0 deletions
diff --git a/compiler/GHC/Utils/Binary.hs b/compiler/GHC/Utils/Binary.hs
index 5bcc98cff4..d73939c53c 100644
--- a/compiler/GHC/Utils/Binary.hs
+++ b/compiler/GHC/Utils/Binary.hs
@@ -1448,6 +1448,23 @@ instance Binary BufSpan where
end <- get bh
return (BufSpan start end)
+instance Binary UnhelpfulSpanReason where
+ put_ bh r = case r of
+ UnhelpfulNoLocationInfo -> putByte bh 0
+ UnhelpfulWiredIn -> putByte bh 1
+ UnhelpfulInteractive -> putByte bh 2
+ UnhelpfulGenerated -> putByte bh 3
+ UnhelpfulOther fs -> putByte bh 4 >> put_ bh fs
+
+ get bh = do
+ h <- getByte bh
+ case h of
+ 0 -> return UnhelpfulNoLocationInfo
+ 1 -> return UnhelpfulWiredIn
+ 2 -> return UnhelpfulInteractive
+ 3 -> return UnhelpfulGenerated
+ _ -> UnhelpfulOther <$> get bh
+
instance Binary SrcSpan where
put_ bh (RealSrcSpan ss sb) = do
putByte bh 0