Skip to content
  • thomasw's avatar
    Refactor wild card renaming · 058af6c9
    thomasw authored
    Summary:
    Refactor wild card error reporting
    
    * Merge `HsWildcardTy` and `HsNamedWildcardTy` into one constructor
      `HsWildCardTy` with as field the new type `HsWildCardInfo`, which has two
      constructors: `AnonWildCard` and `NamedWildCard`.
    
    * All partial type checks are removed from `RdrHsSyn.hs` and are now done
      during renaming in order to report better error messages. When wild cards
      are allowed in a type, the new function `rnLHsTypeWithWildCards` (or
      `rnHsSigTypeWithWildCards`) should be used. This will bring the named wild
      cards into scope before renaming them. When this is not done, renaming will
      trigger "Unexpected wild card..." errors.
    
      Unfortunately, this has to be done separately for anonymous wild cards
      because they are given a fresh name during renaming, so they will not cause
      an out-of-scope error. They are handled in `tc_hs_type`, as a special case
      of a lookup that fails.
    
      The previous opt-out approach is replaced with an opt-in approach. No more
      panics because of forgotten checks!
    
    * `[t| _ |]` isn't caught by the above two checks, so it is currently handled
      by a special case. The error message (generated in the `DsM` monad) doesn't
      provide as much context information as the other cases.
    
    * Instead of three (!) functions that walk `HsType`, there is now only one
      pure function called `collectWildCards`.
    
    * Alternative approach: catch all unwanted wild cards in `rnHsTyKi` by looking
      at the `HsDocContext`. This will reduce the number of places to catch
      unwanted wild cards form three to one, and make the error messages more
      uniform, albeit less informative, as the error context for renaming is not
      as informative as the one for type checking. A new constructor of
      `HsDocContext` will be required for pattern synonyms signatures.
    
      Small problem: currently type-class type signatures can't be distinguished
      from type signatures using the `HsDocContext`.
    
    This requires an update to the Haddock submodule.
    
    Test Plan: validate
    
    Reviewers: goldfire, simonpj, austin
    
    Reviewed By: simonpj
    
    Subscribers: bgamari, thomie, goldfire
    
    Differential Revision: https://phabricator.haskell.org/D613
    
    GHC Trac Issues: #10098
    058af6c9