[Git][ghc/ghc][wip/haddock-object-files] haddock: Handle non-hs files, so that haddock can generate documentation for modules with

Zubin (@wz1000) gitlab at gitlab.haskell.org
Tue Jul 9 12:00:41 UTC 2024



Zubin pushed to branch wip/haddock-object-files at Glasgow Haskell Compiler / GHC


Commits:
04236fbd by Zubin Duggal at 2024-07-09T17:30:26+05:30
haddock: Handle non-hs files, so that haddock can generate documentation for modules with
foreign imports and template haskell.

Fixes #24964

- - - - -


7 changed files:

- testsuite/tests/haddock/haddock_testsuite/Makefile
- testsuite/tests/haddock/haddock_testsuite/all.T
- + testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/A.hs
- + testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/B.hs
- + testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/F.hs
- + testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/arith.c
- utils/haddock/haddock-api/src/Haddock/Interface.hs


Changes:

=====================================
testsuite/tests/haddock/haddock_testsuite/Makefile
=====================================
@@ -72,3 +72,7 @@ hypsrcTest:
 		$(ACCEPT) \
 		--ghc-path='$(TEST_HC)' \
 		--haddock-path='$(HADDOCK)' \
+
+.PHONY: haddockForeignTest
+haddockForeignTest:
+	'$(HADDOCK)' A.hs B.hs F.hs arith.c


=====================================
testsuite/tests/haddock/haddock_testsuite/all.T
=====================================
@@ -19,3 +19,8 @@ test('haddockHypsrcTest',
      [ignore_stdout, ignore_stderr, req_haddock],
      makefile_test,
      ['hypsrcTest ' + accept])
+
+test('haddockForeignTest',
+     [ignore_stdout, ignore_stderr, req_haddock, extra_files(['./haddock-th-foreign-repro/A.hs', './haddock-th-foreign-repro/B.hs', './haddock-th-foreign-repro/F.hs', './haddock-th-foreign-repro/arith.c'])],
+     makefile_test,
+     ['haddockForeignTest'])


=====================================
testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/A.hs
=====================================
@@ -0,0 +1,8 @@
+module A where
+
+import Language.Haskell.TH
+import F
+
+
+foo :: Exp
+foo = LitE (StringL "foo")


=====================================
testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/B.hs
=====================================
@@ -0,0 +1,6 @@
+{-# LANGUAGE TemplateHaskell #-}
+module B where
+
+import A
+
+$([d| bar = $(return foo) |])


=====================================
testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/F.hs
=====================================
@@ -0,0 +1,4 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module F where
+
+foreign import ccall "some_c_function" c_some_c_function :: IO ()


=====================================
testsuite/tests/haddock/haddock_testsuite/haddock-th-foreign-repro/arith.c
=====================================
@@ -0,0 +1 @@
+void some_c_function(void) {}


=====================================
utils/haddock/haddock-api/src/Haddock/Interface.hs
=====================================
@@ -1,6 +1,7 @@
 {-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE BangPatterns      #-}
+{-# LANGUAGE TupleSections     #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Haddock.Interface
@@ -58,6 +59,8 @@ import GHC.Core.InstEnv
 import qualified GHC.Driver.DynFlags as DynFlags
 import qualified GHC.Utils.Outputable as Outputable
 import GHC.Driver.Session hiding (verbosity)
+import GHC.Driver.Phases
+import GHC.Driver.Pipeline (compileFile)
 import GHC.HsToCore.Docs (getMainDeclBinder)
 import GHC.Iface.Load (loadSysInterface)
 import GHC.IfaceToCore (tcIfaceInst, tcIfaceFamInst)
@@ -73,6 +76,7 @@ import GHC.Unit.Module.ModIface (mi_semantic_module, mi_boot)
 import GHC.Unit.Module.ModSummary (isBootSummary)
 import GHC.Utils.Outputable (Outputable, (<+>), pprModuleName, text)
 import GHC.Utils.Error (withTiming)
+import GHC.Utils.Monad (mapMaybeM)
 
 #if defined(mingw32_HOST_OS)
 import System.IO
@@ -165,7 +169,15 @@ createIfaces
     -> Ghc [Interface]
     -- ^ Resulting interfaces
 createIfaces verbosity modules flags instIfaceMap = do
-  targets <- mapM (\filePath -> guessTarget filePath Nothing Nothing) modules
+  let (hs_srcs, non_hs_srcs) = List.partition isHaskellishTarget $ map (,Nothing) modules
+  hsc_env <- getSession
+  o_files <- mapMaybeM (\x -> liftIO $ compileFile hsc_env NoStop x)
+             non_hs_srcs
+  dflags <- getSessionDynFlags
+  let dflags' = dflags { ldInputs = map (FileOption "") o_files
+                                    ++ ldInputs dflags }
+  _ <- setSessionDynFlags dflags'
+  targets <- mapM (\(filePath, _) -> guessTarget filePath Nothing Nothing) hs_srcs
   setTargets targets
   (_errs, modGraph) <- depanalE [] False
 



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/04236fbdb3b78b3e03f862427b7b145b7642a928

-- 
This project does not include diff previews in email notifications.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/04236fbdb3b78b3e03f862427b7b145b7642a928
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20240709/195dd8b9/attachment-0001.html>


More information about the ghc-commits mailing list