Why TcLclEnv and DsGblEnv need to store the same IORef for errors?
Alfredo Di Napoli
alfredo.dinapoli at gmail.com
Tue Mar 30 14:35:51 UTC 2021
Richard: as I was in the middle of some other refactoring by the time Simon
replied, you can see a potential refactoring that *doesn't* use the double
IORef, but rather this idea of having a `DsMessage` embed `TcRnMessage`(s)
via a new costructor:
(Just grep for "DsMessage", "DsUnknownMessage", and `DsLiftedTcRnMessage`
to see the call sites).
The end result is not bad, I have to say. Or, at least, it doesn't
strike me as totally horrid :)
On Tue, 30 Mar 2021 at 16:14, Richard Eisenberg <rae at richarde.dev> wrote:
> On Mar 30, 2021, at 4:57 AM, Alfredo Di Napoli <alfredo.dinapoli at gmail.com>
> I'll explore the idea of adding a second IORef.
> Renaming/type-checking is already mutually recursive. (The renamer must
> call the type-checker in order to rename -- that is, evaluate -- untyped
> splices. I actually can't recall why the type-checker needs to call the
> renamer.) So we will have a TcRnError. Now we see that the desugarer ends
> up mixed in, too. We could proceed how Alfredo suggests, by adding a second
> IORef. Or we could just make TcRnDsError (maybe renaming that).
> What's the disadvantage? Clients will have to potentially know about all
> the different error forms with either approach (that is, using my combined
> type or using multiple IORefs). The big advantage to separating is maybe
> module dependencies? But my guess is that the dependencies won't be an
> issue here, due to the fact that these components are already leaning on
> each other. Maybe the advantage is just in having smaller types? Maybe.
> I don't have a great sense as to what to do here, but I would want a clear
> reason that e.g. the TcRn monad would have two IORefs, while other monads
> will work with GhcMessage (instead of a whole bunch of IORefs).
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the ghc-devs