haddock 2.23.0 → 2.23.1
raw patch · 24 files changed
+2238/−76 lines, 24 filesdep ~haddock-api
Dependency ranges changed: haddock-api
Files
- haddock-api/src/Haddock.hs +1/−1
- haddock-api/src/Haddock/Backends/Hyperlinker.hs +32/−17
- haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs +1/−1
- haddock-api/src/Haddock/Convert.hs +28/−37
- haddock-api/src/Haddock/Interface/Create.hs +5/−4
- haddock.cabal +4/−3
- html-test/Main.hs +0/−6
- html-test/ref/Bug1103.html +556/−0
- html-test/ref/IgnoreExports.html +46/−6
- html-test/src/Bug1103.hs +24/−0
- html-test/src/IgnoreExports.hs +4/−1
- hypsrc-test/ref/src/Bug1091.html +34/−0
- hypsrc-test/ref/src/CallingQuotes.html +104/−0
- hypsrc-test/ref/src/Quasiquoter.html +415/−0
- hypsrc-test/ref/src/TemplateHaskellQuasiquotes.html +659/−0
- hypsrc-test/ref/src/TemplateHaskellSplices.html +135/−0
- hypsrc-test/ref/src/UsingQuasiquotes.html +104/−0
- hypsrc-test/src/Bug1091.hs +4/−0
- hypsrc-test/src/Include1For1091.h +6/−0
- hypsrc-test/src/Include2For1091.h +4/−0
- hypsrc-test/src/Quasiquoter.hs +16/−0
- hypsrc-test/src/TemplateHaskellQuasiquotes.hs +39/−0
- hypsrc-test/src/TemplateHaskellSplices.hs +8/−0
- hypsrc-test/src/UsingQuasiquotes.hs +9/−0
haddock-api/src/Haddock.hs view
@@ -432,7 +432,7 @@ when (Flag_HyperlinkedSource `elem` flags && not (null ifaces)) $ do withTiming (pure dflags') "ppHyperlinkedSource" (const ()) $ do _ <- {-# SCC ppHyperlinkedSource #-}- ppHyperlinkedSource odir libDir opt_source_css pretty srcMap ifaces+ ppHyperlinkedSource (verbosity flags) odir libDir opt_source_css pretty srcMap ifaces return ()
haddock-api/src/Haddock/Backends/Hyperlinker.hs view
@@ -7,7 +7,7 @@ import Haddock.Types-import Haddock.Utils (writeUtf8File)+import Haddock.Utils (writeUtf8File, out, verbose, Verbosity) import Haddock.Backends.Hyperlinker.Renderer import Haddock.Backends.Hyperlinker.Parser import Haddock.Backends.Hyperlinker.Types@@ -18,12 +18,13 @@ import System.Directory import System.FilePath -import HieTypes ( HieFile(..), HieASTs(..) )+import HieTypes ( HieFile(..), HieASTs(..), HieAST(..), NodeInfo(..) ) import HieBin ( readHieFile, hie_file_result) import Data.Map as M import FastString ( mkFastString ) import Module ( Module, moduleName ) import NameCache ( initNameCache )+import SrcLoc ( mkRealSrcLoc, realSrcLocSpan ) import UniqSupply ( mkSplitUniqSupply ) @@ -32,27 +33,28 @@ -- Note that list of interfaces should also contain interfaces normally hidden -- when generating documentation. Otherwise this could lead to dead links in -- produced source.-ppHyperlinkedSource :: FilePath -- ^ Output directory+ppHyperlinkedSource :: Verbosity+ -> FilePath -- ^ Output directory -> FilePath -- ^ Resource directory -> Maybe FilePath -- ^ Custom CSS file path -> Bool -- ^ Flag indicating whether to pretty-print HTML -> M.Map Module SrcPath -- ^ Paths to sources -> [Interface] -- ^ Interfaces for which we create source -> IO ()-ppHyperlinkedSource outdir libdir mstyle pretty srcs' ifaces = do+ppHyperlinkedSource verbosity outdir libdir mstyle pretty srcs' ifaces = do createDirectoryIfMissing True srcdir let cssFile = fromMaybe (defaultCssFile libdir) mstyle copyFile cssFile $ srcdir </> srcCssFile copyFile (libdir </> "html" </> highlightScript) $ srcdir </> highlightScript- mapM_ (ppHyperlinkedModuleSource srcdir pretty srcs) ifaces+ mapM_ (ppHyperlinkedModuleSource verbosity srcdir pretty srcs) ifaces where srcdir = outdir </> hypSrcDir srcs = (srcs', M.mapKeys moduleName srcs') -- | Generate hyperlinked source for particular interface.-ppHyperlinkedModuleSource :: FilePath -> Bool -> SrcMaps -> Interface -> IO ()-ppHyperlinkedModuleSource srcdir pretty srcs iface = case ifaceHieFile iface of+ppHyperlinkedModuleSource :: Verbosity -> FilePath -> Bool -> SrcMaps -> Interface -> IO ()+ppHyperlinkedModuleSource verbosity srcdir pretty srcs iface = case ifaceHieFile iface of Just hfp -> do -- Parse the GHC-produced HIE file u <- mkSplitUniqSupply 'a'@@ -64,24 +66,37 @@ <$> (readHieFile (initNameCache u []) hfp) -- Get the AST and tokens corresponding to the source file we want- let mast | M.size asts == 1 = snd <$> M.lookupMin asts- | otherwise = M.lookup (mkFastString file) asts+ let fileFs = mkFastString file+ mast | M.size asts == 1 = snd <$> M.lookupMin asts+ | otherwise = M.lookup fileFs asts+ ast = fromMaybe (emptyHieAst fileFs) mast+ fullAst = recoverFullIfaceTypes df types ast tokens = parse df file rawSrc + -- Warn if we didn't find an AST, but there were still ASTs+ if M.null asts+ then pure ()+ else out verbosity verbose $ unwords [ "couldn't find ast for"+ , file, show (M.keys asts) ]+ -- Produce and write out the hyperlinked sources- case mast of- Just ast ->- let fullAst = recoverFullIfaceTypes df types ast- in writeUtf8File path . renderToString pretty . render' fullAst $ tokens- Nothing- | M.size asts == 0 -> return ()- | otherwise -> error $ unwords [ "couldn't find ast for"- , file, show (M.keys asts) ]+ writeUtf8File path . renderToString pretty . render' fullAst $ tokens Nothing -> return () where df = ifaceDynFlags iface render' = render (Just srcCssFile) (Just highlightScript) srcs path = srcdir </> hypSrcModuleFile (ifaceMod iface)++ emptyNodeInfo = NodeInfo+ { nodeAnnotations = mempty+ , nodeType = []+ , nodeIdentifiers = mempty+ }+ emptyHieAst fileFs = Node+ { nodeInfo = emptyNodeInfo+ , nodeSpan = realSrcLocSpan (mkRealSrcLoc fileFs 1 0)+ , nodeChildren = []+ } -- | Name of CSS file in output directory. srcCssFile :: FilePath
haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs view
@@ -102,7 +102,7 @@ -- > hieAst -- -- However, this is very inefficient (both in time and space) because the--- mutliple calls to 'recoverFullType' don't share intermediate results. This+-- multiple calls to 'recoverFullType' don't share intermediate results. This -- function fixes that. recoverFullIfaceTypes :: DynFlags
haddock-api/src/Haddock/Convert.hs view
@@ -28,7 +28,6 @@ import Data.Either (lefts, rights) import DataCon import FamInstEnv-import FV import HsSyn import Name import NameSet ( emptyNameSet )@@ -45,8 +44,7 @@ import PrelNames ( hasKey, eqTyConKey, ipClassKey, tYPETyConKey , liftedRepDataConKey ) import Unique ( getUnique )-import Util ( chkAppend, compareLength, dropList, filterByList, filterOut- , splitAtList )+import Util ( chkAppend,dropList, filterByList, filterOut, splitAtList ) import Var import VarSet @@ -150,8 +148,7 @@ = let name = synifyName tc args_types_only = filterOutInvisibleTypes tc args typats = map (synifyType WithinType []) args_types_only- annot_typats = zipWith3 annotHsType (mkIsPolyTvs fam_tvs)- args_types_only typats+ annot_typats = zipWith3 annotHsType args_poly args_types_only typats hs_rhs = synifyType WithinType [] rhs in HsIB { hsib_ext = map tyVarName tkvs , hsib_body = FamEqn { feqn_ext = noExt@@ -162,7 +159,7 @@ , feqn_fixity = synifyFixity name , feqn_rhs = hs_rhs } } where- fam_tvs = tyConVisibleTyVars tc+ args_poly = tyConArgsPolyKinded tc synifyAxiom :: CoAxiom br -> Either ErrMsg (HsDecl GhcRn) synifyAxiom ax@(CoAxiom { co_ax_tc = tc })@@ -472,18 +469,27 @@ in noLoc (HsKindSig noExt hs_ty hs_ki) annotHsType _ _ hs_ty = hs_ty --- | For every type variable in the input,--- report whether or not the tv is poly-kinded. This is used to eventually--- feed into 'annotHsType'.-mkIsPolyTvs :: [TyVar] -> [Bool]-mkIsPolyTvs = map is_poly_tv+-- | For every argument type that a type constructor accepts,+-- report whether or not the argument is poly-kinded. This is used to+-- eventually feed into 'annotThType'.+tyConArgsPolyKinded :: TyCon -> [Bool]+tyConArgsPolyKinded tc =+ map (is_poly_ty . tyVarKind) tc_vis_tvs+ ++ map (is_poly_ty . tyCoBinderType) tc_res_kind_vis_bndrs+ ++ repeat True where- is_poly_tv tv = not $+ is_poly_ty :: Type -> Bool+ is_poly_ty ty = not $ isEmptyVarSet $ filterVarSet isTyVar $- tyCoVarsOfType $- tyVarKind tv+ tyCoVarsOfType ty + tc_vis_tvs :: [TyVar]+ tc_vis_tvs = tyConVisibleTyVars tc++ tc_res_kind_vis_bndrs :: [TyCoBinder]+ tc_res_kind_vis_bndrs = filter isVisibleBinder $ fst $ splitPiTys $ tyConResKind tc+ --states of what to do with foralls: data SynifyTypeState = WithinType@@ -539,7 +545,7 @@ = noLoc (HsTyVar noExt NotPromoted (noLoc liftedTypeKindTyConName)) -- Use non-prefix tuple syntax where possible, because it looks nicer. | Just sort <- tyConTuple_maybe tc- , tyConArity tc == length tys+ , tyConArity tc == tys_len = noLoc $ HsTupleTy noExt (case sort of BoxedTuple -> HsBoxedTuple@@ -596,32 +602,17 @@ (map (synifyType WithinType vs) $ filterOut isCoercionTy ty_args) - vis_tys = filterOutInvisibleTypes tc tys- binders = tyConBinders tc- res_kind = tyConResKind tc+ tys_len = length tys+ vis_tys = filterOutInvisibleTypes tc tys maybe_sig :: LHsType GhcRn -> LHsType GhcRn maybe_sig ty'- | needs_kind_sig+ | tyConAppNeedsKindSig False tc tys_len = let full_kind = typeKind (mkTyConApp tc tys) full_kind' = synifyType WithinType vs full_kind in noLoc $ HsKindSig noExt ty' full_kind' | otherwise = ty' - needs_kind_sig :: Bool- needs_kind_sig- | GT <- compareLength tys binders- = False- | otherwise- = let (dropped_binders, remaining_binders)- = splitAtList tys binders- result_kind = mkTyConKind remaining_binders res_kind- result_vars = tyCoVarsOfType result_kind- dropped_vars = fvVarSet $- mapUnionFV injectiveVarsOfBinder dropped_binders-- in not (subVarSet result_vars dropped_vars)- synifyType s vs (AppTy t1 (CoercionTy {})) = synifyType s vs t1 synifyType _ vs (AppTy t1 t2) = let s1 = synifyType WithinType vs t1@@ -787,8 +778,8 @@ cls_tycon = classTyCon cls ts = filterOutInvisibleTypes cls_tycon types ts' = map (synifyType WithinType vs) ts- annot_ts = zipWith3 annotHsType is_poly_tvs ts ts'- is_poly_tvs = mkIsPolyTvs (tyConVisibleTyVars cls_tycon)+ annot_ts = zipWith3 annotHsType args_poly ts ts'+ args_poly = tyConArgsPolyKinded cls_tycon synifyClsIdSig = synifyIdSig ShowRuntimeRep DeleteTopLevelQuantification vs -- Convert a family instance, this could be a type family or data family@@ -827,8 +818,8 @@ ts = filterOutInvisibleTypes fam_tc eta_expanded_lhs synifyTypes = map (synifyType WithinType []) ts' = synifyTypes ts- annot_ts = zipWith3 annotHsType is_poly_tvs ts ts'- is_poly_tvs = mkIsPolyTvs (tyConVisibleTyVars fam_tc)+ annot_ts = zipWith3 annotHsType args_poly ts ts'+ args_poly = tyConArgsPolyKinded fam_tc {- Note [Invariant: Never expand type synonyms]
haddock-api/src/Haddock/Interface/Create.hs view
@@ -83,8 +83,9 @@ (TcGblEnv { tcg_rdr_env = gre , tcg_warns = warnings- , tcg_exports = all_exports+ , tcg_exports = all_exports0 }, md) = tm_internals_ tm+ all_local_avails = gresToAvailInfo . filter isLocalGRE . globalRdrEnvElts $ gre -- The 'pkgName' is necessary to decide what package to mention in "@since" -- annotations. Not having it is not fatal though.@@ -111,9 +112,9 @@ let declsWithDocs = topDecls group_ exports0 = fmap (map (first unLoc)) mayExports- exports- | OptIgnoreExports `elem` opts = Nothing- | otherwise = exports0+ (all_exports, exports)+ | OptIgnoreExports `elem` opts = (all_local_avails, Nothing)+ | otherwise = (all_exports0, exports0) unrestrictedImportedMods -- module re-exports are only possible with
haddock.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: haddock-version: 2.23.0+version: 2.23.1 synopsis: A documentation-generation tool for Haskell libraries description: This is Haddock, a tool for automatically generating documentation@@ -33,7 +33,7 @@ copyright: (c) Simon Marlow, David Waern category: Documentation build-type: Simple-tested-with: GHC==8.8.*+tested-with: GHC==8.8.2 extra-source-files: CHANGES.md@@ -46,6 +46,7 @@ html-test/src/*.hs html-test/ref/*.html hypsrc-test/src/*.hs+ hypsrc-test/src/*.h hypsrc-test/ref/src/*.html latex-test/src/**/*.hs latex-test/ref/**/*.tex@@ -141,7 +142,7 @@ else -- in order for haddock's advertised version number to have proper meaning, -- we pin down to a single haddock-api version.- build-depends: haddock-api == 2.23.0+ build-depends: haddock-api == 2.23.1 test-suite html-test type: exitcode-stdio-1.0
html-test/Main.hs view
@@ -54,12 +54,6 @@ -- we need a reliable way to deduplicate here. -- Happens since PR #688. "B"-- -- ignore-exports flag broke with PR #688. We use- -- the Avails calculated by GHC now. Probably- -- requires a change to GHC to "ignore" a modules- -- export list reliably.- , "IgnoreExports" ] checkIgnore :: FilePath -> Bool
+ html-test/ref/Bug1103.html view
@@ -0,0 +1,556 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1103</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ ></span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1103</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Foo1" class="def"+ >Foo1</a+ > :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo1"+ >Instances</h4+ ><details id="i:Foo1" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo1:Foo1:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo1:Foo1:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > = <a id="v:Foo1Bool" class="def"+ >Foo1Bool</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo1:Foo1:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo1:Foo1:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a)</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Foo2" class="def"+ >Foo2</a+ > :: k -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo2"+ >Instances</h4+ ><details id="i:Foo2" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > = <a id="v:Foo2Bool" class="def"+ >Foo2Bool</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:3"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:4"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Foo3" class="def"+ >Foo3</a+ > :: k <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo3"+ >Instances</h4+ ><details id="i:Foo3" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:3"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:4"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > = <a id="v:Foo3Bool" class="def"+ >Foo3Bool</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:5"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ><div id="footer"+ ></div+ ></body+ ></html+>
html-test/ref/IgnoreExports.html view
@@ -4,12 +4,14 @@ /><meta name="viewport" content="width=device-width, initial-scale=1" /><title >IgnoreExports</title- ><link href="#" rel="stylesheet" type="text/css" title="Ocean"+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial" /><link rel="stylesheet" type="text/css" href="#" /><link rel="stylesheet" type="text/css" href="#" /><script src="haddock-bundle.min.js" async="async" type="text/javascript" ></script- ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript" ></script ></head ><body@@ -46,15 +48,23 @@ >Synopsis</summary ><ul class="details-toggle" data-details-id="syn" ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ > = <a href="#"+ >Bar</a+ ></li+ ><li class="src short" ><a href="#" >foo</a- > :: <a href="#"+ > :: <a href="#" title="Data.Int" >Int</a ></li ><li class="src short" ><a href="#" >bar</a- > :: <a href="#"+ > :: <a href="#" title="Data.Int" >Int</a ></li ></ul@@ -65,9 +75,39 @@ >Documentation</h1 ><div class="top" ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >documentation for Foo</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Bar" class="def"+ >Bar</a+ ></td+ ><td class="doc"+ ><p+ >Documentation for Bar</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src" ><a id="v:foo" class="def" >foo</a- > :: <a href="#"+ > :: <a href="#" title="Data.Int" >Int</a > <a href="#" class="selflink" >#</a@@ -81,7 +121,7 @@ ><p class="src" ><a id="v:bar" class="def" >bar</a- > :: <a href="#"+ > :: <a href="#" title="Data.Int" >Int</a > <a href="#" class="selflink" >#</a
+ html-test/src/Bug1103.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeFamilies #-}+module Bug1103 where++import Data.Kind++data family Foo1 :: Type -> Type+data instance Foo1 Bool = Foo1Bool+data instance Foo1 (Maybe a)++data family Foo2 :: k -> Type+data instance Foo2 Bool = Foo2Bool+data instance Foo2 (Maybe a)+data instance Foo2 :: Char -> Type+data instance Foo2 :: (Char -> Char) -> Type where++data family Foo3 :: k+data instance Foo3+data instance Foo3 Bool = Foo3Bool+data instance Foo3 (Maybe a)+data instance Foo3 :: Char -> Type+data instance Foo3 :: (Char -> Char) -> Type where
html-test/src/IgnoreExports.hs view
@@ -1,5 +1,8 @@ {-# OPTIONS_HADDOCK ignore-exports #-}-module IgnoreExports (foo) where+module IgnoreExports (Foo, foo) where++-- | documentation for Foo+data Foo = Bar -- ^ Documentation for Bar -- | documentation for foo foo :: Int
+ hypsrc-test/ref/src/Bug1091.html view
@@ -0,0 +1,34 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><link rel="stylesheet" type="text/css" href="style.css"+ /><script type="text/javascript" src="highlight.js"+ ></script+ ></head+ ><body+ ><pre+ ><span class="hs-pragma"+ >{-# LANGUAGE CPP #-}</span+ ><span+ >+</span+ ><span id="line-2"+ ></span+ ><span class="hs-keyword"+ >module</span+ ><span+ > </span+ ><span class="hs-identifier"+ >Bug1091</span+ ><span+ > </span+ ><span class="hs-keyword"+ >where</span+ ><span class="hs-cpp"+ >++#include "Include1For1091.h"+</span+ ></pre+ ></body+ ></html+>
+ hypsrc-test/ref/src/CallingQuotes.html view
@@ -0,0 +1,104 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><link rel="stylesheet" type="text/css" href="style.css"+ /><script type="text/javascript" src="highlight.js"+ ></script+ ></head+ ><body+ ><pre+ ><span class="hs-pragma"+ >{-# LANGUAGE QuasiQuotes #-}</span+ ><span+ >+</span+ ><span id="line-2"+ ></span+ ><span class="hs-keyword"+ >module</span+ ><span+ > </span+ ><span class="hs-identifier"+ >CallingQuotes</span+ ><span+ > </span+ ><span class="hs-keyword"+ >where</span+ ><span+ >+</span+ ><span id="line-3"+ ></span+ ><span+ >+</span+ ><span id="line-4"+ ></span+ ><span class="hs-keyword"+ >import</span+ ><span+ > </span+ ><span class="annot"+ ><a href="Quasiquoter.html"+ ><span class="hs-identifier"+ >Quasiquoter</span+ ></a+ ></span+ ><span+ >+</span+ ><span id="line-5"+ ></span+ ><span+ >+</span+ ><span id="line-6"+ ></span+ ><span id="baz"+ ><span class="annot"+ ><span class="annottext"+ >baz :: [Char]+</span+ ><a href="CallingQuotes.html#baz"+ ><span class="hs-identifier hs-var hs-var"+ >baz</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class=""+ >[string| foo bar |]</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >[Char] -> [Char] -> [Char]+forall a. [a] -> [a] -> [a]+</span+ ><span class="hs-operator hs-var"+ >++</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class=""+ >[string| some+ mulitline+ quasiquote+|]</span+ ></span+ ><span+ >+</span+ ><span id="line-10"+ ></span+ ></pre+ ></body+ ></html+>
+ hypsrc-test/ref/src/Quasiquoter.html view
@@ -0,0 +1,415 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><link rel="stylesheet" type="text/css" href="style.css"+ /><script type="text/javascript" src="highlight.js"+ ></script+ ></head+ ><body+ ><pre+ ><span class="hs-keyword"+ >module</span+ ><span+ > </span+ ><span class="hs-identifier"+ >Quasiquoter</span+ ><span+ > </span+ ><span class="hs-special"+ >(</span+ ><span+ > </span+ ><span class="annot"+ ><a href="Quasiquoter.html#string"+ ><span class="hs-identifier"+ >string</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >)</span+ ><span+ > </span+ ><span class="hs-keyword"+ >where</span+ ><span+ >+</span+ ><span id="line-2"+ ></span+ ><span+ >+</span+ ><span id="line-3"+ ></span+ ><span class="hs-keyword"+ >import</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier"+ >Language.Haskell.TH.Quote</span+ ></span+ ><span+ >+</span+ ><span id="line-4"+ ></span+ ><span class="hs-keyword"+ >import</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier"+ >Language.Haskell.TH.Syntax</span+ ></span+ ><span+ >+</span+ ><span id="line-5"+ ></span+ ><span+ >+</span+ ><span id="line-6"+ ></span+ ><span class="hs-comment"+ >-- | Quoter for constructing multiline string literals</span+ ><span+ >+</span+ ><span id="line-7"+ ></span+ ><span class="annot"+ ><a href="Quasiquoter.html#string"+ ><span class="hs-identifier hs-type"+ >string</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >QuasiQuoter</span+ ></span+ ><span+ >+</span+ ><span id="line-8"+ ></span+ ><span id="string"+ ><span class="annot"+ ><span class="annottext"+ >string :: QuasiQuoter+</span+ ><a href="Quasiquoter.html#string"+ ><span class="hs-identifier hs-var hs-var"+ >string</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >QuasiQuoter :: (String -> Q Exp)+-> (String -> Q Pat)+-> (String -> Q Type)+-> (String -> Q [Dec])+-> QuasiQuoter+</span+ ><span class="hs-identifier hs-type hs-type"+ >QuasiQuoter</span+ ></span+ ><span+ >+</span+ ><span id="line-9"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >{</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >quoteExp :: String -> Q Exp+</span+ ><span class="hs-identifier hs-var"+ >quoteExp</span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >Exp -> Q Exp+forall (f :: * -> *) a. Applicative f => a -> f a+</span+ ><span class="hs-identifier hs-var"+ >pure</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >(Exp -> Q Exp) -> (String -> Exp) -> String -> Q Exp+forall b c a. (b -> c) -> (a -> b) -> a -> c+</span+ ><span class="hs-operator hs-var"+ >.</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >Lit -> Exp+</span+ ><span class="hs-identifier hs-var"+ >LitE</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >(Lit -> Exp) -> (String -> Lit) -> String -> Exp+forall b c a. (b -> c) -> (a -> b) -> a -> c+</span+ ><span class="hs-operator hs-var"+ >.</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >String -> Lit+</span+ ><span class="hs-identifier hs-var"+ >StringL</span+ ></span+ ><span+ >+</span+ ><span id="line-10"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >quotePat :: String -> Q Pat+</span+ ><span class="hs-identifier hs-var"+ >quotePat</span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >String -> Q Pat+forall a. String -> Q a+</span+ ><a href="#"+ ><span class="hs-identifier hs-var"+ >invalidDomain</span+ ></a+ ></span+ ><span+ >+</span+ ><span id="line-11"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >quoteType :: String -> Q Type+</span+ ><span class="hs-identifier hs-var"+ >quoteType</span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >String -> Q Type+forall a. String -> Q a+</span+ ><a href="#"+ ><span class="hs-identifier hs-var"+ >invalidDomain</span+ ></a+ ></span+ ><span+ >+</span+ ><span id="line-12"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >quoteDec :: String -> Q [Dec]+</span+ ><span class="hs-identifier hs-var"+ >quoteDec</span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >String -> Q [Dec]+forall a. String -> Q a+</span+ ><a href="#"+ ><span class="hs-identifier hs-var"+ >invalidDomain</span+ ></a+ ></span+ ><span+ >+</span+ ><span id="line-13"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >}</span+ ><span+ >+</span+ ><span id="line-14"+ ></span+ ><span+ > </span+ ><span class="hs-keyword"+ >where</span+ ><span+ >+</span+ ><span id="line-15"+ ></span+ ><span+ > </span+ ><span id=""+ ><span class="annot"+ ><a href="#"+ ><span class="hs-identifier hs-type"+ >invalidDomain</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >String</span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >-></span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >Q</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><a href="#"+ ><span class="hs-identifier hs-type"+ >a</span+ ></a+ ></span+ ></span+ ><span+ >+</span+ ><span id="line-16"+ ></span+ ><span+ > </span+ ><span id=""+ ><span class="annot"+ ><span class="annottext"+ >invalidDomain :: String -> Q a+</span+ ><a href="#"+ ><span class="hs-identifier hs-var hs-var"+ >invalidDomain</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-identifier"+ >_</span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >String -> Q a+forall (m :: * -> *) a. MonadFail m => String -> m a+</span+ ><span class="hs-identifier hs-var"+ >fail</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-string"+ >"stringQuoter: only valid in expression context"</span+ ></span+ ><span+ >+</span+ ><span id="line-17"+ ></span+ ></pre+ ></body+ ></html+>
+ hypsrc-test/ref/src/TemplateHaskellQuasiquotes.html view
@@ -0,0 +1,659 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><link rel="stylesheet" type="text/css" href="style.css"+ /><script type="text/javascript" src="highlight.js"+ ></script+ ></head+ ><body+ ><pre+ ><span class="hs-pragma"+ >{-# LANGUAGE TemplateHaskell #-}</span+ ><span+ >+</span+ ><span id="line-2"+ ></span+ ><span+ >+</span+ ><span id="line-3"+ ></span+ ><span class="hs-keyword"+ >module</span+ ><span+ > </span+ ><span class="hs-identifier"+ >TemplateHaskellQuasiquotes</span+ ><span+ > </span+ ><span class="hs-keyword"+ >where</span+ ><span+ >+</span+ ><span id="line-4"+ ></span+ ><span+ >+</span+ ><span id="line-5"+ ></span+ ><span class="hs-keyword"+ >import</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier"+ >Language.Haskell.TH</span+ ></span+ ><span+ >+</span+ ><span id="line-6"+ ></span+ ><span+ >+</span+ ><span id="line-7"+ ></span+ ><span class="annot"+ ><a href="TemplateHaskellQuasiquotes.html#aDecl"+ ><span class="hs-identifier hs-type"+ >aDecl</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >DecsQ</span+ ></span+ ><span+ >+</span+ ><span id="line-8"+ ></span+ ><span id="aDecl"+ ><span class="annot"+ ><span class="annottext"+ >aDecl :: DecsQ+</span+ ><a href="TemplateHaskellQuasiquotes.html#aDecl"+ ><span class="hs-identifier hs-var hs-var"+ >aDecl</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="hs-special"+ >[d|</span+ ><span+ >+</span+ ><span id="line-9"+ ></span+ ><span+ > </span+ ><span class="hs-identifier"+ >bar</span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class=""+ >$aType</span+ ><span+ > </span+ ><span class="hs-glyph"+ >-></span+ ><span+ > </span+ ><span class="hs-special"+ >[</span+ ><span+ > </span+ ><span class="hs-special"+ >(</span+ ><span class="hs-identifier"+ >Int</span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-identifier"+ >String</span+ ><span class="hs-special"+ >)</span+ ><span+ > </span+ ><span class="hs-special"+ >]</span+ ><span+ >+</span+ ><span id="line-10"+ ></span+ ><span+ > </span+ ><span class="hs-identifier"+ >bar</span+ ><span+ > </span+ ><span class=""+ >$aPattern</span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class=""+ >$anExpression</span+ ><span+ >+</span+ ><span id="line-11"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >|]</span+ ><span+ >+</span+ ><span id="line-12"+ ></span+ ><span+ >+</span+ ><span id="line-13"+ ></span+ ><span class="annot"+ ><a href="TemplateHaskellQuasiquotes.html#aPattern"+ ><span class="hs-identifier hs-type"+ >aPattern</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >PatQ</span+ ></span+ ><span+ >+</span+ ><span id="line-14"+ ></span+ ><span id="aPattern"+ ><span class="annot"+ ><span class="annottext"+ >aPattern :: PatQ+</span+ ><a href="TemplateHaskellQuasiquotes.html#aPattern"+ ><span class="hs-identifier hs-var hs-var"+ >aPattern</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="hs-special"+ >[p|</span+ ><span+ >+</span+ ><span id="line-15"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >[</span+ ><span+ > </span+ ><span class="hs-identifier"+ >aCrazyLongVariableName</span+ ><span+ >+</span+ ><span id="line-16"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-identifier"+ >_unused</span+ ><span+ >+</span+ ><span id="line-17"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-special"+ >(</span+ ><span class="hs-identifier"+ >y</span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-identifier"+ >z</span+ ><span class="hs-special"+ >)</span+ ><span+ >+</span+ ><span id="line-18"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-special"+ >(</span+ ><span+ > </span+ ><span class=""+ >$aNumberPattern</span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-string"+ >"hello"</span+ ><span class="hs-special"+ >)</span+ ><span+ >+</span+ ><span id="line-19"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >]</span+ ><span+ >+</span+ ><span id="line-20"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >|]</span+ ><span+ >+</span+ ><span id="line-21"+ ></span+ ><span+ >+</span+ ><span id="line-22"+ ></span+ ><span class="annot"+ ><a href="TemplateHaskellQuasiquotes.html#aNumberPattern"+ ><span class="hs-identifier hs-type"+ >aNumberPattern</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >PatQ</span+ ></span+ ><span+ >+</span+ ><span id="line-23"+ ></span+ ><span id="aNumberPattern"+ ><span class="annot"+ ><span class="annottext"+ >aNumberPattern :: PatQ+</span+ ><a href="TemplateHaskellQuasiquotes.html#aNumberPattern"+ ><span class="hs-identifier hs-var hs-var"+ >aNumberPattern</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="hs-special"+ >[p|</span+ ><span+ >+</span+ ><span id="line-24"+ ></span+ ><span+ > </span+ ><span class="hs-identifier"+ >w</span+ ><span+ > </span+ ><span class="hs-glyph"+ >@</span+ ><span+ > </span+ ><span class="hs-identifier"+ >v</span+ ><span+ > </span+ ><span class="hs-glyph"+ >@</span+ ><span+ > </span+ ><span class="hs-number"+ >4.5</span+ ><span+ >+</span+ ><span id="line-25"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >|]</span+ ><span+ >+</span+ ><span id="line-26"+ ></span+ ><span+ >+</span+ ><span id="line-27"+ ></span+ ><span class="annot"+ ><a href="TemplateHaskellQuasiquotes.html#anExpression"+ ><span class="hs-identifier hs-type"+ >anExpression</span+ ></a+ ></span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="annot"+ ><a href="TemplateHaskellQuasiquotes.html#anExpression2"+ ><span class="hs-identifier hs-type"+ >anExpression2</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >ExpQ</span+ ></span+ ><span+ >+</span+ ><span id="line-28"+ ></span+ ><span id="anExpression"+ ><span class="annot"+ ><span class="annottext"+ >anExpression :: ExpQ+</span+ ><a href="TemplateHaskellQuasiquotes.html#anExpression"+ ><span class="hs-identifier hs-var hs-var"+ >anExpression</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="hs-special"+ >[e|</span+ ><span+ >+</span+ ><span id="line-29"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >[</span+ ><span+ > </span+ ><span class="hs-special"+ >(</span+ ><span class="hs-number"+ >1</span+ ><span+ > </span+ ><span class="hs-operator"+ >+</span+ ><span+ > </span+ ><span class=""+ >$anExpression2</span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-string"+ >"world"</span+ ><span class="hs-special"+ >)</span+ ><span+ > </span+ ><span class="hs-special"+ >]</span+ ><span+ >+</span+ ><span id="line-30"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >|]</span+ ><span+ >+</span+ ><span id="line-31"+ ></span+ ><span id="anExpression2"+ ><span class="annot"+ ><span class="annottext"+ >anExpression2 :: ExpQ+</span+ ><a href="TemplateHaskellQuasiquotes.html#anExpression2"+ ><span class="hs-identifier hs-var hs-var"+ >anExpression2</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="hs-special"+ >[|</span+ ><span+ > </span+ ><span class="hs-special"+ >(</span+ ><span class="hs-number"+ >1</span+ ><span+ > </span+ ><span class="hs-operator"+ >+</span+ ><span+ > </span+ ><span class="hs-identifier"+ >round</span+ ><span+ > </span+ ><span class="hs-identifier"+ >pi</span+ ><span class="hs-special"+ >)</span+ ><span+ > </span+ ><span class="hs-special"+ >|]</span+ ><span+ >+</span+ ><span id="line-32"+ ></span+ ><span+ >+</span+ ><span id="line-33"+ ></span+ ><span class="annot"+ ><a href="TemplateHaskellQuasiquotes.html#aType"+ ><span class="hs-identifier hs-type"+ >aType</span+ ></a+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >::</span+ ><span+ > </span+ ><span class="annot"+ ><span class="hs-identifier hs-type"+ >TypeQ</span+ ></span+ ><span+ >+</span+ ><span id="line-34"+ ></span+ ><span id="aType"+ ><span class="annot"+ ><span class="annottext"+ >aType :: TypeQ+</span+ ><a href="TemplateHaskellQuasiquotes.html#aType"+ ><span class="hs-identifier hs-var hs-var"+ >aType</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="hs-special"+ >[t|</span+ ><span+ >+</span+ ><span id="line-35"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >[</span+ ><span+ > </span+ ><span class="hs-special"+ >(</span+ ><span class="hs-identifier"+ >Double</span+ ><span class="hs-special"+ >,</span+ ><span+ > </span+ ><span class="hs-identifier"+ >String</span+ ><span class="hs-special"+ >)</span+ ><span+ > </span+ ><span class="hs-special"+ >]</span+ ><span+ >+</span+ ><span id="line-36"+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >|]</span+ ><span+ >+</span+ ><span id="line-37"+ ></span+ ><span+ >+</span+ ><span id="line-38"+ ></span+ ><span+ >+</span+ ><span id="line-39"+ ></span+ ><span+ >+</span+ ><span id="line-40"+ ></span+ ></pre+ ></body+ ></html+>
+ hypsrc-test/ref/src/TemplateHaskellSplices.html view
@@ -0,0 +1,135 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><link rel="stylesheet" type="text/css" href="style.css"+ /><script type="text/javascript" src="highlight.js"+ ></script+ ></head+ ><body+ ><pre+ ><span class="hs-pragma"+ >{-# LANGUAGE TemplateHaskell #-}</span+ ><span+ >+</span+ ><span id="line-2"+ ></span+ ><span class="hs-keyword"+ >module</span+ ><span+ > </span+ ><span class="hs-identifier"+ >TemplateHaskellSplices</span+ ><span+ > </span+ ><span class="hs-keyword"+ >where</span+ ><span+ >+</span+ ><span id="line-3"+ ></span+ ><span+ >+</span+ ><span id="line-4"+ ></span+ ><span class="hs-keyword"+ >import</span+ ><span+ > </span+ ><span class="annot"+ ><a href="TemplateHaskellQuasiquotes.html"+ ><span class="hs-identifier"+ >TemplateHaskellQuasiquotes</span+ ></a+ ></span+ ><span+ >+</span+ ><span id="line-5"+ ></span+ ><span+ >+</span+ ><span id="line-6"+ ></span+ ><span class="hs-special"+ >$(</span+ ><span id="bar"+ ><span class="annot"+ ><span class="annottext"+ >[(Double, String)] -> [(Int, String)]+</span+ ><a href="TemplateHaskellSplices.html#bar"+ ><span class="hs-identifier hs-type hs-var"+ >aDecl</span+ ></a+ ></span+ ></span+ ><span class="hs-special"+ >)</span+ ><span+ >+</span+ ><span id="line-7"+ ></span+ ><span+ >+</span+ ><span id="line-8"+ ></span+ ><span id="foo"+ ><span class="annot"+ ><span class="annottext"+ >foo :: Integer+</span+ ><a href="TemplateHaskellSplices.html#foo"+ ><span class="hs-identifier hs-var hs-var"+ >foo</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >Integer -> Integer+forall a. a -> a+</span+ ><span class="hs-identifier hs-var"+ >id</span+ ></span+ ><span+ > </span+ ><span class="hs-special"+ >$(</span+ ><span class="annot"+ ><span class="annottext"+ >Double+Double -> Integer+Integer -> Integer -> Integer+forall a. Floating a => a+forall a. Num a => a -> a -> a+forall a b. (RealFrac a, Integral b) => a -> b++ :: forall a. Num a => a -> a -> a+round :: forall a b. (RealFrac a, Integral b) => a -> b+pi :: forall a. Floating a => a+</span+ ><span class="hs-identifier hs-var hs-var hs-var"+ >anExpression2</span+ ></span+ ><span class="hs-special"+ >)</span+ ><span+ >+</span+ ><span id="line-9"+ ></span+ ></pre+ ></body+ ></html+>
+ hypsrc-test/ref/src/UsingQuasiquotes.html view
@@ -0,0 +1,104 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><link rel="stylesheet" type="text/css" href="style.css"+ /><script type="text/javascript" src="highlight.js"+ ></script+ ></head+ ><body+ ><pre+ ><span class="hs-pragma"+ >{-# LANGUAGE QuasiQuotes #-}</span+ ><span+ >+</span+ ><span id="line-2"+ ></span+ ><span class="hs-keyword"+ >module</span+ ><span+ > </span+ ><span class="hs-identifier"+ >UsingQuasiquotes</span+ ><span+ > </span+ ><span class="hs-keyword"+ >where</span+ ><span+ >+</span+ ><span id="line-3"+ ></span+ ><span+ >+</span+ ><span id="line-4"+ ></span+ ><span class="hs-keyword"+ >import</span+ ><span+ > </span+ ><span class="annot"+ ><a href="Quasiquoter.html"+ ><span class="hs-identifier"+ >Quasiquoter</span+ ></a+ ></span+ ><span+ >+</span+ ><span id="line-5"+ ></span+ ><span+ >+</span+ ><span id="line-6"+ ></span+ ><span id="baz"+ ><span class="annot"+ ><span class="annottext"+ >baz :: [Char]+</span+ ><a href="UsingQuasiquotes.html#baz"+ ><span class="hs-identifier hs-var hs-var"+ >baz</span+ ></a+ ></span+ ></span+ ><span+ > </span+ ><span class="hs-glyph"+ >=</span+ ><span+ > </span+ ><span class="annot"+ ><span class=""+ >[string| foo bar |]</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class="annottext"+ >[Char] -> [Char] -> [Char]+forall a. [a] -> [a] -> [a]+</span+ ><span class="hs-operator hs-var"+ >++</span+ ></span+ ><span+ > </span+ ><span class="annot"+ ><span class=""+ >[string| some+ mulitline+ quasiquote+|]</span+ ></span+ ><span+ >+</span+ ><span id="line-10"+ ></span+ ></pre+ ></body+ ></html+>
+ hypsrc-test/src/Bug1091.hs view
@@ -0,0 +1,4 @@+{-# LANGUAGE CPP #-}+module Bug1091 where++#include "Include1For1091.h"
+ hypsrc-test/src/Include1For1091.h view
@@ -0,0 +1,6 @@+/* Include1For1091.h */++foo :: Int+foo = 42++#include "Include2For1091.h"
+ hypsrc-test/src/Include2For1091.h view
@@ -0,0 +1,4 @@+/* Include2For1091.h */++bar :: Int+bar = 27
+ hypsrc-test/src/Quasiquoter.hs view
@@ -0,0 +1,16 @@+module Quasiquoter ( string ) where++import Language.Haskell.TH.Quote+import Language.Haskell.TH.Syntax++-- | Quoter for constructing multiline string literals+string :: QuasiQuoter+string = QuasiQuoter+ { quoteExp = pure . LitE . StringL+ , quotePat = invalidDomain+ , quoteType = invalidDomain+ , quoteDec = invalidDomain+ }+ where+ invalidDomain :: String -> Q a+ invalidDomain _ = fail "stringQuoter: only valid in expression context"
+ hypsrc-test/src/TemplateHaskellQuasiquotes.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE TemplateHaskell #-}++module TemplateHaskellQuasiquotes where++import Language.Haskell.TH++aDecl :: DecsQ+aDecl = [d|+ bar :: $aType -> [ (Int, String) ]+ bar $aPattern = $anExpression+ |]++aPattern :: PatQ+aPattern = [p|+ [ aCrazyLongVariableName+ , _unused+ , (y, z)+ , ( $aNumberPattern, "hello")+ ]+ |]++aNumberPattern :: PatQ+aNumberPattern = [p|+ w @ v @ 4.5+ |]++anExpression, anExpression2 :: ExpQ+anExpression = [e|+ [ (1 + $anExpression2, "world") ]+ |]+anExpression2 = [| (1 + round pi) |]++aType :: TypeQ+aType = [t|+ [ (Double, String) ]+ |]+++
+ hypsrc-test/src/TemplateHaskellSplices.hs view
@@ -0,0 +1,8 @@+{-# LANGUAGE TemplateHaskell #-}+module TemplateHaskellSplices where++import TemplateHaskellQuasiquotes++$(aDecl)++foo = id $(anExpression2)
+ hypsrc-test/src/UsingQuasiquotes.hs view
@@ -0,0 +1,9 @@+{-# LANGUAGE QuasiQuotes #-}+module UsingQuasiquotes where++import Quasiquoter++baz = [string| foo bar |] ++ [string| some+ mulitline+ quasiquote+|]