summaryrefslogtreecommitdiff
path: root/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
diff options
context:
space:
mode:
authorRyan Scott <ryan.gl.scott@gmail.com>2016-09-30 20:15:25 -0400
committerBen Gamari <ben@smart-cactus.org>2016-09-30 23:23:44 -0400
commit9e862765ffe161da8a4fd9cd67b0a600874feaa9 (patch)
tree235c1ba702b0101e1fa6a8fe7f8146e2c7ec9c69 /libraries/template-haskell/Language/Haskell/TH/Syntax.hs
parentb3d55e20d20344bfc09f4ca4a554a819c4ecbfa8 (diff)
downloadhaskell-9e862765ffe161da8a4fd9cd67b0a600874feaa9.tar.gz
Implement deriving strategies
Allows users to explicitly request which approach to `deriving` to use via keywords, e.g., ``` newtype Foo = Foo Bar deriving Eq deriving stock Ord deriving newtype Show ``` Fixes #10598. Updates haddock submodule. Test Plan: ./validate Reviewers: hvr, kosmikus, goldfire, alanz, bgamari, simonpj, austin, erikd, simonmar Reviewed By: alanz, bgamari, simonpj Subscribers: thomie, mpickering, oerjan Differential Revision: https://phabricator.haskell.org/D2280 GHC Trac Issues: #10598
Diffstat (limited to 'libraries/template-haskell/Language/Haskell/TH/Syntax.hs')
-rw-r--r--libraries/template-haskell/Language/Haskell/TH/Syntax.hs40
1 files changed, 29 insertions, 11 deletions
diff --git a/libraries/template-haskell/Language/Haskell/TH/Syntax.hs b/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
index 00ac0b308b..afe961b50e 100644
--- a/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
+++ b/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
@@ -1549,13 +1549,15 @@ data Dec
| ValD Pat Body [Dec] -- ^ @{ p = b where decs }@
| DataD Cxt Name [TyVarBndr]
(Maybe Kind) -- Kind signature (allowed only for GADTs)
- [Con] Cxt
+ [Con] [DerivClause]
-- ^ @{ data Cxt x => T x = A x | B (T x)
- -- deriving (Z,W)}@
+ -- deriving (Z,W)
+ -- deriving stock Eq }@
| NewtypeD Cxt Name [TyVarBndr]
(Maybe Kind) -- Kind signature
- Con Cxt -- ^ @{ newtype Cxt x => T x = A (B x)
- -- deriving (Z,W Q)}@
+ Con [DerivClause] -- ^ @{ newtype Cxt x => T x = A (B x)
+ -- deriving (Z,W Q)
+ -- deriving stock Eq }@
| TySynD Name [TyVarBndr] Type -- ^ @{ type T x = (x,x) }@
| ClassD Cxt Name [TyVarBndr]
[FunDep] [Dec] -- ^ @{ class Eq a => Ord a where ds }@
@@ -1578,14 +1580,18 @@ data Dec
| DataInstD Cxt Name [Type]
(Maybe Kind) -- Kind signature
- [Con] Cxt -- ^ @{ data instance Cxt x => T [x]
- -- = A x | B (T x) deriving (Z,W)}@
+ [Con] [DerivClause] -- ^ @{ data instance Cxt x => T [x]
+ -- = A x | B (T x)
+ -- deriving (Z,W)
+ -- deriving stock Eq }@
| NewtypeInstD Cxt Name [Type]
- (Maybe Kind) -- Kind signature
- Con Cxt -- ^ @{ newtype instance Cxt x => T [x]
- -- = A (B x) deriving (Z,W)}@
- | TySynInstD Name TySynEqn -- ^ @{ type instance ... }@
+ (Maybe Kind) -- Kind signature
+ Con [DerivClause] -- ^ @{ newtype instance Cxt x => T [x]
+ -- = A (B x)
+ -- deriving (Z,W)
+ -- deriving stock Eq }@
+ | TySynInstD Name TySynEqn -- ^ @{ type instance ... }@
-- | open type families (may also appear in [Dec] of 'ClassD' and 'InstanceD')
| OpenTypeFamilyD TypeFamilyHead
@@ -1595,7 +1601,8 @@ data Dec
-- ^ @{ type family F a b = (r :: *) | r -> a where ... }@
| RoleAnnotD Name [Role] -- ^ @{ type role T nominal representational }@
- | StandaloneDerivD Cxt Type -- ^ @{ deriving instance Ord a => Ord (Foo a) }@
+ | StandaloneDerivD (Maybe DerivStrategy) Cxt Type
+ -- ^ @{ deriving stock instance Ord a => Ord (Foo a) }@
| DefaultSigD Name Type -- ^ @{ default size :: Data a => a -> Int }@
-- | Pattern Synonyms
@@ -1620,6 +1627,17 @@ data Overlap = Overlappable -- ^ May be overlapped by more specific instances
-- available.
deriving( Show, Eq, Ord, Data, Generic )
+-- | A single @deriving@ clause at the end of a datatype.
+data DerivClause = DerivClause (Maybe DerivStrategy) Cxt
+ -- ^ @{ deriving stock (Eq, Ord) }@
+ deriving( Show, Eq, Ord, Data, Generic )
+
+-- | What the user explicitly requests when deriving an instance.
+data DerivStrategy = Stock -- ^ A \"standard\" derived instance
+ | Anyclass -- ^ @-XDeriveAnyClass@
+ | Newtype -- ^ @-XGeneralizedNewtypeDeriving@
+ deriving( Show, Eq, Ord, Data, Generic )
+
-- | A Pattern synonym's type. Note that a pattern synonym's *fully*
-- specified type has a peculiar shape coming with two forall
-- quantifiers and two constraint contexts. For example, consider the