blob: 191f84eb2fb95df52099cdc2a3311a9ccb97005a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
module GHC.Types.Target
( Target(..)
, TargetId(..)
, InputFileBuffer
, pprTarget
, pprTargetId
)
where
import GHC.Prelude
import GHC.Driver.Phases ( Phase )
import GHC.Unit
import GHC.Data.StringBuffer ( StringBuffer )
import GHC.Utils.Outputable
import Data.Time
-- | A compilation target.
--
-- A target may be supplied with the actual text of the
-- module. If so, use this instead of the file contents (this
-- is for use in an IDE where the file hasn't been saved by
-- the user yet).
--
-- These fields are strict because Targets are long lived.
data Target
= Target {
targetId :: !TargetId, -- ^ module or filename
targetAllowObjCode :: !Bool, -- ^ object code allowed?
targetUnitId :: !UnitId, -- ^ id of the unit this target is part of
targetContents :: !(Maybe (InputFileBuffer, UTCTime))
-- ^ Optional in-memory buffer containing the source code GHC should
-- use for this target instead of reading it from disk.
--
-- Since GHC version 8.10 modules which require preprocessors such as
-- Literate Haskell or CPP to run are also supported.
--
-- If a corresponding source file does not exist on disk this will
-- result in a 'SourceError' exception if @targetId = TargetModule _@
-- is used. However together with @targetId = TargetFile _@ GHC will
-- not complain about the file missing.
}
data TargetId
= TargetModule !ModuleName
-- ^ A module name: search for the file
| TargetFile !FilePath !(Maybe Phase)
-- ^ A filename: preprocess & parse it to find the module name.
-- If specified, the Phase indicates how to compile this file
-- (which phase to start from). Nothing indicates the starting phase
-- should be determined from the suffix of the filename.
deriving Eq
type InputFileBuffer = StringBuffer
pprTarget :: Target -> SDoc
pprTarget Target { targetId = id, targetAllowObjCode = obj } =
(if obj then empty else char '*') <> pprTargetId id
instance Outputable Target where
ppr = pprTarget
pprTargetId :: TargetId -> SDoc
pprTargetId (TargetModule m) = ppr m
pprTargetId (TargetFile f _) = text f
instance Outputable TargetId where
ppr = pprTargetId
|