2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1996
4 %************************************************************************
6 \section[HsPragmas]{Pragmas in Haskell interface files}
8 %************************************************************************
10 See also: @Sig@ (``signatures'') which is where user-supplied pragmas
11 for values show up; ditto @SpecInstSig@ (for instances) and
12 @SpecDataSig@ (for data types).
15 #include "HsVersions.h"
17 module HsPragmas where
22 import HsTypes ( HsType )
26 import SpecEnv ( SpecEnv )
27 import Outputable ( Outputable(..) )
31 All the pragma stuff has changed. Here are some placeholders!
34 data GenPragmas name = NoGenPragmas
35 data DataPragmas name = NoDataPragmas
36 data InstancePragmas name = NoInstancePragmas
37 data ClassOpPragmas name = NoClassOpPragmas
38 data ClassPragmas name = NoClassPragmas
40 noClassPragmas = NoClassPragmas
41 isNoClassPragmas NoClassPragmas = True
43 noDataPragmas = NoDataPragmas
44 isNoDataPragmas NoDataPragmas = True
46 noGenPragmas = NoGenPragmas
47 isNoGenPragmas NoGenPragmas = True
49 noInstancePragmas = NoInstancePragmas
50 isNoInstancePragmas NoInstancePragmas = True
52 noClassOpPragmas = NoClassOpPragmas
53 isNoClassOpPragmas NoClassOpPragmas = True
55 instance Outputable name => Outputable (ClassPragmas name) where
56 ppr sty NoClassPragmas = empty
58 instance Outputable name => Outputable (ClassOpPragmas name) where
59 ppr sty NoClassOpPragmas = empty
61 instance Outputable name => Outputable (InstancePragmas name) where
62 ppr sty NoInstancePragmas = empty
64 instance Outputable name => Outputable (GenPragmas name) where
65 ppr sty NoGenPragmas = empty
68 ========================= OLD CODE SCEDULED FOR DELETION SLPJ Nov 96 ==============
73 Certain pragmas expect to be pinned onto certain constructs.
75 Pragma types may be parameterised, just as with any other
78 For a @data@ declaration---indicates which specialisations exist.
82 | DataPragmas [[Maybe (HsType name)]] -- types to which specialised
84 noDataPragmas = NoDataPragmas
85 isNoDataPragmas NoDataPragmas = True
88 These are {\em general} things you can know about any value:
92 | GenPragmas (Maybe Int) -- arity (maybe)
93 (Maybe UpdateInfo) -- update info (maybe)
94 (ImpStrictness name) -- strictness, worker-wrapper
95 (ImpUnfolding name) -- unfolding (maybe)
96 [([Maybe (HsType name)], -- Specialisations: types to which spec'd;
97 Int, -- # dicts to ignore
98 GenPragmas name)] -- Gen info about the spec'd version
100 noGenPragmas = NoGenPragmas
102 isNoGenPragmas NoGenPragmas = True
103 isNoGenPragmas _ = False
105 data ImpUnfolding name
107 | ImpMagicUnfolding FAST_STRING -- magic "unfolding"
108 -- known to the compiler by "String"
109 | ImpUnfolding UnfoldingGuidance -- always, if you like, etc.
110 (UnfoldingCoreExpr name)
112 data ImpStrictness name
114 | ImpStrictness Bool -- True <=> bottoming Id
115 [Demand] -- demand info
116 (GenPragmas name) -- about the *worker*
119 For an ordinary imported function: it can have general pragmas (only).
121 For a class's super-class dictionary selectors:
123 data ClassPragmas name
125 | SuperDictPragmas [GenPragmas name] -- list mustn't be empty
127 noClassPragmas = NoClassPragmas
129 isNoClassPragmas NoClassPragmas = True
130 isNoClassPragmas _ = False
133 For a class's method selectors:
135 data ClassOpPragmas name
137 | ClassOpPragmas (GenPragmas name) -- for method selector
138 (GenPragmas name) -- for default method
141 noClassOpPragmas = NoClassOpPragmas
143 isNoClassOpPragmas NoClassOpPragmas = True
144 isNoClassOpPragmas _ = False
148 data InstancePragmas name
151 | SimpleInstancePragma -- nothing but for the dfun itself...
154 | ConstantInstancePragma
155 (GenPragmas name) -- for the "dfun" itself
156 [(name, GenPragmas name)] -- one per class op
158 | SpecialisedInstancePragma
159 (GenPragmas name) -- for its "dfun"
160 [([Maybe (HsType name)], -- specialised instance; type...
161 Int, -- #dicts to ignore
162 InstancePragmas name)] -- (no SpecialisedInstancePragma please!)
164 noInstancePragmas = NoInstancePragmas
166 isNoInstancePragmas NoInstancePragmas = True
167 isNoInstancePragmas _ = False
170 Some instances for printing (just for debugging, really)
172 instance Outputable name => Outputable (ClassPragmas name) where
173 ppr sty NoClassPragmas = empty
174 ppr sty (SuperDictPragmas sdsel_prags)
175 = ($$) (ptext SLIT("{-superdict pragmas-}"))
176 (ppr sty sdsel_prags)
178 instance Outputable name => Outputable (ClassOpPragmas name) where
179 ppr sty NoClassOpPragmas = empty
180 ppr sty (ClassOpPragmas op_prags defm_prags)
181 = ($$) (hsep [ptext SLIT("{-meth-}"), ppr sty op_prags])
182 (hsep [ptext SLIT("{-defm-}"), ppr sty defm_prags])
184 instance Outputable name => Outputable (InstancePragmas name) where
185 ppr sty NoInstancePragmas = empty
186 ppr sty (SimpleInstancePragma dfun_pragmas)
187 = hsep [ptext SLIT("{-dfun-}"), ppr sty dfun_pragmas]
188 ppr sty (ConstantInstancePragma dfun_pragmas name_pragma_pairs)
189 = ($$) (hsep [ptext SLIT("{-constm-}"), ppr sty dfun_pragmas])
190 (vcat (map pp_pair name_pragma_pairs))
193 = hsep [ppr sty n, equals, ppr sty prags]
195 ppr sty (SpecialisedInstancePragma dfun_pragmas spec_pragma_info)
196 = ($$) (hsep [ptext SLIT("{-spec'd-}"), ppr sty dfun_pragmas])
197 (vcat (map pp_info spec_pragma_info))
199 pp_info (ty_maybes, num_dicts, prags)
200 = hcat [brackets (hsep (map pp_ty ty_maybes)),
201 parens (int num_dicts), equals, ppr sty prags]
202 pp_ty Nothing = ptext SLIT("_N_")
203 pp_ty (Just t)= ppr sty t
205 instance Outputable name => Outputable (GenPragmas name) where
206 ppr sty NoGenPragmas = empty
207 ppr sty (GenPragmas arity_maybe upd_maybe def strictness unfolding specs)
208 = hsep [pp_arity arity_maybe, pp_upd upd_maybe, -- ToDo: print def?
209 pp_str strictness, pp_unf unfolding,
212 pp_arity Nothing = empty
213 pp_arity (Just i) = (<>) (ptext SLIT("ARITY=")) (int i)
215 pp_upd Nothing = empty
216 pp_upd (Just u) = ppUpdateInfo sty u
218 pp_str NoImpStrictness = empty
219 pp_str (ImpStrictness is_bot demands wrkr_prags)
220 = hcat [ptext SLIT("IS_BOT="), ppr sty is_bot,
221 ptext SLIT("STRICTNESS="), text (showList demands ""),
222 ptext SLIT(" {"), ppr sty wrkr_prags, char '}']
224 pp_unf NoImpUnfolding = ptext SLIT("NO_UNFOLDING")
225 pp_unf (ImpMagicUnfolding m) = (<>) (ptext SLIT("MAGIC=")) (ptext m)
226 pp_unf (ImpUnfolding g core) = (<>) (ptext SLIT("UNFOLD=")) (ppr sty core)
230 = hcat [ptext SLIT("SPECS=["), hsep (map pp_spec specs), char ']']
232 pp_spec (ty_maybes, num_dicts, gprags)
233 = hsep [brackets (hsep (map pp_MaB ty_maybes)), int num_dicts, ppr sty gprags]
235 pp_MaB Nothing = ptext SLIT("_N_")
236 pp_MaB (Just x) = ppr sty x