Improved Valid Hole Fits
authorMatthías Páll Gissurarson <mpg@mpg.is>
Sun, 27 May 2018 15:50:49 +0000 (11:50 -0400)
committerBen Gamari <ben@smart-cactus.org>
Wed, 30 May 2018 19:21:34 +0000 (15:21 -0400)
commite0b44e2eccd4053852b6c4c3de75a714301ec080
tree0095bdd908921a8fa17a30275527d312f2dca8b9
parentb876c1bb5c8ccd73a203c0f94bac3cbb9c7e2d65
Improved Valid Hole Fits

I've changed the name from `Valid substitutions` to `Valid hole fits`,
since "substitution" already has a well defined meaning within the
theory. As part of this change, the flags and output is reanamed, with
substitution turning into hole-fit in most cases. "hole fit" was already
used internally in the code, it's clear and shouldn't cause any
confusion.

In this update, I've also reworked how we manage side-effects in the
hole we are considering.

This allows us to consider local bindings such as where clauses and
arguments to functions, suggesting e.g. `a` for `head (x:xs) where head
:: [a] -> a`.

It also allows us to find suggestions such as `maximum` for holes of
type `Ord a => a -> [a]`, and `max` when looking for a match for the
hole in `g = foldl1 _`, where `g :: Ord a => [a] -> a`.

We also show much improved output for refinement hole fits, and
fixes #14990. We now show the correct type of the function, but we also
now show what the arguments to the function should be e.g. `foldl1 (_ ::
Integer -> Integer -> Integer)` when looking for `[Integer] -> Integer`.

I've moved the bulk of the code from `TcErrors.hs` to a new file,
`TcHoleErrors.hs`, since it was getting too big to not live on it's own.

This addresses the considerations raised in #14969, and takes proper
care to set the `tcLevel` of the variables to the right level before
passing it to the simplifier.

We now also zonk the suggestions properly, which improves the output of
the refinement hole fits considerably.

This also filters out suggestions from the `GHC.Err` module, since even
though `error` and `undefined` are indeed valid hole fits, they are
"trivial", and almost never useful to the user.

We now find the hole fits using the proper manner, namely by solving
nested implications. This entails that the givens are passed along using
the implications the hole was nested in, which in turn should mean that
there will be fewer weird bugs in the typed holes.

I've also added a new sorting method (as suggested by SPJ) and sort by
the size of the types needed to turn the hole fits into the type of the
hole. This gives a reasonable approximation to relevance, and is much
faster than the subsumption check. I've also added a flag to toggle
whether to use this new sorting algorithm (as is done by default) or the
subsumption algorithm. This fixes #14969

I've also added documentation for these new flags and update the
documentation according to the new output.

Reviewers: bgamari, goldfire

Reviewed By: bgamari

Subscribers: simonpj, rwbarton, thomie, carter

GHC Trac Issues: #14969, #14990, #10946

Differential Revision: https://phabricator.haskell.org/D4444
59 files changed:
compiler/ghc.cabal.in
compiler/main/DynFlags.hs
compiler/typecheck/TcErrors.hs
compiler/typecheck/TcHoleErrors.hs [new file with mode: 0644]
compiler/typecheck/TcHoleErrors.hs-boot [new file with mode: 0644]
compiler/typecheck/TcMType.hs
compiler/typecheck/TcRnTypes.hs
compiler/typecheck/TcSimplify.hs
compiler/typecheck/TcSimplify.hs-boot [deleted file]
docs/users_guide/8.6.1-notes.rst
docs/users_guide/glasgow_exts.rst
testsuite/tests/gadt/T12468.stderr
testsuite/tests/ghci/scripts/T10248.stderr
testsuite/tests/ghci/scripts/T10249.stderr
testsuite/tests/ghci/scripts/T8353.stderr
testsuite/tests/module/mod71.stderr
testsuite/tests/partial-sigs/should_compile/T12531.stderr
testsuite/tests/th/T10267.stderr
testsuite/tests/th/all.T
testsuite/tests/typecheck/should_compile/T13050.stderr
testsuite/tests/typecheck/should_compile/T14273.stderr
testsuite/tests/typecheck/should_compile/T14590.stderr
testsuite/tests/typecheck/should_compile/T9497a.stderr
testsuite/tests/typecheck/should_compile/ValidHoleFits.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/ValidSubs.hs [deleted file]
testsuite/tests/typecheck/should_compile/abstract_refinement_hole_fits.hs [moved from testsuite/tests/typecheck/should_compile/abstract_refinement_substitutions.hs with 100% similarity]
testsuite/tests/typecheck/should_compile/abstract_refinement_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/abstract_refinement_substitutions.stderr [deleted file]
testsuite/tests/typecheck/should_compile/all.T
testsuite/tests/typecheck/should_compile/constraint_hole_fits.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/constraint_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/free_monad_hole_fits.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/free_monad_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/hole_constraints.stderr
testsuite/tests/typecheck/should_compile/hole_constraints_nested.stderr
testsuite/tests/typecheck/should_compile/holes.stderr
testsuite/tests/typecheck/should_compile/holes2.stderr
testsuite/tests/typecheck/should_compile/holes3.stderr
testsuite/tests/typecheck/should_compile/local_hole_fits.hs [new file with mode: 0755]
testsuite/tests/typecheck/should_compile/local_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/refinement_hole_fits.hs [moved from testsuite/tests/typecheck/should_compile/refinement_substitutions.hs with 100% similarity]
testsuite/tests/typecheck/should_compile/refinement_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/refinement_substitutions.stderr [deleted file]
testsuite/tests/typecheck/should_compile/subsumption_sort_hole_fits.hs [new file with mode: 0755]
testsuite/tests/typecheck/should_compile/subsumption_sort_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/type_in_type_hole_fits.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/type_in_type_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/valid_hole_fits.hs [moved from testsuite/tests/typecheck/should_compile/valid_substitutions.hs with 87% similarity]
testsuite/tests/typecheck/should_compile/valid_hole_fits.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/valid_hole_fits_interactions.hs [moved from testsuite/tests/typecheck/should_compile/valid_substitutions_interactions.hs with 100% similarity]
testsuite/tests/typecheck/should_compile/valid_hole_fits_interactions.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/valid_substitutions.stderr [deleted file]
testsuite/tests/typecheck/should_compile/valid_substitutions_interactions.stderr [deleted file]
testsuite/tests/typecheck/should_fail/T12177.stderr
testsuite/tests/typecheck/should_fail/T14884.stderr
testsuite/tests/typecheck/should_fail/T9497d.stderr
testsuite/tests/typecheck/should_run/T9497a-run.stderr
testsuite/tests/typecheck/should_run/T9497b-run.stderr
testsuite/tests/typecheck/should_run/T9497c-run.stderr