summaryrefslogtreecommitdiff
path: root/compiler/GHC/Types/SourceFile.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Types/SourceFile.hs')
-rw-r--r--compiler/GHC/Types/SourceFile.hs104
1 files changed, 61 insertions, 43 deletions
diff --git a/compiler/GHC/Types/SourceFile.hs b/compiler/GHC/Types/SourceFile.hs
index 7a1898a51e..0d04a194de 100644
--- a/compiler/GHC/Types/SourceFile.hs
+++ b/compiler/GHC/Types/SourceFile.hs
@@ -1,8 +1,11 @@
+{-# LANGUAGE PatternSynonyms #-}
+
module GHC.Types.SourceFile
- ( HscSource(..)
+ ( HscSource(HsBootFile, HsigFile, ..)
+ , HsBootOrSig(..)
, hscSourceToIsBoot
, isHsBootOrSig
- , isHsigFile
+ , isHsBootFile, isHsigFile
, hscSourceString
)
where
@@ -11,45 +14,57 @@ import GHC.Prelude
import GHC.Utils.Binary
import GHC.Unit.Types
--- Note [HscSource types]
--- ~~~~~~~~~~~~~~~~~~~~~~
--- There are three types of source file for Haskell code:
---
--- * HsSrcFile is an ordinary hs file which contains code,
---
--- * HsBootFile is an hs-boot file, which is used to break
--- recursive module imports (there will always be an
--- HsSrcFile associated with it), and
---
--- * HsigFile is an hsig file, which contains only type
--- signatures and is used to specify signatures for
--- modules.
---
--- Syntactically, hs-boot files and hsig files are quite similar: they
--- only include type signatures and must be associated with an
--- actual HsSrcFile. isHsBootOrSig allows us to abstract over code
--- which is indifferent to which. However, there are some important
--- differences, mostly owing to the fact that hsigs are proper
--- modules (you `import Sig` directly) whereas HsBootFiles are
--- temporary placeholders (you `import {-# SOURCE #-} Mod).
--- When we finish compiling the true implementation of an hs-boot,
--- we replace the HomeModInfo with the real HsSrcFile. An HsigFile, on the
--- other hand, is never replaced (in particular, we *cannot* use the
--- HomeModInfo of the original HsSrcFile backing the signature, since it
--- will export too many symbols.)
---
--- Additionally, while HsSrcFile is the only Haskell file
--- which has *code*, we do generate .o files for HsigFile, because
--- this is how the recompilation checker figures out if a file
--- needs to be recompiled. These are fake object files which
--- should NOT be linked against.
+{- Note [HscSource types]
+~~~~~~~~~~~~~~~~~~~~~~~~~
+There are three types of source file for Haskell code:
+
+ * HsSrcFile is an ordinary hs file which contains code,
+
+ * HsBootFile is an hs-boot file, which is used to break
+ recursive module imports (there will always be an
+ HsSrcFile associated with it), and
+
+ * HsigFile is an hsig file, which contains only type
+ signatures and is used to specify signatures for
+ modules.
+
+Syntactically, hs-boot files and hsig files are quite similar: they
+only include type signatures and must be associated with an
+actual HsSrcFile. isHsBootOrSig allows us to abstract over code
+which is indifferent to which. However, there are some important
+differences, mostly owing to the fact that hsigs are proper
+modules (you `import Sig` directly) whereas HsBootFiles are
+temporary placeholders (you `import {-# SOURCE #-} Mod).
+When we finish compiling the true implementation of an hs-boot,
+we replace the HomeModInfo with the real HsSrcFile. An HsigFile, on the
+other hand, is never replaced (in particular, we *cannot* use the
+HomeModInfo of the original HsSrcFile backing the signature, since it
+will export too many symbols.)
+
+Additionally, while HsSrcFile is the only Haskell file
+which has *code*, we do generate .o files for HsigFile, because
+this is how the recompilation checker figures out if a file
+needs to be recompiled. These are fake object files which
+should NOT be linked against.
+-}
+
+data HsBootOrSig
+ = HsBoot -- ^ .hs-boot file
+ | Hsig -- ^ .hsig file
+ deriving (Eq, Ord, Show)
data HscSource
- = HsSrcFile -- ^ .hs file
- | HsBootFile -- ^ .hs-boot file
- | HsigFile -- ^ .hsig file
+ -- | .hs file
+ = HsSrcFile
+ -- | .hs-boot or .hsig file
+ | HsBootOrSig !HsBootOrSig
deriving (Eq, Ord, Show)
+{-# COMPLETE HsSrcFile, HsBootFile, HsigFile #-}
+pattern HsBootFile, HsigFile :: HscSource
+pattern HsBootFile = HsBootOrSig HsBoot
+pattern HsigFile = HsBootOrSig Hsig
+
-- | Tests if an 'HscSource' is a boot file, primarily for constructing elements
-- of 'BuildModule'. We conflate signatures and modules because they are bound
-- in the same namespace; only boot interfaces can be disambiguated with
@@ -70,15 +85,18 @@ instance Binary HscSource where
_ -> return HsigFile
hscSourceString :: HscSource -> String
-hscSourceString HsSrcFile = ""
-hscSourceString HsBootFile = "[boot]"
-hscSourceString HsigFile = "[sig]"
+hscSourceString HsSrcFile = ""
+hscSourceString HsBootFile = "[boot]"
+hscSourceString HsigFile = "[sig]"
-- See Note [HscSource types]
isHsBootOrSig :: HscSource -> Bool
-isHsBootOrSig HsBootFile = True
-isHsBootOrSig HsigFile = True
-isHsBootOrSig _ = False
+isHsBootOrSig (HsBootOrSig _) = True
+isHsBootOrSig HsSrcFile = False
+
+isHsBootFile :: HscSource -> Bool
+isHsBootFile HsBootFile = True
+isHsBootFile _ = False
isHsigFile :: HscSource -> Bool
isHsigFile HsigFile = True