From a5b7d1c5b0e7f1a6148d34b3cf706acb693c7f6d Mon Sep 17 00:00:00 2001 From: Isaac Dupree Date: Mon, 24 Aug 2009 01:24:03 +0000 Subject: Eradicate wrong runtime warning for type-inferenced exported-functions see the long comment in the patch for why I did it this way :-) --- src/Haddock/Interface/Create.hs | 51 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'src/Haddock') diff --git a/src/Haddock/Interface/Create.hs b/src/Haddock/Interface/Create.hs index 50bd3a74..512c4e9e 100644 --- a/src/Haddock/Interface/Create.hs +++ b/src/Haddock/Interface/Create.hs @@ -513,10 +513,57 @@ mkExportItems modMap this_mod gre exported_names decls declMap -- Is getting to here a bug in Haddock? -- Aren't the .hi files always present? return [ ExportNoDecl t [] ] - Just tyThing -> let hsdecl = tyThingToHsSynSig tyThing in + Just tyThing -> do + let hsdecl = tyThingToHsSynSig tyThing + -- This is not the ideal way to implement haddockumentation + -- for functions/values without explicit type signatures. + -- + -- However I didn't find an easy way to implement it properly, + -- and as long as we're using lookupName it is going to find + -- the types of local inferenced binds. If we don't check for + -- this at all, then we'll get the "warning: couldn't find + -- .haddock" which is wrong. + -- + -- The reason this is not an ideal implementation + -- (besides that we take a trip to desugared syntax and back + -- unnecessarily) + -- is that Haddock won't be able to detect doc-strings being + -- attached to such a function, such as, + -- + -- > -- | this is an identity function + -- > id a = a + -- + -- . It's more difficult to say what it ought to mean in cases + -- where multiple exports are bound at once, like + -- + -- > -- | comment... + -- > (a, b) = ... + -- + -- especially since in the export-list they might not even + -- be next to each other. But a proper implementation would + -- really need to find the type of *all* exports as well as + -- addressing all these issues. This implementation works + -- adequately. Do you see a way to improve the situation? + -- Please go ahead! I got stuck trying to figure out how to + -- get the 'PostTcType's that we want for all the bindings + -- of an HsBind (you get 'LHsBinds' from 'GHC.typecheckedSource' + -- for example). + -- + -- But I might be missing something obvious. What's important + -- *here* is that we behave reasonably when we run into one of + -- those exported type-inferenced values. + isLocalAndTypeInferenced <- liftGhcToErrMsgGhc $ + isLoaded (moduleName (nameModule t)) + if isLocalAndTypeInferenced + then do + -- I don't think there can be any subs in this case, + -- currently? But better not to rely on it. + let subs = subordinatesWithNoDocs (unLoc hsdecl) + return [ mkExportDecl t (hsdecl, noDocForDecl, subs) ] + else -- We try to get the subs and docs -- from the installed interface of that package. - case Map.lookup (nameModule t) instIfaceMap of + case Map.lookup (nameModule t) instIfaceMap of -- It's Nothing in the cases where I thought -- Haddock has already warned the user: "Warning: The -- documentation for the following packages are not -- cgit v1.2.3