on master help sign in
Merge remote-tracking branch 'upstream/master' into error-reflection

Conflicts: src/Idris/Parser.hs

commit7ae55f9626637589b0b17f1b22e4b85941eb00b6 authorDavid Christiansen <david@davidchristiansen.dk> dateFri 27 Sep 2013, 11:54 (13 years ago) parentd114d397c041d4
10 files changed+503−441
README+2 Setup.hs+117−137 effects/Makefile+5−4 idris.cabal+166−79 javascript/Makefile+4−3 lib/Makefile+5−4 llvm/Makefile+1−1 rts/Makefile+1−1 src/Idris/Delaborate.hs+1−1 src/Idris/Parser.hs+201−211
README+2
@@ -12,3 +12,5 @@ To run the tests, type 'make test' which will execute the test suite, and
1212Idris has buildtime dependencies on the C libraries llvm-3.3 and libffi. Be sure these are compiled for the same architecture as your Haskell compiler (e.g. 64 bit libraries for 64 bit ghc).
1313
1414Idris has a runtime dependency on libgmp, and on Boehm GC (libgc) when using the LLVM codegen. These are needed for linking into compiled programs, so be sure these are compiled for Idris's default target architecture (usually 64 bit on x86_64 systems).
15+
16+The Idris wiki contains instructions for building on various platforms and for getting involved with development. It is located at https://github.com/idris-lang/Idris-dev/wiki .
Setup.hs+117−137
@@ -20,158 +20,138 @@ import qualified Data.Text.IO as TIO
2020
2121-- After Idris is built, we need to check and install the prelude and other libs
2222
23−make verbosity = P.runProgramInvocation verbosity . P.simpleProgramInvocation "make"
23+-- -----------------------------------------------------------------------------
24+-- Idris Command Path
2425
25−#ifdef mingw32_HOST_OS
2626-- make on mingw32 exepects unix style separators
27+#ifdef mingw32_HOST_OS
2728(<//>) = (Px.</>)
28−idrisCmd local = Px.joinPath $ splitDirectories $
29− ".." <//> buildDir local <//> "idris" <//> "idris"
30−rtsDir local = Px.joinPath $ splitDirectories $
31− ".." <//> buildDir local <//> "rts" <//> "libidris_rts"
29+idrisCmd local = Px.joinPath $ splitDirectories $ ".." <//> buildDir local <//> "idris" <//> "idris"
3230#else
3331idrisCmd local = ".." </> buildDir local </> "idris" </> "idris"
34−rtsDir local = ".." </> buildDir local </> "rts" </> "libidris_rts"
3532#endif
3633
37−cleanStdLib verbosity
38− = do make verbosity [ "-C", "lib", "clean", "IDRIS=idris" ]
39− make verbosity [ "-C", "effects", "clean", "IDRIS=idris" ]
40− make verbosity [ "-C", "javascript", "clean", "IDRIS=idris" ]
41−
42−cleanJavaPom verbosity
43− = do execPomExists <- doesFileExist ("java" </> "executable_pom.xml")
44− when execPomExists $ removeFile ("java" </> "executable_pom.xml")
45−
46−cleanLLVMLib verbosity = make verbosity ["-C", "llvm", "clean"]
47−
48−installStdLib pkg local withoutEffects verbosity copy
49− = do let dirs = L.absoluteInstallDirs pkg local copy
50− let idir = datadir dirs
51− let icmd = idrisCmd local
52− putStrLn $ "Installing libraries in " ++ idir
53− make verbosity
54− [ "-C", "lib", "install"
55− , "TARGET=" ++ idir
56− , "IDRIS=" ++ icmd
57− ]
58− unless withoutEffects $
59− make verbosity
60− [ "-C", "effects", "install"
61− , "TARGET=" ++ idir
62− , "IDRIS=" ++ icmd
63− ]
64− make verbosity
65− [ "-C", "javascript", "install"
66− , "TARGET=" ++ idir
67− , "IDRIS=" ++ icmd
68− ]
69− let idirRts = idir </> "rts"
70− putStrLn $ "Installing run time system in " ++ idirRts
71− make verbosity
72− [ "-C", "rts", "install"
73− , "TARGET=" ++ idirRts
74− , "IDRIS=" ++ icmd
75− ]
76−
77−installLLVMLib verbosity pkg local copy =
78− let idir = datadir $ L.absoluteInstallDirs pkg local copy in
79− make verbosity ["-C", "llvm", "install", "TARGET=" ++ idir </> "llvm"]
80−
81−buildLLVMLib verbosity = make verbosity ["-C", "llvm", "all"]
82−
83−installJavaPom pkg local verbosity copy version = do
84− putStrLn $ "Installing java pom template"
85− let dir = datadir $ L.absoluteInstallDirs pkg local copy
86− copyFile ("java" </> "executable_pom.xml") (dir </> "executable_pom.xml")
87−
88−-- This is a hack. I don't know how to tell cabal that a data file needs
89−-- installing but shouldn't be in the distribution. And it won't make the
90−-- distribution if it's not there, so instead I just delete
91−-- the file after configure.
92−
93−removeLibIdris local verbosity
94− = do let icmd = idrisCmd local
95− make verbosity
96− [ "-C", "rts", "clean"
97− , "IDRIS=" ++ icmd
98− ]
99−
100−checkStdLib local withoutEffects verbosity
101− = do let icmd = idrisCmd local
102− putStrLn $ "Building libraries..."
103− make verbosity
104− [ "-C", "lib", "check"
105− , "IDRIS=" ++ icmd
106− ]
107− unless withoutEffects $
108− make verbosity
109− [ "-C", "effects", "check"
110− , "IDRIS=" ++ icmd
111− ]
112− make verbosity
113− [ "-C", "javascript", "check"
114− , "IDRIS=" ++ icmd
115− ]
116− make verbosity
117− [ "-C", "rts", "check"
118− , "IDRIS=" ++ icmd
119− ]
120−
121−llvmFlag flags =
34+-- -----------------------------------------------------------------------------
35+-- Make Commands
36+
37+make verbosity =
38+ P.runProgramInvocation verbosity . P.simpleProgramInvocation "make"
39+
40+-- -----------------------------------------------------------------------------
41+-- Flags
42+
43+usesLLVM :: S.ConfigFlags -> Bool
44+usesLLVM flags =
12245 case lookup (FlagName "llvm") (S.configConfigurationsFlags flags) of
12346 Just True -> True
12447 Just False -> False
12548 Nothing -> True
12649
127−noEffectsFlag flags =
128− case lookup (FlagName "noeffects") (S.configConfigurationsFlags flags) of
50+usesEffects :: S.ConfigFlags -> Bool
51+usesEffects flags =
52+ case lookup (FlagName "effects") (S.configConfigurationsFlags flags) of
12953 Just True -> True
13054 Just False -> False
131− Nothing -> False
55+ Nothing -> True
56+
57+-- -----------------------------------------------------------------------------
58+-- Clean
59+
60+idrisClean _ flags _ _ = do
61+ cleanStdLib
62+ cleanLLVM
63+ where
64+ verbosity = S.fromFlag $ S.cleanVerbosity flags
65+
66+ cleanStdLib = do
67+ makeClean "lib"
68+ makeClean "effects"
69+ makeClean "javascript"
70+
71+ cleanLLVM = makeClean "llvm"
72+
73+ makeClean dir = make verbosity [ "-C", dir, "clean", "IDRIS=idris" ]
74+
75+
76+-- -----------------------------------------------------------------------------
77+-- Configure
78+
79+idrisConfigure _ flags _ local = do
80+ configureRTS
81+ where
82+ verbosity = S.fromFlag $ S.configVerbosity flags
83+ version = pkgVersion . package $ localPkgDescr local
84+
85+ -- This is a hack. I don't know how to tell cabal that a data file needs
86+ -- installing but shouldn't be in the distribution. And it won't make the
87+ -- distribution if it's not there, so instead I just delete
88+ -- the file after configure.
89+ configureRTS = make verbosity ["-C", "rts", "clean"]
90+
91+-- -----------------------------------------------------------------------------
92+-- Build
93+
94+idrisBuild _ flags _ local = do
95+ buildStdLib
96+ buildRTS
97+ when (usesLLVM $ configFlags local) buildLLVM
98+ where
99+ verbosity = S.fromFlag $ S.buildVerbosity flags
100+
101+ buildStdLib = do
102+ putStrLn "Building libraries..."
103+ makeBuild "lib"
104+ when (usesEffects $ configFlags local) $ makeBuild "effects"
105+ makeBuild "javascript"
106+ where
107+ makeBuild dir = make verbosity [ "-C", dir, "build" , "IDRIS=" ++ idrisCmd local]
108+
109+ buildRTS = make verbosity ["-C", "rts", "build"]
110+
111+ buildLLVM = make verbosity ["-C", "llvm", "build"]
112+
113+-- -----------------------------------------------------------------------------
114+-- Copy/Install
115+
116+idrisInstall verbosity copy pkg local = do
117+ installStdLib
118+ installRTS
119+ when (usesLLVM $ configFlags local) installLLVM
120+ where
121+ target = datadir $ L.absoluteInstallDirs pkg local copy
122+
123+ installStdLib = do
124+ putStrLn $ "Installing libraries in " ++ target
125+ makeInstall "lib" target
126+ when (usesEffects $ configFlags local) $ makeInstall "effects" target
127+ makeInstall "javascript" target
128+
129+ installRTS = do
130+ let target' = target </> "rts"
131+ putStrLn $ "Installing run time system in " ++ target'
132+ makeInstall "rts" target'
133+
134+ installLLVM = do
135+ let target' = target </> "llvm"
136+ putStrLn $ "Installing LLVM library in " ++ target
137+ makeInstall "llvm" target
138+
139+ makeInstall src target =
140+ make verbosity [ "-C", src, "install" , "TARGET=" ++ target, "IDRIS=" ++ idrisCmd local]
132141
133−preparePoms version
134− = do execPomTemplate <- TIO.readFile ("java" </> "executable_pom_template.xml")
135− TIO.writeFile ("java" </> "executable_pom.xml") (insertVersion execPomTemplate)
136− where
137− insertVersion template =
138− T.replace (T.pack "$RTS-VERSION$") (T.pack $ display version) template
142+-- -----------------------------------------------------------------------------
143+-- Main
139144
140145-- Install libraries during both copy and install
141146-- See http://hackage.haskell.org/trac/hackage/ticket/718
142−main = do
143− defaultMainWithHooks $ simpleUserHooks
144− { postCopy = \ _ flags pkg lbi -> do
145− let verb = S.fromFlag $ S.copyVerbosity flags
146− let withoutEffects = noEffectsFlag $ configFlags lbi
147− installStdLib pkg lbi withoutEffects verb
148− (S.fromFlag $ S.copyDest flags)
149− installJavaPom pkg lbi verb
150− (S.fromFlag $ S.copyDest flags)
151− (pkgVersion . package $ localPkgDescr lbi)
152− when (llvmFlag $ configFlags lbi)
153− (installLLVMLib verb pkg lbi (S.fromFlag $ S.copyDest flags))
154− , postInst = \ _ flags pkg lbi -> do
155− let verb = (S.fromFlag $ S.installVerbosity flags)
156− let withoutEffects = noEffectsFlag $ configFlags lbi
157− installStdLib pkg lbi withoutEffects verb
158− NoCopyDest
159− installJavaPom pkg lbi verb
160− NoCopyDest
161− (pkgVersion . package $ localPkgDescr lbi)
162− when (llvmFlag $ configFlags lbi)
163− (installLLVMLib verb pkg lbi NoCopyDest)
164− , postConf = \ _ flags _ lbi -> do
165− removeLibIdris lbi (S.fromFlag $ S.configVerbosity flags)
166− preparePoms . pkgVersion . package $ localPkgDescr lbi
167− , postClean = \ _ flags _ _ -> do
168− let verb = S.fromFlag $ S.cleanVerbosity flags
169− cleanStdLib verb
170− cleanLLVMLib verb
171− cleanJavaPom verb
172− , postBuild = \ _ flags _ lbi -> do
173− let verb = S.fromFlag $ S.buildVerbosity flags
174− when (llvmFlag $ configFlags lbi) (buildLLVMLib verb)
175− let withoutEffects = noEffectsFlag $ configFlags lbi
176− checkStdLib lbi withoutEffects verb
177− }
147+main = defaultMainWithHooks $ simpleUserHooks
148+ { postClean = idrisClean
149+ , postConf = idrisConfigure
150+ , postBuild = idrisBuild
151+ , postCopy = \_ flags pkg local ->
152+ idrisInstall (S.fromFlag $ S.copyVerbosity flags)
153+ (S.fromFlag $ S.copyDest flags) pkg local
154+ , postInst = \_ flags pkg local ->
155+ idrisInstall (S.fromFlag $ S.installVerbosity flags)
156+ NoCopyDest pkg local
157+ }
effects/Makefile+5−4
@@ -1,13 +1,14 @@
1+IDRIS := idris
12
2−check: .PHONY
3+build: .PHONY
34 $(IDRIS) --build effects.ipkg
45
5−recheck: clean check
6+clean: .PHONY
7+ $(IDRIS) --clean effects.ipkg
68
79install:
810 $(IDRIS) --install effects.ipkg
911
10−clean: .PHONY
11− $(IDRIS) --clean effects.ipkg
12+rebuild: clean build
1213
1314.PHONY:
idris.cabal+166−79
@@ -14,7 +14,8 @@ Description: Idris is a general purpose language with full dependent types.
1414 Dependent types allow types to be predicated on values,
1515 meaning that some aspects of a program's behaviour can be
1616 specified precisely in the type. The language is closely
17− related to Epigram and Agda. There is a tutorial at <http://www.idris-lang.org/documentation>.
17+ related to Epigram and Agda. There is a tutorial at
18+ <http://www.idris-lang.org/documentation>.
1819 Features include:
1920 .
2021 * Full dependent types with dependent pattern matching
@@ -43,38 +44,60 @@ Description: Idris is a general purpose language with full dependent types.
4344
4445Cabal-Version: >= 1.6
4546
46−
4747Build-type: Custom
4848
49−
50−Data-files: rts/idris_rts.h rts/idris_gc.h rts/idris_stdfgn.h
51− rts/idris_main.c rts/idris_gmp.h
52− rts/libtest.c
49+Data-files: js/Runtime-browser.js
5350 js/Runtime-common.js
5451 js/Runtime-node.js
55− js/Runtime-browser.js
56−Extra-source-files: lib/Makefile lib/*.idr lib/Prelude/*.idr
57− lib/Network/*.idr lib/Control/*.idr
58− lib/Control/Monad/*.idr lib/Language/*.idr
59− lib/Language/Reflection/*.idr
60− lib/System/Concurrency/*.idr
61− lib/Data/*.idr lib/Debug/*.idr
52+ rts/idris_gc.h
53+ rts/idris_gmp.h
54+ rts/idris_main.c
55+ rts/idris_rts.h
56+ rts/idris_stdfgn.h
57+ rts/libtest.c
58+
59+Extra-source-files:
60+ Makefile
61+ config.mk
62+
63+ rts/*.c
64+ rts/*.h
65+ rts/Makefile
66+
67+ lib/base.ipkg
68+ lib/*.idr
69+ lib/Control/*.idr
70+ lib/Control/Monad/*.idr
71+ lib/Data/*.idr
6272 lib/Data/Vect/*.idr
73+ lib/Debug/*.idr
6374 lib/Decidable/*.idr
64− tutorial/examples/*.idr lib/base.ipkg
65− effects/Makefile effects/*.idr effects/Effect/*.idr
75+ lib/Language/*.idr
76+ lib/Language/Reflection/*.idr
77+ lib/Makefile
78+ lib/Network/*.idr
79+ lib/Prelude/*.idr
80+ lib/System/Concurrency/*.idr
81+
82+ effects/Makefile
6683 effects/effects.ipkg
67− javascript/Makefile
68− javascript/JavaScript/*.idr
84+ effects/Effect/*.idr
85+ effects/*.idr
86+
87+ java/*.xml
88+
6989 javascript/*.idr
90+ javascript/JavaScript/*.idr
91+ javascript/Makefile
7092 javascript/javascript.ipkg
71− config.mk
72− rts/*.c rts/*.h rts/Makefile
73− llvm/*.c llvm/Makefile
93+
7494 js/*.js
75− java/*.xml
7695
77− Makefile
96+ llvm/*.c
97+ llvm/Makefile
98+
99+ tutorial/examples/*.idr
100+
78101 test/Makefile
79102 test/runtest.pl
80103 test/reg001/run
@@ -237,76 +260,140 @@ Extra-source-files: lib/Makefile lib/*.idr lib/Prelude/*.idr
237260 test/test031/*.idr
238261 test/test031/expected
239262
240−
241263source-repository head
242264 type: git
243265 location: git://github.com/edwinb/Idris-dev.git
244266
245−Flag NoEffects
246− Description: Do not build the effects package
247− Default: False
267+Flag Effects
268+ Description: Build the effects package
269+ Default: True
248270
249271Flag LLVM
250272 Description: Build the LLVM backend
251273 Default: True
252274 manual: True
253275
254−Executable idris
255− Main-is: Main.hs
256− hs-source-dirs: src
257− Other-modules: Core.TT, Core.Evaluate, Core.Execute, Core.Typecheck,
258− Core.ProofShell, Core.ProofState, Core.CoreParser,
259− Core.ShellParser, Core.Unify, Core.Elaborate,
260− Core.CaseTree, Core.Constraints,
276+Executable idris
277+ Main-is: Main.hs
278+ hs-source-dirs: src
279+ Other-modules:
280+ Core.CaseTree
281+ , Core.Constraints
282+ , Core.CoreParser
283+ , Core.Elaborate
284+ , Core.Evaluate
285+ , Core.Execute
286+ , Core.ProofShell
287+ , Core.ProofState
288+ , Core.ShellParser
289+ , Core.TT
290+ , Core.Typecheck
291+ , Core.Unify
292+
293+ , Idris.AbsSyntax
294+ , Idris.AbsSyntaxTree
295+ , Idris.Chaser
296+ , Idris.Colours
297+ , Idris.Completion
298+ , Idris.Coverage
299+ , Idris.DSL
300+ , Idris.DataOpts
301+ , Idris.Delaborate
302+ , Idris.Docs
303+ , Idris.ElabDecls
304+ , Idris.ElabTerm
305+ , Idris.Error
306+ , Idris.Help
307+ , Idris.IBC
308+ , Idris.IdeSlave
309+ , Idris.Imports
310+ , Idris.Inliner
311+ , Idris.Parser
312+ , Idris.PartialEval
313+ , Idris.Primitives
314+ , Idris.Prover
315+ , Idris.Providers
316+ , Idris.REPL
317+ , Idris.REPLParser
318+ , Idris.Transforms
319+ , Idris.Unlit
320+ , Idris.UnusedArgs
321+
322+ , IRTS.BCImp
323+ , IRTS.Bytecode
324+ , IRTS.CodegenC
325+ , IRTS.CodegenCommon
326+ , IRTS.CodegenJava
327+ , IRTS.CodegenJavaScript
328+ , IRTS.Compiler
329+ , IRTS.Defunctionalise
330+ , IRTS.DumpBC
331+ , IRTS.Inliner
332+ , IRTS.Java.ASTBuilding
333+ , IRTS.Java.JTypes
334+ , IRTS.Java.Mangling
335+ , IRTS.LParser
336+ , IRTS.Lang
337+ , IRTS.Simplified
338+
339+ , Util.Pretty
340+ , Util.System
341+ , Util.DynamicLinker
261342
262− Idris.AbsSyntax, Idris.AbsSyntaxTree, Idris.Colours,
263− Idris.Parser, Idris.Help, Idris.IdeSlave, Idris.REPL,
264− Idris.REPLParser, Idris.ElabDecls, Idris.Error,
265− Idris.Delaborate, Idris.Primitives, Idris.Imports,
266− Idris.Prover, Idris.ElabTerm,
267− Idris.Coverage, Idris.IBC, Idris.Unlit,
268− Idris.DataOpts, Idris.Transforms, Idris.DSL,
269− Idris.UnusedArgs, Idris.Docs, Idris.Completion,
270− Idris.PartialEval, Idris.Providers, Idris.Chaser,
271− Idris.Inliner,
343+ , Pkg.Package
344+ , Pkg.PParser
272345
273− Util.Pretty, Util.System, Util.DynamicLinker,
274− Pkg.Package, Pkg.PParser,
346+ -- Auto Generated
347+ Paths_idris
275348
276− IRTS.Lang, IRTS.LParser, IRTS.Bytecode, IRTS.Simplified,
277− IRTS.CodegenC, IRTS.Defunctionalise, IRTS.Inliner,
278− IRTS.Compiler, IRTS.CodegenJava, IRTS.Java.ASTBuilding,
279− IRTS.Java.JTypes, IRTS.Java.Mangling, IRTS.BCImp,
280− IRTS.CodegenJavaScript,
281− IRTS.CodegenCommon, IRTS.DumpBC
349+ Build-depends: base >=4 && <5
350+ , Cabal
351+ , ansi-terminal
352+ , binary
353+ , bytestring
354+ , containers
355+ , directory
356+ , directory >= 1.2
357+ , filepath
358+ , haskeline >= 0.7
359+ , language-java >= 0.2.2
360+ , libffi
361+ , mtl
362+ , parsec >= 3
363+ , parsers >= 0.9
364+ , pretty
365+ , process
366+ , split
367+ , text
368+ , time >= 1.4
369+ , transformers
370+ , trifecta >= 1.1
371+ , unordered-containers
372+ , utf8-string
373+ , vector
374+ , vector-binary-instances
282375
283− Paths_idris
376+ Extensions: MultiParamTypeClasses
377+ , FunctionalDependencies
378+ , FlexibleInstances
379+ , TemplateHaskell
284380
285− Build-depends: base>=4 && <5, parsec>=3, mtl, Cabal,
286− haskeline>=0.7, split, directory>=1.2,
287− time>=1.4,
288− containers, process, transformers, filepath,
289− directory, binary, bytestring, text, pretty,
290− language-java>=0.2.2, libffi,
291− vector, vector-binary-instances, ansi-terminal,
292− utf8-string, unordered-containers, parsers>=0.9, trifecta>=1.1
381+ ghc-prof-options: -auto-all -caf-all
382+ ghc-options: -rtsopts
293383
294− Extensions: MultiParamTypeClasses, FunctionalDependencies,
295− FlexibleInstances, TemplateHaskell
296− ghc-prof-options: -auto-all -caf-all
297− ghc-options: -rtsopts
298− if os(linux)
299− cpp-options: -DLINUX
300− build-depends: unix
301− if os(darwin)
302− cpp-options: -DMACOSX
303− build-depends: unix
304− if os(windows)
305− cpp-options: -DWINDOWS
306− build-depends: Win32
307− if flag(LLVM)
308− other-modules: IRTS.CodegenLLVM
309− cpp-options: -DIDRIS_LLVM
310− build-depends: llvm-general==3.3.8.*, llvm-general-pure==3.3.8.*
311− else
312− other-modules: Util.LLVMStubs
384+ if os(linux)
385+ cpp-options: -DLINUX
386+ build-depends: unix
387+ if os(darwin)
388+ cpp-options: -DMACOSX
389+ build-depends: unix
390+ if os(windows)
391+ cpp-options: -DWINDOWS
392+ build-depends: Win32
393+ if flag(LLVM)
394+ other-modules: IRTS.CodegenLLVM
395+ cpp-options: -DIDRIS_LLVM
396+ build-depends: llvm-general == 3.3.8.*
397+ , llvm-general-pure == 3.3.8.*
398+ else
399+ other-modules: Util.LLVMStubs
javascript/Makefile+4−3
@@ -1,13 +1,14 @@
1+IDRIS := idris
12
2−check: .PHONY
3+build: .PHONY
34 $(IDRIS) --build javascript.ipkg
45
5−recheck: clean check
6−
76install:
87 $(IDRIS) --install javascript.ipkg
98
109clean: .PHONY
1110 $(IDRIS) --clean javascript.ipkg
1211
12+rebuild: clean build
13+
1314.PHONY:
lib/Makefile+5−4
@@ -1,16 +1,17 @@
1+IDRIS := idris
12
2−check: .PHONY
3+build: .PHONY
34 $(IDRIS) --build base.ipkg
45
5−recheck: clean check
6−
76install:
87 $(IDRIS) --install base.ipkg
98
109clean: .PHONY
1110 $(IDRIS) --clean base.ipkg
1211
12+rebuild: clean build
13+
1314linecount: .PHONY
14− wc -l *.idr Network/*.idr Language/*.idr Prelude/*.idr Data/*.idr Control/Monad/*.idr Control/*.idr
15+ find . -name '*.idr' | xargs wc -l
1516
1617.PHONY:
llvm/Makefile+1−1
@@ -5,7 +5,7 @@ SOURCES=defs.c
55OBJECTS=$(SOURCES:.c=.o)
66LIB=libidris_rts.a
77
8−all: $(SOURCES) $(LIB)
8+build: $(SOURCES) $(LIB)
99
1010$(LIB): $(OBJECTS)
1111 ar r $@ $(OBJECTS)
rts/Makefile+1−1
@@ -9,7 +9,7 @@ endif
99
1010LIBTARGET = libidris_rts.a
1111
12−check : $(LIBTARGET) $(DYLIBTARGET)
12+build: $(LIBTARGET) $(DYLIBTARGET)
1313
1414$(LIBTARGET) : $(OBJS)
1515 ar r $(LIBTARGET) $(OBJS)
src/Idris/Delaborate.hs+1−1
@@ -11,7 +11,7 @@ import Core.Evaluate
1111
1212import Debug.Trace
1313
14−bugaddr = "https://github.com/edwinb/Idris-dev/issues"
14+bugaddr = "https://github.com/idris-lang/Idris-dev/issues"
1515
1616delab :: IState -> Term -> PTerm
1717delab i tm = delab' i tm False
src/Idris/Parser.hs+201−211
@@ -89,8 +89,8 @@ isDocCommentMarker _ = False
8989 -}
9090singleLineComment :: MonadicParsing m => m ()
9191singleLineComment = try (string "--" *> satisfy isEol *> pure ())
92− <|> try (string "--" *> satisfy (not . isDocCommentMarker) *> many (satisfy (not . isEol)) *> (satisfy isEol <?> "end of line") *> pure ())
93− <?> "single-line comment"
92+ <|> string "--" *> satisfy (not . isDocCommentMarker) *> many (satisfy (not . isEol)) *> (satisfy isEol <?> "end of line") *> pure ()
93+ <?> ""
9494
9595{- | Consumes a multi-line comment
9696 MultiLineComment_t ::=
@@ -107,14 +107,14 @@ singleLineComment = try (string "--" *> satisfy isEol *> pure ())
107107
108108multiLineComment :: MonadicParsing m => m ()
109109multiLineComment = try (string "{-" *> (string "-}") *> pure ())
110− <|> try (string "{-" *> satisfy (not . isDocCommentMarker) *> inCommentChars)
111− <?> "multi-line comment"
110+ <|> string "{-" *> satisfy (not . isDocCommentMarker) *> inCommentChars
111+ <?> ""
112112 where inCommentChars :: MonadicParsing m => m ()
113− inCommentChars = try (string "-}" *> pure ())
114− <|> try (multiLineComment *> inCommentChars)
115− <|> try (docComment '|' *> inCommentChars)
116− <|> try (docComment '^' *> inCommentChars)
117− <|> try (skipSome (noneOf startEnd) *> inCommentChars)
113+ inCommentChars = string "-}" *> pure ()
114+ <|> try (multiLineComment) *> inCommentChars
115+ <|> try (docComment '|') *> inCommentChars
116+ <|> try (docComment '^') *> inCommentChars
117+ <|> skipSome (noneOf startEnd) *> inCommentChars
118118 <|> oneOf startEnd *> inCommentChars
119119 <?> "end of comment"
120120 startEnd :: String
@@ -131,7 +131,7 @@ docComment marker | isDocCommentMarker marker = do dc <- docComment' marker; ret
131131 where docComment' :: MonadicParsing m => Char -> m String
132132 docComment' marker = string "--" *> char marker *> many (satisfy (not . isEol)) <* satisfy isEol
133133 <|> string "{-" *> char marker *> (manyTill anyChar (try (string "-}")) <?> "end of comment")
134− <?> "documentation comment"
134+ <?> ""
135135
136136-- | Consumes whitespace (and comments)
137137whiteSpace :: MonadicParsing m => m ()
@@ -555,9 +555,9 @@ decl syn = do notEndBlock
555555 <|> instance_ syn
556556 <|> do d <- dsl syn; return [d]
557557 <|> directive syn
558− <|> try(provider syn)
558+ <|> provider syn
559559 <|> transform syn
560− <|> try(do import_; fail "imports must be at top of file")
560+ <|> do import_; fail "imports must be at top of file"
561561 <?> "declaration"
562562 declBody' :: IdrisParser [PDecl]
563563 declBody' = do d <- decl' syn
@@ -575,11 +575,11 @@ Decl' ::=
575575 ;
576576-}
577577decl' :: SyntaxInfo -> IdrisParser PDecl
578−decl' syn = try fixity
579− <|> try (fnDecl' syn)
580− <|> try (data_ syn)
581− <|> try (record syn)
582− <|> try (syntaxDecl syn)
578+decl' syn = fixity
579+ <|> syntaxDecl syn
580+ <|> fnDecl' syn
581+ <|> data_ syn
582+ <|> record syn
583583 <?> "declaration"
584584
585585{- | Parses a syntax extension declaration (and adds the rule to parser state)
@@ -615,10 +615,12 @@ SyntaxSym ::= '[' Name_t ']'
615615-}
616616syntaxRule :: SyntaxInfo -> IdrisParser Syntax
617617syntaxRule syn
618− = do pushIndent
619− sty <- option AnySyntax (do reserved "term"; return TermSyntax
618+ = do sty <- try (do
619+ pushIndent
620+ sty <- option AnySyntax (do reserved "term"; return TermSyntax
620621 <|> do reserved "pattern"; return PatternSyntax)
621− reserved "syntax"
622+ reserved "syntax"
623+ return sty)
622624 syms <- some syntaxSym
623625 when (all isExpr syms) $ unexpected "missing keywords in syntax rule"
624626 let ns = mapMaybe getName syms
@@ -699,9 +701,9 @@ fnDecl' syn = try (do doc <- option "" (docComment '|')
699701 terminator
700702 addAcc n acc
701703 return (PTy doc syn fc opts' n ty))
702− <|> try (postulate syn)
703− <|> try (pattern syn)
704− <|> try (caf syn)
704+ <|> postulate syn
705+ <|> caf syn
706+ <|> pattern syn
705707 <?> "function declaration"
706708
707709
@@ -727,12 +729,12 @@ fnOpts :: [FnOpt] -> IdrisParser [FnOpt]
727729fnOpts opts
728730 = do reserved "total"; fnOpts (TotalFn : opts)
729731 <|> do reserved "partial"; fnOpts (PartialFn : (opts \\ [TotalFn]))
730− <|> try (do lchar '%'; reserved "export"; c <- stringLiteral;
731− fnOpts (CExport c : opts))
732− <|> try (do lchar '%'; reserved "assert_total";
733− fnOpts (AssertTotal : opts))
734− <|> try (do lchar '%'; reserved "reflection";
735− fnOpts (Reflection : opts))
732+ <|> do try (lchar '%' *> reserved "export"); c <- stringLiteral;
733+ fnOpts (CExport c : opts)
734+ <|> do try (lchar '%' *> reserved "assert_total");
735+ fnOpts (AssertTotal : opts)
736+ <|> do try (lchar '%' *> reserved "reflection");
737+ fnOpts (Reflection : opts)
736738 <|> do lchar '%'; reserved "specialise";
737739 lchar '['; ns <- sepBy nameTimes (lchar ','); lchar ']'
738740 fnOpts (Specialise ns : opts)
@@ -775,9 +777,10 @@ Postulate ::=
775777 ;
776778-}
777779postulate :: SyntaxInfo -> IdrisParser PDecl
778−postulate syn = do doc <- option "" (docComment '|')
779− pushIndent
780− reserved "postulate"
780+postulate syn = do doc <- try $ do doc <- option "" (docComment '|')
781+ pushIndent
782+ reserved "postulate"
783+ return doc
781784 ist <- get
782785 let initOpts = if default_total ist
783786 then [TotalFn]
@@ -902,10 +905,10 @@ FixityType ::=
902905 ;
903906 -}
904907fixityType :: IdrisParser (Int -> Fixity)
905−fixityType = try (do reserved "infixl"; return Infixl)
906− <|> try (do reserved "infixr"; return Infixr)
907− <|> try (do reserved "infix"; return InfixN)
908− <|> try (do reserved "prefix"; return PrefixN)
908+fixityType = do reserved "infixl"; return Infixl
909+ <|> do reserved "infixr"; return Infixr
910+ <|> do reserved "infix"; return InfixN
911+ <|> do reserved "prefix"; return PrefixN
909912 <?> "fixity type"
910913
911914{- |Parses a methods block (for type classes and instances)
@@ -931,8 +934,10 @@ Class ::=
931934 ;
932935-}
933936class_ :: SyntaxInfo -> IdrisParser [PDecl]
934−class_ syn = do doc <- option "" (docComment '|')
935− acc <- optional accessibility
937+class_ syn = do (doc, acc) <- try (do
938+ doc <- option "" (docComment '|')
939+ acc <- optional accessibility
940+ return (doc, acc))
936941 reserved "class"; fc <- getFC; cons <- constraintList syn; n_in <- name
937942 let n = expandNS syn n_in
938943 cs <- many carg
@@ -1441,8 +1446,8 @@ Arg ::=
14411446 ;
14421447-}
14431448arg :: SyntaxInfo -> IdrisParser PArg
1444−arg syn = try (implicitArg syn)
1445− <|> try (constraintArg syn)
1449+arg syn = implicitArg syn
1450+ <|> constraintArg syn
14461451 <|> do e <- simpleExpr syn
14471452 return (pexp e)
14481453 <?> "function argument"
@@ -1847,9 +1852,9 @@ do_ syn
18471852 fc <- getFC
18481853 e <- expr syn;
18491854 return (DoBindP fc i e))
1850− <|> try (do e <- expr syn
1851− fc <- getFC
1852− return (DoExp fc e))
1855+ <|> do e <- expr syn
1856+ fc <- getFC
1857+ return (DoExp fc e)
18531858 <?> "do block expression"
18541859
18551860{- |Parses an expression in idiom brackets
@@ -1922,9 +1927,11 @@ Record ::=
19221927 DocComment Accessibility? 'record' FnName TypeSig 'where' OpenBlock Constructor KeepTerminator CloseBlock;
19231928-}
19241929record :: SyntaxInfo -> IdrisParser PDecl
1925−record syn = do doc <- option "" (docComment '|')
1926− acc <- optional accessibility
1927− reserved "record"
1930+record syn = do (doc, acc) <- try (do
1931+ doc <- option "" (docComment '|')
1932+ acc <- optional accessibility
1933+ reserved "record"
1934+ return (doc, acc))
19281935 fc <- getFC
19291936 tyn_in <- fnName
19301937 ty <- typeSig (allowImp syn)
@@ -2152,116 +2159,108 @@ rhs syn n = do lchar '='; expr syn
21522159 addLet nm r = (PLet (UN "value") Placeholder r (PMetavar nm))
21532160
21542161{- |Parses a function clause
2155−Clause ::= FnName ConstraintArg* ImplicitOrArgExpr* WExpr* RHS WhereOrTerminator
2162+RHSOrWithBlock ::= RHS WhereOrTerminator
2163+ | 'with' SimpleExpr OpenBlock FnDecl+ CloseBlock
2164+ ;
2165+Clause ::= WExpr+ RHSOrWithBlock
21562166 | SimpleExpr '<==' FnName RHS WhereOrTerminator
2157− | WExpr+ RHS WhereOrTerminator
2158− | FnName ConstraintArg* ImplicitOrArgExpr* WExpr* 'with' SimpleExpr OpenBlock FnDecl+ CloseBlock
2159− | WExpr+ 'with' SimpleExpr OpenBlock FnDecl+ CloseBlock
2160− | ArgExpr Operator ArgExpr WExpr* RHS WhereOrTerminator
2161− | ArgExpr Operator ArgExpr WExpr* 'with' SimpleExpr OpenBlock FnDecl+ CloseBlock
2167+ | ArgExpr Operator ArgExpr WExpr* RHSOrWithBlock {- Except "=" and "?=" operators to avoid ambiguity -}
2168+ | FnName ConstraintArg* ImplicitOrArgExpr* WExpr* RHSOrWithBlock
21622169 ;
21632170ImplicitOrArgExpr ::= ImplicitArg | ArgExpr;
21642171WhereOrTerminator ::= WhereBlock | Terminator;
21652172-}
21662173clause :: SyntaxInfo -> IdrisParser PClause
21672174clause syn
2168− = try (do pushIndent
2169− n_in <- fnName; let n = expandNS syn n_in
2170− cargs <- many (constraintArg syn)
2171− fc <- getFC
2172− args <- many (try (implicitArg (syn { inPattern = True } ))
2173− <|> (fmap pexp (argExpr syn)))
2174− wargs <- many (wExpr syn)
2175− r <- rhs syn n
2176− ist <- get
2177− let ctxt = tt_ctxt ist
2178− let wsyn = syn { syn_namespace = [] }
2179− (wheres, nmap) <- choice [do x <- whereBlock n wsyn
2180− popIndent
2181− return x,
2182− do terminator
2183− return ([], [])]
2184− let capp = PApp fc (PRef fc n)
2185− (cargs ++ args)
2186− ist <- get
2187− put (ist { lastParse = Just n })
2188− return $ PClause fc n capp wargs r wheres)
2189− <|> try (do pushIndent
2190− ty <- simpleExpr syn
2191− symbol "<=="
2192− fc <- getFC
2193− n_in <- fnName; let n = expandNS syn n_in
2194− r <- rhs syn n
2195− ist <- get
2196− let ctxt = tt_ctxt ist
2197− let wsyn = syn { syn_namespace = [] }
2198− (wheres, nmap) <- choice [do x <- whereBlock n wsyn
2199− popIndent
2200− return x,
2201− do terminator
2202− return ([], [])]
2203− let capp = PLet (MN 0 "match")
2204− ty
2205− (PMatchApp fc n)
2206− (PRef fc (MN 0 "match"))
2207− ist <- get
2208− put (ist { lastParse = Just n })
2209− return $ PClause fc n capp [] r wheres)
2210− <|> try (do pushIndent
2211− wargs <- some (wExpr syn)
2212− ist <- get
2213− n <- case lastParse ist of
2214− Just t -> return t
2215− Nothing -> fail "Invalid clause"
2216− fc <- getFC
2217− r <- rhs syn n
2218− let ctxt = tt_ctxt ist
2219− let wsyn = syn { syn_namespace = [] }
2220− (wheres, nmap) <- choice [do x <- whereBlock n wsyn
2221− popIndent
2222− return x,
2223− do terminator
2224− return ([], [])]
2225− return $ PClauseR fc wargs r wheres)
2226−
2227− <|> try (do pushIndent
2228− n_in <- fnName; let n = expandNS syn n_in
2229− cargs <- many (constraintArg syn)
2230− fc <- getFC
2231− args <- many (try (implicitArg (syn { inPattern = True } ))
2232− <|> (fmap pexp (argExpr syn)))
2233− wargs <- many (wExpr syn)
2234− let capp = PApp fc (PRef fc n)
2235− (cargs ++ args)
2236− ist <- get
2237− put (ist { lastParse = Just n })
2238− reserved "with"
2239− wval <- simpleExpr syn
2240− openBlock
2241− ds <- some $ fnDecl syn
2242− let withs = map (fillLHSD n capp wargs) $ concat ds
2243− closeBlock
2175+ = do wargs <- try (do pushIndent; some (wExpr syn))
2176+ fc <- getFC
2177+ ist <- get
2178+ n <- case lastParse ist of
2179+ Just t -> return t
2180+ Nothing -> fail "Invalid clause"
2181+ (do r <- rhs syn n
2182+ let ctxt = tt_ctxt ist
2183+ let wsyn = syn { syn_namespace = [] }
2184+ (wheres, nmap) <- choice [do x <- whereBlock n wsyn
2185+ popIndent
2186+ return x,
2187+ do terminator
2188+ return ([], [])]
2189+ return $ PClauseR fc wargs r wheres) <|> (do
2190+ popIndent
2191+ reserved "with"
2192+ wval <- simpleExpr syn
2193+ openBlock
2194+ ds <- some $ fnDecl syn
2195+ let withs = concat ds
2196+ closeBlock
2197+ return $ PWithR fc wargs wval withs)
2198+ <|> do ty <- try (do pushIndent
2199+ ty <- simpleExpr syn
2200+ symbol "<=="
2201+ return ty)
2202+ fc <- getFC
2203+ n_in <- fnName; let n = expandNS syn n_in
2204+ r <- rhs syn n
2205+ ist <- get
2206+ let ctxt = tt_ctxt ist
2207+ let wsyn = syn { syn_namespace = [] }
2208+ (wheres, nmap) <- choice [do x <- whereBlock n wsyn
2209+ popIndent
2210+ return x,
2211+ do terminator
2212+ return ([], [])]
2213+ let capp = PLet (MN 0 "match")
2214+ ty
2215+ (PMatchApp fc n)
2216+ (PRef fc (MN 0 "match"))
2217+ ist <- get
2218+ put (ist { lastParse = Just n })
2219+ return $ PClause fc n capp [] r wheres
2220+ <|> do (l, op) <- try (do
2221+ pushIndent
2222+ l <- argExpr syn
2223+ op <- operator
2224+ when (op == "=" || op == "?=" ) (fail "infix clause definition with \"=\" and \"?=\" not supported ")
2225+ return (l, op))
2226+ let n = expandNS syn (UN op)
2227+ r <- argExpr syn
2228+ fc <- getFC
2229+ wargs <- many (wExpr syn)
2230+ (do rs <- rhs syn n
2231+ let wsyn = syn { syn_namespace = [] }
2232+ (wheres, nmap) <- choice [do x <- whereBlock n wsyn
2233+ popIndent
2234+ return x,
2235+ do terminator
2236+ return ([], [])]
2237+ ist <- get
2238+ let capp = PApp fc (PRef fc n) [pexp l, pexp r]
2239+ put (ist { lastParse = Just n })
2240+ return $ PClause fc n capp wargs rs wheres) <|> (do
22442241 popIndent
2245− return $ PWith fc n capp wargs wval withs)
2246−
2247− <|> try (do wargs <- some (wExpr syn)
2248− fc <- getFC
22492242 reserved "with"
22502243 wval <- simpleExpr syn
22512244 openBlock
22522245 ds <- some $ fnDecl syn
2253− let withs = concat ds
22542246 closeBlock
2255− return $ PWithR fc wargs wval withs)
2256−
2257− <|> try(do pushIndent
2258− l <- argExpr syn
2259− op <- operator
2260− let n = expandNS syn (UN op)
2261− r <- argExpr syn
2262− fc <- getFC
2263− wargs <- many (wExpr syn)
2264− rs <- rhs syn n
2247+ ist <- get
2248+ let capp = PApp fc (PRef fc n) [pexp l, pexp r]
2249+ let withs = map (fillLHSD n capp wargs) $ concat ds
2250+ put (ist { lastParse = Just n })
2251+ return $ PWith fc n capp wargs wval withs)
2252+ <|> do pushIndent
2253+ n_in <- fnName; let n = expandNS syn n_in
2254+ cargs <- many (constraintArg syn)
2255+ fc <- getFC
2256+ args <- many (try (implicitArg (syn { inPattern = True } ))
2257+ <|> (fmap pexp (argExpr syn)))
2258+ wargs <- many (wExpr syn)
2259+ let capp = PApp fc (PRef fc n)
2260+ (cargs ++ args)
2261+ (do r <- rhs syn n
2262+ ist <- get
2263+ let ctxt = tt_ctxt ist
22652264 let wsyn = syn { syn_namespace = [] }
22662265 (wheres, nmap) <- choice [do x <- whereBlock n wsyn
22672266 popIndent
@@ -2269,26 +2268,18 @@ clause syn
22692268 do terminator
22702269 return ([], [])]
22712270 ist <- get
2272− let capp = PApp fc (PRef fc n) [pexp l, pexp r]
22732271 put (ist { lastParse = Just n })
2274− return $ PClause fc n capp wargs rs wheres)
2275−
2276− <|> do l <- argExpr syn
2277− op <- operator
2278− let n = expandNS syn (UN op)
2279− r <- argExpr syn
2280− fc <- getFC
2281− wargs <- many (wExpr syn)
2282− reserved "with"
2283− wval <- simpleExpr syn
2284− openBlock
2285− ds <- some $ fnDecl syn
2286− closeBlock
2287− ist <- get
2288− let capp = PApp fc (PRef fc n) [pexp l, pexp r]
2289− let withs = map (fillLHSD n capp wargs) $ concat ds
2290− put (ist { lastParse = Just n })
2291− return $ PWith fc n capp wargs wval withs
2272+ return $ PClause fc n capp wargs r wheres) <|> (do
2273+ reserved "with"
2274+ ist <- get
2275+ put (ist { lastParse = Just n })
2276+ wval <- simpleExpr syn
2277+ openBlock
2278+ ds <- some $ fnDecl syn
2279+ let withs = map (fillLHSD n capp wargs) $ concat ds
2280+ closeBlock
2281+ popIndent
2282+ return $ PWith fc n capp wargs wval withs)
22922283 <?> "function clause"
22932284 where
22942285 fillLHS :: Name -> PTerm -> [PTerm] -> PClause -> PClause
@@ -2332,13 +2323,13 @@ Codegen ::= 'C'
23322323 ;
23332324-}
23342325codegen_ :: IdrisParser Codegen
2335−codegen_ = try (do reserved "C"; return ViaC)
2336− <|> try (do reserved "Java"; return ViaJava)
2337− <|> try (do reserved "JavaScript"; return ViaJavaScript)
2338− <|> try (do reserved "Node"; return ViaNode)
2339− <|> try (do reserved "LLVM"; return ViaLLVM)
2340− <|> try (do reserved "Bytecode"; return Bytecode)
2341− <?> "code generation language"
2326+codegen_ = do reserved "C"; return ViaC
2327+ <|> do reserved "Java"; return ViaJava
2328+ <|> do reserved "JavaScript"; return ViaJavaScript
2329+ <|> do reserved "Node"; return ViaNode
2330+ <|> do reserved "LLVM"; return ViaLLVM
2331+ <|> do reserved "Bytecode"; return Bytecode
2332+ <?> "code generation language"
23422333
23432334{- |Parses a compiler directive
23442335StringList ::=
@@ -2363,45 +2354,45 @@ Directive' ::= 'lib' CodeGen String_t
23632354 ;
23642355-}
23652356directive :: SyntaxInfo -> IdrisParser [PDecl]
2366−directive syn = try (do lchar '%'; reserved "lib"; cgn <- codegen_; lib <- stringLiteral;
2367− return [PDirective (do addLib cgn lib
2368− addIBC (IBCLib cgn lib))])
2369− <|> try (do lchar '%'; reserved "link"; cgn <- codegen_; obj <- stringLiteral;
2370− return [PDirective (do dirs <- allImportDirs
2371− o <- liftIO $ findInPath dirs obj
2372− addIBC (IBCObj cgn obj) -- just name, search on loading ibc
2373− addObjectFile cgn o)])
2374− <|> try (do lchar '%'; reserved "flag"; cgn <- codegen_;
2375− flag <- stringLiteral
2376− return [PDirective (do addIBC (IBCCGFlag cgn flag)
2377− addFlag cgn flag)])
2378− <|> try (do lchar '%'; reserved "include"; cgn <- codegen_; hdr <- stringLiteral;
2379− return [PDirective (do addHdr cgn hdr
2380− addIBC (IBCHeader cgn hdr))])
2381− <|> try (do lchar '%'; reserved "hide"; n <- iName []
2382− return [PDirective (do setAccessibility n Hidden
2383− addIBC (IBCAccess n Hidden))])
2384− <|> try (do lchar '%'; reserved "freeze"; n <- iName []
2385− return [PDirective (do setAccessibility n Frozen
2386− addIBC (IBCAccess n Frozen))])
2387− <|> try (do lchar '%'; reserved "access"; acc <- accessibility
2388− return [PDirective (do i <- get
2389− put(i { default_access = acc }))])
2390− <|> try (do lchar '%'; reserved "default"; tot <- totality
2391− i <- get
2392− put (i { default_total = tot } )
2393− return [PDirective (do i <- get
2394− put(i { default_total = tot }))])
2395− <|> try (do lchar '%'; reserved "logging"; i <- natural;
2396− return [PDirective (setLogLevel (fromInteger i))])
2397− <|> try (do lchar '%'; reserved "dynamic"; libs <- sepBy1 stringLiteral (lchar ',');
2398− return [PDirective (do added <- addDyLib libs
2399− case added of
2400− Left lib -> addIBC (IBCDyLib (lib_name lib))
2401− Right msg ->
2402− fail $ msg)])
2403− <|> try (do lchar '%'; reserved "language"; ext <- pLangExt;
2404− return [PDirective (addLangExt ext)])
2357+directive syn = do try (lchar '%' *> reserved "lib"); cgn <- codegen_; lib <- stringLiteral;
2358+ return [PDirective (do addLib cgn lib
2359+ addIBC (IBCLib cgn lib))]
2360+ <|> do try (lchar '%' *> reserved "link"); cgn <- codegen_; obj <- stringLiteral;
2361+ return [PDirective (do dirs <- allImportDirs
2362+ o <- liftIO $ findInPath dirs obj
2363+ addIBC (IBCObj cgn obj) -- just name, search on loading ibc
2364+ addObjectFile cgn o)]
2365+ <|> do try (lchar '%' *> reserved "flag"); cgn <- codegen_;
2366+ flag <- stringLiteral
2367+ return [PDirective (do addIBC (IBCCGFlag cgn flag)
2368+ addFlag cgn flag)]
2369+ <|> do try (lchar '%' *> reserved "include"); cgn <- codegen_; hdr <- stringLiteral;
2370+ return [PDirective (do addHdr cgn hdr
2371+ addIBC (IBCHeader cgn hdr))]
2372+ <|> do try (lchar '%' *> reserved "hide"); n <- iName []
2373+ return [PDirective (do setAccessibility n Hidden
2374+ addIBC (IBCAccess n Hidden))]
2375+ <|> do try (lchar '%' *> reserved "freeze"); n <- iName []
2376+ return [PDirective (do setAccessibility n Frozen
2377+ addIBC (IBCAccess n Frozen))]
2378+ <|> do try (lchar '%' *> reserved "access"); acc <- accessibility
2379+ return [PDirective (do i <- get
2380+ put(i { default_access = acc }))]
2381+ <|> do try (lchar '%' *> reserved "default"); tot <- totality
2382+ i <- get
2383+ put (i { default_total = tot } )
2384+ return [PDirective (do i <- get
2385+ put(i { default_total = tot }))]
2386+ <|> do try (lchar '%' *> reserved "logging"); i <- natural;
2387+ return [PDirective (setLogLevel (fromInteger i))]
2388+ <|> do try (lchar '%' *> reserved "dynamic"); libs <- sepBy1 stringLiteral (lchar ',');
2389+ return [PDirective (do added <- addDyLib libs
2390+ case added of
2391+ Left lib -> addIBC (IBCDyLib (lib_name lib))
2392+ Right msg ->
2393+ fail $ msg)]
2394+ <|> do try (lchar '%' *> reserved "language"); ext <- pLangExt;
2395+ return [PDirective (addLangExt ext)]
24052396 <?> "directive"
24062397
24072398pLangExt :: IdrisParser LanguageExt
@@ -2420,7 +2411,7 @@ totality
24202411Provider ::= '%' 'provide' '(' FnName TypeSig ')' 'with' Expr;
24212412 -}
24222413provider :: SyntaxInfo -> IdrisParser [PDecl]
2423−provider syn = do lchar '%'; reserved "provide";
2414+provider syn = do try (lchar '%' *> reserved "provide");
24242415 lchar '('; n <- fnName; t <- typeSig syn; lchar ')'
24252416 fc <- getFC
24262417 reserved "with"
@@ -2432,7 +2423,7 @@ provider syn = do lchar '%'; reserved "provide";
24322423Transform ::= '%' 'transform' Expr '==>' Expr
24332424-}
24342425transform :: SyntaxInfo -> IdrisParser [PDecl]
2435−transform syn = do lchar '%'; reserved "transform";
2426+transform syn = do try (lchar '%' *> reserved "transform")
24362427 -- leave it unchecked, until we work out what this should
24372428 -- actually mean...
24382429-- safety <- option True (do reserved "unsafe"
@@ -2774,4 +2765,3 @@ addHides xs = do i <- getIState
27742765
27752766 doHide (n, a) = do setAccessibility n a
27762767 addIBC (IBCAccess n a)
2777−