Skip to content
  • Alan Zimmerman's avatar
    Udate hsSyn AST to use Trees that Grow · 8e6ec0fa
    Alan Zimmerman authored
    Summary:
    See https://ghc.haskell.org/trac/ghc/wiki/ImplementingTreesThatGrow
    
    This commit prepares the ground for a full extensible AST, by replacing the type
    parameter for the hsSyn data types with a set of indices into type families,
    
        data GhcPs -- ^ Index for GHC parser output
        data GhcRn -- ^ Index for GHC renamer output
        data GhcTc -- ^ Index for GHC typechecker output
    
    These are now used instead of `RdrName`, `Name` and `Id`/`TcId`/`Var`
    
    Where the original name type is required in a polymorphic context, this is
    accessible via the IdP type family, defined as
    
        type family IdP p
        type instance IdP GhcPs = RdrName
        type instance IdP GhcRn = Name
        type instance IdP GhcTc = Id
    
    These types are declared in the new 'hsSyn/HsExtension.hs' module.
    
    To gain a better understanding of the extension mechanism, it has been applied
    to `HsLit` only, also replacing the `SourceText` fields in them with extension
    types.
    
    To preserve extension generality, a type class is introduced to capture the
    `SourceText` interface, which must be honoured by all of the extension points
    which originally had a `SourceText`.  The class is defined as
    
        class HasSourceText a where
          -- Provide setters to mimic existing constructors
          noSourceText  :: a
          sourceText    :: String -> a
    
          setSourceText :: SourceText -> a
          getSourceText :: a -> SourceText
    
    And the constraint is captured in `SourceTextX`, which is a constraint type
    listing all the extension points that make use of the class.
    
    Updating Haddock submodule to match.
    
    Test Plan: ./validate
    
    Reviewers: simonpj, shayan-najd, goldfire, austin, bgamari
    
    Subscribers: rwbarton, thomie, mpickering
    
    Differential Revision: https://phabricator.haskell.org/D3609
    8e6ec0fa