Skip to content
  • Ömer Sinan Ağacan's avatar
    Support SCC pragmas in declaration context · 98b2c508
    Ömer Sinan Ağacan authored
    Not having SCCs at the top level is becoming annoying real quick. For
    simplest cases, it's possible to do this transformation:
    
        f x y = ...
        =>
        f = {-# SCC f #-} \x y -> ...
    
    However, it doesn't work when there's a `where` clause:
    
        f x y = <t is in scope>
          where t = ...
        =>
        f = {-# SCC f #-} \x y -> <t is out of scope>
          where t = ...
    
    Or when we have a "equation style" definition:
    
        f (C1 ...) = ...
        f (C2 ...) = ...
        f (C3 ...) = ...
        ...
    
    (usual solution is to rename `f` to `f'` and define a new `f` with a
    `SCC`)
    
    This patch implements support for SCC annotations in declaration
    contexts. This is now a valid program:
    
        f x y = ...
          where
            g z = ...
            {-# SCC g #-}
        {-# SCC f #-}
    
    Test Plan: This passes slow validate (no new failures added).
    
    Reviewers: goldfire, mpickering, austin, bgamari, simonmar
    
    Reviewed By: bgamari, simonmar
    
    Subscribers: simonmar, thomie, mpickering
    
    Differential Revision: https://phabricator.haskell.org/D2407
    98b2c508