Skip to content
  • Alp Mestanogullari's avatar
    compiler: re-engineer the treatment of rebindable if · 118e1c3d
    Alp Mestanogullari authored and Marge Bot's avatar Marge Bot committed
    Executing on the plan described in #17582, this patch changes the way if expressions
    are handled in the compiler in the presence of rebindable syntax. We get rid of the
    SyntaxExpr field of HsIf and instead, when rebindable syntax is on, we rewrite the HsIf
    node to the appropriate sequence of applications of the local `ifThenElse` function.
    
    In order to be able to report good error messages, with expressions as they were
    written by the user (and not as desugared by the renamer), we make use of TTG
    extensions to extend GhcRn expression ASTs with an `HsExpansion` construct, which
    keeps track of a source (GhcPs) expression and the desugared (GhcRn) expression that
    it gives rise to. This way, we can typecheck the latter while reporting the former in
    error messages.
    
    In order to discard the error context lines that arise from typechecking the desugared
    expressions (because they talk about expressions that the user has not written), we
    carefully give a special treatment to the nodes fabricated by this new renaming-time
    transformation when typechecking them. See Note [Rebindable syntax and HsExpansion]
    for more details. The note also includes a recipe to apply the same treatment to
    other rebindable constructs.
    
    Tests 'rebindable11' and 'rebindable12' have been added to make sure we report
    identical error messages as before this patch under various circumstances.
    
    We also now disable rebindable syntax when processing untyped TH quotes, as per
    the discussion in #18102 and document the interaction of rebindable syntax and
    Template Haskell, both in Note [Template Haskell quotes and Rebindable Syntax]
    and in the user guide, adding a test to make sure that we do not regress in
    that regard.
    118e1c3d