I think we just go ahead and rename the constructor. We don't have back-compat 
guarantees at this level. Simplicity is a virtue, too!

Thanks,
Richard

> On Jul 6, 2021, at 5:59 AM, Alfredo Di Napoli <alfredo.dinap...@gmail.com> 
> wrote:
> 
> 
> Hello Simon,
> 
> Yes, renaming and perhaps keeping `RecordPuns` as a pattern synonym to not 
> break backward-compat, if that's feasible to define as we are in 
> `ghc-boot-th` here. Not sure if `PatternSynonyms` and `COMPLETE` would be 
> available there.
> 
> I am not sure how many libs that depend on the ghc API would break (I haven't 
> grepped on Hackage yet), but that might tip the benefits/troubles ratio 
> towards keeping the status quo.
> 
> This is not a "problem" I have to solve today, and it might not be considered 
> a problem by others (just an inconsistency I guess): as a colleague of mine 
> pointed out, GHC is not necessarily "lying" here. It's still the same 
> underlying extension, it just happens that there are two names that refer to 
> it.
> 
> Perhaps I could think about adding to `GhcHint` some kind of mapping which 
> would give to IDEs or third-party libs the correct extension name given an 
> input `LangExt.Extension`, the problem then becomes making sure that we keep 
> this mapping in sync with the information contained in `GHC.Driver.Session`.
> 
> I will let it simmer.
> 
> Thanks!
> 
> A.
> 
> On Tue, 6 Jul 2021 at 11:19, Simon Peyton Jones <simo...@microsoft.com 
> <mailto:simo...@microsoft.com>> wrote:
> 1. What prevents us from adding `NamedFieldPuns` as a proper constructor for 
> the `Extension` type and in principle remove `RecordPuns`? Backward 
> compatibility I assume?
> 
> You mean, essentially, rename `LangExt.RecordPuns` to `NamedFieldPuns`.
> 
>  
> 
> I’d be fine with that.  There might be back-compat issues, but only with 
> other plugins, and probably with vanishingly few of them.  Grep in Hackage!
> 
>  
> 
> Simon
> 
>  
> 
> From: ghc-devs <ghc-devs-boun...@haskell.org 
> <mailto:ghc-devs-boun...@haskell.org>> On Behalf Of Alfredo Di Napoli
> Sent: 06 July 2021 10:14
> To: Simon Peyton Jones via ghc-devs <ghc-devs@haskell.org 
> <mailto:ghc-devs@haskell.org>>
> Subject: Can NamedFieldPuns be added to 
> `GHC.LanguageExtensions.Types.Extension`?
> 
>  
> 
> Dear all,
> 
>  
> 
> As some of you might know, for the past few months I have been working on 
> changing GHC's diagnostic messages from plain SDocs to richer Haskell types.
> 
>  
> 
> As part of this work, I have added a mechanism to embed hints into 
> diagnostics, defined in `GHC.Types.Hint` in `HEAD`. One of the main workhorse 
> of this `GhcHint` type is the `SuggestExtension LangExt.Extension` 
> constructor, which embeds the extension to enable to use a particular 
> feature. The `LangExt.Extension` type comes from 
> `GHC.LanguageExtensions.Types`, and up until now there has always been a 1:1 
> mapping between the language pragma for the extension and the type itself.
> 
>  
> 
> Today I was working on turning this error into a proper Haskell type:
> 
>  
> 
> badPun :: Located RdrName -> TcRnMessage
> 
> badPun fld = TcRnUnknownMessage $ mkPlainError noHints $
> 
>   vcat [text "Illegal use of punning for field" <+> quotes (ppr fld),
> 
>         text "Use NamedFieldPuns to permit this"]
> 
>  
> 
> I was ready to yield a `SuggestExtension LangExt.NamedFieldPuns` when I 
> discovered that there is no `NamedFieldPuns` constructor. Rather, there is a 
> `RecordPuns` , which refer to a deprecated flag, and we simply map 
> `NamedFieldPuns` back to it in `GHC.Driver.Session`:
> 
>  
> 
> ...
> 
>   depFlagSpec' "RecordPuns"                   LangExt.RecordPuns
> 
>     (deprecatedForExtension "NamedFieldPuns"),
> 
> ...
> 
>   flagSpec "NamedFieldPuns"                   LangExt.RecordPuns,
> 
> ...
> 
>  
> 
> This is problematic for the `GhcHint` type, because now if I was to yield 
> `SuggestExtension LangExt.RecordPuns` to the user, I could still pretty-print 
> the suggestion to turn `RecordPuns` into `NamedFieldPuns`, but this means 
> that IDEs or third-party library would have access to the 
> 
> "raw" Haskell datatype, and at that point they will be stuck with a 
> suggestion to enable a deprecated extension! (or best case scenario they will 
> have to transform the suggestion into something more sensible, which 
> partially defeats the point of this refactoring work I have been doing).
> 
>  
> 
> I am not sure this behaviour is unique for just `NamedFieldPuns`, but my 
> question is:
> 
>  
> 
> 1. What prevents us from adding `NamedFieldPuns` as a proper constructor for 
> the `Extension` type and in principle remove `RecordPuns`? Backward 
> compatibility I assume?
> 
>  
> 
>  
> 
> Many thanks,
> 
>  
> 
> Alfredo
> 
>  
> 
>  
> 
>  
> 
>  
> 
>  
> 
>  
> 
>  
> 
>  
> 
> _______________________________________________
> ghc-devs mailing list
> ghc-devs@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to