28
31
import Control.Monad ( when )
29
import Control.Monad.Error ( MonadError(..) )
30
32
import Data.Maybe ( isJust )
31
import Data.List ( isSuffixOf , intercalate )
32
import System.Console.GetOpt ( getOpt, usageInfo, ArgOrder(ReturnInOrder)
33
, OptDescr(..), ArgDescr(..)
33
import Data.List ( isSuffixOf , intercalate )
34
import System.Console.GetOpt ( getOpt, usageInfo, ArgOrder(ReturnInOrder)
35
, OptDescr(..), ArgDescr(..)
36
38
import Agda.Termination.CutOff ( CutOff(..) )
38
40
import Agda.Utils.TestHelpers ( runTests )
39
41
import Agda.Utils.QuickCheck ( quickCheck' )
40
42
import Agda.Utils.FileName ( AbsolutePath )
41
import Agda.Utils.Monad ( readM )
43
import Agda.Utils.Monad ( readM )
42
44
import Agda.Utils.List ( wordsBy )
43
45
import Agda.Utils.String ( indent )
44
46
import Agda.Utils.Trie ( Trie )
45
47
import qualified Agda.Utils.Trie as Trie
49
import Agda.Utils.Except ( MonadError(catchError, throwError) )
47
51
-- | This should probably go somewhere else.
48
52
isLiterate :: FilePath -> Bool
49
53
isLiterate file = ".lagda" `isSuffixOf` file
64
68
-- interpreted as @["."]@ (see
65
69
-- 'Agda.TypeChecking.Monad.Options.makeIncludeDirsAbsolute').
67
data CommandLineOptions =
68
Options { optProgramName :: String
69
, optInputFile :: Maybe FilePath
70
, optIncludeDirs :: IncludeDirs
71
, optShowVersion :: Bool
73
, optInteractive :: Bool
75
, optGHCiInteraction :: Bool
77
, optCompileNoMain :: Bool
78
, optEpicCompile :: Bool
79
, optJSCompile :: Bool
80
, optCompileDir :: Maybe FilePath
81
-- ^ In the absence of a path the project root is used.
82
, optGenerateVimFile :: Bool
83
, optGenerateLaTeX :: Bool
84
, optGenerateHTML :: Bool
85
, optDependencyGraph :: Maybe FilePath
86
, optLaTeXDir :: FilePath
87
, optHTMLDir :: FilePath
88
, optCSSFile :: Maybe FilePath
89
, optIgnoreInterfaces :: Bool
91
, optGhcFlags :: [String]
92
, optPragmaOptions :: PragmaOptions
93
, optEpicFlags :: [String]
71
data CommandLineOptions = Options
72
{ optProgramName :: String
73
, optInputFile :: Maybe FilePath
74
, optIncludeDirs :: IncludeDirs
75
, optShowVersion :: Bool
77
, optInteractive :: Bool
79
, optGHCiInteraction :: Bool
81
, optCompileNoMain :: Bool
82
, optEpicCompile :: Bool
83
, optJSCompile :: Bool
84
, optCompileDir :: Maybe FilePath
85
-- ^ In the absence of a path the project root is used.
86
, optGenerateVimFile :: Bool
87
, optGenerateLaTeX :: Bool
88
, optGenerateHTML :: Bool
89
, optDependencyGraph :: Maybe FilePath
90
, optLaTeXDir :: FilePath
91
, optHTMLDir :: FilePath
92
, optCSSFile :: Maybe FilePath
93
, optIgnoreInterfaces :: Bool
95
, optGhcFlags :: [String]
96
, optPragmaOptions :: PragmaOptions
97
, optEpicFlags :: [String]
98
102
-- | Options which can be set in a pragma.
140
144
defaultInteractionOptions = defaultPragmaOptions
142
146
defaultOptions :: CommandLineOptions
144
Options { optProgramName = "agda"
145
, optInputFile = Nothing
146
, optIncludeDirs = Left []
147
, optShowVersion = False
148
, optShowHelp = False
149
, optInteractive = False
150
, optRunTests = False
151
, optGHCiInteraction = False
153
, optCompileNoMain = False
154
, optEpicCompile = False
155
, optJSCompile = False
156
, optCompileDir = Nothing
157
, optGenerateVimFile = False
158
, optGenerateLaTeX = False
159
, optGenerateHTML = False
160
, optDependencyGraph = Nothing
161
, optLaTeXDir = defaultLaTeXDir
162
, optHTMLDir = defaultHTMLDir
163
, optCSSFile = Nothing
164
, optIgnoreInterfaces = False
167
, optPragmaOptions = defaultPragmaOptions
147
defaultOptions = Options
148
{ optProgramName = "agda"
149
, optInputFile = Nothing
150
, optIncludeDirs = Left []
151
, optShowVersion = False
152
, optShowHelp = False
153
, optInteractive = False
154
, optRunTests = False
155
, optGHCiInteraction = False
157
, optCompileNoMain = False
158
, optEpicCompile = False
159
, optJSCompile = False
160
, optCompileDir = Nothing
161
, optGenerateVimFile = False
162
, optGenerateLaTeX = False
163
, optGenerateHTML = False
164
, optDependencyGraph = Nothing
165
, optLaTeXDir = defaultLaTeXDir
166
, optHTMLDir = defaultHTMLDir
167
, optCSSFile = Nothing
168
, optIgnoreInterfaces = False
171
, optPragmaOptions = defaultPragmaOptions
172
176
defaultPragmaOptions :: PragmaOptions
173
177
defaultPragmaOptions = PragmaOptions
278
286
Nothing -> return $ o { optInputFile = Just f }
279
287
Just _ -> throwError "only one input file allowed"
281
versionFlag o = return $ o { optShowVersion = True }
282
helpFlag o = return $ o { optShowHelp = True }
283
safeFlag o = return $ o { optSafe = True }
284
proofIrrelevanceFlag o = return $ o { optProofIrrelevance = True }
285
experimentalIrrelevanceFlag o = return $ o { optExperimentalIrrelevance = True }
286
noIrrelevantProjectionsFlag o = return $ o { optIrrelevantProjections = False }
287
ignoreInterfacesFlag o = return $ o { optIgnoreInterfaces = True }
288
allowUnsolvedFlag o = return $ o { optAllowUnsolved = True }
289
showImplicitFlag o = return $ o { optShowImplicit = True }
290
showIrrelevantFlag o = return $ o { optShowIrrelevant = True }
291
runTestsFlag o = return $ o { optRunTests = True }
292
ghciInteractionFlag o = return $ o { optGHCiInteraction = True }
293
vimFlag o = return $ o { optGenerateVimFile = True }
294
latexFlag o = return $ o { optGenerateLaTeX = True }
295
latexDirFlag d o = return $ o { optLaTeXDir = d }
296
noPositivityFlag o = return $ o { optDisablePositivity = True }
297
dontTerminationCheckFlag o = return $ o { optTerminationCheck = False }
298
dontCompletenessCheckFlag o = return $ o { optCompletenessCheck = False }
299
dontUniverseCheckFlag o = return $ o { optUniverseCheck = False
300
, optUniversePolymorphism = False }
301
sizedTypes o = return $ o { optSizedTypes = True }
302
noSizedTypes o = return $ o { optSizedTypes = False }
303
injectiveTypeConstructorFlag o = return $ o { optInjectiveTypeConstructors = True }
304
guardingTypeConstructorFlag o = return $ o { optGuardingTypeConstructors = True }
305
universePolymorphismFlag o = return $ o { optUniversePolymorphism = True }
306
noUniversePolymorphismFlag o = return $ o { optUniversePolymorphism = False }
307
noForcingFlag o = return $ o { optForcing = False }
308
withoutKFlag o = return $ o { optWithoutK = True }
309
copatternsFlag o = return $ o { optCopatterns = True }
310
noPatternMatchingFlag o = return $ o { optPatternMatching = False }
289
versionFlag :: Flag CommandLineOptions
290
versionFlag o = return $ o { optShowVersion = True }
292
helpFlag :: Flag CommandLineOptions
293
helpFlag o = return $ o { optShowHelp = True }
295
safeFlag :: Flag CommandLineOptions
296
safeFlag o = return $ o { optSafe = True }
298
proofIrrelevanceFlag :: Flag PragmaOptions
299
proofIrrelevanceFlag o = return $ o { optProofIrrelevance = True }
301
experimentalIrrelevanceFlag :: Flag PragmaOptions
302
experimentalIrrelevanceFlag o = return $ o { optExperimentalIrrelevance = True }
304
noIrrelevantProjectionsFlag :: Flag PragmaOptions
305
noIrrelevantProjectionsFlag o = return $ o { optIrrelevantProjections = False }
307
ignoreInterfacesFlag :: Flag CommandLineOptions
308
ignoreInterfacesFlag o = return $ o { optIgnoreInterfaces = True }
310
allowUnsolvedFlag :: Flag PragmaOptions
311
allowUnsolvedFlag o = return $ o { optAllowUnsolved = True }
313
showImplicitFlag :: Flag PragmaOptions
314
showImplicitFlag o = return $ o { optShowImplicit = True }
316
showIrrelevantFlag :: Flag PragmaOptions
317
showIrrelevantFlag o = return $ o { optShowIrrelevant = True }
319
runTestsFlag :: Flag CommandLineOptions
320
runTestsFlag o = return $ o { optRunTests = True }
322
ghciInteractionFlag :: Flag CommandLineOptions
323
ghciInteractionFlag o = return $ o { optGHCiInteraction = True }
325
vimFlag :: Flag CommandLineOptions
326
vimFlag o = return $ o { optGenerateVimFile = True }
328
latexFlag :: Flag CommandLineOptions
329
latexFlag o = return $ o { optGenerateLaTeX = True }
331
latexDirFlag :: FilePath -> Flag CommandLineOptions
332
latexDirFlag d o = return $ o { optLaTeXDir = d }
334
noPositivityFlag :: Flag PragmaOptions
335
noPositivityFlag o = return $ o { optDisablePositivity = True }
337
dontTerminationCheckFlag :: Flag PragmaOptions
338
dontTerminationCheckFlag o = return $ o { optTerminationCheck = False }
340
dontCompletenessCheckFlag :: Flag PragmaOptions
341
dontCompletenessCheckFlag o = return $ o { optCompletenessCheck = False }
343
dontUniverseCheckFlag :: Flag PragmaOptions
344
dontUniverseCheckFlag o = return $ o { optUniverseCheck = False
345
, optUniversePolymorphism = False
348
sizedTypes :: Flag PragmaOptions
349
sizedTypes o = return $ o { optSizedTypes = True }
351
noSizedTypes :: Flag PragmaOptions
352
noSizedTypes o = return $ o { optSizedTypes = False }
354
injectiveTypeConstructorFlag :: Flag PragmaOptions
355
injectiveTypeConstructorFlag o = return $ o { optInjectiveTypeConstructors = True }
357
guardingTypeConstructorFlag :: Flag PragmaOptions
358
guardingTypeConstructorFlag o = return $ o { optGuardingTypeConstructors = True }
360
universePolymorphismFlag :: Flag PragmaOptions
361
universePolymorphismFlag o = return $ o { optUniversePolymorphism = True }
363
noUniversePolymorphismFlag :: Flag PragmaOptions
364
noUniversePolymorphismFlag o = return $ o { optUniversePolymorphism = False }
366
noForcingFlag :: Flag CommandLineOptions
367
noForcingFlag o = return $ o { optForcing = False }
369
withKFlag :: Flag PragmaOptions
370
withKFlag o = return $ o { optWithoutK = False }
372
withoutKFlag :: Flag PragmaOptions
373
withoutKFlag o = return $ o { optWithoutK = True }
375
copatternsFlag :: Flag PragmaOptions
376
copatternsFlag o = return $ o { optCopatterns = True }
378
noPatternMatchingFlag :: Flag PragmaOptions
379
noPatternMatchingFlag o = return $ o { optPatternMatching = False }
381
interactiveFlag :: Flag CommandLineOptions
312
382
interactiveFlag o = return $ o { optInteractive = True
313
383
, optPragmaOptions = (optPragmaOptions o)
314
{ optAllowUnsolved = True }
384
{ optAllowUnsolved = True }
316
compileFlag o = return $ o { optCompile = True }
317
compileFlagNoMain o = return $ o { optCompileNoMain = True }
318
compileEpicFlag o = return $ o { optEpicCompile = True}
319
compileJSFlag o = return $ o { optJSCompile = True}
320
compileDirFlag f o = return $ o { optCompileDir = Just f }
321
ghcFlag f o = return $ o { optGhcFlags = optGhcFlags o ++ [f] } -- NOTE: Quadratic in number of flags.
322
epicFlagsFlag s o = return $ o { optEpicFlags = optEpicFlags o ++ [s] } -- NOTE: Quadratic in number of flags.
324
htmlFlag o = return $ o { optGenerateHTML = True }
325
dependencyGraphFlag f o = return $ o { optDependencyGraph = Just f }
326
htmlDirFlag d o = return $ o { optHTMLDir = d }
327
cssFlag f o = return $ o { optCSSFile = Just f }
387
compileFlag :: Flag CommandLineOptions
388
compileFlag o = return $ o { optCompile = True }
390
compileFlagNoMain :: Flag CommandLineOptions
391
compileFlagNoMain o = return $ o { optCompileNoMain = True }
393
compileEpicFlag :: Flag CommandLineOptions
394
compileEpicFlag o = return $ o { optEpicCompile = True}
396
compileJSFlag :: Flag CommandLineOptions
397
compileJSFlag o = return $ o { optJSCompile = True }
399
compileDirFlag :: FilePath -> Flag CommandLineOptions
400
compileDirFlag f o = return $ o { optCompileDir = Just f }
402
-- NOTE: Quadratic in number of flags.
403
ghcFlag :: String -> Flag CommandLineOptions
404
ghcFlag f o = return $ o { optGhcFlags = optGhcFlags o ++ [f] }
406
-- NOTE: Quadratic in number of flags.
407
epicFlagsFlag :: String -> Flag CommandLineOptions
408
epicFlagsFlag s o = return $ o { optEpicFlags = optEpicFlags o ++ [s] }
410
htmlFlag :: Flag CommandLineOptions
411
htmlFlag o = return $ o { optGenerateHTML = True }
413
dependencyGraphFlag :: FilePath -> Flag CommandLineOptions
414
dependencyGraphFlag f o = return $ o { optDependencyGraph = Just f }
416
htmlDirFlag :: FilePath -> Flag CommandLineOptions
417
htmlDirFlag d o = return $ o { optHTMLDir = d }
419
cssFlag :: FilePath -> Flag CommandLineOptions
420
cssFlag f o = return $ o { optCSSFile = Just f }
422
includeFlag :: FilePath -> Flag CommandLineOptions
329
423
includeFlag d o = return $ o { optIncludeDirs = Left (d : ds) }
330
424
where ds = either id (const []) $ optIncludeDirs o
426
verboseFlag :: String -> Flag PragmaOptions
332
427
verboseFlag s o =
333
428
do (k,n) <- parseVerbose s
334
429
return $ o { optVerbose = Trie.insert k n $ optVerbose o }
366
462
, Option [] ["epic"] (NoArg compileEpicFlag) "compile program using the Epic backend"
367
463
, Option [] ["js"] (NoArg compileJSFlag) "compile program using the JS backend"
368
464
, Option [] ["compile-dir"] (ReqArg compileDirFlag "DIR")
369
("directory for compiler output (default: the project root)")
465
("directory for compiler output (default: the project root)")
370
466
, Option [] ["ghc-flag"] (ReqArg ghcFlag "GHC-FLAG")
371
467
"give the flag GHC-FLAG to GHC when compiling using MAlonzo"
372
468
, Option [] ["epic-flag"] (ReqArg epicFlagsFlag "EPIC-FLAG")
373
469
"give the flag EPIC-FLAG to Epic when compiling using Epic"
374
, Option [] ["test"] (NoArg runTestsFlag)
375
"run internal test suite"
376
, Option [] ["vim"] (NoArg vimFlag)
377
"generate Vim highlighting files"
378
, Option [] ["latex"] (NoArg latexFlag)
470
, Option [] ["test"] (NoArg runTestsFlag)
471
"run internal test suite"
472
, Option [] ["vim"] (NoArg vimFlag)
473
"generate Vim highlighting files"
474
, Option [] ["latex"] (NoArg latexFlag)
379
475
"generate LaTeX with highlighted source code"
380
, Option [] ["latex-dir"] (ReqArg latexDirFlag "DIR")
476
, Option [] ["latex-dir"] (ReqArg latexDirFlag "DIR")
381
477
("directory in which LaTeX files are placed (default: " ++
382
478
defaultLaTeXDir ++ ")")
383
, Option [] ["html"] (NoArg htmlFlag)
384
"generate HTML files with highlighted source code"
385
, Option [] ["dependency-graph"] (ReqArg dependencyGraphFlag "FILE")
386
"generate a Dot file with a module dependency graph"
387
, Option [] ["html-dir"] (ReqArg htmlDirFlag "DIR")
479
, Option [] ["html"] (NoArg htmlFlag)
480
"generate HTML files with highlighted source code"
481
, Option [] ["dependency-graph"] (ReqArg dependencyGraphFlag "FILE")
482
"generate a Dot file with a module dependency graph"
483
, Option [] ["html-dir"] (ReqArg htmlDirFlag "DIR")
388
484
("directory in which HTML files are placed (default: " ++
389
485
defaultHTMLDir ++ ")")
390
, Option [] ["css"] (ReqArg cssFlag "URL")
391
"the CSS file used by the HTML files (can be relative)"
392
, Option [] ["ignore-interfaces"] (NoArg ignoreInterfacesFlag)
393
"ignore interface files (re-type check everything)"
486
, Option [] ["css"] (ReqArg cssFlag "URL")
487
"the CSS file used by the HTML files (can be relative)"
488
, Option [] ["ignore-interfaces"] (NoArg ignoreInterfacesFlag)
489
"ignore interface files (re-type check everything)"
394
490
, Option ['i'] ["include-path"] (ReqArg includeFlag "DIR")
395
"look for imports in DIR"
491
"look for imports in DIR"
396
492
, Option [] ["no-forcing"] (NoArg noForcingFlag)
397
493
"disable the forcing optimisation"
398
494
, Option [] ["safe"] (NoArg safeFlag)
407
503
pragmaOptions :: [OptDescr (Flag PragmaOptions)]
409
[ Option [] ["show-implicit"] (NoArg showImplicitFlag)
410
"show implicit arguments when printing"
411
, Option [] ["show-irrelevant"] (NoArg showIrrelevantFlag)
412
"show irrelevant arguments when printing"
413
, Option ['v'] ["verbose"] (ReqArg verboseFlag "N")
505
[ Option [] ["show-implicit"] (NoArg showImplicitFlag)
506
"show implicit arguments when printing"
507
, Option [] ["show-irrelevant"] (NoArg showIrrelevantFlag)
508
"show irrelevant arguments when printing"
509
, Option ['v'] ["verbose"] (ReqArg verboseFlag "N")
414
510
"set verbosity level to N"
415
-- , Option [] ["proof-irrelevance"] (NoArg proofIrrelevanceFlag)
416
-- "enable proof irrelevance (experimental feature)"
417
, Option [] ["allow-unsolved-metas"] (NoArg allowUnsolvedFlag)
418
"allow unsolved meta variables (only needed in batch mode)"
419
, Option [] ["no-positivity-check"] (NoArg noPositivityFlag)
420
"do not warn about not strictly positive data types"
421
, Option [] ["no-termination-check"] (NoArg dontTerminationCheckFlag)
422
"do not warn about possibly nonterminating code"
423
, Option [] ["termination-depth"] (ReqArg terminationDepthFlag "N")
424
"allow termination checker to count decrease/increase upto N (default N=1)"
425
, Option [] ["no-coverage-check"] (NoArg dontCompletenessCheckFlag)
426
"do not warn about possibly incomplete pattern matches"
427
, Option [] ["type-in-type"] (NoArg dontUniverseCheckFlag)
428
"ignore universe levels (this makes Agda inconsistent)"
511
-- , Option [] ["proof-irrelevance"] (NoArg proofIrrelevanceFlag)
512
-- "enable proof irrelevance (experimental feature)"
513
, Option [] ["allow-unsolved-metas"] (NoArg allowUnsolvedFlag)
514
"allow unsolved meta variables (only needed in batch mode)"
515
, Option [] ["no-positivity-check"] (NoArg noPositivityFlag)
516
"do not warn about not strictly positive data types"
517
, Option [] ["no-termination-check"] (NoArg dontTerminationCheckFlag)
518
"do not warn about possibly nonterminating code"
519
, Option [] ["termination-depth"] (ReqArg terminationDepthFlag "N")
520
"allow termination checker to count decrease/increase upto N (default N=1)"
521
, Option [] ["no-coverage-check"] (NoArg dontCompletenessCheckFlag)
522
"do not warn about possibly incomplete pattern matches"
523
, Option [] ["type-in-type"] (NoArg dontUniverseCheckFlag)
524
"ignore universe levels (this makes Agda inconsistent)"
429
525
, Option [] ["sized-types"] (NoArg sizedTypes)
430
526
"use sized types (default, inconsistent with `musical' coinduction)"
431
527
, Option [] ["no-sized-types"] (NoArg noSizedTypes)