Expose source locations via Implicit Parameters of type GHC.Location.Location
authorEric Seidel <gridaphobe@gmail.com>
Mon, 19 Jan 2015 22:08:32 +0000 (16:08 -0600)
committerAustin Seipp <austin@well-typed.com>
Mon, 19 Jan 2015 22:08:33 +0000 (16:08 -0600)
commitc024af131b9e2538486eb605ba8af6a8d10fe76d
tree88ab74b92cb05298626bd455624ce822dc390046
parentc77eecdc35e2fb4664765264a72ed3f29e50c047
Expose source locations via Implicit Parameters of type GHC.Location.Location

Summary:
IPs with this type will always be solved for the current source
location. If another IP of the same type is in scope, the two locations will be
appended, creating a call-stack. The Location type is kept abstract so users
cannot create them, but a Location can be turned into a list of SrcLocs, which
correspond to individual locations in a program. Each SrcLoc contains a
package/module/file name and start/end lines and columns.

The only thing missing from the SrcLoc in my opinion is the name of the
top-level definition it inhabits. I suspect that would also be useful, but it's
not clear to me how to extract the current top-level binder from within the
constraint solver. (Surely I'm just missing something here?)

I made the (perhaps controversial) decision to have GHC completely ignore
the names of Location IPs, meaning that in the following code:

    bar :: (?myloc :: Location) => String
    bar = foo

    foo :: (?loc :: Location) => String
    foo = show ?loc

if I call `bar`, the resulting call-stack will include locations for

1. the use of `?loc` inside `foo`,
2. `foo`s call-site inside `bar`, and
3. `bar`s call-site, wherever that may be.

This makes Location IPs very special indeed, and I'm happy to change it if the
dissonance is too great.

I've also left out any changes to base to make use of Location IPs, since there
were some concerns about a snowball effect. I think it would be reasonable to
mark this as an experimental feature for now (it is!), and defer using it in
base until we have more experience with it. It is, after all, quite easy to
define your own version of `error`, `undefined`, etc. that use Location IPs.

Test Plan: validate, new test-case is testsuite/tests/typecheck/should_run/IPLocation.hs

Reviewers: austin, hvr, simonpj

Reviewed By: simonpj

Subscribers: simonmar, rodlogic, carter, thomie

Differential Revision: https://phabricator.haskell.org/D578

GHC Trac Issues: #9049
16 files changed:
compiler/deSugar/DsBinds.hs
compiler/prelude/PrelNames.hs
compiler/typecheck/Inst.hs
compiler/typecheck/TcBinds.hs
compiler/typecheck/TcEvidence.hs
compiler/typecheck/TcExpr.hs
compiler/typecheck/TcHsSyn.hs
compiler/typecheck/TcInteract.hs
docs/users_guide/7.12.1-notes.xml
docs/users_guide/glasgow_exts.xml
libraries/base/GHC/SrcLoc.hs [new file with mode: 0644]
libraries/base/GHC/Stack.hsc
libraries/base/base.cabal
testsuite/tests/typecheck/should_run/IPLocation.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_run/IPLocation.stdout [new file with mode: 0644]
testsuite/tests/typecheck/should_run/all.T