Show valid substitutions for typed holes
authorMatthías Páll Gissurarson <mpg@mpg.is>
Wed, 29 Mar 2017 21:30:28 +0000 (17:30 -0400)
committerBen Gamari <ben@smart-cactus.org>
Wed, 29 Mar 2017 22:06:21 +0000 (18:06 -0400)
commit26c95f46e679fb73e1ec2bec2be0801c72fd1449
treeeeedf7a400c80f07a8295c333875576d1b7b5800
parent924a65fc27bb2a3e24489f7baea7ad5fb8a556ac
Show valid substitutions for typed holes

The idea is to implement a mechanism similar to PureScript, where they
suggest which identifiers in scope would fit the given hole. In
PureScript, they use subsumption (which is what we would like here as
well). For subsumption, we would have to check each type in scope
whether the hole is a subtype of the given type, but that would require
`tcSubType` and constraint satisfiability checking. Currently,
`TcSimplify` uses a lot of functions from `TcErrors`, so that would
require more of a rewrite, I will hold on with that for now, and submit
the more simpler type equality version.

As an example, consider

```
ps :: String -> IO ()
ps = putStrLn

ps2 :: a -> IO ()
ps2 _ = putStrLn "hello, world"

main :: IO ()
main = _ "hello, world"
```

The results would be something like

```
    • Found hole: _ :: [Char] -> IO ()
    • In the expression: _
      In a stmt of a 'do' block: _ "hello, world"
      In the expression:
        do _ "hello, world"
    • Relevant bindings include
        main :: IO () (bound at test.hs:13:1)
        ps :: String -> IO () (bound at test.hs:7:1)
        ps2 :: forall a. a  -> IO () (bound at test.hs:10:1)
      Valid substitutions include
        putStrLn :: String
                    -> IO () (imported from ‘Prelude’ at
test.hs:1:1-14
                              (and originally defined in
‘System.IO’))
        putStr :: String
                  -> IO () (imported from ‘Prelude’ at
test.hs:1:1-14
                            (and originally defined in ‘System.IO’))
```

We'd like here for ps2 to be suggested as well, but for that we require
subsumption.

Reviewers: austin, bgamari, dfeuer, mpickering

Reviewed By: dfeuer, mpickering

Subscribers: mpickering, Wizek, dfeuer, rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D3361
compiler/main/DynFlags.hs
compiler/typecheck/TcErrors.hs
docs/users_guide/using-optimisation.rst
testsuite/tests/ghci/scripts/T8353.stderr
testsuite/tests/typecheck/should_compile/T13050.stderr
testsuite/tests/typecheck/should_compile/ValidSubs.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/all.T
testsuite/tests/typecheck/should_compile/valid_substitutions.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/valid_substitutions.stderr [new file with mode: 0644]
utils/mkUserGuidePart/Options/Optimizations.hs