Support SCC pragmas in declaration context

Authored by osa1 on Jul 20 2016, 4:33 AM.

Description

Support SCC pragmas in declaration context

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

Details