• Ryan Scott's avatar
    Fix #14875 by introducing PprPrec, and using it · 21e1a00c
    Ryan Scott authored
    Trying to determine when to insert parentheses during TH
    conversion is a bit of a mess. There is an assortment of functions
    that try to detect this, such as:
    
    * `hsExprNeedsParens`
    * `isCompoundHsType`
    * `hsPatNeedsParens`
    * `isCompoundPat`
    * etc.
    
    To make things worse, each of them have slightly different semantics.
    Plus, they don't work well in the presence of explicit type
    signatures, as #14875 demonstrates.
    
    All of these problems can be alleviated with the use of an explicit
    precedence argument (much like what `showsPrec` currently does). To
    accomplish this, I introduce a new `PprPrec` data type, and define
    standard predences for things like function application, infix
    operators, function arrows, and explicit type signatures (that last
    one is new). I then added `PprPrec` arguments to the various
    `-NeedsParens` functions, and use them to make smarter decisions
    about when things need to be parenthesized.
    
    A nice side effect is that functions like `isCompoundHsType` are
    now completely unneeded, since they're simply aliases for
    `hsTypeNeedsParens appPrec`. As a result, I did a bit of refactoring
    to remove these sorts of functions. I also did a pass over various
    utility functions in GHC for constructing AST forms and used more
    appropriate precedences where convenient.
    
    Along the way, I also ripped out the existing `TyPrec`
    data type (which was tailor-made for pretty-printing `Type`s) and
    replaced it with `PprPrec` for consistency.
    
    Test Plan: make test TEST=T14875
    
    Reviewers: alanz, goldfire, bgamari
    
    Reviewed By: bgamari
    
    Subscribers: rwbarton, thomie, carter
    
    GHC Trac Issues: #14875
    
    Differential Revision: https://phabricator.haskell.org/D4688
    21e1a00c
all.T 18 KB