@@ -26,7 +26,7 @@ import Paths_alex ( version, getDataDir )
26
26
import Control.Exception ( bracketOnError )
27
27
import Control.Monad ( when , liftM )
28
28
import Data.Char ( chr )
29
- import Data.List ( isSuffixOf , nub )
29
+ import Data.List ( intercalate , isSuffixOf , nub )
30
30
import Data.Map ( Map )
31
31
import Data.Version ( showVersion )
32
32
import System.Console.GetOpt ( getOpt , usageInfo , ArgOrder (.. ), OptDescr (.. ), ArgDescr (.. ) )
@@ -385,33 +385,63 @@ optNoWarnings =
385
385
]
386
386
387
387
importsToInject :: Target -> [CLIFlags ] -> String
388
- importsToInject _ cli = always_imports ++ debug_imports ++ glaexts_import
388
+ importsToInject _ cli = unlines $
389
+ always_imports ++ debug_imports ++ glaexts_import
389
390
where
390
391
glaexts_import | OptGhcTarget `elem` cli = import_glaexts
391
- | otherwise = " "
392
+ | otherwise = []
392
393
393
394
debug_imports | OptDebugParser `elem` cli = import_debug
394
- | otherwise = " "
395
+ | otherwise = []
395
396
396
397
-- We need to #include "ghcconfig.h" to get hold of
397
398
-- WORDS_BIGENDIAN (see AlexTemplate.hs).
398
399
399
- always_imports :: String
400
- always_imports = " #include \" ghcconfig.h\"\n " ++
401
- " import Data.Array\n " ++
402
- " "
403
-
404
- import_glaexts :: String
405
- import_glaexts = " import Data.Array.Base (unsafeAt)\n " ++
406
- " import GHC.Exts\n " ++
407
- " "
408
-
409
- import_debug :: String
410
- import_debug = " import Data.Char (chr)\n " ++
411
- " import System.IO\n " ++
412
- " import System.IO.Unsafe\n " ++
413
- " import Debug.Trace\n " ++
414
- " "
400
+ always_imports :: [String ]
401
+ always_imports =
402
+ [ " #include \" ghcconfig.h\" "
403
+ , " import Data.Array"
404
+ ]
405
+
406
+ import_glaexts :: [String ]
407
+ import_glaexts =
408
+ [ " import Data.Array.Base (unsafeAt)"
409
+ , " import GHC.Exts (" ++ imports ++ " )"
410
+ , " import qualified GHC.Exts"
411
+ ]
412
+ where
413
+ -- We can import anything mentioning # safely,
414
+ -- assuming the user code does not make use of
415
+ -- MagicHash.
416
+ imports = intercalate " ,"
417
+ [ " Addr#"
418
+ , " Int#"
419
+ , " Int(I#)"
420
+ , " (*#)"
421
+ , " (+#)"
422
+ , " (-#)"
423
+ , " (==#)"
424
+ , " (>=#)"
425
+ , " indexCharOffAddr#"
426
+ , " indexInt16OffAddr#"
427
+ , " indexInt32OffAddr#"
428
+ , " int2Word#"
429
+ , " narrow16Int#"
430
+ , " narrow32Int#"
431
+ , " negateInt#"
432
+ , " or#"
433
+ , " ord#"
434
+ , " uncheckedShiftL#"
435
+ , " word2Int#"
436
+ ]
437
+
438
+ import_debug :: [String ]
439
+ import_debug =
440
+ [ " import Data.Char (chr)"
441
+ , " import System.IO"
442
+ , " import System.IO.Unsafe"
443
+ , " import Debug.Trace"
444
+ ]
415
445
416
446
templateDir :: IO FilePath -> [CLIFlags ] -> IO FilePath
417
447
templateDir def cli
0 commit comments