summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/hsSyn/HsDecls.hs9
-rw-r--r--compiler/parser/Parser.y13
-rw-r--r--docs/users_guide/7.12.1-notes.xml10
-rw-r--r--testsuite/tests/haddock/should_compile_flag_haddock/all.T1
-rw-r--r--testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.hs8
-rw-r--r--testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.stderr5
6 files changed, 39 insertions, 7 deletions
diff --git a/compiler/hsSyn/HsDecls.hs b/compiler/hsSyn/HsDecls.hs
index 9233f4fde1..79b0deeb16 100644
--- a/compiler/hsSyn/HsDecls.hs
+++ b/compiler/hsSyn/HsDecls.hs
@@ -981,16 +981,17 @@ pprConDecl (ConDecl { con_names = cons, con_explicit = expl, con_qvars = tvs
pprConDecl (ConDecl { con_names = cons, con_explicit = expl, con_qvars = tvs
, con_cxt = cxt, con_details = PrefixCon arg_tys
- , con_res = ResTyGADT _ res_ty })
- = ppr_con_names cons <+> dcolon <+>
+ , con_res = ResTyGADT _ res_ty, con_doc = doc })
+ = ppr_mbDoc doc <+> ppr_con_names cons <+> dcolon <+>
sep [pprHsForAll expl tvs cxt, ppr (foldr mk_fun_ty res_ty arg_tys)]
where
mk_fun_ty a b = noLoc (HsFunTy a b)
pprConDecl (ConDecl { con_names = cons, con_explicit = expl, con_qvars = tvs
, con_cxt = cxt, con_details = RecCon fields
- , con_res = ResTyGADT _ res_ty })
- = sep [ppr_con_names cons <+> dcolon <+> pprHsForAll expl tvs cxt,
+ , con_res = ResTyGADT _ res_ty, con_doc = doc })
+ = sep [ppr_mbDoc doc <+> ppr_con_names cons <+> dcolon
+ <+> pprHsForAll expl tvs cxt,
pprConDeclFields (unLoc fields) <+> arrow <+> ppr res_ty]
pprConDecl decl@(ConDecl { con_details = InfixCon ty1 ty2, con_res = ResTyGADT {} })
diff --git a/compiler/parser/Parser.y b/compiler/parser/Parser.y
index d6972532d7..99abf162d1 100644
--- a/compiler/parser/Parser.y
+++ b/compiler/parser/Parser.y
@@ -1870,10 +1870,10 @@ gadt_constrlist :: { Located ([AddAnn]
| {- empty -} { noLoc ([],[]) }
gadt_constrs :: { Located [LConDecl RdrName] }
- : gadt_constr ';' gadt_constrs
+ : gadt_constr_with_doc ';' gadt_constrs
{% addAnnotation (gl $1) AnnSemi (gl $2)
>> return (L (comb2 $1 $3) ($1 : unLoc $3)) }
- | gadt_constr { L (gl $1) [$1] }
+ | gadt_constr_with_doc { L (gl $1) [$1] }
| {- empty -} { noLoc [] }
-- We allow the following forms:
@@ -1882,11 +1882,18 @@ gadt_constrs :: { Located [LConDecl RdrName] }
-- D { x,y :: a } :: T a
-- forall a. Eq a => D { x,y :: a } :: T a
+gadt_constr_with_doc :: { LConDecl RdrName }
+gadt_constr_with_doc
+ : maybe_docnext ';' gadt_constr
+ {% return $ addConDoc $3 $1 }
+ | gadt_constr
+ {% return $1 }
+
gadt_constr :: { LConDecl RdrName }
-- Returns a list because of: C,D :: ty
: con_list '::' sigtype
{% do { (anns,gadtDecl) <- mkGadtDecl (unLoc $1) $3
- ; ams (sLL $1 $> $ gadtDecl)
+ ; ams (sLL $1 $> gadtDecl)
(mj AnnDcolon $2:anns) } }
-- Deprecated syntax for GADT record declarations
diff --git a/docs/users_guide/7.12.1-notes.xml b/docs/users_guide/7.12.1-notes.xml
index cfe98b530b..27ad849b16 100644
--- a/docs/users_guide/7.12.1-notes.xml
+++ b/docs/users_guide/7.12.1-notes.xml
@@ -36,6 +36,16 @@
</listitem>
<listitem>
<para>
+ The parser now supports Haddock comments on GADT data constructors. For example,
+ <programlisting>
+ data Expr a where
+ -- | Just a normal sum
+ Sum :: Int -> Int -> Expr Int
+ </programlisting>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
Implicit parameters of the new base type
<literal>GHC.Stack.CallStack</literal> are treated
specially, and automatically solved for the current source
diff --git a/testsuite/tests/haddock/should_compile_flag_haddock/all.T b/testsuite/tests/haddock/should_compile_flag_haddock/all.T
index d803e9dd61..a0d1d7c07d 100644
--- a/testsuite/tests/haddock/should_compile_flag_haddock/all.T
+++ b/testsuite/tests/haddock/should_compile_flag_haddock/all.T
@@ -31,4 +31,5 @@ test('haddockA030', normal, compile, ['-haddock -ddump-parsed'])
test('haddockA031', normal, compile, ['-haddock -ddump-parsed -XExistentialQuantification'])
test('haddockA032', normal, compile, ['-haddock -ddump-parsed'])
test('haddockA033', normal, compile, ['-haddock -ddump-parsed'])
+test('haddockA034', normal, compile, ['-haddock -ddump-parsed'])
test('T10398', normal, compile, ['-haddock -ddump-parsed'])
diff --git a/testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.hs b/testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.hs
new file mode 100644
index 0000000000..195d76c34a
--- /dev/null
+++ b/testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE GADTs #-}
+
+module Hi where
+
+-- | This is a GADT.
+data Hi where
+ -- | This is a GADT constructor.
+ Hi :: () -> Hi
diff --git a/testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.stderr b/testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.stderr
new file mode 100644
index 0000000000..f743393349
--- /dev/null
+++ b/testsuite/tests/haddock/should_compile_flag_haddock/haddockA034.stderr
@@ -0,0 +1,5 @@
+
+==================== Parser ====================
+module Hi where
+<document comment>
+data Hi where This is a GADT constructor. Hi :: () -> Hi