Support wild cards in TH splices
authorThomas Winant <thomas.winant@cs.kuleuven.be>
Mon, 20 Jul 2015 13:43:53 +0000 (15:43 +0200)
committerBen Gamari <ben@smart-cactus.org>
Mon, 20 Jul 2015 14:43:34 +0000 (16:43 +0200)
commit49373ffe4cbc87b46468d2372e850138e151a9ae
treec5b5f74bc06eb924b4d75f10b370a3b3e49a972b
parent82ffc80df573512f788524c4616db3c08fc9f125
Support wild cards in TH splices

- Declaration splices: partial type signatures are fully supported in TH
  declaration splices.

  For example, the wild cards in the example below will unify with `Eq
a`
  and `a -> a -> Bool`, as expected:

```
[d| foo :: _ => _
    foo x y = x == y |]
```

- Expression splices: anonymous and named wild cards are supported in
  expression signatures, but extra-constraints wild cards aren't. Just
  as is the case for regular expression signatures.

```
[e | Just True :: _a _ |]
```

- Typed expression splices: the same wildcards as in (untyped)
  expression splices are supported.

- Pattern splices: TH doesn't support type signatures in pattern
  splices, consequently, partial type signatures aren't supported
  either.

- Type splices: partial type signatures are only partially supported in
  type splices, specifically: only anonymous wild cards are allowed.

  So `[t| _ |]`, `[t| _ -> Maybe _ |]` will work, but `[t| _ => _ |]` or
  `[| _a |]` won't (without `-XNamedWildCards`, the latter will work as
  the named wild card is treated as a type variable).

  Normally, named wild cards are collected before renaming a (partial)
  type signature. However, TH type splices are run during renaming, i.e.
  after the initial traversal, leading to out of scope errors for named
  wild cards. We can't just extend the initial traversal to collect the
  named wild cards in TH type splices, as we'd need to expand them,
  which is supposed to happen only once, during renaming.

  Similarly, the extra-constraints wild card is handled right before
  renaming too, and is therefore also not supported in a TH type splice.
  Another reason not to support extra-constraints wild cards in TH type
  splices is that a single signature can contain many TH type splices,
  whereas it mustn't contain more than one extra-constraints wild card.
  Enforcing would this be hard the way things are currently organised.

  Anonymous wild cards pose no problem, because they start without names
  and are given names during renaming. These names are collected right
  after renaming. The names generated for anonymous wild cards in TH
  type splices will thus be collected as well.

  With a more invasive refactoring of the renaming, partial type
  signatures could be fully supported in TH type splices. As only
  anonymous wild cards have been requested so far, these small changes
  satisfying this request will do for now. Also don't forget that a TH
  declaration splices support all kinds of wild cards.

- Extra-constraints wild cards were silently ignored in expression and
  pattern signatures, appropriate error messages are now generated.

Test Plan: run new tests

Reviewers: austin, goldfire, adamgundry, bgamari

Reviewed By: goldfire, adamgundry, bgamari

Subscribers: thomie

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

GHC Trac Issues: #10094, #10548
33 files changed:
compiler/deSugar/DsMeta.hs
compiler/hsSyn/Convert.hs
compiler/hsSyn/HsTypes.hs
compiler/prelude/THNames.hs
compiler/rename/RnSplice.hs
compiler/rename/RnTypes.hs
docs/users_guide/7.12.1-notes.xml
docs/users_guide/glasgow_exts.xml
libraries/template-haskell/Language/Haskell/TH/Lib.hs
libraries/template-haskell/Language/Haskell/TH/Ppr.hs
libraries/template-haskell/Language/Haskell/TH/Syntax.hs
testsuite/tests/partial-sigs/should_compile/Splices.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_compile/SplicesUsed.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_compile/SplicesUsed.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_compile/TypedSplice.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_compile/TypedSplice.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_compile/all.T
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInExpressionSignature.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInExpressionSignature.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInPatternSignature.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInPatternSignature.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInPatternSplice.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInPatternSplice.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInTypeSplice.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInTypeSplice2.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInTypeSplice2.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInTypeSpliceUsed.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/ExtraConstraintsWildcardInTypeSpliceUsed.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/NamedWildcardInTypeSplice.hs [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/NamedWildcardInTypeSplice.stderr [new file with mode: 0644]
testsuite/tests/partial-sigs/should_fail/WildcardInTypeBrackets.hs [deleted file]
testsuite/tests/partial-sigs/should_fail/WildcardInTypeBrackets.stderr [deleted file]
testsuite/tests/partial-sigs/should_fail/all.T