idris 0.10 → 0.10.1
raw patch · 445 files changed
+7235/−5766 lines, 445 filesdep ~asyncdep ~basedep ~containerssetup-changedbinary-added
Dependency ranges changed: async, base, containers, directory, filepath, haskeline, process, time, transformers
This diff is very large; some files are shown as “too large to diff”. Download the raw patch for the complete diff.
Files
- CHANGELOG +66/−0
- CONTRIBUTORS +1/−0
- Makefile +3/−14
- Setup.hs +19/−0
- benchmarks/quasigroups/Parser.idr +2/−0
- benchmarks/quasigroups/Solver.idr +2/−1
- icons/idris.ico binary
- icons/idris_icon.rc +1/−0
- idris-tutorial.pdf binary
- idris.cabal +57/−10
- libs/base/Control/Arrow.idr +1/−1
- libs/base/Control/Catchable.idr +2/−0
- libs/base/Control/Category.idr +1/−1
- libs/base/Control/IOExcept.idr +2/−0
- libs/base/Control/Isomorphism.idr +1/−0
- libs/base/Control/Monad/Identity.idr +3/−1
- libs/base/Control/Monad/RWS.idr +1/−1
- libs/base/Control/Monad/Reader.idr +1/−1
- libs/base/Control/Monad/State.idr +1/−1
- libs/base/Control/Monad/Trans.idr +2/−0
- libs/base/Control/Monad/Writer.idr +1/−1
- libs/base/Data/Bits.idr +51/−32
- libs/base/Data/Complex.idr +2/−0
- libs/base/Data/Erased.idr +1/−1
- libs/base/Data/Fin.idr +2/−2
- libs/base/Data/HVect.idr +1/−1
- libs/base/Data/List.idr +2/−2
- libs/base/Data/List/Quantifiers.idr +2/−0
- libs/base/Data/Mod2.idr +5/−4
- libs/base/Data/Morphisms.idr +1/−1
- libs/base/Data/So.idr +1/−0
- libs/base/Data/String.idr +1/−1
- libs/base/Data/Vect.idr +11/−4
- libs/base/Data/Vect/Quantifiers.idr +2/−0
- libs/base/Debug/Error.idr +1/−1
- libs/base/Debug/Trace.idr +1/−0
- libs/base/Language/Reflection/Utils.idr +5/−1
- libs/base/Syntax/PreorderReasoning.idr +2/−0
- libs/base/System.idr +1/−1
- libs/base/System/Concurrency/Raw.idr +2/−0
- libs/base/System/Info.idr +3/−0
- libs/contrib/Classes/Verified.idr +9/−0
- libs/contrib/Control/Algebra.idr +1/−0
- libs/contrib/Control/Algebra/Lattice.idr +1/−0
- libs/contrib/Control/Algebra/NumericInstances.idr +1/−0
- libs/contrib/Control/Algebra/VectorSpace.idr +2/−0
- libs/contrib/Control/Isomorphism/Primitives.idr +1/−1
- libs/contrib/Control/Partial.idr +1/−1
- libs/contrib/Control/WellFounded.idr +1/−1
- libs/contrib/Data/BoundedList.idr +1/−1
- libs/contrib/Data/CoList.idr +1/−1
- libs/contrib/Data/Fun.idr +1/−0
- libs/contrib/Data/Hash.idr +1/−1
- libs/contrib/Data/Heap.idr +2/−2
- libs/contrib/Data/Matrix.idr +1/−0
- libs/contrib/Data/Matrix/Algebraic.idr +1/−1
- libs/contrib/Data/Matrix/Numeric.idr +1/−0
- libs/contrib/Data/Nat/DivMod.idr +1/−0
- libs/contrib/Data/Nat/DivMod/IteratedSubtraction.idr +1/−1
- libs/contrib/Data/Rel.idr +1/−0
- libs/contrib/Data/Sign.idr +2/−0
- libs/contrib/Data/SortedMap.idr +7/−8
- libs/contrib/Data/SortedSet.idr +7/−7
- libs/contrib/Data/Storable.idr +41/−0
- libs/contrib/Data/ZZ.idr +1/−1
- libs/contrib/Decidable/Decidable.idr +1/−1
- libs/contrib/Decidable/Order.idr +1/−1
- libs/contrib/Network/Cgi.idr +11/−11
- libs/contrib/Network/Socket.idr +7/−8
- libs/contrib/System/Concurrency/Process.idr +10/−2
- libs/contrib/contrib.ipkg +3/−1
- libs/effects/Effect/Default.idr +2/−0
- libs/effects/Effect/Exception.idr +2/−0
- libs/effects/Effect/File.idr +5/−4
- libs/effects/Effect/Logging/Category.idr +2/−2
- libs/effects/Effect/Logging/Default.idr +2/−2
- libs/effects/Effect/Logging/Level.idr +1/−1
- libs/effects/Effect/Memory.idr +9/−3
- libs/effects/Effect/Monad.idr +2/−0
- libs/effects/Effect/Perf.idr +1/−1
- libs/effects/Effect/Random.idr +2/−0
- libs/effects/Effect/Select.idr +2/−0
- libs/effects/Effect/State.idr +1/−1
- libs/effects/Effect/StdIO.idr +2/−0
- libs/effects/Effect/System.idr +2/−0
- libs/effects/Effect/Trans.idr +1/−1
- libs/effects/Effects.idr +25/−1
- libs/prelude/Builtins.idr +39/−17
- libs/prelude/Decidable/Equality.idr +4/−5
- libs/prelude/IO.idr +92/−30
- libs/prelude/Language/Reflection.idr +3/−3
- libs/prelude/Language/Reflection/Elab.idr +54/−2
- libs/prelude/Language/Reflection/Errors.idr +3/−1
- libs/prelude/Prelude.idr +9/−9
- libs/prelude/Prelude/Algebra.idr +1/−1
- libs/prelude/Prelude/Applicative.idr +3/−1
- libs/prelude/Prelude/Basics.idr +6/−4
- libs/prelude/Prelude/Bits.idr +2/−2
- libs/prelude/Prelude/Bool.idr +2/−0
- libs/prelude/Prelude/Cast.idr +2/−0
- libs/prelude/Prelude/Chars.idr +3/−3
- libs/prelude/Prelude/Classes.idr +0/−404
- libs/prelude/Prelude/Doubles.idr +4/−6
- libs/prelude/Prelude/Either.idr +3/−1
- libs/prelude/Prelude/File.idr +62/−20
- libs/prelude/Prelude/Foldable.idr +4/−5
- libs/prelude/Prelude/Functor.idr +7/−5
- libs/prelude/Prelude/Interactive.idr +18/−19
- libs/prelude/Prelude/Interfaces.idr +404/−0
- libs/prelude/Prelude/List.idr +5/−6
- libs/prelude/Prelude/Maybe.idr +2/−2
- libs/prelude/Prelude/Monad.idr +12/−4
- libs/prelude/Prelude/Nat.idr +19/−19
- libs/prelude/Prelude/Pairs.idr +15/−7
- libs/prelude/Prelude/Providers.idr +4/−1
- libs/prelude/Prelude/Show.idr +4/−3
- libs/prelude/Prelude/Stream.idr +7/−3
- libs/prelude/Prelude/Strings.idr +4/−3
- libs/prelude/Prelude/Traversable.idr +2/−0
- libs/prelude/Prelude/Uninhabited.idr +2/−0
- libs/prelude/prelude.ipkg +1/−2
- libs/pruviloj/Pruviloj/Core.idr +2/−0
- libs/pruviloj/Pruviloj/Derive/DecEq.idr +1/−1
- libs/pruviloj/Pruviloj/Derive/Eliminators.idr +1/−1
- libs/pruviloj/Pruviloj/Disjoint.idr +1/−1
- libs/pruviloj/Pruviloj/Induction.idr +1/−1
- libs/pruviloj/Pruviloj/Injective.idr +1/−1
- libs/pruviloj/Pruviloj/Internals.idr +2/−0
- libs/pruviloj/Pruviloj/Internals/TyConInfo.idr +1/−1
- libs/pruviloj/Pruviloj/Renamers.idr +2/−0
- rts/idris_bitstring.c +35/−0
- rts/idris_bitstring.h +10/−0
- rts/idris_gmp.c +13/−0
- rts/idris_gmp.h +2/−0
- rts/idris_rts.c +25/−5
- rts/idris_rts.h +7/−1
- samples/tutorial/interp.idr +1/−1
- src/IRTS/CodegenC.hs +185/−23
- src/IRTS/CodegenCommon.hs +0/−10
- src/IRTS/Compiler.hs +1/−1
- src/IRTS/System.hs +9/−25
- src/Idris/ASTUtils.hs +1/−4
- src/Idris/AbsSyntax.hs +111/−52
- src/Idris/AbsSyntaxTree.hs +475/−463
- src/Idris/CaseSplit.hs +3/−2
- src/Idris/Colours.hs +6/−6
- src/Idris/Completion.hs +7/−7
- src/Idris/Core/Binary.hs +4/−3
- src/Idris/Core/CaseTree.hs +2/−2
- src/Idris/Core/DeepSeq.hs +2/−1
- src/Idris/Core/Evaluate.hs +20/−13
- src/Idris/Core/ProofState.hs +10/−1
- src/Idris/Core/TT.hs +4/−4
- src/Idris/Coverage.hs +45/−22
- src/Idris/DeepSeq.hs +9/−7
- src/Idris/Delaborate.hs +10/−4
- src/Idris/Directives.hs +6/−2
- src/Idris/Docs.hs +3/−3
- src/Idris/Elab/Class.hs +16/−2
- src/Idris/Elab/Clause.hs +68/−36
- src/Idris/Elab/Data.hs +12/−7
- src/Idris/Elab/Instance.hs +19/−12
- src/Idris/Elab/Quasiquote.hs +173/−0
- src/Idris/Elab/Record.hs +1/−1
- src/Idris/Elab/Term.hs +15/−15
- src/Idris/Elab/Type.hs +18/−5
- src/Idris/Elab/Utils.hs +27/−9
- src/Idris/Elab/Value.hs +2/−2
- src/Idris/ElabDecls.hs +2/−2
- src/Idris/ElabQuasiquote.hs +0/−175
- src/Idris/IBC.hs +98/−67
- src/Idris/IdrisDoc.hs +3/−3
- src/Idris/Interactive.hs +77/−45
- src/Idris/ParseData.hs +0/−338
- src/Idris/ParseExpr.hs +0/−1553
- src/Idris/ParseHelpers.hs +0/−668
- src/Idris/ParseOps.hs +0/−173
- src/Idris/Parser.hs +71/−54
- src/Idris/Parser/Data.hs +338/−0
- src/Idris/Parser/Expr.hs +1552/−0
- src/Idris/Parser/Helpers.hs +701/−0
- src/Idris/Parser/Ops.hs +172/−0
- src/Idris/ProofSearch.hs +40/−57
- src/Idris/Prover.hs +24/−7
- src/Idris/REPL.hs +43/−37
- src/Idris/REPL/Browse.hs +2/−1
- src/Idris/REPL/Parser.hs +526/−0
- src/Idris/REPLParser.hs +0/−526
- src/Idris/Reflection.hs +6/−5
- src/Pkg/PParser.hs +3/−3
- src/Pkg/Package.hs +1/−1
- src/Util/ScreenSize.hs +10/−7
- src/Util/System.hs +0/−4
- stack.yaml +4/−1
- test/Makefile +23/−13
- test/basic001/run +2/−2
- test/basic002/run +1/−1
- test/basic003/run +1/−1
- test/basic004/run +1/−1
- test/basic005/run +1/−1
- test/basic006/run +2/−2
- test/basic007/run +1/−1
- test/basic008/run +1/−1
- test/basic009/A.idr +1/−0
- test/basic009/B/C.idr +1/−0
- test/basic009/run +3/−3
- test/basic011/run +1/−1
- test/basic012/run +1/−1
- test/basic013/run +1/−1
- test/basic014/run +1/−1
- test/basic015/run +1/−1
- test/basic016/run +1/−1
- test/basic017/basic017.idr +25/−0
- test/basic017/basic017a.idr +15/−0
- test/basic017/expected +3/−0
- test/basic017/run +4/−0
- test/bignum001/run +1/−1
- test/bignum002/run +1/−1
- test/classes001/run +1/−1
- test/corecords001/run +1/−1
- test/corecords002/run +1/−1
- test/delab001/run +1/−1
- test/disambig002/disambig002.idr +10/−12
- test/disambig002/run +1/−1
- test/docs001/run +1/−1
- test/docs002/run +1/−1
- test/docs003/expected +1/−1
- test/docs003/run +1/−1
- test/dsl001/run +1/−1
- test/dsl001/test001.idr +1/−1
- test/dsl002/Resimp.idr +3/−1
- test/dsl002/run +1/−1
- test/dsl003/run +1/−1
- test/dsl004/run +3/−3
- test/effects001/run +2/−2
- test/effects002/run +1/−1
- test/effects003/VectMissing.idr +1/−3
- test/effects003/run +1/−1
- test/effects004/run +1/−1
- test/effects005/run +2/−2
- test/error001/run +1/−1
- test/error002/run +1/−1
- test/error003/run +1/−1
- test/error004/run +1/−1
- test/error005/run +1/−1
- test/ffi001/run +1/−1
- test/ffi002/run +1/−1
- test/ffi003/run +1/−1
- test/ffi004/run +1/−1
- test/ffi005/run +1/−1
- test/ffi006/run +1/−1
- test/ffi007/expected +8/−0
- test/ffi007/ffi007.c +30/−0
- test/ffi007/ffi007.h +11/−0
- test/ffi007/ffi007.idr +49/−0
- test/ffi007/run +4/−0
- test/folding001/run +1/−1
- test/idrisdoc001/run +1/−1
- test/idrisdoc002/TestFunctions.idr +1/−0
- test/idrisdoc002/run +1/−1
- test/idrisdoc003/TestDatatypes.idr +1/−0
- test/idrisdoc003/run +1/−1
- test/idrisdoc004/TestTypeclasses.idr +1/−0
- test/idrisdoc004/run +1/−1
- test/idrisdoc005/TestTracing.idr +1/−0
- test/idrisdoc005/run +1/−1
- test/idrisdoc006/A/fully/Qualified/NAME.idr +1/−1
- test/idrisdoc006/B.idr +1/−0
- test/idrisdoc006/run +2/−2
- test/idrisdoc007/run +1/−1
- test/idrisdoc008/Abstract.idr +1/−1
- test/idrisdoc008/Visible.idr +1/−1
- test/idrisdoc008/run +1/−1
- test/idrisdoc009/Test.idr +2/−0
- test/idrisdoc009/run +1/−1
- test/interactive001/run +1/−1
- test/interactive002/expected +1/−1
- test/interactive002/run +1/−1
- test/interactive003/expected +1/−1
- test/interactive003/run +1/−1
- test/interactive004/expected +1/−1
- test/interactive004/run +1/−1
- test/interactive005/run +1/−1
- test/interactive006/run +1/−1
- test/interactive007/run +1/−1
- test/interactive008/run +1/−1
- test/interactive009/expected +1/−1
- test/interactive009/run +1/−1
- test/interactive010/expected +3/−3
- test/interactive010/run +1/−1
- test/interactive011/run +1/−1
- test/interactive012/run +1/−1
- test/io001/run +1/−1
- test/io001/test004.idr +1/−1
- test/io002/run +1/−1
- test/io003/run +2/−2
- test/literate001/Lit.lidr +2/−2
- test/literate001/run +2/−2
- test/meta001/run +1/−1
- test/meta002/AgdaStyleReflection.idr +95/−9
- test/meta002/Tacs.idr +4/−5
- test/meta002/expected +2/−2
- test/meta002/run +2/−2
- test/meta004/run +1/−1
- test/pkg001/run +1/−1
- test/primitives001/run +2/−2
- test/primitives003/run +1/−1
- test/primitives005/expected +2/−0
- test/primitives005/primitives005.idr +24/−0
- test/primitives005/run +5/−0
- test/proof001/run +1/−1
- test/proof002/Reflect.idr +3/−4
- test/proof002/expected +4/−4
- test/proof002/run +2/−2
- test/proof002/test030.idr +0/−1
- test/proof003/Parity.idr +2/−0
- test/proof003/expected +2/−2
- test/proof003/run +1/−1
- test/proof004/run +1/−1
- test/proof005/run +1/−1
- test/proof006/run +1/−1
- test/proof007/run +1/−1
- test/proof008/run +1/−1
- test/proof009/run +1/−1
- test/proof010/run +1/−1
- test/proofsearch001/run +1/−1
- test/proofsearch002/Process.idr +1/−1
- test/proofsearch002/run +1/−1
- test/proofsearch003/run +1/−1
- test/pruviloj001/run +1/−1
- test/quasiquote001/run +1/−1
- test/quasiquote002/run +1/−1
- test/quasiquote003/run +1/−1
- test/quasiquote004/run +1/−1
- test/quasiquote005/run +1/−1
- test/quasiquote006/run +1/−1
- test/records001/run +1/−1
- test/records002/run +1/−1
- test/records003/run +1/−1
- test/reg001/reg001.idr +13/−14
- test/reg001/run +1/−1
- test/reg002/run +1/−1
- test/reg003/run +2/−2
- test/reg004/run +1/−1
- test/reg005/expected +3/−0
- test/reg005/reg005.idr +9/−0
- test/reg005/run +4/−0
- test/reg006/run +1/−1
- test/reg007/A.lidr +1/−1
- test/reg007/run +1/−1
- test/reg010/run +1/−1
- test/reg013/run +1/−1
- test/reg016/run +1/−1
- test/reg017/run +1/−1
- test/reg018/expected +2/−0
- test/reg018/reg018b.idr +1/−1
- test/reg018/run +4/−4
- test/reg020/run +1/−1
- test/reg023/run +1/−1
- test/reg024/run +1/−1
- test/reg025/run +1/−1
- test/reg027/run +2/−2
- test/reg028/run +2/−2
- test/reg029/run +2/−2
- test/reg031/run +1/−1
- test/reg032/run +1/−1
- test/reg034/run +1/−1
- test/reg035/run +3/−3
- test/reg036/run +1/−1
- test/reg037/run +1/−1
- test/reg038/run +1/−1
- test/reg040/run +1/−1
- test/reg041/run +2/−2
- test/reg042/run +1/−1
- test/reg044/run +1/−1
- test/reg045/run +1/−1
- test/reg046/run +1/−1
- test/reg047/run +2/−2
- test/reg048/run +1/−1
- test/reg049/run +1/−1
- test/reg050/run +3/−3
- test/reg051-disabled/run +1/−1
- test/reg052/run +1/−1
- test/reg053/run +1/−1
- test/reg054/run +1/−1
- test/reg055/run +2/−2
- test/reg056/run +1/−1
- test/reg057/run +1/−1
- test/reg058/run +2/−2
- test/reg059/run +1/−1
- test/reg060/run +1/−1
- test/reg061/run +1/−1
- test/reg062/run +2/−2
- test/reg063/run +1/−1
- test/reg064/reg064.idr +6/−7
- test/reg064/run +1/−1
- test/reg065/run +1/−1
- test/reg066/run +1/−1
- test/reg067/run +1/−1
- test/reg068/expected +7/−0
- test/reg068/reg068.idr too large to diff
- test/reg068/run too large to diff
- test/reg069/Mod.idr too large to diff
- test/reg069/expected too large to diff
- test/reg069/reg069.idr too large to diff
- test/reg069/run too large to diff
- test/reg070/expected too large to diff
- test/reg070/reg070.idr too large to diff
- test/reg070/run too large to diff
- test/runtest.hs too large to diff
- test/runtest.pl too large to diff
- test/sourceLocation001/run too large to diff
- test/sugar001/run too large to diff
- test/sugar002/run too large to diff
- test/sugar003/run too large to diff
- test/sugar004/run too large to diff
- test/sugar005/run too large to diff
- test/syntax001/expected too large to diff
- test/syntax001/run too large to diff
- test/syntax002/run too large to diff
- test/tactics001/run too large to diff
- test/totality001/run too large to diff
- test/totality002/run too large to diff
- test/totality003/run too large to diff
- test/totality004/run too large to diff
- test/totality005/run too large to diff
- test/totality006/run too large to diff
- test/totality007/run too large to diff
- test/totality008/run too large to diff
- test/totality009/run too large to diff
- test/totality010/run too large to diff
- test/totality011/expected too large to diff
- test/totality011/run too large to diff
- test/totality011/totality011.lidr too large to diff
- test/tutorial001/run too large to diff
- test/tutorial002/run too large to diff
- test/tutorial003/run too large to diff
- test/tutorial004/run too large to diff
- test/tutorial005/run too large to diff
- test/tutorial006/expected too large to diff
- test/tutorial006/run too large to diff
- test/unique001/run too large to diff
- test/unique001/unique001c.idr too large to diff
- test/unique002/run too large to diff
- test/unique003/run too large to diff
@@ -1,3 +1,69 @@+New in 0.11:+============++Updated export rules+--------------------++* The export rules are:+ - 'private' means that the definition is not exported at all+ - 'export' means that the top level type is exported, but not the+ definition. In the case of 'data', this means the type constructor is+ exported but not the data constructors.+ - 'public export' means that the entire definition is exported.+* By default, names are 'private'. This can be altered with an %access+ directive as before.+* Exported types can only refer to other exported names+* Publicly exported definitions can only refer to publicly exported names++Improved C FFI+--------------++* Idris functions can now be passed as callbacks to C functions or wrapped+in a C function pointer.+* C function pointers can be called.+* Idris can access pointers to C globals.++Minor language changes+----------------------++* The '[static]' annotation is changed to '%static' to be consistent with the+ other annotations.+* Added '%auto_implicits' directive. The default is '%auto_implicits on'.+ Placing '%auto_implicits off' in a source file means that after that+ point, any implicit arguments must be bound, e.g.:+ append : {n,m,a:_} -> Vect n a -> Vect m a -> Vect (n + m) a++ Only names which are used explicitly in the type need to be bound, e.g.:+ Here : {x, xs : _} -> Elem x (x :: xs)++ In 'Here', there is no need to bind any of the variables in the type of+ 'xs' (it could be e.g. List a or Vect n a; 'a' and 'n' will still be+ implicitly bound).++ You can still implicitly bind with 'using':++ using (xs : Vect _ _)+ data Elem : {a, n : _} -> a -> Vect n a -> Type where+ Here : {x : _} -> Elem x (x :: xs)+ There : {x, y : _} -> Elem x xs -> Elem x (y :: xs)++ However, note that *only* names which appear in *both* the using block+ *and* the type being defined will be implicitly bound. The following will+ therefore fail because 'n' isn't implicitly bound:++ using (xs : Vect n a)+ bad : Elem x xs -> Elem x (y :: xs)+* `Sigma` has been renamed to `DPair`.+* Accessor functions for dependent pairs have been renamed to bring them into+ line with standard accessor functions for pairs. The function `getWitness`+ is now `fst`, and `getProof` is `snd`.+* File Modes expanded: Append, ReadWriteTruncate, and ReadAppend added,+ Write is deprecated and renamed to WriteTruncate.+* C11 Extended Mode variations added to File Modes.+* More flexible holes.+ Holes can now depend on other holes in a term (such as implicit arguments+ which may be inferred from the definition of the hole).+ New in 0.10: ============
@@ -32,6 +32,7 @@ Tom Prince raichoo Philip Rasmussen+Aistis Raulinaitis Reynir Reynisson Adam Sandberg Eriksson Seo Sanghyeon
@@ -20,24 +20,13 @@ test: doc test_c test_c:- $(MAKE) -C test IDRIS=../dist/build/idris--test_java:- $(MAKE) -C test IDRIS=../dist/build/idris test_java--test_llvm:- $(MAKE) -C test IDRIS=../dist/build/idris test_llvm+ $(MAKE) -C test IDRIS=../dist/build/idris/idris test test_js:- $(MAKE) -C test IDRIS=../dist/build/idris test_js--test_all:- $(MAKE) test- $(MAKE) test_llvm- $(MAKE) test_java+ $(MAKE) -C test IDRIS=../dist/build/idris/idris test_js test_timed:- $(MAKE) -C test IDRIS=../dist/build/idris time+ $(MAKE) -C test IDRIS=../dist/build/idris/idris time lib_clean: $(MAKE) -C libs IDRIS=../../dist/build/idris/idris RTS=../../dist/build/rts/libidris_rts clean
@@ -10,6 +10,7 @@ import qualified Distribution.Simple.Setup as S import qualified Distribution.Simple.Program as P import Distribution.Simple.Utils (createDirectoryIfMissingVerbose, rewriteFile)+import Distribution.Compiler import Distribution.PackageDescription import Distribution.Text @@ -45,6 +46,9 @@ make verbosity = P.runProgramInvocation verbosity . P.simpleProgramInvocation mymake +#ifdef mingw32_HOST_OS+windres verbosity = P.runProgramInvocation verbosity . P.simpleProgramInvocation "windres"+#endif -- ----------------------------------------------------------------------------- -- Flags @@ -198,6 +202,20 @@ let buildinfo = (emptyBuildInfo { cppOptions = ["-DVERSION="++hash] }) :: BuildInfo return (Just buildinfo, []) +++idrisPreBuild args flags = do+#ifdef mingw32_HOST_OS+ createDirectoryIfMissingVerbose verbosity True dir+ windres verbosity ["icons/idris_icon.rc","-o", dir++"idris_icon.o"]+ return (Nothing, [("idris", emptyBuildInfo { ldOptions = [dir ++ "idris_icon.o"] })])+ where+ verbosity = S.fromFlag $ S.buildVerbosity flags+ dir = S.fromFlagOrDefault "dist" $ S.buildDistPref flags+#else+ return (Nothing, [])+#endif+ idrisBuild _ flags _ local = unless (execOnly (configFlags local)) $ do buildStdLib buildRTS@@ -247,6 +265,7 @@ main = defaultMainWithHooks $ simpleUserHooks { postClean = idrisClean , postConf = idrisConfigure+ , preBuild = idrisPreBuild , postBuild = idrisBuild , postCopy = \_ flags pkg local -> idrisInstall (S.fromFlag $ S.copyVerbosity flags)
@@ -5,6 +5,8 @@ import Solver +%access public export+ ParseErr : Type ParseErr = String
@@ -6,6 +6,7 @@ import Data.Vect.Quantifiers %default total+%access public export Cell : Nat -> Type Cell n = Maybe (Fin n)@@ -32,7 +33,7 @@ addLine : List Char -> List Char -> List Char addLine w s = w ++ ('\n' :: s) -instance Show (Board n) where+Show (Board n) where show (MkBoard rs) = unlines (map showRow rs) updateAt : Fin n -> Vect n a -> (a -> a) -> Vect n a
binary file changed (absent → 19427 bytes)
@@ -0,0 +1,1 @@+0 ICON "idris.ico"
binary file changed (287080 → 326385 bytes)
@@ -1,5 +1,5 @@ Name: idris-Version: 0.10+Version: 0.10.1 License: BSD3 License-file: LICENSE Author: Edwin Brady@@ -150,7 +150,7 @@ libs/pruviloj/Pruviloj/Internals/*.idr test/Makefile- test/runtest.pl+ test/runtest.hs test/reg001/run test/reg001/*.idr test/reg001/expected@@ -163,6 +163,9 @@ test/reg004/run test/reg004/*.idr test/reg004/expected+ test/reg005/run+ test/reg005/*.idr+ test/reg005/expected test/reg006/run test/reg006/*.idr test/reg006/expected@@ -311,6 +314,15 @@ test/reg067/run test/reg067/*.idr test/reg067/expected+ test/reg068/run+ test/reg068/*.idr+ test/reg068/expected+ test/reg069/run+ test/reg069/*.idr+ test/reg069/expected+ test/reg070/run+ test/reg070/*.idr+ test/reg070/expected test/basic001/run test/basic001/*.idr@@ -361,6 +373,9 @@ test/basic016/run test/basic016/*.idr test/basic016/expected+ test/basic017/run+ test/basic017/*.idr+ test/basic017/expected test/bignum001/run test/bignum001/*.idr@@ -462,6 +477,11 @@ test/ffi006/*.c test/ffi006/run test/ffi006/expected+ test/ffi007/*.idr+ test/ffi007/*.c+ test/ffi007/*.h+ test/ffi007/run+ test/ffi007/expected test/folding001/*.idr test/folding001/run@@ -585,6 +605,9 @@ test/primitives003/run test/primitives003/*.idr test/primitives003/expected+ test/primitives005/run+ test/primitives005/*.idr+ test/primitives005/expected test/pkg001/run test/pkg001/test.ipkg@@ -728,6 +751,9 @@ test/totality010/run test/totality010/*.idr test/totality010/expected+ test/totality011/run+ test/totality011/*.lidr+ test/totality011/expected test/tutorial001/run test/tutorial001/*.idr@@ -788,6 +814,9 @@ benchmarks/trivial/sortvec.idr benchmarks/trivial/sortvec.ipkg + icons/idris_icon.rc+ icons/idris.ico+ source-repository head type: git location: git://github.com/idris-lang/Idris-dev.git@@ -859,6 +888,7 @@ , Idris.Elab.Transform , Idris.Elab.Value , Idris.Elab.Term+ , Idris.Elab.Quasiquote , Idris.REPL.Browse @@ -879,7 +909,6 @@ , Idris.Docs , Idris.Docstrings , Idris.ElabDecls- , Idris.ElabQuasiquote , Idris.Erasure , Idris.Error , Idris.ErrReverse@@ -892,10 +921,10 @@ , Idris.Interactive , Idris.Output , Idris.Parser- , Idris.ParseHelpers- , Idris.ParseOps- , Idris.ParseExpr- , Idris.ParseData+ , Idris.Parser.Helpers+ , Idris.Parser.Ops+ , Idris.Parser.Expr+ , Idris.Parser.Data , Idris.PartialEval , Idris.Primitives , Idris.ProofSearch@@ -903,7 +932,7 @@ , Idris.Providers , Idris.Reflection , Idris.REPL- , Idris.REPLParser+ , Idris.REPL.Parser , Idris.Transforms , Idris.TypeSearch , Idris.Unlit@@ -978,7 +1007,8 @@ , zip-archive > 0.2.3.5 && < 0.2.4 , safe , fsnotify < 2.2- , async < 2.1+ , async < 2.2+ -- zlib >= 0.6.1 is broken with GHC < 7.10.3 if impl(ghc < 7.10.3) build-depends: zlib < 0.6.1@@ -992,7 +1022,6 @@ , TemplateHaskell ghc-prof-options: -auto-all -caf-all- ghc-options: -threaded -rtsopts if os(linux) cpp-options: -DLINUX@@ -1035,6 +1064,24 @@ , directory , haskeline >= 0.7 , transformers++ ghc-prof-options: -auto-all -caf-all+ ghc-options: -threaded -rtsopts -funbox-strict-fields++Test-suite regression-and-sanity-tests+ Type: exitcode-stdio-1.0+ Main-is: runtest.hs+ hs-source-dirs: test++ Build-depends: idris+ , base+ , containers+ , process+ , time+ , filepath+ , directory+ , haskeline >= 0.7+ , transformers ghc-prof-options: -auto-all -caf-all ghc-options: -threaded -rtsopts -funbox-strict-fields
@@ -3,7 +3,7 @@ import Data.Morphisms import Control.Category -%access public+%access public export infixr 5 <++> infixr 3 ***
@@ -2,6 +2,8 @@ import Control.IOExcept +%access public export+ interface Catchable (m : Type -> Type) t where throw : t -> m a catch : m a -> (t -> m a) -> m a
@@ -2,7 +2,7 @@ import Data.Morphisms -%access public+%access public export interface Category (cat : Type -> Type -> Type) where id : cat a a
@@ -1,5 +1,7 @@ module Control.IOExcept +%access public export+ -- An IO monad with exception handling record IOExcept' (f:FFI) err a where
@@ -4,6 +4,7 @@ import Data.Fin %default total+%access public export ||| An isomorphism between two types data Iso : Type -> Type -> Type where
@@ -1,6 +1,8 @@ module Control.Monad.Identity -public record Identity (a : Type) where+%access public export++public export record Identity (a : Type) where constructor Id runIdentity : a
@@ -5,7 +5,7 @@ import Control.Monad.Writer import Control.Monad.Reader -%access public+%access public export ||| A combination of the Reader, Writer, and State monads interface (Monoid w, MonadReader r m, MonadWriter w m, MonadState s m) => MonadRWS r w s (m : Type -> Type) where {}
@@ -4,7 +4,7 @@ import Control.Monad.Identity import Control.Monad.Trans -%access public+%access public export ||| A monad representing a computation that runs in an immutable context interface Monad m => MonadReader r (m : Type -> Type) where
@@ -3,7 +3,7 @@ import public Control.Monad.Identity import public Control.Monad.Trans -%access public+%access public export ||| A computation which runs in a context and produces an output interface Monad m => MonadState s (m : Type -> Type) | m where
@@ -1,4 +1,6 @@ module Control.Monad.Trans +%access public export+ interface MonadTrans (t : (Type -> Type) -> Type -> Type) where lift : Monad m => m a -> t m a
@@ -4,7 +4,7 @@ import Control.Monad.Identity import Control.Monad.Trans -%access public+%access public export ||| A monad representing a computation that produces a stream of output interface (Monoid w, Monad m) => MonadWriter w (m : Type -> Type) where
@@ -4,7 +4,7 @@ %default total -public+public export nextPow2 : Nat -> Nat nextPow2 Z = Z nextPow2 (S x) = if (S x) == (2 `power` l2x)@@ -13,11 +13,11 @@ where l2x = log2NZ (S x) SIsNotZ -public+public export nextBytes : Nat -> Nat nextBytes bits = (nextPow2 (divCeilNZ bits 8 SIsNotZ)) -public+public export machineTy : Nat -> Type machineTy Z = Bits8 machineTy (S Z) = Bits16@@ -47,7 +47,7 @@ getPad : Nat -> machineTy n getPad n = natToBits (minus (bitsUsed (nextBytes n)) n) -public+public export data Bits : Nat -> Type where MkBits : machineTy (nextBytes n) -> Bits n @@ -92,6 +92,10 @@ where pad = getPad {n=3} n +-- TODO: This (and all the other functions along these lings) is public export+-- because it is used by public export things. Do they really need to be+-- public export, or is export good enough?+public export shiftLeft' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) shiftLeft' {n=n} x c with (nextBytes n) | Z = pad8' n prim__shlB8 x c@@ -99,10 +103,11 @@ | S (S Z) = pad32' n prim__shlB32 x c | S (S (S _)) = pad64' n prim__shlB64 x c -public+public export shiftLeft : Bits n -> Bits n -> Bits n shiftLeft (MkBits x) (MkBits y) = MkBits (shiftLeft' x y) +public export shiftRightLogical' : machineTy n -> machineTy n -> machineTy n shiftRightLogical' {n=n} x c with (n) | Z = prim__lshrB8 x c@@ -110,11 +115,12 @@ | S (S Z) = prim__lshrB32 x c | S (S (S _)) = prim__lshrB64 x c -public+public export shiftRightLogical : Bits n -> Bits n -> Bits n shiftRightLogical {n} (MkBits x) (MkBits y) = MkBits {n} (shiftRightLogical' {n=nextBytes n} x y) +public export shiftRightArithmetic' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) shiftRightArithmetic' {n=n} x c with (nextBytes n) | Z = pad8' n prim__ashrB8 x c@@ -122,10 +128,11 @@ | S (S Z) = pad32' n prim__ashrB32 x c | S (S (S _)) = pad64' n prim__ashrB64 x c -public+public export shiftRightArithmetic : Bits n -> Bits n -> Bits n shiftRightArithmetic (MkBits x) (MkBits y) = MkBits (shiftRightArithmetic' x y) +public export and' : machineTy n -> machineTy n -> machineTy n and' {n=n} x y with (n) | Z = prim__andB8 x y@@ -133,10 +140,11 @@ | S (S Z) = prim__andB32 x y | S (S (S _)) = prim__andB64 x y -public+public export and : Bits n -> Bits n -> Bits n and {n} (MkBits x) (MkBits y) = MkBits (and' {n=nextBytes n} x y) +public export or' : machineTy n -> machineTy n -> machineTy n or' {n=n} x y with (n) | Z = prim__orB8 x y@@ -144,10 +152,11 @@ | S (S Z) = prim__orB32 x y | S (S (S _)) = prim__orB64 x y -public+public export or : Bits n -> Bits n -> Bits n or {n} (MkBits x) (MkBits y) = MkBits (or' {n=nextBytes n} x y) +public export xor' : machineTy n -> machineTy n -> machineTy n xor' {n=n} x y with (n) | Z = prim__xorB8 x y@@ -155,10 +164,11 @@ | S (S Z) = prim__xorB32 x y | S (S (S _)) = prim__xorB64 x y -public+public export xor : Bits n -> Bits n -> Bits n xor {n} (MkBits x) (MkBits y) = MkBits {n} (xor' {n=nextBytes n} x y) +public export plus' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) plus' {n=n} x y with (nextBytes n) | Z = pad8 n prim__addB8 x y@@ -166,10 +176,11 @@ | S (S Z) = pad32 n prim__addB32 x y | S (S (S _)) = pad64 n prim__addB64 x y -public+public export plus : Bits n -> Bits n -> Bits n plus (MkBits x) (MkBits y) = MkBits (plus' x y) +public export minus' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) minus' {n=n} x y with (nextBytes n) | Z = pad8 n prim__subB8 x y@@ -177,10 +188,11 @@ | S (S Z) = pad32 n prim__subB32 x y | S (S (S _)) = pad64 n prim__subB64 x y -public+public export minus : Bits n -> Bits n -> Bits n minus (MkBits x) (MkBits y) = MkBits (minus' x y) +public export times' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) times' {n=n} x y with (nextBytes n) | Z = pad8 n prim__mulB8 x y@@ -188,11 +200,12 @@ | S (S Z) = pad32 n prim__mulB32 x y | S (S (S _)) = pad64 n prim__mulB64 x y -public+public export times : Bits n -> Bits n -> Bits n times (MkBits x) (MkBits y) = MkBits (times' x y) partial+public export sdiv' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) sdiv' {n=n} x y with (nextBytes n) | Z = prim__sdivB8 x y@@ -200,11 +213,12 @@ | S (S Z) = prim__sdivB32 x y | S (S (S _)) = prim__sdivB64 x y -public partial+public export partial sdiv : Bits n -> Bits n -> Bits n sdiv (MkBits x) (MkBits y) = MkBits (sdiv' x y) partial+public export udiv' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) udiv' {n=n} x y with (nextBytes n) | Z = prim__udivB8 x y@@ -212,11 +226,11 @@ | S (S Z) = prim__udivB32 x y | S (S (S _)) = prim__udivB64 x y -public partial+public export partial udiv : Bits n -> Bits n -> Bits n udiv (MkBits x) (MkBits y) = MkBits (udiv' x y) -partial+public export partial srem' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) srem' {n=n} x y with (nextBytes n) | Z = prim__sremB8 x y@@ -224,11 +238,11 @@ | S (S Z) = prim__sremB32 x y | S (S (S _)) = prim__sremB64 x y -public partial+public export partial srem : Bits n -> Bits n -> Bits n srem (MkBits x) (MkBits y) = MkBits (srem' x y) -partial+public export partial urem' : machineTy (nextBytes n) -> machineTy (nextBytes n) -> machineTy (nextBytes n) urem' {n=n} x y with (nextBytes n) | Z = prim__uremB8 x y@@ -236,7 +250,7 @@ | S (S Z) = prim__uremB32 x y | S (S (S _)) = prim__uremB64 x y -public partial+public export partial urem : Bits n -> Bits n -> Bits n urem (MkBits x) (MkBits y) = MkBits (urem' x y) @@ -276,9 +290,11 @@ | S (S Z) = prim__gtB32 x y | S (S (S _)) = prim__gtB64 x y +public export implementation Eq (Bits n) where (MkBits x) == (MkBits y) = boolOp eq x y +public export implementation Ord (Bits n) where (MkBits x) < (MkBits y) = boolOp lt x y (MkBits x) <= (MkBits y) = boolOp lte x y@@ -291,6 +307,7 @@ then EQ else GT +public export complement' : machineTy (nextBytes n) -> machineTy (nextBytes n) complement' {n=n} x with (nextBytes n) | Z = let pad = getPad {n=0} n in@@ -302,12 +319,12 @@ | S (S (S _)) = let pad = getPad {n=3} n in prim__complB64 (x `prim__shlB64` pad) `prim__lshrB64` pad -public+public export complement : Bits n -> Bits n complement (MkBits x) = MkBits (complement' x) -- TODO: Prove-%assert_total -- can't verify coverage of with block+public export %assert_total -- can't verify coverage of with block zext' : machineTy (nextBytes n) -> machineTy (nextBytes (n+m)) zext' {n=n} {m=m} x with (nextBytes n, nextBytes (n+m)) | (Z, Z) = believe_me x@@ -321,11 +338,11 @@ | (S (S Z), S (S (S _))) = believe_me (prim__zextB32_B64 (believe_me x)) | (S (S (S _)), S (S (S _))) = believe_me x -public+public export zeroExtend : Bits n -> Bits (n+m) zeroExtend (MkBits x) = MkBits (zext' x) -%assert_total+public export %assert_total intToBits' : Integer -> machineTy (nextBytes n) intToBits' {n=n} x with (nextBytes n) | Z = let pad = getPad {n=0} n in@@ -337,13 +354,14 @@ | S (S (S _)) = let pad = getPad {n=3} n in prim__lshrB64 (prim__shlB64 (prim__truncBigInt_B64 x) pad) pad -public+public export intToBits : Integer -> Bits n intToBits n = MkBits (intToBits' n) implementation Cast Integer (Bits n) where cast = intToBits +public export bitsToInt' : machineTy (nextBytes n) -> Integer bitsToInt' {n=n} x with (nextBytes n) | Z = prim__zextB8_BigInt x@@ -351,11 +369,12 @@ | S (S Z) = prim__zextB32_BigInt x | S (S (S _)) = prim__zextB64_BigInt x -public+public export bitsToInt : Bits n -> Integer bitsToInt (MkBits x) = bitsToInt' x -- Zero out the high bits of a truncated bitstring+public export zeroUnused : machineTy (nextBytes n) -> machineTy (nextBytes n) zeroUnused {n} x = x `and'` complement' (intToBits' {n=n} 0) @@ -393,12 +412,12 @@ | (S (S (S _)), S (S (S _))) = let pad = getPad {n=3} n in believe_me (prim__ashrB64 (prim__shlB64 (believe_me x) pad) pad) ---public+--public export --signExtend : Bits n -> Bits (n+m) --signExtend {m=m} (MkBits x) = MkBits (zeroUnused (sext' x)) -- TODO: Prove-%assert_total -- can't verify coverage of with block+public export %assert_total -- can't verify coverage of with block trunc' : machineTy (nextBytes (m+n)) -> machineTy (nextBytes n) trunc' {m=m} {n=n} x with (nextBytes n, nextBytes (m+n)) | (Z, Z) = believe_me x@@ -412,23 +431,23 @@ | (S (S Z), S (S (S _))) = believe_me (prim__truncB64_B32 (believe_me x)) | (S (S (S _)), S (S (S _))) = believe_me x -public+public export truncate : Bits (m+n) -> Bits n truncate (MkBits x) = MkBits (zeroUnused (trunc' x)) -public+public export bitAt : Fin n -> Bits n bitAt n = intToBits 1 `shiftLeft` intToBits (cast n) -public+public export getBit : Fin n -> Bits n -> Bool getBit n x = (x `and` (bitAt n)) /= intToBits 0 -public+public export setBit : Fin n -> Bits n -> Bits n setBit n x = x `or` (bitAt n) -public+public export unsetBit : Fin n -> Bits n -> Bits n unsetBit n x = x `and` complement (bitAt n)
@@ -5,6 +5,8 @@ module Data.Complex +%access public export+ ------------------------------ Rectangular form infix 6 :+
@@ -1,6 +1,6 @@ module Data.Erased -%access public+%access public export %default total ||| The erasure monad.
@@ -1,7 +1,7 @@ module Data.Fin %default total-%access public+%access public export ||| Numbers strictly less than some bound. The name comes from "finite sets". |||@@ -149,7 +149,7 @@ , TermPart `(Fin ~(getNat finSize)) , SubReport subErr ]-total+total export finFromIntegerErrors : Err -> Maybe (List ErrorReportPart) finFromIntegerErrors (CantUnify x tm `(IsJust (integerToFin ~(TConst c) ~m)) err xs y) = mkFinIntegerErr (TConst c) m
@@ -2,7 +2,7 @@ import public Data.Vect -%access public+%access public export %default total ||| Heterogeneous vectors where the type index gives, element-wise,
@@ -1,6 +1,6 @@ module Data.List -%access public+%access public export ||| A proof that some element is found in a list. |||@@ -13,7 +13,7 @@ ||| A proof that the element is after the front of the list ||| ||| Example: `the (Elem "b" ["a", "b"]) (There Here)`- There : Elem x xs -> Elem x (y :: xs)+ There : (later : Elem x xs) -> Elem x (y :: xs) implementation Uninhabited (Elem {a} x []) where uninhabited Here impossible
@@ -2,6 +2,8 @@ import Data.List +%access public export+ ||| A proof that some element of a list satisfies some property ||| ||| @ P the property to be satsified
@@ -5,26 +5,27 @@ %default total ||| Integers modulo 2^n-public+public export data Mod2 : Nat -> Type where MkMod2 : {n : Nat} -> Bits n -> Mod2 n +public export modBin : (Bits n -> Bits n -> Bits n) -> Mod2 n -> Mod2 n -> Mod2 n modBin f (MkMod2 x) (MkMod2 y) = MkMod2 (f x y) modComp : (Bits n -> Bits n -> a) -> Mod2 n -> Mod2 n -> a modComp f (MkMod2 x) (MkMod2 y) = f x y -public partial+public export partial div : Mod2 n -> Mod2 n -> Mod2 n div = modBin udiv -public partial+public export partial rem : Mod2 n -> Mod2 n -> Mod2 n rem = modBin urem %assert_total-public+public export intToMod : {n : Nat} -> Integer -> Mod2 n intToMod {n=n} x = MkMod2 (intToBits x)
@@ -1,6 +1,6 @@ module Data.Morphisms -%access public+%access public export data Morphism : Type -> Type -> Type where Mor : (a -> b) -> Morphism a b
@@ -1,6 +1,7 @@ module Data.So %default total+%access public export ||| Ensure that some run-time Boolean test has been performed. |||
@@ -1,5 +1,5 @@ module Data.String-%access public+%access public export private parseNumWithoutSign : List Char -> Integer -> Maybe Integer
@@ -3,7 +3,7 @@ import public Data.Fin import Language.Reflection -%access public+%access public export %default total infixr 7 ::@@ -198,8 +198,12 @@ -- Zips and unzips -------------------------------------------------------------------------------- -||| Combine two equal-length vectors pairwise with some function-zipWith : (a -> b -> c) -> Vect n a -> Vect n b -> Vect n c+||| Combine two equal-length vectors pairwise with some function.+|||+||| @ f the function to combine elements with+||| @ xs the first vector of elements+||| @ ys the second vector of elements+zipWith : (f : a -> b -> c) -> (xs : Vect n a) -> (ys : Vect n b) -> Vect n c zipWith f [] [] = [] zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys @@ -573,11 +577,14 @@ ||| A proof that some element is found in a vector data Elem : a -> Vect k a -> Type where Here : Elem x (x::xs)- There : Elem x xs -> Elem x (y::xs)+ There : (later : Elem x xs) -> Elem x (y::xs) ||| Nothing can be in an empty Vect noEmptyElem : {x : a} -> Elem x [] -> Void noEmptyElem Here impossible++Uninhabited (Elem x []) where+ uninhabited = noEmptyElem ||| An item not in the head and not in the tail is not in the Vect at all neitherHereNorThere : {x, y : a} -> {xs : Vect n a} -> Not (x = y) -> Not (Elem x xs) -> Not (Elem x (y :: xs))
@@ -2,6 +2,8 @@ import Data.Vect +%access public export+ ||| A proof that some element of a vector satisfies some property ||| ||| @ P the property to be satsified
@@ -7,7 +7,7 @@ ||| ||| @ loc The source location to display for the error ||| @ message The error to print-partial+partial export error : {default (%runElab sourceLocation) loc : SourceLocation} -> (message : String) -> a
@@ -3,6 +3,7 @@ ||| Print a message for debugging purposes as a side effect ||| @ msg what to print ||| @ result the final result+export trace : (msg : String) -> (result : a) -> a trace x val = unsafePerformIO {ffi=FFI_C} (do putStrLn x; return val)
@@ -4,6 +4,8 @@ import Language.Reflection.Elab import Language.Reflection.Errors +%access public export+ -------------------------------------------------------- -- Tactic construction conveniences --------------------------------------------------------@@ -145,6 +147,8 @@ showPrec d StrType = "StrType" showPrec d VoidType = "VoidType" showPrec d Forgot = "Forgot"+ showPrec d WorldType = "WorldType"+ showPrec d TheWorld = "TheWorld" implementation Eq NativeTy where IT8 == IT8 = True@@ -299,7 +303,7 @@ showPrec d (CantMatch tm) = showCon d "CantMatch" $ showArg tm showPrec d (NoTypeDecl n) = showCon d "NoTypeDecl" $ showArg n showPrec d (NotInjective tm tm' x) = showCon d "NotInjective" $ showArg tm ++ showArg tm'- showPrec d (CantResolve tm) = showCon d "CantResolve" $ showArg tm+ showPrec d (CantResolve tm e) = showCon d "CantResolve" $ showArg tm ++ showArg e showPrec d (InvalidTCArg n tm) = showCon d "InvalidTCName" $ showArg n ++ showArg tm showPrec d (CantResolveAlts xs) = showCon d "CantResolveAlts" $ showArg xs showPrec d (NoValidAlts xs) = showCon d "NoValidAlts" $ showArg xs
@@ -1,5 +1,7 @@ module Syntax.PreorderReasoning +%access public export+ -- QED is first to get the precedence to work out. It's just Refl with an explicit argument. syntax [expr] "QED" = qed expr -- foo ={ prf }= bar ={ prf' }= fnord QED
@@ -2,7 +2,7 @@ %include C "unistd.h" %default partial-%access public+%access public export ||| Retrieves a value from the environment if the given key is present, ||| otherwise it returns Nothing.
@@ -6,6 +6,8 @@ import System +%access export+ ||| Send a message of any type to the thread with the given thread id ||| Returns 1 if the message was sent successfully, 0 otherwise sendToThread : (thread_id : Ptr) -> a -> IO Int
@@ -1,13 +1,16 @@ module System.Info ||| The Idris backend in use+export backend : String backend = prim__systemInfo 0 ||| The operating system in use.+export os : String os = prim__systemInfo 1 ||| The triple this program was targeted for+export targetTriple : String targetTriple = prim__systemInfo 2
@@ -4,6 +4,8 @@ import Control.Algebra.Lattice import Control.Algebra.VectorSpace +%access public export+ -- Due to these being basically unused and difficult to implement, -- they're in contrib for a bit. Once a design is found that lets them -- be implemented for a number of implementations, and we get those@@ -92,6 +94,11 @@ total meetSemilatticeMeetIsCommutative : (l, r : a) -> meet l r = meet r l total meetSemilatticeMeetIsIdempotent : (e : a) -> meet e e = e +{- FIXME: Some maintenance required here.+ Algebra.top and Algebra.bottom don't exist!+-}+{-+ interface (VerifiedJoinSemilattice a, BoundedJoinSemilattice a) => VerifiedBoundedJoinSemilattice a where total boundedJoinSemilatticeBottomIsBottom : (e : a) -> join e Algebra.bottom = e @@ -112,3 +119,5 @@ -- total moduleScalarMultDistributiveWRTModuleAddition : (s, t : a) -> (v : b) -> (s <+> t) <#> v = (s <#> v) <+> (t <#> v) --interface (VerifiedField a, VerifiedModule a b) => VerifiedVectorSpace a b where {}++-}
@@ -3,6 +3,7 @@ infixl 6 <-> infixl 7 <.> +%access public export ||| Sets equipped with a single binary operation that is associative, along with ||| a neutral element for that binary operation and inverses for all elements.
@@ -3,6 +3,7 @@ import Control.Algebra import Data.Heap +%access public export ||| Sets equipped with a binary operation that is commutative, associative and ||| idempotent. Must satisfy the following laws:
@@ -7,6 +7,7 @@ import Data.Complex import Data.ZZ +%access public export Semigroup Integer where (<+>) = (+)
@@ -2,6 +2,8 @@ import Control.Algebra +%access public export+ infixl 5 <#> infixr 2 <||>
@@ -4,7 +4,7 @@ import Data.ZZ %default total-%access public+%access public export -- This module contains isomorphisms between convenient inductive types and -- Idris primitives. Because primitives lack a convenient structure, these
@@ -7,7 +7,7 @@ ||| @ p the predicate to wait for ||| @ f the function to repeatedly apply ||| @ v the starting value-partial+partial export until : (p : a -> Bool) -> (f : a -> a) -> (v : a) -> a until p f v with (p v) | False = until p f (f v)
@@ -6,7 +6,7 @@ module Control.WellFounded %default total-+%access public export ||| Accessibility: some element `x` is accessible if all `y` such that ||| `rel y x` are themselves accessible.
@@ -2,7 +2,7 @@ import Data.Fin -%access public+%access public export %default total ||| A list with an upper bound on its length.
@@ -1,6 +1,6 @@ module Data.CoList -%access public+%access public export %default total ||| Idris will know that it always can produce a new element in finite time
@@ -3,6 +3,7 @@ import public Data.Vect %default total+%access public export ||| Build an n-ary function type from a Vect of Types and a result type Fun : Vect n Type -> Type -> Type
@@ -2,7 +2,7 @@ import Data.Vect -%access public+%access public export %default total {- A general purpose Hashing library (not cryptographic)
@@ -7,9 +7,9 @@ %default total-%access public+%access export -abstract data MaxiphobicHeap : Type -> Type where+export data MaxiphobicHeap : Type -> Type where Empty : MaxiphobicHeap a Node : Nat -> MaxiphobicHeap a -> a -> MaxiphobicHeap a -> MaxiphobicHeap a
@@ -5,6 +5,7 @@ import public Data.Vect %default total+%access public export ||| Matrix with n rows and m columns Matrix : Nat -> Nat -> Type -> Type
@@ -9,7 +9,7 @@ import public Data.Matrix -+%access public export %default total infixr 2 <:> -- vector inner product
@@ -5,6 +5,7 @@ import public Data.Matrix %default total+%access public export infixr 2 <:> -- vector inner product infixr 2 >< -- vector outer product
@@ -2,6 +2,7 @@ module Data.Nat.DivMod %default total+%access public export ||| The result of euclidean division of natural numbers |||
@@ -8,7 +8,7 @@ import Control.WellFounded %default total-%access public+%access public export ||| A strict less-than relation on `Nat`. |||
@@ -2,6 +2,7 @@ import Data.Fun +%access public export ||| Build an n-ary relation type from a Vect of Types Rel : Vect n Type -> Type
@@ -1,5 +1,7 @@ module Data.Sign +%access public export+ ||| A representation of signs for signed datatypes such as `ZZ` data Sign = Plus | Zero | Minus
@@ -192,21 +192,21 @@ treeToList' cont (Branch2 t1 _ t2) = treeToList' (:: treeToList' cont t2) t1 treeToList' cont (Branch3 t1 _ t2 _ t3) = treeToList' (:: treeToList' (:: treeToList' cont t3) t2) t1 -abstract+export data SortedMap : Type -> Type -> Type where Empty : Ord k => SortedMap k v M : (o : Ord k) => (n:Nat) -> Tree n k v o -> SortedMap k v -public+export empty : Ord k => SortedMap k v empty = Empty -public+export lookup : k -> SortedMap k v -> Maybe v lookup _ Empty = Nothing lookup k (M _ t) = treeLookup k t -public+export insert : k -> v -> SortedMap k v -> SortedMap k v insert k v Empty = M Z (Leaf k v) insert k v (M _ t) =@@ -214,7 +214,7 @@ Left t' => (M _ t') Right t' => (M _ t') -public+export delete : k -> SortedMap k v -> SortedMap k v delete _ Empty = Empty delete k (M Z t) =@@ -226,16 +226,15 @@ Left t' => (M _ t') Right t' => (M _ t') -public+export fromList : Ord k => List (k, v) -> SortedMap k v fromList l = foldl (flip (uncurry insert)) empty l -public+export toList : SortedMap k v -> List (k, v) toList Empty = [] toList (M _ t) = treeToList t -public treeMap : (a -> b) -> Tree n k a o -> Tree n k b o treeMap f (Leaf k v) = Leaf k (f v) treeMap f (Branch2 t1 k t2) = Branch2 (treeMap f t1) k (treeMap f t2)
@@ -4,30 +4,30 @@ -- TODO: add intersection, union, difference -abstract+export data SortedSet k = SetWrapper (Data.SortedMap.SortedMap k ()) -public+export empty : Ord k => SortedSet k empty = SetWrapper Data.SortedMap.empty -public+export insert : k -> SortedSet k -> SortedSet k insert k (SetWrapper m) = SetWrapper (Data.SortedMap.insert k () m) -public+export delete : k -> SortedSet k -> SortedSet k delete k (SetWrapper m) = SetWrapper (Data.SortedMap.delete k m) -public+export contains : k -> SortedSet k -> Bool contains k (SetWrapper m) = isJust (Data.SortedMap.lookup k m) -public+export fromList : Ord k => List k -> SortedSet k fromList l = SetWrapper (Data.SortedMap.fromList (map (\i => (i, ())) l)) -public+export toList : SortedSet k -> List k toList (SetWrapper m) = map (\(i, _) => i) (Data.SortedMap.toList m)
@@ -0,0 +1,41 @@+module Data.Storable++%access public export++interface Storable a where+ sizeOf : a -> Int+ alignOf : a -> Int+ peek : Ptr -> Int -> IO a+ poke : Ptr -> Int -> a -> IO ()++Storable Bits8 where+ sizeOf _ = 1+ alignOf _ = 1+ peek p offset = prim_peek8 p offset+ poke p offset val = do+ _ <- prim_poke8 p offset val+ return ()++Storable Bits16 where+ sizeOf _ = 2+ alignOf _ = 2+ peek p offset = prim_peek16 p offset+ poke p offset val = do+ _ <- prim_poke16 p offset val+ return ()++Storable Bits32 where+ sizeOf _ = 4+ alignOf _ = 4+ peek p offset = prim_peek32 p offset+ poke p offset val = do+ _ <- prim_poke32 p offset val+ return ()++Storable Bits64 where+ sizeOf _ = 8+ alignOf _ = 8+ peek p offset = prim_peek64 p offset+ poke p offset val = do+ _ <- prim_poke64 p offset val+ return ()
@@ -4,7 +4,7 @@ import Data.Sign %default total-%access public+%access public export ||| An integer is either a positive `Nat` or the negated successor of a `Nat`.
@@ -3,7 +3,7 @@ import Data.Rel import Data.Fun -%access public+%access public export -------------------------------------------------------------------------------- -- Interface for decidable n-ary Relations
@@ -6,7 +6,7 @@ import Data.Fun import Data.Rel -%access public+%access public export -------------------------------------------------------------------------------- -- Utility Lemmas
@@ -4,7 +4,7 @@ %default total -public+public export Vars : Type Vars = List (String, String) @@ -23,7 +23,7 @@ add_Output : String -> CGIInfo -> CGIInfo add_Output str st = record { Output = Output st ++ str } st -abstract+export data CGI : Type -> Type where MkCGI : (CGIInfo -> IO (a, CGIInfo)) -> CGI a @@ -51,32 +51,32 @@ getInfo : CGI CGIInfo getInfo = MkCGI (\s => return (s, s)) -abstract+export lift : IO a -> CGI a lift op = MkCGI (\st => do { x <- op return (x, st) } ) -abstract+export output : String -> CGI () output s = do i <- getInfo setInfo (add_Output s i) -abstract+export queryVars : CGI Vars queryVars = do i <- getInfo return (GET i) -abstract+export postVars : CGI Vars postVars = do i <- getInfo return (POST i) -abstract+export cookieVars : CGI Vars cookieVars = do i <- getInfo return (Cookies i) -abstract+export queryVar : String -> CGI (Maybe String) queryVar x = do vs <- queryVars return (lookup x vs)@@ -89,12 +89,12 @@ getHeaders = do i <- getInfo return (Headers i) -abstract+export flushHeaders : CGI () flushHeaders = do o <- getHeaders lift (putStrLn o) -abstract+export flush : CGI () flush = do o <- getOutput lift (putStr o)@@ -119,7 +119,7 @@ val <- getEnv key return $ maybe "" id val -abstract+export runCGI : CGI a -> IO a runCGI prog = do clen_in <- getCgiEnv "CONTENT_LENGTH"
@@ -8,9 +8,7 @@ %include C "sys/socket.h" %include C "netdb.h" -%access public--ByteLength : Type+public export ByteLength : Type ByteLength = Int interface ToCode a where@@ -67,9 +65,10 @@ data RecvStructPtr = RSPtr Ptr data RecvfromStructPtr = RFPtr Ptr-data BufPtr = BPtr Ptr-data SockaddrPtr = SAPtr Ptr +export data BufPtr = BPtr Ptr+export data SockaddrPtr = SAPtr Ptr+ ||| Protocol Number. ||| ||| Generally good enough to just set it to 0.@@ -120,18 +119,18 @@ remote_port : Port ||| Frees a given pointer-public+export sock_free : BufPtr -> IO () sock_free (BPtr ptr) = foreign FFI_C "idrnet_free" (Ptr -> IO ()) ptr -public+export sockaddr_free : SockaddrPtr -> IO () sockaddr_free (SAPtr ptr) = foreign FFI_C "idrnet_free" (Ptr -> IO ()) ptr ||| Allocates an amount of memory given by the ByteLength parameter. ||| ||| Used to allocate a mutable pointer to be given to the Recv functions.-public+export sock_alloc : ByteLength -> IO BufPtr sock_alloc bl = map BPtr $ foreign FFI_C "idrnet_malloc" (Int -> IO Ptr) bl
@@ -4,9 +4,9 @@ import System.Concurrency.Raw -%access public+%access public export -abstract+export data ProcID msg = MkPID Ptr ||| Type safe message passing programs. Parameterised over the type of@@ -30,24 +30,29 @@ run (Lift prog) = prog ||| Get current process ID+export myID : Process msg (ProcID msg) myID = Lift (return (MkPID prim__vm)) ||| Send a message to another process ||| Returns whether the send was unsuccessful.+export send : ProcID msg -> msg -> Process msg Bool send (MkPID p) m = Lift (do x <- sendToThread p (prim__vm, m) return (x == 1)) ||| Return whether a message is waiting in the queue+export msgWaiting : Process msg Bool msgWaiting = Lift checkMsgs ||| Return whether a message is waiting in the queue from a specific sender+export msgWaitingFrom : ProcID msg -> Process msg Bool msgWaitingFrom (MkPID p) = Lift (checkMsgsFrom p) ||| Receive a message - blocks if there is no message waiting+export recv : Process msg msg recv {msg} = do (senderid, m) <- Lift get return m@@ -55,6 +60,7 @@ get = getMsg ||| Receive a message from specific sender - blocks if there is no message waiting+export recvFrom : ProcID msg -> Process msg msg recvFrom (MkPID p) {msg} = do (senderid, m) <- Lift get return m@@ -62,6 +68,7 @@ get = getMsgFrom p ||| receive a message, and return with the sender's process ID.+export recvWithSender : Process msg (ProcID msg, msg) recvWithSender {msg} = do (senderid, m) <- Lift get@@ -69,6 +76,7 @@ where get : IO (Ptr, msg) get = getMsg +export create : Process msg () -> Process msg (ProcID msg) create (Lift p) = do ptr <- Lift (fork p) return (MkPID ptr)
@@ -7,7 +7,9 @@ Control.Isomorphism.Primitives, Control.Partial, Control.WellFounded,+ Classes.Verified,+ Data.Fun, Data.Rel, Data.Hash, Data.Matrix, Data.Matrix.Algebraic, Data.Matrix.Numeric,@@ -16,7 +18,7 @@ Data.BoundedList, Data.Heap, Data.SortedMap, Data.SortedSet,- Data.CoList,+ Data.CoList, Data.Storable, Decidable.Decidable, Decidable.Order,
@@ -2,6 +2,8 @@ import Data.Vect +%access public export+ interface Default a where default : a
@@ -4,6 +4,8 @@ import System import Control.IOExcept +%access public export+ data Exception : Type -> Effect where Raise : a -> sig (Exception a) b
@@ -4,6 +4,7 @@ import Effects import Control.IOExcept +%access public export ||| A Dependent type to describe File Handles. File handles are ||| parameterised with the current state of the file: Closed; Open for@@ -63,7 +64,7 @@ ||| Write a string to a file. ||| ||| Only file that are open for writing can be written to.- WriteString : String -> sig FileIO () (OpenFile Write)+ WriteString : String -> sig FileIO () (OpenFile WriteTruncate) ||| End of file? |||@@ -137,11 +138,11 @@ readLine = call $ ReadLine ||| Write a string to a file.-writeString : String -> Eff () [FILE_IO (OpenFile Write)]+writeString : String -> Eff () [FILE_IO (OpenFile WriteTruncate)] writeString str = call $ WriteString str ||| Write a line to a file.-writeLine : String -> Eff () [FILE_IO (OpenFile Write)]+writeLine : String -> Eff () [FILE_IO (OpenFile WriteTruncate)] writeLine str = call $ WriteString (str ++ "\n") ||| End of file?@@ -175,7 +176,7 @@ -> (content : String) -> Eff (Either e ()) [FILE_IO ()] writeFile errFunc fname content = do- case !(open fname Write) of+ case !(open fname WriteTruncate) of True => do writeString content close
@@ -14,7 +14,7 @@ import Effects import public Effect.Logging.Level -%access public+%access public export -- -------------------------------------------------------- [ Logging Resource ] @@ -147,7 +147,7 @@ -> (cs : List a) -> (m : String) -> Eff () [LOG a]-logN l cs msg = call $ Log (getProof lvl) cs msg+logN l cs msg = call $ Log (snd lvl) cs msg where lvl : (n ** LogLevel n) lvl = case cast {to=String} (cast {to=Int} l) of
@@ -15,7 +15,7 @@ import Effects import public Effect.Logging.Level -%access public+%access public export -- ------------------------------------------------------------ [ The Resource ] @@ -84,7 +84,7 @@ ||| @l The level to log. ||| @m The message to log. logN : (l : Nat) -> {auto prf : LTE l 70} -> (m : String) -> Eff () [LOG]-logN l msg = call $ Log (getProof lvl) msg+logN l msg = call $ Log (snd lvl) msg where lvl : (n ** LogLevel n) lvl = case cast {to=String} (cast {to=Int} l) of
@@ -14,7 +14,7 @@ ||| loggers. module Effect.Logging.Level -%access public+%access public export %default total -- ---------------------------------------------------- [ Log Level Definition ]
@@ -5,13 +5,13 @@ import Data.Vect import public Data.So -%access public+%access public export -abstract+export data MemoryChunk : Nat -> Nat -> Type where CH : Ptr -> MemoryChunk size initialized -abstract+export data RawMemory : Effect where Allocate : (n : Nat) -> RawMemory () () (\v => MemoryChunk n 0)@@ -102,10 +102,12 @@ RAW_MEMORY : Type -> EFFECT RAW_MEMORY t = MkEff t RawMemory +export allocate : (n : Nat) -> Eff () [RAW_MEMORY ()] (\v => [RAW_MEMORY (MemoryChunk n 0)]) allocate size = call $ Allocate size +export initialize : {i : Nat} -> {n : Nat} -> Bits8 ->@@ -115,9 +117,11 @@ (\v => [RAW_MEMORY (MemoryChunk n (i + size))]) initialize c size prf = call $ Initialize c size prf +export free : Eff () [RAW_MEMORY (MemoryChunk n i)] (\v => [RAW_MEMORY ()]) free = call Free +export peek : {i : Nat} -> (offset : Nat) -> (size : Nat) ->@@ -125,6 +129,7 @@ { [RAW_MEMORY (MemoryChunk n i)] } Eff (Vect size Bits8) peek offset size prf = call $ Peek offset size prf +export poke : {n : Nat} -> {i : Nat} -> (offset : Nat) ->@@ -155,6 +160,7 @@ data MoveDescriptor = Dst | Src +export move : {dst_size : Nat} -> {dst_init : Nat} -> {src_size : Nat} ->
@@ -2,6 +2,8 @@ import Effects +%access public export+ data MonadEffT : List EFFECT -> (Type -> Type) -> Type -> Type where MkMonadEffT : EffM m a xs (\v => xs) -> MonadEffT xs m a
@@ -12,7 +12,7 @@ import Effects import Effect.Default -%access public+%access public export -- ---------------------------------------------------- [ Timer Data Structure ]
@@ -3,6 +3,8 @@ import Effects import Data.Vect +%access public export+ data Random : Effect where GetRandom : sig Random Integer Integer SetSeed : Integer -> sig Random () Integer
@@ -2,6 +2,8 @@ import Effects +%access public export+ data Selection : Effect where Select : List a -> sig Selection a ()
@@ -2,7 +2,7 @@ import Effects -%access public+%access public export data State : Effect where Get : sig State a a
@@ -3,6 +3,8 @@ import Effects import Control.IOExcept +%access public export+ ------------------------------------------------------------- -- IO effects internals -------------------------------------------------------------
@@ -7,6 +7,8 @@ import System import Control.IOExcept +%access public export+ data System : Effect where Args : sig System (List String) Time : sig System Integer
@@ -2,7 +2,7 @@ import Effects -%access public+%access public export data Trans : (Type -> Type) -> Effect where Lift : m a -> sig (Trans m) a
@@ -7,7 +7,7 @@ --- Effectful computations are described as algebraic data types that --- explain how an effect is interpreted in some underlying context. -%access public+%access export -- ----------------------------------------------------------------- [ Effects ] ||| The Effect type describes effectful computations. |||@@ -15,11 +15,13 @@ ||| + The return type of the computation. ||| + The input resource. ||| + The computation to run on the resource given the return value.+public export Effect : Type Effect = (x : Type) -> Type -> (x -> Type) -> Type ||| The `EFFECT` Data type describes how to promote the Effect ||| description into a concrete effect.+public export %error_reverse data EFFECT : Type where MkEff : Type -> Effect -> EFFECT@@ -30,24 +32,29 @@ -- or a dependent change. These are easily disambiguated by type. namespace NoResourceEffect+ public export sig : Effect -> Type -> Type sig e r = e r () (\v => ()) namespace NoUpdateEffect+ public export sig : Effect -> (ret : Type) -> (resource : Type) -> Type sig e r e_in = e r e_in (\v => e_in) namespace UpdateEffect+ public export sig : Effect -> (ret : Type) -> (res_in : Type) -> (res_out : Type) -> Type sig e r e_in e_out = e r e_in (\v => e_out) namespace DepUpdateEffect+ public export sig : Effect -> (ret : Type) -> (res_in : Type) -> (res_out : ret -> Type) -> Type sig e r e_in e_out = e r e_in e_out ||| Handler interfaces describe how an effect `e` is translated to the ||| underlying computation context `m` for execution.+public export interface Handler (e : Effect) (m : Type -> Type) where ||| How to handle the effect. |||@@ -77,6 +84,7 @@ syntax "{" [inst] "==>" [outst] "}" [eff] = eff inst (\result => outst) -- --------------------------------------- [ Properties and Proof Construction ]+public export data SubList : List a -> List a -> Type where SubNil : SubList [] [] Keep : SubList xs ys -> SubList (x :: xs) (x :: ys)@@ -88,21 +96,25 @@ subListId {xs = x :: xs} = Keep subListId namespace Env+ public export data Env : (m : Type -> Type) -> List EFFECT -> Type where Nil : Env m Nil (::) : Handler eff m => a -> Env m xs -> Env m (MkEff a eff :: xs) +public export data EffElem : Effect -> Type -> List EFFECT -> Type where Here : EffElem x a (MkEff a x :: xs) There : EffElem x a xs -> EffElem x a (y :: xs) ||| make an environment corresponding to a sub-list+private dropEnv : Env m ys -> SubList xs ys -> Env m xs dropEnv [] SubNil = [] dropEnv (v :: vs) (Keep rest) = v :: dropEnv vs rest dropEnv (v :: vs) (Drop rest) = dropEnv vs rest +public export updateWith : (ys' : List a) -> (xs : List a) -> SubList ys xs -> List a updateWith (y :: ys) (x :: xs) (Keep rest) = y :: updateWith ys xs rest@@ -112,6 +124,7 @@ updateWith [] (x :: xs) (Keep rest) = [] ||| Put things back, replacing old with new in the sub-environment+private rebuildEnv : Env m ys' -> (prf : SubList ys xs) -> Env m xs -> Env m (updateWith ys' xs prf) rebuildEnv [] SubNil env = env@@ -123,6 +136,7 @@ -- -------------------------------------------------- [ The Effect EDSL itself ] +public export updateResTy : (val : t) -> (xs : List EFFECT) -> EffElem e a xs -> e t a b -> List EFFECT@@ -131,9 +145,11 @@ infix 5 :::, :-, := +public export data LRes : lbl -> Type -> Type where (:=) : (x : lbl) -> res -> LRes x res +public export (:::) : lbl -> EFFECT -> EFFECT (:::) {lbl} x (MkEff r e) = MkEff (LRes x r) e @@ -156,6 +172,7 @@ ||| @ x The return type of the result. ||| @ es The list of allowed side-effects. ||| @ ce Function to compute a new list of allowed side-effects.+public export data EffM : (m : Type -> Type) -> (x : Type) -> (es : List EFFECT) -> (ce : x -> List EFFECT) -> Type where@@ -182,27 +199,33 @@ namespace SimpleEff -- Simple effects, no updates+ public export Eff : (x : Type) -> (es : List EFFECT) -> Type Eff x es = {m : Type -> Type} -> EffM m x es (\v => es) + public export EffT : (m : Type -> Type) -> (x : Type) -> (es : List EFFECT) -> Type EffT m x es = EffM m x es (\v => es) namespace TransEff -- Dependent effects, updates not dependent on result+ public export Eff : (x : Type) -> (es : List EFFECT) -> (ce : List EFFECT) -> Type Eff x es ce = {m : Type -> Type} -> EffM m x es (\_ => ce) + public export EffT : (m : Type -> Type) -> (x : Type) -> (es : List EFFECT) -> (ce : List EFFECT) -> Type EffT m x es ce = EffM m x es (\_ => ce) namespace DepEff -- Dependent effects, updates dependent on result+ public export Eff : (x : Type) -> (es : List EFFECT) -> (ce : x -> List EFFECT) -> Type Eff x es ce = {m : Type -> Type} -> EffM m x es ce + public export EffT : (m : Type -> Type) -> (x : Type) -> (es : List EFFECT) -> (ce : x -> List EFFECT) -> Type EffT m x es ce = EffM m x es ce@@ -271,6 +294,7 @@ -- Q: Instead of m b, implement as StateT (Env m xs') m b, so that state -- updates can be propagated even through failing computations? +export eff : Env m xs -> EffM m a xs xs' -> ((x : a) -> Env m (xs' x) -> m b) -> m b eff env (Value x) k = k x env eff env (prog `EBind` c) k
@@ -1,6 +1,6 @@ %unqualified -%access public+%access public export %default total ||| The canonical single-element type, also known as the trivially@@ -37,23 +37,31 @@ %used MkUPair a %used MkUPair b - ||| Dependent pairs+ ||| Dependent pairs aid in the construction of dependent types by+ ||| providing evidence that some value resides in the type. |||- ||| Dependent pairs represent existential quantification - they consist of a- ||| witness for the existential claim and a proof that the property holds for- ||| it. Another way to see dependent pairs is as just data - for instance, the- ||| length of a vector paired with that vector.+ ||| Formally, speaking, dependent pairs represent existential+ ||| quantification - they consist of a witness for the existential+ ||| claim and a proof that the property holds for it. |||- ||| @ a the type of the witness- ||| @ P the type of the proof- data Sigma : (a : Type) -> (P : a -> Type) -> Type where- MkSigma : .{P : a -> Type} -> (x : a) -> (pf : P x) -> Sigma a P+ ||| @a the value to place in the type.+ ||| @P the dependent type that requires the value.+ data DPair : (a : Type) -> (P : a -> Type) -> Type where+ MkDPair : .{P : a -> Type} -> (x : a) -> (pf : P x) -> DPair a P + Sigma : (a : Type) -> (P : a -> Type) -> Type+ Sigma wit prf = DPair wit prf+ %deprecate Sigma "This name is being deprecated in favour of `DPair`."++ MkSigma : .{P : a -> Type} -> (x : a) -> (prf : P x) -> DPair a P+ MkSigma wit prf = MkDPair wit prf+ %deprecate MkSigma "This constructor is being deprecated in favour of `MkDPair`."+ ||| The empty type, also known as the trivially false proposition. |||-||| Use `void` or `absurd` to prove anything if you have a variable of type `Void` in scope. -%elim data Void : Type where - +||| Use `void` or `absurd` to prove anything if you have a variable of type `Void` in scope.+%elim data Void : Type where+ ||| The eliminator for the `Void` type. void : Void -> a -- We can't define void yet. We can't define a function with no clauses without@@ -155,13 +163,13 @@ ||| Subvert the type checker. This function is abstract, so it will not reduce in ||| the type checker. Use it with care - it can result in segfaults or worse!-abstract %assert_total -- need to pretend+export %assert_total -- need to pretend believe_me : a -> b believe_me x = prim__believe_me _ _ x ||| Subvert the type checker. This function *will* reduce in the type checker. ||| Use it with extreme care - it can result in segfaults or worse!-public %assert_total+public export %assert_total really_believe_me : a -> b really_believe_me x = prim__believe_me _ _ x @@ -174,8 +182,8 @@ -- Pointers as external primitive; there's no literals for these, so no -- need for them to be part of the compiler. -abstract data Ptr : Type-abstract data ManagedPtr : Type+export data Ptr : Type+export data ManagedPtr : Type %extern prim__readFile : prim__WorldType -> Ptr -> String %extern prim__writeFile : prim__WorldType -> Ptr -> String -> Int@@ -190,4 +198,18 @@ %extern prim__eqManagedPtr : ManagedPtr -> ManagedPtr -> Int %extern prim__registerPtr : Ptr -> Int -> ManagedPtr +-- primitives for accessing memory.+%extern prim__asPtr : ManagedPtr -> Ptr+%extern prim__sizeofPtr : Int+%extern prim__peek8 : prim__WorldType -> Ptr -> Int -> Bits8+%extern prim__peek16 : prim__WorldType -> Ptr -> Int -> Bits16+%extern prim__peek32 : prim__WorldType -> Ptr -> Int -> Bits32+%extern prim__peek64 : prim__WorldType -> Ptr -> Int -> Bits64 +%extern prim__poke8 : prim__WorldType -> Ptr -> Int -> Bits8 -> Int+%extern prim__poke16 : prim__WorldType -> Ptr -> Int -> Bits16 -> Int+%extern prim__poke32 : prim__WorldType -> Ptr -> Int -> Bits32 -> Int+%extern prim__poke64 : prim__WorldType -> Ptr -> Int -> Bits64 -> Int++%extern prim__peekPtr : prim__WorldType -> Ptr -> Int -> Ptr+%extern prim__pokePtr : prim__WorldType -> Ptr -> Int -> Ptr -> Int
@@ -3,12 +3,14 @@ import Builtins import Prelude.Basics import Prelude.Bool-import Prelude.Classes+import Prelude.Interfaces import Prelude.Either import Prelude.List import Prelude.Nat import Prelude.Maybe +%access public export+ -------------------------------------------------------------------------------- -- Utility lemmas --------------------------------------------------------------------------------@@ -141,7 +143,7 @@ decEq [] (x :: xs) = No (negEqSym lemma_val_not_nil) decEq (x :: xs) (y :: ys) with (decEq x y) decEq (x :: xs) (x :: ys) | Yes Refl with (decEq xs ys)- decEq (x :: xs) (x :: xs) | (Yes Refl) | (Yes Refl) = Yes Refl + decEq (x :: xs) (x :: xs) | (Yes Refl) | (Yes Refl) = Yes Refl decEq (x :: xs) (x :: ys) | (Yes Refl) | (No p) = No (\eq => lemma_x_eq_xs_neq Refl p eq) decEq (x :: xs) (y :: ys) | No p with (decEq xs ys) decEq (x :: xs) (y :: xs) | (No p) | (Yes Refl) = No (\eq => lemma_x_neq_xs_eq p Refl eq)@@ -211,6 +213,3 @@ where primitiveEq : x = y primitiveEq = believe_me (Refl {x}) postulate primitiveNotEq : x = y -> Void---
@@ -3,25 +3,24 @@ import Builtins import Prelude.List -%access public+%access export ||| Idris's primitive IO, for building abstractions on top of-abstract data PrimIO : Type -> Type where Prim__IO : a -> PrimIO a ||| A token representing the world, for use in `IO`-abstract data World = TheWorld prim__WorldType+data World = TheWorld prim__WorldType -private world : World -> prim__WorldType world (TheWorld w) = w -abstract WorldRes : Type -> Type+WorldRes : Type -> Type WorldRes x = x ||| An FFI specifier, which describes how a particular compiler ||| backend handles foreign function calls.+public export record FFI where constructor MkFFI ||| A family describing which types are available in the FFI@@ -35,10 +34,10 @@ ||| The IO type, parameterised over the FFI that is available within ||| it.-abstract data IO' : (lang : FFI) -> Type -> Type where MkIO : (World -> PrimIO (WorldRes a)) -> IO' lang a +public export data FTy : FFI -> List Type -> Type -> Type where FRet : ffi_types f t -> FTy f xs (IO' f t) FFun : ffi_types f s -> FTy f (s :: xs) t -> FTy f xs (s -> t)@@ -47,15 +46,16 @@ data FEnv : FFI -> List Type -> Type where Nil : FEnv f [] (::) : (ffi_types f t, t) -> FEnv f xs -> FEnv f (t :: xs)- + ForeignPrimType : (xs : List Type) -> FEnv ffi xs -> Type -> Type ForeignPrimType {ffi} [] [] t = World -> ffi_fn ffi -> ffi_types ffi t -> PrimIO t-ForeignPrimType {ffi} (x :: xs) ((a, _) :: env) t +ForeignPrimType {ffi} (x :: xs) ((a, _) :: env) t = (ffi_types ffi x, x) -> ForeignPrimType xs env t %inline-applyEnv : (env : FEnv ffi xs) -> - ForeignPrimType xs env t -> +private+applyEnv : (env : FEnv ffi xs) ->+ ForeignPrimType xs env t -> World -> ffi_fn ffi -> ffi_types ffi t -> PrimIO t applyEnv [] f = f applyEnv (x@(_, _) :: xs) f = applyEnv xs (f x)@@ -66,7 +66,8 @@ -- explicit here. %inline-foreign_prim : (f : FFI) -> +private+foreign_prim : (f : FFI) -> (fname : ffi_fn f) -> FTy f xs ty -> FEnv f xs -> ty foreign_prim f fname (FRet y) env = MkIO (\w => applyEnv env mkForeignPrim w fname y)@@ -91,25 +92,21 @@ {auto fty : FTy f [] ty} -> ty foreign ffi fname ty {fty} = foreign_prim ffi fname fty [] -abstract prim_io_bind : PrimIO a -> (a -> PrimIO b) -> PrimIO b prim_io_bind (Prim__IO v) k = k v unsafePerformPrimIO : PrimIO a -> a -- compiled as primitive -abstract prim_io_return : a -> PrimIO a prim_io_return x = Prim__IO x -abstract io_bind : IO' l a -> (a -> IO' l b) -> IO' l b io_bind (MkIO fn) k = MkIO (\w => prim_io_bind (fn w) (\ b => case k b of MkIO fkb => fkb w)) -abstract io_return : a -> IO' l a io_return x = MkIO (\w => prim_io_return x) @@ -131,27 +128,32 @@ prim_read = MkIO (\w => prim_io_return (prim__readString (world w))) prim_write : String -> IO' l Int-prim_write s +prim_write s = MkIO (\w => prim_io_return (prim__writeString (world w) s)) prim_fread : Ptr -> IO' l String prim_fread h = MkIO (\w => prim_io_return (prim__readFile (world w) h)) prim_fwrite : Ptr -> String -> IO' l Int-prim_fwrite h s +prim_fwrite h s = MkIO (\w => prim_io_return (prim__writeFile (world w) h s)) --------- The C FFI namespace FFI_C+ public export data Raw : Type -> Type where -- code generated can assume it's compiled just as 't' MkRaw : (x : t) -> Raw t - -- Tell erasure analysis not to erase the argument- %used MkRaw x+ public export+ data CFnPtr : Type -> Type where+ MkCFnPtr : (x : t) -> CFnPtr t - ||| Supported C integer types- data C_IntTypes : Type -> Type where++ mutual+ ||| Supported C integer types+ public export+ data C_IntTypes : Type -> Type where C_IntChar : C_IntTypes Char C_IntNative : C_IntTypes Int C_IntBits8 : C_IntTypes Bits8@@ -159,28 +161,43 @@ C_IntBits32 : C_IntTypes Bits32 C_IntBits64 : C_IntTypes Bits64 - ||| Supported C foreign types- data C_Types : Type -> Type where+ public export+ data C_FnTypes : Type -> Type where+ C_Fn : C_Types s -> C_FnTypes t -> C_FnTypes (s -> t)+ C_FnIO : C_Types t -> C_FnTypes (IO' FFI_C t)+ C_FnBase : C_Types t -> C_FnTypes t++ ||| Supported C foreign types+ public export+ data C_Types : Type -> Type where C_Str : C_Types String C_Float : C_Types Double C_Ptr : C_Types Ptr C_MPtr : C_Types ManagedPtr C_Unit : C_Types () C_Any : C_Types (Raw a)+ C_FnT : C_FnTypes t -> C_Types (CFnPtr t) C_IntT : C_IntTypes i -> C_Types i - ||| A descriptor for the C FFI. See the constructors of `C_Types`- ||| and `C_IntTypes` for the concrete types that are available.+ ||| A descriptor for the C FFI. See the constructors of `C_Types`+ ||| and `C_IntTypes` for the concrete types that are available. %error_reverse- FFI_C : FFI- FFI_C = MkFFI C_Types String String+ public export+ FFI_C : FFI+ FFI_C = MkFFI C_Types String String ||| Interactive programs, describing I/O actions and returning a value.-||| @res The result type of the program +||| @res The result type of the program %error_reverse+public export+ IO : (res : Type) -> Type IO = IO' FFI_C + -- Tell erasure analysis not to erase the argument+%used MkRaw x+%used MkCFnPtr x+ -- Cannot be relaxed as is used by type providers and they expect IO a -- in the first argument. run__provider : IO a -> PrimIO a@@ -207,18 +224,22 @@ -- Supported JS foreign types mutual+ public export data JsFn : Type -> Type where MkJsFn : (x : t) -> JsFn t + public export data JS_IntTypes : Type -> Type where JS_IntChar : JS_IntTypes Char JS_IntNative : JS_IntTypes Int + public export data JS_FnTypes : Type -> Type where JS_Fn : JS_Types s -> JS_FnTypes t -> JS_FnTypes (s -> t) JS_FnIO : JS_Types t -> JS_FnTypes (IO' l t) JS_FnBase : JS_Types t -> JS_FnTypes t + public export data JS_Types : Type -> Type where JS_Str : JS_Types String JS_Float : JS_Types Double@@ -236,10 +257,12 @@ ||| JavaScript code snippets, into which the arguments are substituted ||| for the placeholders `%0`, `%1`, etc. %error_reverse+public export FFI_JS : FFI FFI_JS = MkFFI JS_Types String String %error_reverse+public export JS_IO : Type -> Type JS_IO = IO' FFI_JS @@ -249,10 +272,12 @@ namespace FFI_Export -- It's just like Data.List.Elem, but we don't need all the other stuff -- that comes with it, just a proof that a data type is defined.+ public export data DataDefined : Type -> List (Type, s) -> s -> Type where DHere : DataDefined x ((x, t) :: xs) t DThere : DataDefined x xs t -> DataDefined x (y :: xs) t + public export data FFI_Base : (f : FFI) -> List (Type, ffi_data f) -> Type -> Type where FFI_ExpType : {n : ffi_data f} -> (def : DataDefined t xs n) -> FFI_Base f xs t FFI_Prim : (prim : ffi_types f t) -> FFI_Base f xs t@@ -261,6 +286,7 @@ %used FFI_ExpType def %used FFI_Prim prim + public export data FFI_Exportable : (f : FFI) -> List (Type, ffi_data f) -> Type -> Type where FFI_IO : (b : FFI_Base f xs t) -> FFI_Exportable f xs (IO' f t) FFI_Fun : (b : FFI_Base f xs s) -> (a : FFI_Exportable f xs t) -> FFI_Exportable f xs (s -> t)@@ -271,10 +297,11 @@ %used FFI_Fun a %used FFI_Ret b + public export data FFI_Export : (f : FFI) -> String -> List (Type, ffi_data f) -> Type where- Data : (x : Type) -> (n : ffi_data f) -> + Data : (x : Type) -> (n : ffi_data f) -> (es : FFI_Export f h ((x, n) :: xs)) -> FFI_Export f h xs- Fun : (fn : t) -> (n : ffi_fn f) -> {auto prf : FFI_Exportable f xs t} -> + Fun : (fn : t) -> (n : ffi_fn f) -> {auto prf : FFI_Exportable f xs t} -> (es : FFI_Export f h xs) -> FFI_Export f h xs End : FFI_Export f h xs @@ -286,3 +313,38 @@ %used Fun es %used Fun prf +-- Accessing memory+prim_peek8 : Ptr -> Int -> IO Bits8+prim_peek8 ptr offset = MkIO (\w => prim_io_return (prim__peek8 (world w) ptr offset))++prim_poke8 : Ptr -> Int -> Bits8 -> IO Int+prim_poke8 ptr offset val = MkIO (\w => prim_io_return (+ prim__poke8 (world w) ptr offset val))++prim_peek16 : Ptr -> Int -> IO Bits16+prim_peek16 ptr offset = MkIO (\w => prim_io_return (prim__peek16 (world w) ptr offset))++prim_poke16 : Ptr -> Int -> Bits16 -> IO Int+prim_poke16 ptr offset val = MkIO (\w => prim_io_return (+ prim__poke16 (world w) ptr offset val))++prim_peek32 : Ptr -> Int -> IO Bits32+prim_peek32 ptr offset = MkIO (\w => prim_io_return (prim__peek32 (world w) ptr offset))++prim_poke32 : Ptr -> Int -> Bits32 -> IO Int+prim_poke32 ptr offset val = MkIO (\w => prim_io_return (+ prim__poke32 (world w) ptr offset val))++prim_peek64 : Ptr -> Int -> IO Bits64+prim_peek64 ptr offset = MkIO (\w => prim_io_return (prim__peek64 (world w) ptr offset))++prim_poke64 : Ptr -> Int -> Bits64 -> IO Int+prim_poke64 ptr offset val = MkIO (\w => prim_io_return (+ prim__poke64 (world w) ptr offset val))++prim_peekPtr : Ptr -> Int -> IO Ptr+prim_peekPtr ptr offset = MkIO (\w => prim_io_return (prim__peekPtr (world w) ptr offset))++prim_pokePtr : Ptr -> Int -> Ptr -> IO Int+prim_pokePtr ptr offset val = MkIO (\w => prim_io_return (+ prim__pokePtr (world w) ptr offset val))
@@ -9,7 +9,7 @@ import Prelude.Nat import Prelude.Traversable -%access public+%access public export ||| A source location in an Idris file record SourceLocation where@@ -80,7 +80,7 @@ | WorldType | TheWorld %name Const c, c' -abstract interface ReflConst (a : Type) where+export interface ReflConst (a : Type) where toConst : a -> Const implementation ReflConst Int where@@ -110,7 +110,7 @@ implementation ReflConst Bits64 where toConst = B64 -implicit+implicit export reflectConstant: (ReflConst a) => a -> Const reflectConstant = toConst
@@ -16,6 +16,8 @@ import Prelude.Nat import Language.Reflection +%access public export+ data Fixity = Infixl Nat | Infixr Nat | Infix Nat | Prefix Nat ||| Erasure annotations reflect Idris's idea of what is intended to be@@ -100,7 +102,7 @@ constructors : List (TTName, List CtorArg, Raw) ||| A reflected elaboration script.-abstract+export data Elab : Type -> Type where -- obligatory control stuff Prim__PureElab : a -> Elab a@@ -164,7 +166,7 @@ ------------- -- Public API --------------%access public+%access public export namespace Tactics implementation Functor Elab where map f t = Prim__BindElab t (\x => Prim__PureElab (f x))@@ -186,31 +188,38 @@ x >>= f = Prim__BindElab x f ||| Halt elaboration with an error+ export fail : List ErrorReportPart -> Elab a fail err = Prim__Fail err ||| Look up the lexical binding at the focused hole. Fails if no holes are present.+ export getEnv : Elab (List (TTName, Binder TT)) getEnv = Prim__Env ||| Get the name and type of the focused hole. Fails if not holes are present.+ export getGoal : Elab (TTName, TT) getGoal = Prim__Goal ||| Get the hole queue, in order.+ export getHoles : Elab (List TTName) getHoles = Prim__Holes ||| If the current hole contains a guess, return it. Otherwise, fail.+ export getGuess : Elab TT getGuess = Prim__Guess ||| Look up the types of every overloading of a name.+ export lookupTy : TTName -> Elab (List (TTName, NameType, TT)) lookupTy n = Prim__LookupTy n ||| Get the type of a fully-qualified name. Fail if it doesn not ||| resolve uniquely.+ export lookupTyExact : TTName -> Elab (TTName, NameType, TT) lookupTyExact n = case !(lookupTy n) of [res] => return res@@ -219,12 +228,14 @@ ||| Find the reflected representation of all datatypes whose names ||| are overloadings of some name.+ export lookupDatatype : TTName -> Elab (List Datatype) lookupDatatype n = Prim__LookupDatatype n ||| Find the reflected representation of a datatype, given its ||| fully-qualified name. Fail if the name does not uniquely resolve ||| to a datatype.+ export lookupDatatypeExact : TTName -> Elab Datatype lookupDatatypeExact n = case !(lookupDatatype n) of [res] => return res@@ -233,12 +244,14 @@ ||| Find the reflected function definition of all functions whose names ||| are overloadings of some name.+ export lookupFunDefn : TTName -> Elab (List (FunDefn TT)) lookupFunDefn n = Prim__LookupFunDefn n ||| Find the reflected function definition of a function, given its ||| fully-qualified name. Fail if the name does not uniquely resolve ||| to a function.+ export lookupFunDefnExact : TTName -> Elab (FunDefn TT) lookupFunDefnExact n = case !(lookupFunDefn n) of [res] => return res@@ -246,11 +259,13 @@ xs => fail [TextPart "More than one function named", NamePart n] ||| Get the argument specification for each overloading of a name.+ export lookupArgs : TTName -> Elab (List (TTName, List FunArg, Raw)) lookupArgs n = Prim__LookupArgs n ||| Get the argument specification for a name. Fail if the name does ||| not uniquely resolve.+ export lookupArgsExact : TTName -> Elab (TTName, List FunArg, Raw) lookupArgsExact n = case !(lookupArgs n) of [res] => return res@@ -261,6 +276,7 @@ ||| ||| @ env the environment within which to check the type ||| @ tm the term to check+ export check : (env : List (TTName, Binder TT)) -> (tm : Raw) -> Elab (TT, TT) check env tm = Prim__Check env tm @@ -269,15 +285,18 @@ ||| ||| **NB**: the generated name is unique _for this run of the ||| elaborator_. Do not assume that they are globally unique.+ export gensym : (hint : String) -> Elab TTName gensym hint = Prim__Gensym hint ||| Substitute a guess into a hole.+ export solve : Elab () solve = Prim__Solve ||| Place a term into a hole, unifying its type. Fails if the focus ||| is not a hole.+ export fill : Raw -> Elab () fill tm = Prim__Fill tm @@ -295,6 +314,7 @@ ||| @ argSpec instructions for finding the arguments to the term, ||| where the Boolean states whether or not to attempt to solve ||| the argument by unification.+ export apply : (op : Raw) -> (argSpec : List Bool) -> Elab (List TTName) apply tm argSpec = map snd <$> Prim__Apply tm argSpec @@ -313,6 +333,7 @@ ||| where the Boolean states whether or not to attempt to solve ||| the argument by matching. + export matchApply : (op : Raw) -> (argSpec : List Bool) -> Elab (List TTName) matchApply tm argSpec = map snd <$> Prim__Apply tm argSpec @@ -320,11 +341,13 @@ ||| exist. ||| ||| @ hole the hole to focus on+ export focus : (hole : TTName) -> Elab () focus hole = Prim__Focus hole ||| Send the currently-focused hole to the end of the hole queue and ||| focus on the next hole.+ export unfocus : TTName -> Elab () unfocus hole = Prim__Unfocus hole @@ -336,6 +359,7 @@ ||| binding, or else the scopes of the generated terms won't make ||| sense. This tactic creates a new hole of the proper form, and ||| points the old hole at it.+ export attack : Elab () attack = Prim__Attack @@ -344,6 +368,7 @@ ||| The new hole will be focused, and the previously-focused hole ||| will be immediately after it in the hole queue. Because this ||| tactic introduces a new binding, you may need to `attack` first.+ export claim : TTName -> Raw -> Elab () claim n ty = Prim__Claim n ty @@ -352,6 +377,7 @@ ||| `attack`). ||| ||| @ n the name to use for the argument+ export intro : (n : TTName) -> Elab () intro n = Prim__Intro (Just n) @@ -361,6 +387,7 @@ ||| ||| Requires that the hole be immediately under its binder (use ||| `attack` if it might not be).+ export intro' : Elab () intro' = Prim__Intro Nothing @@ -369,10 +396,12 @@ ||| ||| Requires that the hole be immediately under its binder (use ||| `attack` if it might not be).+ export forall : TTName -> Raw -> Elab () forall n ty = Prim__Forall n ty ||| Convert a hole into a pattern variable.+ export patvar : TTName -> Elab () patvar n = Prim__PatVar n @@ -380,6 +409,7 @@ ||| ||| Requires that the hole be immediately under its binder (use ||| `attack` if it might not be).+ export patbind : TTName -> Elab () patbind n = Prim__PatBind n @@ -391,10 +421,12 @@ ||| @ n the name to let bind ||| @ ty the type of the term to be let-bound ||| @ tm the term to be bound+ export letbind : (n : TTName) -> (ty, tm : Raw) -> Elab () letbind n ty tm = Prim__LetBind n ty tm ||| Normalise the goal.+ export compute : Elab () compute = Prim__Compute @@ -402,12 +434,14 @@ ||| ||| @ env the environment in which to compute (get one of these from `getEnv`) ||| @ term the term to normalise+ export normalise : (env : List (TTName, Binder TT)) -> (term : TT) -> Elab TT normalise env term = Prim__Normalise env term ||| Reduce a closed term to weak-head normal form ||| ||| @ term the term to reduce+ export whnf : (term : TT) -> Elab TT whnf term = Prim__Whnf term @@ -417,6 +451,7 @@ ||| @ env a lexical environment to compare the terms in (see `getEnv`) ||| @ term1 the first term to convert ||| @ term2 the second term to convert+ export convertsInEnv : (env : List (TTName, Binder TT)) -> (term1, term2 : TT) -> Elab () convertsInEnv env term1 term2 = Prim__Converts env term1 term2 @@ -424,14 +459,17 @@ ||| ||| @ term1 the first term to convert ||| @ term2 the second term to convert+ export converts : (term1, term2 : TT) -> Elab () converts term1 term2 = convertsInEnv !getEnv term1 term2 ||| Find the source context for the elaboration script+ export getSourceLocation : Elab SourceLocation getSourceLocation = Prim__SourceLocation ||| Attempt to solve the current goal with the source code location+ export sourceLocation : Elab () sourceLocation = do loc <- getSourceLocation fill (quote loc)@@ -442,6 +480,7 @@ ||| ||| The namespace is represented as a reverse-order list of strings, ||| just as in the representation of names.+ export currentNamespace : Elab (List String) currentNamespace = Prim__Namespace @@ -455,16 +494,19 @@ ||| Because this tactic internally introduces a `let` binding, it ||| requires that the hole be immediately under its binder (use ||| `attack` if it might not be).+ export rewriteWith : Raw -> Elab () rewriteWith rule = Prim__Rewrite rule ||| Add a type declaration to the global context.+ export declareType : TyDecl -> Elab () declareType decl = Prim__DeclareType decl ||| Define a function in the global context. The function must have ||| already been declared, either in ordinary Idris code or using ||| `declareType`.+ export defineFunction : FunDefn Raw -> Elab () defineFunction defun = Prim__DefineFunction defun @@ -472,12 +514,14 @@ ||| ||| @ ifaceName the name of the interface for which an implementation is being registered ||| @ instName the name of the definition to use in implementation search+ export addInstance : (ifaceName, instName : TTName) -> Elab () addInstance ifaceName instName = Prim__AddInstance ifaceName instName ||| Determine whether a name denotes an interface. ||| ||| @ name a name that might denote an interface.+ export isTCName : (name : TTName) -> Elab Bool isTCName name = Prim__IsTCName name @@ -485,10 +529,12 @@ ||| ||| @ fn the name of the definition being elaborated (to prevent Idris ||| from looping)+ export resolveTC : (fn : TTName) -> Elab () resolveTC fn = Prim__ResolveTC fn ||| Use Idris's internal proof search.+ export search : Elab () search = Prim__Search 100 [] @@ -496,6 +542,7 @@ ||| ||| @ depth the search depth ||| @ hints additional names to try+ export search' : (depth : Int) -> (hints : List TTName) -> Elab () search' depth hints = Prim__Search depth hints @@ -505,6 +552,7 @@ ||| if the string is not a valid operator. ||| ||| @ operator the operator string to look up+ export operatorFixity : (operator : String) -> Elab Fixity operatorFixity operator = Prim__Fixity operator @@ -512,6 +560,7 @@ ||| ||| This is intended for elaboration script developers, not for ||| end-users. Use `fail` for final scripts.+ export debug : Elab a debug = Prim__Debug [] @@ -522,18 +571,21 @@ ||| end-users. Use `fail` for final scripts. ||| ||| @ msg the message to display+ export debugMessage : (msg : List ErrorReportPart) -> Elab a debugMessage msg = Prim__Debug msg ||| Create a new top-level metavariable to solve the current hole. ||| ||| @ name the name for the top-level variable+ export metavar : (name : TTName) -> Elab () metavar name = Prim__Metavar name ||| Recursively invoke the reflected elaborator with some goal. ||| ||| The result is the final term and its type.+ export runElab : Raw -> Elab () -> Elab (TT, TT) runElab goal script = Prim__RecursiveElab goal script
@@ -8,6 +8,8 @@ import Prelude.List import Prelude.Maybe +%access public export+ data Err = Msg String | InternalMsg String | CantUnify Bool TT TT Err (List (TTName, TT)) Int@@ -28,7 +30,7 @@ | CantMatch TT | NoTypeDecl TTName | NotInjective TT TT TT- | CantResolve TT+ | CantResolve TT Err | InvalidTCArg TTName TT | CantResolveAlts (List TTName) | NoValidAlts (List TTName)
@@ -6,7 +6,7 @@ import public Prelude.Algebra import public Prelude.Basics import public Prelude.Bool-import public Prelude.Classes+import public Prelude.Interfaces import public Prelude.Cast import public Prelude.Nat import public Prelude.List@@ -33,7 +33,7 @@ import public Language.Reflection.Elab import public Language.Reflection.Errors -%access public+%access public export %default total -- Things that can't be elsewhere for import cycle reasons@@ -210,7 +210,7 @@ Enum Char where toNat c = toNat (ord c) fromNat n = chr (fromNat n)- + pred c = fromNat (pred (toNat c)) syntax "[" [start] ".." [end] "]"@@ -264,15 +264,15 @@ ------- Some error rewriting %language ErrorReflection- + private cast_part : TT -> ErrorReportPart cast_part (P Bound n t) = TextPart "unknown type" cast_part x = TermPart x- -%error_handler++%error_handler export cast_error : Err -> Maybe (List ErrorReportPart)-cast_error (CantResolve `(Cast ~x ~y))+cast_error (CantResolve `(Cast ~x ~y) _) = Just [TextPart "Can't cast from", cast_part x, TextPart "to",@@ -280,8 +280,8 @@ cast_error _ = Nothing %error_handler+export num_error : Err -> Maybe (List ErrorReportPart)-num_error (CantResolve `(Num ~x))+num_error (CantResolve `(Num ~x) _) = Just [TermPart x, TextPart "is not a numeric type"] num_error _ = Nothing-
@@ -4,7 +4,7 @@ infixl 6 <+> -%access public+%access public export -------------------------------------------------------------------------------- -- A modest interface hierarchy
@@ -4,9 +4,11 @@ import Prelude.Basics import Prelude.Bool-import Prelude.Classes+import Prelude.Interfaces import Prelude.Foldable import Prelude.Functor++%access public export ---- Applicative functors/Idioms
@@ -1,7 +1,9 @@ module Prelude.Basics import Builtins- ++%access public export+ Not : Type -> Type Not a = a -> Void @@ -51,9 +53,9 @@ ||| The case where the property holds ||| @ prf the proof- Yes : {A : Type} -> (prf : A) -> Dec A+ Yes : (prf : prop) -> Dec prop ||| The case where the property holding would be a contradiction- ||| @ contra a demonstration that A would be a contradiction- No : {A : Type} -> (contra : A -> Void) -> Dec A+ ||| @ contra a demonstration that prop would be a contradiction+ No : (contra : prop -> Void) -> Dec prop
@@ -6,13 +6,13 @@ import Prelude.Bool import Prelude.Cast import Prelude.Chars-import Prelude.Classes+import Prelude.Interfaces import Prelude.Foldable import Prelude.Nat import Prelude.List import Prelude.Strings -%access public+%access public export %default total b8ToString : Bits8 -> String
@@ -4,6 +4,8 @@ import Prelude.Uninhabited +%access public export+ ||| Boolean Data Type %case data Bool = False | True
@@ -3,6 +3,8 @@ import Prelude.Bool import public Builtins +%access public export+ ||| Interface for transforming an instance of a data type to another type. interface Cast from to where ||| Perform a cast operation.
@@ -2,11 +2,13 @@ -- Functions operating over Chars import Prelude.Bool-import Prelude.Classes+import Prelude.Interfaces import Prelude.List import Prelude.Cast import Builtins +%access public export+ ||| Convert the number to its ASCII equivalent. chr : Int -> Char chr x = if (x >= 0 && x < 0x110000)@@ -74,5 +76,3 @@ ||| Returns true if the character is an octal digit. isOctDigit : Char -> Bool isOctDigit x = (x >= '0' && x <= '7')--
@@ -1,404 +0,0 @@-module Prelude.Classes--import Builtins-import Prelude.Basics-import Prelude.Bool---- Numerical Operator Precedence-infixl 5 ==, /=-infixl 6 <, <=, >, >=-infixl 7 <<, >>-infixl 8 +,--infixl 9 *,/---- ------------------------------------------------------------- [ Boolean Ops ]-intToBool : Int -> Bool-intToBool 0 = False-intToBool x = True--boolOp : (a -> a -> Int) -> a -> a -> Bool-boolOp op x y = intToBool (op x y)---- ---------------------------------------------------------- [ Equality Interface ]-||| The Eq interface defines inequality and equality.-interface Eq ty where- (==) : ty -> ty -> Bool- (/=) : ty -> ty -> Bool-- x /= y = not (x == y)- x == y = not (x /= y)--Eq () where- () == () = True--Eq Int where- (==) = boolOp prim__eqInt--Eq Integer where- (==) = boolOp prim__eqBigInt--Eq Double where- (==) = boolOp prim__eqFloat--Eq Char where- (==) = boolOp prim__eqChar--Eq String where- (==) = boolOp prim__eqString--Eq Ptr where- (==) = boolOp prim__eqPtr--Eq ManagedPtr where- (==) = boolOp prim__eqManagedPtr--Eq Bool where- True == True = True- True == False = False- False == True = False- False == False = True- -(Eq a, Eq b) => Eq (a, b) where- (==) (a, c) (b, d) = (a == b) && (c == d)----- ---------------------------------------------------------- [ Ordering Interface ]-%elim data Ordering = LT | EQ | GT--Eq Ordering where- LT == LT = True- EQ == EQ = True- GT == GT = True- _ == _ = False--||| Compose two comparisons into the lexicographic product-thenCompare : Ordering -> Lazy Ordering -> Ordering-thenCompare LT y = LT-thenCompare EQ y = y-thenCompare GT y = GT--||| The Ord interface defines comparison operations on ordered data types.-interface Eq ty => Ord ty where- compare : ty -> ty -> Ordering-- (<) : ty -> ty -> Bool- (<) x y with (compare x y)- (<) x y | LT = True- (<) x y | _ = False-- (>) : ty -> ty -> Bool- (>) x y with (compare x y)- (>) x y | GT = True- (>) x y | _ = False-- (<=) : ty -> ty -> Bool- (<=) x y = x < y || x == y-- (>=) : ty -> ty -> Bool- (>=) x y = x > y || x == y-- max : ty -> ty -> ty- max x y = if x > y then x else y-- min : ty -> ty -> ty- min x y = if (x < y) then x else y--Ord () where- compare () () = EQ--Ord Int where- compare x y = if (x == y) then EQ else- if (boolOp prim__sltInt x y) then LT else- GT---Ord Integer where- compare x y = if (x == y) then EQ else- if (boolOp prim__sltBigInt x y) then LT else- GT---Ord Double where- compare x y = if (x == y) then EQ else- if (boolOp prim__sltFloat x y) then LT else- GT---Ord Char where- compare x y = if (x == y) then EQ else- if (boolOp prim__sltChar x y) then LT else- GT---Ord String where- compare x y = if (x == y) then EQ else- if (boolOp prim__ltString x y) then LT else- GT---Ord Bool where- compare True True = EQ- compare False False = EQ- compare False True = LT- compare True False = GT---(Ord a, Ord b) => Ord (a, b) where- compare (xl, xr) (yl, yr) =- if xl /= yl- then compare xl yl- else compare xr yr---- --------------------------------------------------------- [ Numerical Interface ]-||| The Num interface defines basic numerical arithmetic.-interface Num ty where- (+) : ty -> ty -> ty- (*) : ty -> ty -> ty- ||| Conversion from Integer.- fromInteger : Integer -> ty--Num Integer where- (+) = prim__addBigInt- (*) = prim__mulBigInt-- fromInteger = id--Num Int where- (+) = prim__addInt- (*) = prim__mulInt-- fromInteger = prim__truncBigInt_Int---Num Double where- (+) = prim__addFloat- (*) = prim__mulFloat-- fromInteger = prim__toFloatBigInt--Num Bits8 where- (+) = prim__addB8- (*) = prim__mulB8- fromInteger = prim__truncBigInt_B8--Num Bits16 where- (+) = prim__addB16- (*) = prim__mulB16- fromInteger = prim__truncBigInt_B16--Num Bits32 where- (+) = prim__addB32- (*) = prim__mulB32- fromInteger = prim__truncBigInt_B32--Num Bits64 where- (+) = prim__addB64- (*) = prim__mulB64- fromInteger = prim__truncBigInt_B64---- --------------------------------------------------------- [ Negatable Interface ]-||| The `Neg` interface defines operations on numbers which can be negative.-interface Num ty => Neg ty where- ||| The underlying of unary minus. `-5` desugars to `negate (fromInteger 5)`.- negate : ty -> ty- (-) : ty -> ty -> ty- ||| Absolute value- abs : ty -> ty--Neg Integer where- negate x = prim__subBigInt 0 x- (-) = prim__subBigInt- abs x = if x < 0 then -x else x--Neg Int where- negate x = prim__subInt 0 x- (-) = prim__subInt- abs x = if x < (prim__truncBigInt_Int 0) then -x else x--Neg Double where- negate x = prim__negFloat x- (-) = prim__subFloat- abs x = if x < (prim__toFloatBigInt 0) then -x else x---- -------------------------------------------------------------Eq Bits8 where- x == y = intToBool (prim__eqB8 x y)--Eq Bits16 where- x == y = intToBool (prim__eqB16 x y)--Eq Bits32 where- x == y = intToBool (prim__eqB32 x y)--Eq Bits64 where- x == y = intToBool (prim__eqB64 x y)--Ord Bits8 where- (<) = boolOp prim__ltB8- (>) = boolOp prim__gtB8- (<=) = boolOp prim__lteB8- (>=) = boolOp prim__gteB8- compare l r = if l < r then LT- else if l > r then GT- else EQ--Ord Bits16 where- (<) = boolOp prim__ltB16- (>) = boolOp prim__gtB16- (<=) = boolOp prim__lteB16- (>=) = boolOp prim__gteB16- compare l r = if l < r then LT- else if l > r then GT- else EQ--Ord Bits32 where- (<) = boolOp prim__ltB32- (>) = boolOp prim__gtB32- (<=) = boolOp prim__lteB32- (>=) = boolOp prim__gteB32- compare l r = if l < r then LT- else if l > r then GT- else EQ--Ord Bits64 where- (<) = boolOp prim__ltB64- (>) = boolOp prim__gtB64- (<=) = boolOp prim__lteB64- (>=) = boolOp prim__gteB64- compare l r = if l < r then LT- else if l > r then GT- else EQ---- ------------------------------------------------------------- [ Bounded ]--interface Ord b => MinBound b where- ||| The lower bound for the type- minBound : b--interface Ord b => MaxBound b where- ||| The upper bound for the type- maxBound : b--MinBound Bits8 where- minBound = 0x0--MaxBound Bits8 where- maxBound = 0xff--MinBound Bits16 where- minBound = 0x0--MaxBound Bits16 where- maxBound = 0xffff--MinBound Bits32 where- minBound = 0x0--MaxBound Bits32 where- maxBound = 0xffffffff--MinBound Bits64 where- minBound = 0x0--MaxBound Bits64 where- maxBound = 0xffffffffffffffff----- ------------------------------------------------------------- [ Fractionals ]--interface Num ty => Fractional ty where- (/) : ty -> ty -> ty- recip : ty -> ty-- recip x = 1 / x--Fractional Double where- (/) = prim__divFloat---- --------------------------------------------------------------- [ Integrals ]-%default partial--interface Num ty => Integral ty where- div : ty -> ty -> ty- mod : ty -> ty -> ty---- ---------------------------------------------------------------- [ Integers ]-divBigInt : Integer -> Integer -> Integer-divBigInt x y = case y == 0 of- False => prim__sdivBigInt x y--modBigInt : Integer -> Integer -> Integer-modBigInt x y = case y == 0 of- False => prim__sremBigInt x y--Integral Integer where- div = divBigInt- mod = modBigInt---- --------------------------------------------------------------------- [ Int ]--divInt : Int -> Int -> Int-divInt x y = case y == 0 of- False => prim__sdivInt x y--modInt : Int -> Int -> Int-modInt x y = case y == 0 of- False => prim__sremInt x y--Integral Int where- div = divInt- mod = modInt---- ------------------------------------------------------------------- [ Bits8 ]-divB8 : Bits8 -> Bits8 -> Bits8-divB8 x y = case y == 0 of- False => prim__sdivB8 x y--modB8 : Bits8 -> Bits8 -> Bits8-modB8 x y = case y == 0 of- False => prim__sremB8 x y- -Integral Bits8 where- div = divB8- mod = modB8---- ------------------------------------------------------------------ [ Bits16 ]-divB16 : Bits16 -> Bits16 -> Bits16-divB16 x y = case y == 0 of- False => prim__sdivB16 x y--modB16 : Bits16 -> Bits16 -> Bits16-modB16 x y = case y == 0 of- False => prim__sremB16 x y--Integral Bits16 where- div = divB16 - mod = modB16 ---- ------------------------------------------------------------------ [ Bits32 ]-divB32 : Bits32 -> Bits32 -> Bits32-divB32 x y = case y == 0 of- False => prim__sdivB32 x y--modB32 : Bits32 -> Bits32 -> Bits32-modB32 x y = case y == 0 of- False => prim__sremB32 x y--Integral Bits32 where- div = divB32 - mod = modB32 ---- ------------------------------------------------------------------ [ Bits64 ]-divB64 : Bits64 -> Bits64 -> Bits64-divB64 x y = case y == 0 of- False => prim__sdivB64 x y--modB64 : Bits64 -> Bits64 -> Bits64-modB64 x y = case y == 0 of- False => prim__sremB64 x y--Integral Bits64 where- div = divB64 - mod = modB64 --
@@ -1,16 +1,16 @@-module Prelude.Doubles +module Prelude.Doubles import Builtins-import Prelude.Classes+import Prelude.Interfaces -%access public+%access public export %default total %include C "math.h" %lib C "m" pi : Double-pi = 3.14159265358979323846 +pi = 3.14159265358979323846 euler : Double euler = 2.7182818284590452354@@ -59,5 +59,3 @@ ceiling : Double -> Double ceiling x = prim__floatCeil x--
@@ -4,9 +4,11 @@ import Prelude.Basics import Prelude.Bool-import Prelude.Classes+import Prelude.Interfaces import Prelude.Maybe import Prelude.List++%access public export ||| A sum type %elim data Either : (a, b : Type) -> Type where
@@ -9,15 +9,15 @@ import Prelude.Cast import Prelude.Bool import Prelude.Basics-import Prelude.Classes+import Prelude.Interfaces import Prelude.Either import Prelude.Show import IO -%access public+%access public export ||| A file handle-abstract+export data File : Type where FHandle : (p : Ptr) -> File @@ -39,35 +39,43 @@ (foreign FFI_C "idris_showerror" (Int -> IO String) err) getFileError : IO FileError-getFileError = do MkRaw err <- foreign FFI_C "idris_mkFileError" +getFileError = do MkRaw err <- foreign FFI_C "idris_mkFileError" (Ptr -> IO (Raw FileError)) prim__vm return err Show FileError where+ show FileReadError = "File Read Error"+ show FileWriteError = "File Write Error" show FileNotFound = "File Not Found" show PermissionDenied = "Permission Denied" show (GenericFileError errno) = strError errno ||| Standard input+export stdin : File stdin = FHandle prim__stdin ||| Standard output+export stdout : File stdout = FHandle prim__stdout ||| Standard output+export stderr : File stderr = FHandle prim__stderr +private do_ferror : Ptr -> IO Int do_ferror h = foreign FFI_C "fileError" (Ptr -> IO Int) h +export ferror : File -> IO Bool ferror (FHandle h) = do err <- do_ferror h return (not (err == 0)) ||| Call the RTS's file opening function+private do_fopen : String -> String -> IO Ptr do_fopen f m = foreign FFI_C "fileOpen" (String -> String -> IO Ptr) f m@@ -75,6 +83,7 @@ ||| Open a file ||| @ f the filename ||| @ m the mode as a String (`"r"`, `"w"`, or `"r+"`)+export fopen : (f : String) -> (m : String) -> IO (Either FileError File) fopen f m = do h <- do_fopen f m if !(nullPtr h)@@ -83,60 +92,83 @@ else return (Right (FHandle h)) ||| Check whether a file handle is actually a null pointer+export validFile : File -> IO Bool validFile (FHandle h) = do x <- nullPtr h return (not x) ||| Modes for opening files-data Mode = Read | Write | ReadWrite+data Mode = Read | WriteTruncate | Append | ReadWrite | ReadWriteTruncate | ReadAppend +Write : Mode+Write = WriteTruncate+%deprecate Write "Please use WriteTruncate instead."++modeStr : Mode -> String+modeStr Read = "r"+modeStr WriteTruncate = "w"+modeStr Append = "a"+modeStr ReadWrite = "r+"+modeStr ReadWriteTruncate = "w+"+modeStr ReadAppend = "a+"+ ||| Open a file ||| @ f the filename-||| @ m the mode; either Read, Write, or ReadWrite+||| @ m the mode; either Read, WriteTruncate, Append, ReadWrite, ReadWriteTruncate, or ReadAppend+export openFile : (f : String) -> (m : Mode) -> IO (Either FileError File)-openFile f m = fopen f (modeStr m) where- modeStr Read = "r"- modeStr Write = "w"- modeStr ReadWrite = "r+"+openFile f m = fopen f (modeStr m) +||| Open a file using C11 extended modes.+||| @ f the filename+||| @ m the mode; either Read, WriteTruncate, Append, ReadWrite, ReadWriteTruncate, or ReadAppend+export+openFileX : (f : String) -> (m : Mode) -> IO (Either FileError File)+openFileX f m = fopen f $ modeStr m ++ "x"++private do_fclose : Ptr -> IO () do_fclose h = foreign FFI_C "fileClose" (Ptr -> IO ()) h +export closeFile : File -> IO () closeFile (FHandle h) = do_fclose h +private do_fread : Ptr -> IO' l String do_fread h = prim_fread h +export fgetc : File -> IO (Either FileError Char) fgetc (FHandle h) = do let c = cast !(foreign FFI_C "fgetc" (Ptr -> IO Int) h) if !(ferror (FHandle h)) then return (Left FileReadError) else return (Right c) +export fflush : File -> IO () fflush (FHandle h) = foreign FFI_C "fflush" (Ptr -> IO ()) h +private do_popen : String -> String -> IO Ptr do_popen f m = foreign FFI_C "do_popen" (String -> String -> IO Ptr) f m +export popen : String -> Mode -> IO (Either FileError File) popen f m = do ptr <- do_popen f (modeStr m) if !(nullPtr ptr) then do err <- getFileError return (Left err) else return (Right (FHandle ptr))- where- modeStr Read = "r"- modeStr Write = "w"- modeStr ReadWrite = "r+" +export pclose : File -> IO () pclose (FHandle h) = foreign FFI_C "pclose" (Ptr -> IO ()) h -- mkForeign (FFun "idris_readStr" [FPtr, FPtr] (FAny String)) -- prim__vm h +export fread : File -> IO (Either FileError String) fread (FHandle h) = do str <- do_fread h if !(ferror (FHandle h))@@ -145,56 +177,65 @@ ||| Read a line from a file ||| @h a file handle which must be open for reading+export fGetLine : (h : File) -> IO (Either FileError String) fGetLine = fread %deprecate fread "Use fGetLine instead" +private do_fwrite : Ptr -> String -> IO (Either FileError ()) do_fwrite h s = do res <- prim_fwrite h s if (res /= 0) then do errno <- getErrno- if errno == 0 + if errno == 0 then return (Left FileWriteError) else do err <- getFileError return (Left err) else return (Right ()) +export fwrite : File -> String -> IO (Either FileError ()) fwrite (FHandle h) s = do_fwrite h s ||| Write a line to a file ||| @h a file handle which must be open for writing ||| @str the line to write to the file+export fPutStr : (h : File) -> (str : String) -> IO (Either FileError ()) fPutStr (FHandle h) s = do_fwrite h s +export fPutStrLn : File -> String -> IO (Either FileError ()) fPutStrLn (FHandle h) s = do_fwrite h (s ++ "\n") %deprecate fwrite "Use fPutStr instead" +private do_feof : Ptr -> IO Int do_feof h = foreign FFI_C "fileEOF" (Ptr -> IO Int) h ||| Check if a file handle has reached the end+export fEOF : File -> IO Bool fEOF (FHandle h) = do eof <- do_feof h return (not (eof == 0)) ||| Check if a file handle has reached the end+export feof : File -> IO Bool feof = fEOF %deprecate feof "Use fEOF instead" +export fpoll : File -> IO Bool fpoll (FHandle h) = do p <- foreign FFI_C "fpoll" (Ptr -> IO Int) h return (p > 0) ||| Read the contents of a file into a string-partial -- might be reading something infinitely long like /dev/null ... -covering+partial -- might be reading something infinitely long like /dev/null ...+covering export readFile : String -> IO (Either FileError String) readFile fn = do Right h <- openFile fn Read | Left err => return (Left err)@@ -212,10 +253,11 @@ else return (Right contents) ||| Write a string to a file-writeFile : (filepath : String) -> (contents : String) -> +export+writeFile : (filepath : String) -> (contents : String) -> IO (Either FileError ()) writeFile fn contents = do- Right h <- openFile fn Write | Left err => return (Left err)- Right () <- fPutStr h contents | Left err => return (Left err)+ Right h <- openFile fn WriteTruncate | Left err => return (Left err)+ Right () <- fPutStr h contents | Left err => return (Left err) closeFile h return (Right ())
@@ -3,15 +3,15 @@ import Builtins import Prelude.Bool import Prelude.Basics-import Prelude.Classes+import Prelude.Interfaces import Prelude.Algebra -%access public+%access public export %default total interface Foldable (t : Type -> Type) where- foldr : (elt -> acc -> acc) -> acc -> t elt -> acc- foldl : (acc -> elt -> acc) -> acc -> t elt -> acc+ foldr : (elem -> acc -> acc) -> acc -> t elem -> acc+ foldl : (acc -> elem -> acc) -> acc -> t elem -> acc foldl f z t = foldr (flip (.) . flip f) id t z ||| Combine each element of a structure into a monoid@@ -54,4 +54,3 @@ ||| Multiply together all elements of a structure product : (Foldable t, Num a) => t a -> a product = foldr (*) 1-
@@ -2,21 +2,23 @@ import Prelude.Basics +%access public export+ ||| Functors allow a uniform action over a parameterised type. ||| @ f a parameterised type interface Functor (f : Type -> Type) where ||| Apply a function across everything of type 'a' in a ||| parameterised type ||| @ f the parameterised type- ||| @ m the function to apply- map : (m : a -> b) -> f a -> f b+ ||| @ func the function to apply+ map : (func : a -> b) -> f a -> f b infixl 4 <$> ||| An infix alias for `map`, applying a function across everything of ||| type 'a' in a parameterised type ||| @ f the parameterised type-||| @ m the function to apply-(<$>) : Functor f => (m : a -> b) -> f a -> f b-m <$> x = map m x+||| @ func the function to apply+(<$>) : Functor f => (func : a -> b) -> f a -> f b+func <$> x = map func x
@@ -1,5 +1,5 @@ ||| Various helper functions for creating simple interactive systems.-||| +||| ||| These are mostly intended for helping with teaching, in that they will allow ||| the easy creation of interactive programs without needing to teach IO ||| or Effects first, but they also capture some common patterns of interactive@@ -10,7 +10,7 @@ import Prelude.List import Prelude.File import Prelude.Bool-import Prelude.Classes+import Prelude.Interfaces import Prelude.Strings import Prelude.Chars import Prelude.Show@@ -21,7 +21,7 @@ import Prelude.Monad import IO -%access public+%access public export ---- some basic io @@ -115,19 +115,19 @@ ||| @ onEOF the function to run on reaching end of file, returning a String ||| to output partial-processHandle : File -> +processHandle : File -> (state : a) ->- (onRead : a -> String -> (String, a)) -> - (onEOF : a -> String) -> + (onRead : a -> String -> (String, a)) ->+ (onEOF : a -> String) -> IO ()-processHandle h acc onRead onEOF +processHandle h acc onRead onEOF = if !(fEOF h) then putStr (onEOF acc) else do Right x <- fGetLine h | Left err => putStr (onEOF acc) let (out, acc') = onRead acc x putStr out- processHandle h acc' onRead onEOF + processHandle h acc' onRead onEOF ||| Process input from the standard input stream, while maintaining a state. ||| @ state the input state@@ -136,34 +136,33 @@ ||| @ onEOI the function to run on reaching end of input, returning a String ||| to output partial-processStdin : (state : a) -> - (onRead : a -> String -> (String, a)) -> +processStdin : (state : a) ->+ (onRead : a -> String -> (String, a)) -> (onEOI : a -> String) -> IO () processStdin = processHandle stdin ||| A basic read-eval-print loop, maintaining a state ||| @ state the input state-||| @ prompt the prompt to show +||| @ prompt the prompt to show ||| @ onInput the function to run on reading input, returning a String to ||| output and a new state. Returns Nothing if the repl should exit partial-replWith : (state : a) -> (prompt : String) -> +replWith : (state : a) -> (prompt : String) -> (onInput : a -> String -> Maybe (String, a)) -> IO ()-replWith acc prompt fn +replWith acc prompt fn = do putStr prompt x <- getLine case fn acc x of- Just (out, acc') => do putStr out + Just (out, acc') => do putStr out replWith acc' prompt fn Nothing => return () ||| A basic read-eval-print loop-||| @ prompt the prompt to show +||| @ prompt the prompt to show ||| @ onInput the function to run on reading input, returning a String to-||| output +||| output partial-repl : (prompt : String) -> +repl : (prompt : String) -> (onInput : String -> String) -> IO ()-repl prompt fn +repl prompt fn = replWith () prompt (\x, s => Just (fn s, ()))-
@@ -0,0 +1,404 @@+module Prelude.Interfaces++import Builtins+import Prelude.Basics+import Prelude.Bool++%access public export++-- Numerical Operator Precedence+infixl 5 ==, /=+infixl 6 <, <=, >, >=+infixl 7 <<, >>+infixl 8 +,-+infixl 9 *,/++-- ------------------------------------------------------------- [ Boolean Ops ]+intToBool : Int -> Bool+intToBool 0 = False+intToBool x = True++boolOp : (a -> a -> Int) -> a -> a -> Bool+boolOp op x y = intToBool (op x y)++-- ---------------------------------------------------------- [ Equality Interface ]+||| The Eq interface defines inequality and equality.+interface Eq ty where+ (==) : ty -> ty -> Bool+ (/=) : ty -> ty -> Bool++ x /= y = not (x == y)+ x == y = not (x /= y)++Eq () where+ () == () = True++Eq Int where+ (==) = boolOp prim__eqInt++Eq Integer where+ (==) = boolOp prim__eqBigInt++Eq Double where+ (==) = boolOp prim__eqFloat++Eq Char where+ (==) = boolOp prim__eqChar++Eq String where+ (==) = boolOp prim__eqString++Eq Ptr where+ (==) = boolOp prim__eqPtr++Eq ManagedPtr where+ (==) = boolOp prim__eqManagedPtr++Eq Bool where+ True == True = True+ True == False = False+ False == True = False+ False == False = True++(Eq a, Eq b) => Eq (a, b) where+ (==) (a, c) (b, d) = (a == b) && (c == d)+++-- ---------------------------------------------------------- [ Ordering Interface ]+%elim data Ordering = LT | EQ | GT++Eq Ordering where+ LT == LT = True+ EQ == EQ = True+ GT == GT = True+ _ == _ = False++||| Compose two comparisons into the lexicographic product+thenCompare : Ordering -> Lazy Ordering -> Ordering+thenCompare LT y = LT+thenCompare EQ y = y+thenCompare GT y = GT++||| The Ord interface defines comparison operations on ordered data types.+interface Eq ty => Ord ty where+ compare : ty -> ty -> Ordering++ (<) : ty -> ty -> Bool+ (<) x y with (compare x y)+ (<) x y | LT = True+ (<) x y | _ = False++ (>) : ty -> ty -> Bool+ (>) x y with (compare x y)+ (>) x y | GT = True+ (>) x y | _ = False++ (<=) : ty -> ty -> Bool+ (<=) x y = x < y || x == y++ (>=) : ty -> ty -> Bool+ (>=) x y = x > y || x == y++ max : ty -> ty -> ty+ max x y = if x > y then x else y++ min : ty -> ty -> ty+ min x y = if (x < y) then x else y++Ord () where+ compare () () = EQ++Ord Int where+ compare x y = if (x == y) then EQ else+ if (boolOp prim__sltInt x y) then LT else+ GT+++Ord Integer where+ compare x y = if (x == y) then EQ else+ if (boolOp prim__sltBigInt x y) then LT else+ GT+++Ord Double where+ compare x y = if (x == y) then EQ else+ if (boolOp prim__sltFloat x y) then LT else+ GT+++Ord Char where+ compare x y = if (x == y) then EQ else+ if (boolOp prim__sltChar x y) then LT else+ GT+++Ord String where+ compare x y = if (x == y) then EQ else+ if (boolOp prim__ltString x y) then LT else+ GT+++Ord Bool where+ compare True True = EQ+ compare False False = EQ+ compare False True = LT+ compare True False = GT+++(Ord a, Ord b) => Ord (a, b) where+ compare (xl, xr) (yl, yr) =+ if xl /= yl+ then compare xl yl+ else compare xr yr++-- --------------------------------------------------------- [ Numerical Interface ]+||| The Num interface defines basic numerical arithmetic.+interface Num ty where+ (+) : ty -> ty -> ty+ (*) : ty -> ty -> ty+ ||| Conversion from Integer.+ fromInteger : Integer -> ty++Num Integer where+ (+) = prim__addBigInt+ (*) = prim__mulBigInt++ fromInteger = id++Num Int where+ (+) = prim__addInt+ (*) = prim__mulInt++ fromInteger = prim__truncBigInt_Int+++Num Double where+ (+) = prim__addFloat+ (*) = prim__mulFloat++ fromInteger = prim__toFloatBigInt++Num Bits8 where+ (+) = prim__addB8+ (*) = prim__mulB8+ fromInteger = prim__truncBigInt_B8++Num Bits16 where+ (+) = prim__addB16+ (*) = prim__mulB16+ fromInteger = prim__truncBigInt_B16++Num Bits32 where+ (+) = prim__addB32+ (*) = prim__mulB32+ fromInteger = prim__truncBigInt_B32++Num Bits64 where+ (+) = prim__addB64+ (*) = prim__mulB64+ fromInteger = prim__truncBigInt_B64++-- --------------------------------------------------------- [ Negatable Interface ]+||| The `Neg` interface defines operations on numbers which can be negative.+interface Num ty => Neg ty where+ ||| The underlying of unary minus. `-5` desugars to `negate (fromInteger 5)`.+ negate : ty -> ty+ (-) : ty -> ty -> ty+ ||| Absolute value+ abs : ty -> ty++Neg Integer where+ negate x = prim__subBigInt 0 x+ (-) = prim__subBigInt+ abs x = if x < 0 then -x else x++Neg Int where+ negate x = prim__subInt 0 x+ (-) = prim__subInt+ abs x = if x < (prim__truncBigInt_Int 0) then -x else x++Neg Double where+ negate x = prim__negFloat x+ (-) = prim__subFloat+ abs x = if x < (prim__toFloatBigInt 0) then -x else x++-- ------------------------------------------------------------+Eq Bits8 where+ x == y = intToBool (prim__eqB8 x y)++Eq Bits16 where+ x == y = intToBool (prim__eqB16 x y)++Eq Bits32 where+ x == y = intToBool (prim__eqB32 x y)++Eq Bits64 where+ x == y = intToBool (prim__eqB64 x y)++Ord Bits8 where+ (<) = boolOp prim__ltB8+ (>) = boolOp prim__gtB8+ (<=) = boolOp prim__lteB8+ (>=) = boolOp prim__gteB8+ compare l r = if l < r then LT+ else if l > r then GT+ else EQ++Ord Bits16 where+ (<) = boolOp prim__ltB16+ (>) = boolOp prim__gtB16+ (<=) = boolOp prim__lteB16+ (>=) = boolOp prim__gteB16+ compare l r = if l < r then LT+ else if l > r then GT+ else EQ++Ord Bits32 where+ (<) = boolOp prim__ltB32+ (>) = boolOp prim__gtB32+ (<=) = boolOp prim__lteB32+ (>=) = boolOp prim__gteB32+ compare l r = if l < r then LT+ else if l > r then GT+ else EQ++Ord Bits64 where+ (<) = boolOp prim__ltB64+ (>) = boolOp prim__gtB64+ (<=) = boolOp prim__lteB64+ (>=) = boolOp prim__gteB64+ compare l r = if l < r then LT+ else if l > r then GT+ else EQ++-- ------------------------------------------------------------- [ Bounded ]++interface Ord b => MinBound b where+ ||| The lower bound for the type+ minBound : b++interface Ord b => MaxBound b where+ ||| The upper bound for the type+ maxBound : b++MinBound Bits8 where+ minBound = 0x0++MaxBound Bits8 where+ maxBound = 0xff++MinBound Bits16 where+ minBound = 0x0++MaxBound Bits16 where+ maxBound = 0xffff++MinBound Bits32 where+ minBound = 0x0++MaxBound Bits32 where+ maxBound = 0xffffffff++MinBound Bits64 where+ minBound = 0x0++MaxBound Bits64 where+ maxBound = 0xffffffffffffffff+++-- ------------------------------------------------------------- [ Fractionals ]++interface Num ty => Fractional ty where+ (/) : ty -> ty -> ty+ recip : ty -> ty++ recip x = 1 / x++Fractional Double where+ (/) = prim__divFloat++-- --------------------------------------------------------------- [ Integrals ]+%default partial++interface Num ty => Integral ty where+ div : ty -> ty -> ty+ mod : ty -> ty -> ty++-- ---------------------------------------------------------------- [ Integers ]+divBigInt : Integer -> Integer -> Integer+divBigInt x y = case y == 0 of+ False => prim__sdivBigInt x y++modBigInt : Integer -> Integer -> Integer+modBigInt x y = case y == 0 of+ False => prim__sremBigInt x y++Integral Integer where+ div = divBigInt+ mod = modBigInt++-- --------------------------------------------------------------------- [ Int ]++divInt : Int -> Int -> Int+divInt x y = case y == 0 of+ False => prim__sdivInt x y++modInt : Int -> Int -> Int+modInt x y = case y == 0 of+ False => prim__sremInt x y++Integral Int where+ div = divInt+ mod = modInt++-- ------------------------------------------------------------------- [ Bits8 ]+divB8 : Bits8 -> Bits8 -> Bits8+divB8 x y = case y == 0 of+ False => prim__sdivB8 x y++modB8 : Bits8 -> Bits8 -> Bits8+modB8 x y = case y == 0 of+ False => prim__sremB8 x y++Integral Bits8 where+ div = divB8+ mod = modB8++-- ------------------------------------------------------------------ [ Bits16 ]+divB16 : Bits16 -> Bits16 -> Bits16+divB16 x y = case y == 0 of+ False => prim__sdivB16 x y++modB16 : Bits16 -> Bits16 -> Bits16+modB16 x y = case y == 0 of+ False => prim__sremB16 x y++Integral Bits16 where+ div = divB16+ mod = modB16++-- ------------------------------------------------------------------ [ Bits32 ]+divB32 : Bits32 -> Bits32 -> Bits32+divB32 x y = case y == 0 of+ False => prim__sdivB32 x y++modB32 : Bits32 -> Bits32 -> Bits32+modB32 x y = case y == 0 of+ False => prim__sremB32 x y++Integral Bits32 where+ div = divB32+ mod = modB32++-- ------------------------------------------------------------------ [ Bits64 ]+divB64 : Bits64 -> Bits64 -> Bits64+divB64 x y = case y == 0 of+ False => prim__sdivB64 x y++modB64 : Bits64 -> Bits64 -> Bits64+modB64 x y = case y == 0 of+ False => prim__sremB64 x y++Integral Bits64 where+ div = divB64+ mod = modB64
@@ -5,14 +5,14 @@ import Prelude.Algebra import Prelude.Basics import Prelude.Bool-import Prelude.Classes+import Prelude.Interfaces import Prelude.Foldable import Prelude.Functor import Prelude.Maybe import Prelude.Uninhabited import Prelude.Nat -%access public+%access public export %default total infix 5 \\@@ -174,7 +174,7 @@ init' (x::xs) = case xs of [] => Just []- y::ys => + y::ys => case init' $ y::ys of Nothing => Nothing Just j => Just $ x :: j@@ -305,7 +305,7 @@ ||| @ z the third list zipWith3 : (f : a -> b -> c -> d) -> (x : List a) -> (y : List b) -> (z : List c) -> List d-zipWith3 f _ [] (z::zs) = [] +zipWith3 f _ [] (z::zs) = [] zipWith3 f _ (y::ys) [] = [] zipWith3 f [] (y::ys) _ = [] zipWith3 f (x::xs) [] _ = []@@ -761,7 +761,7 @@ mergeBy order [] right = right mergeBy order left [] = left mergeBy order (x::xs) (y::ys) =- if order x y == LT + if order x y == LT then x :: mergeBy order xs (y::ys) else y :: mergeBy order (x::xs) ys @@ -888,4 +888,3 @@ foldlMatchesFoldr : (f : b -> a -> b) -> (q : b) -> (xs : List a) -> foldl f q xs = foldlAsFoldr f q xs foldlMatchesFoldr f q [] = Refl foldlMatchesFoldr f q (x :: xs) = foldlMatchesFoldr f (f q x) xs-
@@ -5,10 +5,10 @@ import Prelude.Basics import Prelude.Bool import Prelude.Cast-import Prelude.Classes+import Prelude.Interfaces import Prelude.Foldable -%access public+%access public export %default total ||| An optional value. This can be used to represent the possibility of
@@ -8,21 +8,29 @@ import Prelude.Basics import IO -%access public+%access public export infixl 5 >>= interface Applicative m => Monad (m : Type -> Type) where+ ||| Also called `bind`. (>>=) : m a -> ((result : a) -> m b) -> m b -||| Also called `join` or mu-flatten : Monad m => m (m a) -> m a-flatten a = a >>= id+ ||| Also called `flatten` or mu+ join : m (m a) -> m a + -- default implementations+ (>>=) x f = join (f <$> x)+ join x = x >>= id+ ||| For compatibility with Haskell. Note that monads are **not** free to ||| define `return` and `pure` differently! return : Monad m => a -> m a return = pure++flatten : Monad m => m (m a) -> m a+flatten = join+%deprecate flatten "Please use `join`, which is the standard name." -- Annoyingly, these need to be here, so that we can use them in other -- Prelude modules other than the top level.
@@ -6,10 +6,10 @@ import Prelude.Basics import Prelude.Bool import Prelude.Cast-import Prelude.Classes+import Prelude.Interfaces import Prelude.Uninhabited -%access public+%access public export %default total ||| Natural numbers: unbounded, unsigned integers which can be pattern@@ -224,9 +224,9 @@ ||| A wrapper for Nat that specifies the semigroup and monad implementations that use (+) record Additive where- constructor GetAdditive + constructor GetAdditive _ : Nat- + Semigroup Multiplicative where (<+>) left right = GetMultiplicative $ left' * right' where@@ -341,6 +341,7 @@ divCeil : Nat -> Nat -> Nat divCeil x (S y) = divCeilNZ x (S y) SIsNotZ +partial Integral Nat where div = divNat mod = modNat@@ -424,7 +425,7 @@ plusCommutative Z right = rewrite plusZeroRightNeutral right in Refl plusCommutative (S left) right = let inductiveHypothesis = plusCommutative left right in- rewrite inductiveHypothesis in + rewrite inductiveHypothesis in rewrite plusSuccRightSucc right left in Refl total plusAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) ->@@ -450,21 +451,21 @@ plusLeftCancel Z right right' p = p plusLeftCancel (S left) right right' p = let inductiveHypothesis = plusLeftCancel left right right' in- inductiveHypothesis (succInjective _ _ p) + inductiveHypothesis (succInjective _ _ p) total plusRightCancel : (left : Nat) -> (left' : Nat) -> (right : Nat) -> (p : left + right = left' + right) -> left = left' plusRightCancel left left' Z p = rewrite sym (plusZeroRightNeutral left) in rewrite sym (plusZeroRightNeutral left') in- p + p plusRightCancel left left' (S right) p =- plusRightCancel left left' right - (succInjective _ _ (rewrite plusSuccRightSucc left right in + plusRightCancel left left' right+ (succInjective _ _ (rewrite plusSuccRightSucc left right in rewrite plusSuccRightSucc left' right in p)) total plusLeftLeftRightZero : (left : Nat) -> (right : Nat) -> (p : left + right = left) -> right = Z-plusLeftLeftRightZero Z right p = p +plusLeftLeftRightZero Z right p = p plusLeftLeftRightZero (S left) right p = plusLeftLeftRightZero left right (succInjective _ _ p) @@ -481,7 +482,7 @@ multRightSuccPlus Z right = Refl multRightSuccPlus (S left) right = let inductiveHypothesis = multRightSuccPlus left right in- rewrite inductiveHypothesis in + rewrite inductiveHypothesis in rewrite plusAssociative left right (mult left right) in rewrite plusAssociative right left (mult left right) in rewrite plusCommutative right left in@@ -493,11 +494,11 @@ total multCommutative : (left : Nat) -> (right : Nat) -> left * right = right * left-multCommutative Z right = rewrite multZeroRightZero right in Refl +multCommutative Z right = rewrite multZeroRightZero right in Refl multCommutative (S left) right = let inductiveHypothesis = multCommutative left right in rewrite inductiveHypothesis in- rewrite multRightSuccPlus right left in + rewrite multRightSuccPlus right left in Refl total multDistributesOverPlusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->@@ -505,7 +506,7 @@ multDistributesOverPlusRight Z centre right = Refl multDistributesOverPlusRight (S left) centre right = let inductiveHypothesis = multDistributesOverPlusRight left centre right in- rewrite inductiveHypothesis in + rewrite inductiveHypothesis in rewrite plusAssociative (plus centre (mult left centre)) right (mult left right) in rewrite sym (plusAssociative centre (mult left centre) right) in rewrite plusCommutative (mult left centre) right in@@ -527,7 +528,7 @@ multAssociative Z centre right = Refl multAssociative (S left) centre right = let inductiveHypothesis = multAssociative left centre right in- rewrite inductiveHypothesis in + rewrite inductiveHypothesis in rewrite multDistributesOverPlusLeft centre (mult left centre) right in Refl @@ -619,7 +620,7 @@ total multPowerPowerPlus : (base : Nat) -> (exp : Nat) -> (exp' : Nat) -> (power base exp) * (power base exp') = power base (exp + exp')-multPowerPowerPlus base Z exp' = +multPowerPowerPlus base Z exp' = rewrite sym (plusZeroRightNeutral (power base exp')) in Refl multPowerPowerPlus base (S exp) exp' = let inductiveHypothesis = multPowerPowerPlus base exp exp' in@@ -651,7 +652,7 @@ powerPowerMultPower base exp Z = rewrite multZeroRightZero exp in Refl powerPowerMultPower base exp (S exp') = let inductiveHypothesis = powerPowerMultPower base exp exp' in- rewrite inductiveHypothesis in + rewrite inductiveHypothesis in rewrite multRightSuccPlus exp exp' in rewrite sym (multPowerPowerPlus base exp (mult exp exp')) in Refl@@ -664,7 +665,7 @@ minus left (S right) = pred (minus left right) minusSuccPred Z right = Refl minusSuccPred (S left) Z =- rewrite minusZeroRight left in Refl + rewrite minusZeroRight left in Refl minusSuccPred (S left) (S right) = let inductiveHypothesis = minusSuccPred left right in rewrite inductiveHypothesis in Refl@@ -782,4 +783,3 @@ total sucMinR : (l : Nat) -> minimum l (S l) = l sucMinR Z = Refl sucMinR (S l) = cong (sucMinR l)-
@@ -2,7 +2,7 @@ import Builtins -%access public+%access public export %default total swap : (a, b) -> (b, a)@@ -14,7 +14,7 @@ data Exists : (P : a -> Type) -> Type where Evidence : .(x : a) -> (pf : P x) -> Exists P - ||| Dependent pair where the second field is erased. + ||| Dependent pair where the second field is erased. data Subset : (a : Type) -> (P : a -> Type) -> Type where Element : (x : a) -> .(pf : P x) -> Subset a P @@ -34,12 +34,20 @@ getProof : (x : Subset a P) -> P (getWitness x) getProof (Element x pf) = pf - namespace Sigma- getWitness : Sigma a P -> a- getWitness (x ** pf) = x+ namespace DPair+ fst : DPair a P -> a+ fst (x ** pf) = x - getProof : (x : Sigma a P) -> P (getWitness x)- getProof (x ** pf) = pf+ snd : (x : DPair a P) -> P (fst x)+ snd (x ** pf) = pf++ getWitness : DPair a P -> a+ getWitness = fst+ %deprecate DPair.getWitness "This is being deprecated in favour of `fst`."++ getProof : (x : DPair a P) -> P (fst x)+ getProof = snd+ %deprecate DPair.getProof "This is being deprecated in favour of `snd`." -- Polymorphic (class-based) projections have been removed -- because type-directed name disambiguation works better.
@@ -1,11 +1,14 @@ module Prelude.Providers +import Prelude.Basics import Prelude.Functor import Prelude.Applicative import Prelude.Monad +%access public export+ ||| Type providers must build one of these in an IO computation.-public+public export data Provider : (a : Type) -> Type where ||| Return a term to be spliced in ||| @ x the term to be spliced (i.e. the proof)
@@ -7,13 +7,15 @@ import Prelude.Bool import Prelude.Cast import Prelude.Chars-import Prelude.Classes+import Prelude.Interfaces import Prelude.List import Prelude.Maybe import Prelude.Either import Prelude.Nat import Prelude.Strings +%access public export+ %default total ||| The precedence of an Idris operator or syntactic context.@@ -190,6 +192,5 @@ showPrec d (Left x) = showCon d "Left" $ showArg x showPrec d (Right x) = showCon d "Right" $ showArg x -(Show a, {y : a} -> Show (p y)) => Show (Sigma a p) where+(Show a, {y : a} -> Show (p y)) => Show (DPair a p) where show (y ** prf) = "(" ++ show y ++ " ** " ++ show prf ++ ")"-
@@ -9,7 +9,7 @@ import Prelude.Nat import Prelude.List -%access public+%access public export %default total ||| An infinite stream@@ -62,8 +62,12 @@ index Z (x::xs) = x index (S k) (x::xs) = index k xs -||| Combine two streams element-wise using a function-zipWith : (a -> b -> c) -> Stream a -> Stream b -> Stream c+||| Combine two streams element-wise using a function.+|||+||| @ f the function to combine elements with+||| @ xs the first stream of elements+||| @ ys the second stream of elements+zipWith : (f : a -> b -> c) -> (xs : Stream a) -> (ys : Stream b) -> Stream c zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys ||| Combine three streams by applying a function element-wise along them
@@ -8,7 +8,7 @@ import Prelude.Bool import Prelude.Chars import Prelude.Cast-import Prelude.Classes+import Prelude.Interfaces import Prelude.Either import Prelude.Foldable import Prelude.Functor@@ -17,6 +17,8 @@ import Prelude.Monad import Decidable.Equality +%access public export+ partial foldr1 : (a -> a -> a) -> List a -> a foldr1 _ [x] = x@@ -112,7 +114,7 @@ -- we need the 'believe_me' because the operations are primitives strM : (x : String) -> StrM x strM x with (decEq (not (x == "")) True)- strM x | (Yes p) = really_believe_me $ + strM x | (Yes p) = really_believe_me $ StrCons (assert_total (strHead' x p)) (assert_total (strTail' x p)) strM x | (No p) = really_believe_me StrNil@@ -364,4 +366,3 @@ nullStr : String -> IO Bool nullStr p = do ok <- foreign FFI_C "isNull" (String -> IO Int) p return (ok /= 0)-
@@ -7,6 +7,8 @@ import Prelude.Foldable import Prelude.Functor +%access public export+ traverse_ : (Foldable t, Applicative f) => (a -> f b) -> t a -> f () traverse_ f = foldr ((*>) . f) (pure ())
@@ -5,6 +5,8 @@ import Builtins +%access public export+ ||| A canonical proof that some type is empty interface Uninhabited t where ||| If I have a t, I've had a contradiction
@@ -4,7 +4,7 @@ modules = Builtins, Prelude, IO, Prelude.Algebra, Prelude.Basics, Prelude.Bool, Prelude.Cast,- Prelude.Classes, Prelude.Nat, Prelude.List,+ Prelude.Interfaces, Prelude.Nat, Prelude.List, Prelude.Maybe, Prelude.Monad, Prelude.Applicative, Prelude.Either, Prelude.Strings, Prelude.Chars, Prelude.Show, Prelude.Functor, Prelude.Foldable, Prelude.Traversable, Prelude.Bits, Prelude.Stream,@@ -14,4 +14,3 @@ Language.Reflection, Language.Reflection.Errors, Language.Reflection.Elab, Decidable.Equality-
@@ -5,6 +5,8 @@ import Language.Reflection.Utils +%access public export+ ||| Run something for effects, throwing away the return value ignore : Functor f => f a -> f () ignore x = map (const ()) x
@@ -133,7 +133,7 @@ ||| equality. ||| ||| @ fn the name of the function whose type has been declared-abstract partial -- because of mkRhs+export partial -- because of mkRhs deriveDecEq : (fn : TTName) -> Elab () deriveDecEq fn = do (_, Ref, sig') <- lookupTyExact fn
@@ -248,7 +248,7 @@ in traverse (\(i, con) => getElimClause info elimn methodCount con i) (enumerate ctors) -abstract+export deriveElim : (tyn, elimn : TTName) -> Elab () deriveElim tyn elimn = do -- Begin with some basic sanity checking: the type name uniquely
@@ -67,7 +67,7 @@ ||| Solve a goal of the form `(C1 x1 x2 ... xn = C2 x1 x2 ... xn) -> ||| Void` for disjoint constructors `C1` and `C2`.-public covering+public export covering disjoint : Elab () disjoint = do compute
@@ -125,7 +125,7 @@ ||| Perform induction on some expression to solve the current ||| goal. Return a list of new holes to be solved.-public+public export induction : Raw -> Elab (List TTName) induction subj = do g <- goalType
@@ -92,7 +92,7 @@ ||| ||| @ tm the equality to exploit injectivity on ||| @ n the name at which to bind the result-covering public+covering public export injective : (tm : Raw) -> (n : TTName) -> Elab () injective tm n = do (_, ty) <- check !getEnv tm
@@ -7,6 +7,8 @@ import Data.Vect +%access public export+ ||| Get the name of a reflected type constructor argument. tyConArgName : TyConArg -> TTName tyConArgName (TyConParameter a) = name a
@@ -6,7 +6,7 @@ import Language.Reflection.Utils -+%access public export ||| A representation of a type constructor in which all argument names ||| are made unique and they are separated into params and then
@@ -2,6 +2,8 @@ import Language.Reflection.Utils +%access public export+ ||| A renamer keeps track of names to be substituted Renamer : Type Renamer = TTName -> Maybe TTName
@@ -822,3 +822,38 @@ return cl; } +VAL idris_peekB8(VM* vm, VAL ptr, VAL offset) {+ return MKB8(vm, *(uint8_t*)(GETPTR(ptr) + GETINT(offset)));+}++VAL idris_pokeB8(VAL ptr, VAL offset, VAL data) {+ *(uint8_t*)(GETPTR(ptr) + GETINT(offset)) = GETBITS8(data);+ return MKINT(0);+}++VAL idris_peekB16(VM* vm, VAL ptr, VAL offset) {+ return MKB16(vm, *(uint16_t*)(GETPTR(ptr) + GETINT(offset)));+}++VAL idris_pokeB16(VAL ptr, VAL offset, VAL data) {+ *(uint16_t*)(GETPTR(ptr) + GETINT(offset)) = GETBITS16(data);+ return MKINT(0);+}++VAL idris_peekB32(VM* vm, VAL ptr, VAL offset) {+ return MKB32(vm, *(uint32_t*)(GETPTR(ptr) + GETINT(offset)));+}++VAL idris_pokeB32(VAL ptr, VAL offset, VAL data) {+ *(uint32_t*)(GETPTR(ptr) + GETINT(offset)) = GETBITS32(data);+ return MKINT(0);+}++VAL idris_peekB64(VM* vm, VAL ptr, VAL offset) {+ return MKB64(vm, *(uint64_t*)(GETPTR(ptr) + GETINT(offset)));+}++VAL idris_pokeB64(VAL ptr, VAL offset, VAL data) {+ *(uint64_t*)(GETPTR(ptr) + GETINT(offset)) = GETBITS64(data);+ return MKINT(0);+}
@@ -126,4 +126,14 @@ VAL idris_b64T16(VM *vm, VAL a); VAL idris_b64T32(VM *vm, VAL a); +// memory access+VAL idris_peekB8(VM* vm, VAL ptr, VAL offset);+VAL idris_pokeB8(VAL ptr, VAL offset, VAL data);+VAL idris_peekB16(VM* vm, VAL ptr, VAL offset);+VAL idris_pokeB16(VAL ptr, VAL offset, VAL data);+VAL idris_peekB32(VM* vm, VAL ptr, VAL offset);+VAL idris_pokeB32(VAL ptr, VAL offset, VAL data);+VAL idris_peekB64(VM* vm, VAL ptr, VAL offset);+VAL idris_pokeB64(VAL ptr, VAL offset, VAL data);+ #endif
@@ -488,3 +488,16 @@ return MKSTR(vm, str); } +// Get 64 bits out of a big int with special handling+// for systems that have 32-bit longs which needs two limbs to+// fill that.+uint64_t idris_truncBigB64(const mpz_t bi) {+ if (sizeof(mp_limb_t) == 8) {+ return mpz_get_ui(bi);+ }+ int64_t out = mpz_get_ui(bi);+ if (bi->_mp_size > 1 ) {+ out |= (uint64_t)bi->_mp_d[1] << 32;+ }+ return out;+}
@@ -43,6 +43,8 @@ VAL idris_bigShiftLeft(VM* vm, VAL x, VAL y); VAL idris_bigShiftRight(VM* vm, VAL x, VAL y); +uint64_t idris_truncBigB64(const mpz_t bi);+ #define GETMPZ(x) *((mpz_t*)((x)->info.ptr)) #endif
@@ -78,6 +78,14 @@ return vm; } +VM* get_vm(void) {+#ifdef HAS_PTHREAD+ return pthread_getspecific(vm_key);+#else+ return global_vm;+#endif+}+ void close_vm(VM* vm) { terminate(vm); }@@ -113,7 +121,7 @@ pthread_mutex_destroy(&(vm -> inbox_block)); pthread_cond_destroy(&(vm -> inbox_waiting)); #endif- // free(vm); + // free(vm); // Set the VM as inactive, so that if any message gets sent to it // it will not get there, rather than crash the entire system. // (TODO: We really need to be cleverer than this if we're going to@@ -414,6 +422,18 @@ *(((uint8_t*)ptr) + offset) = data; } ++VAL idris_peekPtr(VM* vm, VAL ptr, VAL offset) {+ void** addr = GETPTR(ptr) + GETINT(offset);+ return MKPTR(vm, *addr);+}++VAL idris_pokePtr(VAL ptr, VAL offset, VAL data) {+ void** addr = GETPTR(ptr) + GETINT(offset);+ *addr = GETPTR(data);+ return MKINT(0);+}+ void idris_memmove(void* dest, void* src, i_int dest_offset, i_int src_offset, i_int size) { memmove(dest + dest_offset, src + src_offset, size); }@@ -789,12 +809,12 @@ } pthread_mutex_lock(&(dest->inbox_lock));- + if (dest->inbox_write >= dest->inbox_end) { // FIXME: This is obviously bad in the long run. This should // either block, make the inbox bigger, or return an error code, // or possibly make it user configurable- fprintf(stderr, "Inbox full"); + fprintf(stderr, "Inbox full"); exit(-1); } @@ -820,7 +840,7 @@ VM* idris_checkMessagesFrom(VM* vm, VM* sender) { Msg* msg;- + for (msg = vm->inbox; msg < vm->inbox_end && msg->msg != NULL; ++msg) { if (sender == NULL || msg->sender == sender) { return msg->sender;@@ -854,7 +874,7 @@ Msg* idris_getMessageFrom(VM* vm, VM* sender) { Msg* msg;- + for (msg = vm->inbox; msg < vm->inbox_write; ++msg) { if (sender == NULL || msg->sender == sender) { return msg;
@@ -115,6 +115,9 @@ // Create a new VM VM* init_vm(int stack_size, size_t heap_size, int max_threads);++// Get the VM for the current thread+VM* get_vm(void); // Initialise thread-local data for this VM void init_threaddata(VM *vm); // Clean up a VM once it's no longer needed@@ -304,9 +307,12 @@ // Raw memory manipulation void idris_memset(void* ptr, i_int offset, uint8_t c, i_int size);+void idris_memmove(void* dest, void* src, i_int dest_offset, i_int src_offset, i_int size); uint8_t idris_peek(void* ptr, i_int offset); void idris_poke(void* ptr, i_int offset, uint8_t data);-void idris_memmove(void* dest, void* src, i_int dest_offset, i_int src_offset, i_int size);++VAL idris_peekPtr(VM* vm, VAL ptr, VAL offset);+VAL idris_pokePtr(VAL ptr, VAL offset, VAL data); // String primitives VAL idris_concat(VM* vm, VAL l, VAL r);
@@ -33,7 +33,7 @@ Expr G c If : Expr G TyBool -> Lazy (Expr G a) -> Lazy (Expr G a) -> Expr G a - interp : Env G -> [static] (e : Expr G t) -> interpTy t+ interp : Env G -> %static (e : Expr G t) -> interpTy t interp env (Var i) = lookup i env interp env (Val x) = x interp env (Lam sc) = \x => interp (x :: env) sc
@@ -13,7 +13,7 @@ import Numeric import Data.Char import Data.Bits-import Data.List (intercalate)+import Data.List (intercalate, nubBy) import System.Process import System.Exit import System.IO@@ -48,19 +48,20 @@ [String] -> -- extra object files [String] -> -- extra compiler flags (libraries) [String] -> -- extra compiler flags (anything)- [ExportIFace] -> + [ExportIFace] -> Bool -> -- interfaces too (so make a .o instead) DbgLevel -> IO () codegenC' defs out exec incs objs libs flags exports iface dbg = do -- print defs let bc = map toBC defs+ let wrappers = genWrappers bc let h = concatMap toDecl (map fst bc) let cc = concatMap (uncurry toC) bc let hi = concatMap ifaceC (concatMap getExp exports) d <- getDataDir mprog <- readFile (d </> "rts" </> "idris_main" <.> "c")- let cout = headers incs ++ debug dbg ++ h ++ cc +++ let cout = headers incs ++ debug dbg ++ h ++ wrappers ++ cc ++ (if (exec == Executable) then mprog else hi) case exec of MavenProject -> putStrLn ("FAILURE: output type not supported")@@ -81,10 +82,10 @@ "-I."] ++ objs ++ envFlags ++ (if (exec == Executable) then [] else ["-c"]) ++ [tmpn] ++- (if not iface then concatMap words libFlags else []) ++- concatMap words incFlags ++- (if not iface then concatMap words libs else []) ++- concatMap words flags +++ (if not iface then libFlags else []) +++ incFlags +++ (if not iface then libs else []) +++ flags ++ ["-o", out] -- putStrLn (show args) exit <- rawSystem comp args@@ -153,7 +154,7 @@ headHex h (length bytes) : map toHex bytes where split acc 0 = acc- split acc x = let xbits = x .&. 0x3f + split acc x = let xbits = x .&. 0x3f xrest = shiftR x 6 in split (xbits : acc) xrest @@ -185,7 +186,7 @@ -- if it's a type constant, we won't use it, but equally it shouldn't -- report an error. These might creep into generated for various reasons -- (especially if erasure is disabled).- mkConst c | isTypeConst c = "MKINT(42424242)" + mkConst c | isTypeConst c = "MKINT(42424242)" mkConst c = error $ "mkConst of (" ++ show c ++ ") not implemented" bcc i (UPDATE l r) = indent i ++ creg l ++ " = " ++ creg r ++ ";\n"@@ -317,18 +318,29 @@ bcc i (BASETOP n) = indent i ++ "BASETOP(" ++ show n ++ ");\n" bcc i STOREOLD = indent i ++ "STOREOLD;\n" bcc i (OP l fn args) = indent i ++ doOp (creg l ++ " = ") fn args ++ ";\n"+bcc i (FOREIGNCALL l rty (FStr fn@('&':name)) [])+ = indent i +++ c_irts (toFType rty) (creg l ++ " = ") fn ++ ";\n"+bcc i (FOREIGNCALL l rty (FStr fn) (x:xs)) | fn == "%wrapper"+ = indent i +++ c_irts (toFType rty) (creg l ++ " = ")+ ("_idris_get_wrapper(" ++ creg (snd x) ++ ")") ++ ";\n"+bcc i (FOREIGNCALL l rty (FStr fn) (x:xs)) | fn == "%dynamic"+ = indent i ++ c_irts (toFType rty) (creg l ++ " = ")+ ("(*(" ++ cFnSig "" rty xs ++ ") GETPTR(" ++ creg (snd x) ++ "))" +++ "(" ++ showSep "," (map fcall xs) ++ ")") ++ ";\n" bcc i (FOREIGNCALL l rty (FStr fn) args) = indent i ++ c_irts (toFType rty) (creg l ++ " = ") (fn ++ "(" ++ showSep "," (map fcall args) ++ ")") ++ ";\n"- where fcall (t, arg) = irts_c (toFType t) (creg arg) bcc i (NULL r) = indent i ++ creg r ++ " = NULL;\n" -- clear, so it'll be GCed bcc i (ERROR str) = indent i ++ "fprintf(stderr, " ++ show str ++ "); fprintf(stderr, \"\\n\"); exit(-1);\n" -- bcc i c = error (show c) -- indent i ++ "// not done yet\n" +fcall (t, arg) = irts_c (toFType t) (creg arg) -- Deconstruct the Foreign type in the defunctionalised expression and build -- a foreign type description for c_irts and irts_c-toAType (FCon i) +toAType (FCon i) | i == sUN "C_IntChar" = ATInt ITChar | i == sUN "C_IntNative" = ATInt ITNative | i == sUN "C_IntBits8" = ATInt (ITFixed IT8)@@ -337,18 +349,26 @@ | i == sUN "C_IntBits64" = ATInt (ITFixed IT64) toAType t = error (show t ++ " not defined in toAType") -toFType (FCon c) +toFType (FCon c) | c == sUN "C_Str" = FString | c == sUN "C_Float" = FArith ATFloat | c == sUN "C_Ptr" = FPtr | c == sUN "C_MPtr" = FManagedPtr | c == sUN "C_Unit" = FUnit-toFType (FApp c [_,ity]) +toFType (FApp c [_,ity]) | c == sUN "C_IntT" = FArith (toAType ity)-toFType (FApp c [_]) + | c == sUN "C_FnT" = toFunType ity+toFType (FApp c [_]) | c == sUN "C_Any" = FAny toFType t = FAny +toFunType (FApp c [_,ity])+ | c == sUN "C_FnBase" = FFunction+ | c == sUN "C_FnIO" = FFunctionIO+toFunType (FApp c [_,_,_,ity])+ | c == sUN "C_Fn" = toFunType ity+toFunType _ = FAny+ c_irts (FArith (ATInt ITNative)) l x = l ++ "MKINT((i_int)(" ++ x ++ "))" c_irts (FArith (ATInt ITChar)) l x = c_irts (FArith (ATInt ITNative)) l x c_irts (FArith (ATInt (ITFixed ity))) l x@@ -359,6 +379,8 @@ c_irts FManagedPtr l x = l ++ "MKMPTR(vm, " ++ x ++ ")" c_irts (FArith ATFloat) l x = l ++ "MKFLOAT(vm, " ++ x ++ ")" c_irts FAny l x = l ++ x+c_irts FFunction l x = error "Return of function from foreign call is not supported"+c_irts FFunctionIO l x = error "Return of function from foreign call is not supported" irts_c (FArith (ATInt ITNative)) x = "GETINT(" ++ x ++ ")" irts_c (FArith (ATInt ITChar)) x = irts_c (FArith (ATInt ITNative)) x@@ -370,7 +392,15 @@ irts_c FManagedPtr x = "GETMPTR(" ++ x ++ ")" irts_c (FArith ATFloat) x = "GETFLOAT(" ++ x ++ ")" irts_c FAny x = x+irts_c FFunctionIO x = wrapped x+irts_c FFunction x = wrapped x +cFnSig name rty [] = ctype rty ++ " (*" ++ name ++ ")(void) "+cFnSig name rty args = ctype rty ++ " (*" ++ name ++ ")("+ ++ showSep "," (map (ctype . fst) args) ++ ") "++wrapped x = "_idris_get_wrapper(" ++ x ++ ")"+ bitOp v op ty args = v ++ "idris_b" ++ show (nativeTyWidth ty) ++ op ++ "(vm, " ++ intercalate ", " (map creg args) ++ ")" bitCoerce v op input output arg@@ -527,6 +557,8 @@ = v ++ "MKINT((i_int)" ++ creg x ++ "->info.bits" ++ show (nativeTyWidth from) ++ ")" doOp v (LTrunc (ITFixed from) ITChar) [x] = doOp v (LTrunc (ITFixed from) ITNative) [x]+doOp v (LTrunc ITBig (ITFixed IT64)) [x]+ = v ++ "idris_b64const(vm, ISINT(" ++ creg x ++ ") ? GETINT(" ++ creg x ++ ") : idris_truncBigB64(GETMPZ(" ++ creg x ++ ")))" doOp v (LTrunc ITBig (ITFixed to)) [x] = v ++ "idris_b" ++ show (nativeTyWidth to) ++ "const(vm, ISINT(" ++ creg x ++ ") ? GETINT(" ++ creg x ++ ") : mpz_get_ui(GETMPZ(" ++ creg x ++ ")))" doOp v (LTrunc (ITFixed from) (ITFixed to)) [x]@@ -551,7 +583,7 @@ doOp v LStrEq [l,r] = v ++ "idris_streq(vm, " ++ creg l ++ ", " ++ creg r ++ ")" doOp v LReadStr [_] = v ++ "idris_readStr(vm, stdin)"-doOp v LWriteStr [_,s] +doOp v LWriteStr [_,s] = v ++ "MKINT((i_int)(idris_writeStr(stdout" ++ ",GETSTR(" ++ creg s ++ "))))"@@ -577,10 +609,10 @@ doOp v LNoOp args = v ++ creg (last args) -- Pointer primitives (declared as %extern in Builtins.idr)-doOp v (LExternal rf) [_,x] +doOp v (LExternal rf) [_,x] | rf == sUN "prim__readFile" = v ++ "idris_readStr(vm, GETPTR(" ++ creg x ++ "))"-doOp v (LExternal wf) [_,x,s] +doOp v (LExternal wf) [_,x,s] | wf == sUN "prim__writeFile" = v ++ "MKINT((i_int)(idris_writeStr(GETPTR(" ++ creg x ++ "),GETSTR("@@ -591,15 +623,38 @@ doOp v (LExternal se) [] | se == sUN "prim__stderr" = v ++ "MKPTR(vm, stderr)" doOp v (LExternal nul) [] | nul == sUN "prim__null" = v ++ "MKPTR(vm, NULL)"-doOp v (LExternal eqp) [x, y] | eqp == sUN "prim__eqPtr" +doOp v (LExternal eqp) [x, y] | eqp == sUN "prim__eqPtr" = v ++ "MKINT((i_int)(GETPTR(" ++ creg x ++ ") == GETPTR(" ++ creg y ++ ")))"-doOp v (LExternal eqp) [x, y] | eqp == sUN "prim__eqManagedPtr" +doOp v (LExternal eqp) [x, y] | eqp == sUN "prim__eqManagedPtr" = v ++ "MKINT((i_int)(GETMPTR(" ++ creg x ++ ") == GETMPTR(" ++ creg y ++ ")))" doOp v (LExternal rp) [p, i] | rp == sUN "prim__registerPtr" = v ++ "MKMPTR(vm, GETPTR(" ++ creg p ++ "), GETINT(" ++ creg i ++ "))"-+doOp v (LExternal pk) [_, p, o] | pk == sUN "prim__peek8"+ = v ++ "idris_peekB8(vm," ++ creg p ++ "," ++ creg o ++")"+doOp v (LExternal pk) [_, p, o, x] | pk == sUN "prim__poke8"+ = v ++ "idris_pokeB8(" ++ creg p ++ "," ++ creg o ++ "," ++ creg x ++ ")"+doOp v (LExternal pk) [_, p, o] | pk == sUN "prim__peek16"+ = v ++ "idris_peekB16(vm," ++ creg p ++ "," ++ creg o ++")"+doOp v (LExternal pk) [_, p, o, x] | pk == sUN "prim__poke16"+ = v ++ "idris_pokeB16(" ++ creg p ++ "," ++ creg o ++ "," ++ creg x ++ ")"+doOp v (LExternal pk) [_, p, o] | pk == sUN "prim__peek32"+ = v ++ "idris_peekB32(vm," ++ creg p ++ "," ++ creg o ++")"+doOp v (LExternal pk) [_, p, o, x] | pk == sUN "prim__poke32"+ = v ++ "idris_pokeB32(" ++ creg p ++ "," ++ creg o ++ "," ++ creg x ++ ")"+doOp v (LExternal pk) [_, p, o] | pk == sUN "prim__peek64"+ = v ++ "idris_peekB64(vm," ++ creg p ++ "," ++ creg o ++")"+doOp v (LExternal pk) [_, p, o, x] | pk == sUN "prim__poke64"+ = v ++ "idris_pokeB64(" ++ creg p ++ "," ++ creg o ++ "," ++ creg x ++ ")"+doOp v (LExternal pk) [_, p, o] | pk == sUN "prim__peekPtr"+ = v ++ "idris_peekPtr(vm," ++ creg p ++ "," ++ creg o ++")"+doOp v (LExternal pk) [_, p, o, x] | pk == sUN "prim__pokePtr"+ = v ++ "idris_pokePtr(" ++ creg p ++ "," ++ creg o ++ "," ++ creg x ++ ")"+doOp v (LExternal pk) [] | pk == sUN "prim__sizeofPtr"+ = v ++ "MKINT(sizeof(void*))"+doOp v (LExternal mpt) [p] | mpt == sUN "prim__asPtr" = v ++ "MKPTR(vm, GETMPTR("++ creg p ++"))" doOp _ op args = error $ "doOp not implemented (" ++ show (op, args) ++ ")" + flUnOp :: String -> String -> String flUnOp name val = "MKFLOAT(vm, " ++ name ++ "(GETFLOAT(" ++ val ++ ")))" @@ -610,7 +665,7 @@ ifaceC :: Export -> String ifaceC (ExportData n) = "typedef VAL " ++ cdesc n ++ ";\n" ifaceC (ExportFun n cn ret args)- = ctype ret ++ " " ++ cdesc cn ++ + = ctype ret ++ " " ++ cdesc cn ++ "(VM* vm" ++ showArgs (zip argNames args) ++ ") {\n" ++ mkBody n (zip argNames args) ret ++ "}\n\n" where showArgs [] = ""@@ -623,7 +678,7 @@ indent 1 ++ "RESERVE(" ++ show (max (length as) 3) ++ ");\n" ++ push 0 as ++ call n ++ retval t where push i [] = ""- push i ((n, t) : ts) = indent 1 ++ c_irts (toFType t) + push i ((n, t) : ts) = indent 1 ++ c_irts (toFType t) ("TOP(" ++ show i ++ ") = ") n ++ ";\n" ++ push (i + 1) ts @@ -689,7 +744,7 @@ hdr_export :: Export -> String hdr_export (ExportData n) = "typedef VAL " ++ cdesc n ++ ";\n" hdr_export (ExportFun n cn ret args)- = ctype ret ++ " " ++ cdesc cn ++ + = ctype ret ++ " " ++ cdesc cn ++ "(VM* vm" ++ showArgs (zip argNames args) ++ ");\n" where showArgs [] = "" showArgs ((n, t) : ts) = ", " ++ ctype t ++ " " ++ n ++@@ -697,5 +752,112 @@ argNames = zipWith (++) (repeat "arg") (map show [0..]) +------------------ Callback wrapper generation ----------------+-- Generate callback wrappers and a function to select the+-- correct wrapper function to pass.+-- TODO: This is limited to functions that are specified in+-- the foreign call. Otherwise we would have to generate wrappers for all+-- functions with correct arity or do flow analysis+-- to find all possible inputs to the foreign call.+genWrappers :: [(Name, [BC])] -> String+genWrappers bcs = let+ tags = nubBy (\x y -> snd x == snd y) $ concatMap (getCallback . snd) bcs+ in+ case tags of+ [] -> ""+ t -> concatMap genWrapper t ++ genDispatcher t +genDispatcher :: [(FDesc, Int)] -> String+genDispatcher tags = "void* _idris_get_wrapper(VAL con)\n" +++ "{\n" +++ indent 1 ++ "switch(TAG(con)) {\n" +++ concatMap makeSwitch tags +++ indent 1 ++ "}\n" +++ indent 1 ++ "fprintf(stderr, \"No wrapper for callback\");\n" +++ indent 1 ++ "exit(-1);\n" +++ "}\n\n"+ where+ makeSwitch (_, tag) =+ indent 1 ++ "case " ++ show tag ++ ":\n" +++ indent 2 ++ "return (void*) &" ++ wrapperName tag ++ ";\n" +genWrapper :: (FDesc, Int) -> String+genWrapper (desc, tag) | (toFType desc) == FFunctionIO =+ error $ "Cannot create C callbacks for IO functions, wrap them with unsafePerformIO.\n"+genWrapper (desc, tag) = ret ++ " " ++ wrapperName tag ++ "(" +++ renderArgs argList ++")\n" +++ "{\n" +++ (if ret /= "void" then indent 1 ++ ret ++ " ret;\n" else "") +++ indent 1 ++ "VM* vm = get_vm();\n" +++ indent 1 ++ "if (vm == NULL) {\n" +++ indent 2 ++ "fprintf(stderr, \"No vm available in callback.\");\n" +++ indent 2 ++ "exit(-1);\n" +++ indent 1 ++ "}\n" +++ indent 1 ++ "INITFRAME;\n" +++ indent 1 ++ "RESERVE(" ++ show (len + 1) ++ ");\n" +++ indent 1 ++ "allocCon(REG1, vm, " ++ show tag ++ ",0 , 0);\n" +++ indent 1 ++ "TOP(0) = REG1;\n" ++++ push 1 argList +++ indent 1 ++ "STOREOLD;\n" +++ indent 1 ++ "BASETOP(0);\n" +++ indent 1 ++ "ADDTOP(" ++ show (len + 1) ++ ");\n" +++ indent 1 ++ "CALL(_idris__123_APPLY0_125_);\n" +++ if ret /= "void"+ then indent 1 ++ "ret = " ++ irts_c (toFType ft) "RVAL" ++ ";\n"+ ++ indent 1 ++ "return ret;\n}\n\n"+ else "}\n\n"+ where+ (ret, ft) = rty desc+ argList = zip (args desc) [0..]+ len = length argList+ renderArgs [] = "void"+ renderArgs [((s, _), n)] = s ++ " a" ++ (show n)+ renderArgs (((s, _), n):xs) = s ++ " a" ++ (show n) ++ ", " +++ renderArgs xs+ rty (FApp c [_,ty])+ | c == sUN "C_FnBase" = (ctype ty, ty)+ | c == sUN "C_FnIO" = (ctype ty, ty)+ | c == sUN "C_FnT" = rty ty+ rty (FApp c [_,_,ty,fn])+ | c == sUN "C_Fn" = rty fn+ rty x = ("", x)+ args (FApp c [_,ty])+ | c == sUN "C_FnBase" = []+ | c == sUN "C_FnIO" = []+ | c == sUN "C_FnT" = args ty+ args (FApp c [_,_,ty,fn])+ | toFType ty == FUnit = []+ | c == sUN "C_Fn" = (ctype ty, ty) : args fn+ args _ = []+ push i [] = ""+ push i (((c, t), n) : ts) = indent 1 ++ c_irts (toFType t)+ ("TOP(" ++ show i ++ ") = ") ("a" ++ show n)+ ++ ";\n" ++ push (i + 1) ts++wrapperName :: Int -> String+wrapperName tag = "_idris_wrapper_" ++ show tag++getCallback :: [BC] -> [(FDesc, Int)]+getCallback bc = getCallback' (reverse bc)+ where+ getCallback' (x:xs) = case hasCallback x of+ [] -> getCallback' xs+ cbs -> case findCons cbs xs of+ [] -> error "Idris function couldn't be wrapped."+ x -> x+ getCallback' [] = []+ findCons (c:cs) xs = findCon c xs ++ findCons cs xs+ findCons [] _ = []+ findCon c ((MKCON l loc tag args):xs) | snd c == l = [(fst c, tag)]+ findCon c (_:xs) = findCon c xs+ findCon c [] = []++hasCallback :: BC -> [(FDesc, Reg)]+hasCallback (FOREIGNCALL l rty (FStr fn) args) = filter isFn args+ where+ isFn (desc,_) = case toFType desc of+ FFunction -> True+ FFunctionIO -> True+ _ -> False+hasCallback _ = []
@@ -3,19 +3,9 @@ import Idris.Core.TT import IRTS.Simplified import IRTS.Defunctionalise-import IRTS.Lang -import Control.Exception-import Data.Word-import System.Environment- data DbgLevel = NONE | DEBUG | TRACE deriving Eq data OutputType = Raw | Object | Executable | MavenProject deriving (Eq, Show)--environment :: String -> IO (Maybe String)-environment x = Control.Exception.catch (do e <- getEnv x- return (Just e))- (\y-> do return (y::SomeException); return Nothing) -- Everything which might be needed in a code generator - a CG can choose which -- level of Decls to generate code from (simplified, defunctionalised or merely
@@ -462,7 +462,7 @@ = do let l' = toFDesc l r' <- irTerm vs env r return (l', r')- splitArg _ = ifail "Badly formed foreign function call"+ splitArg _ = ifail $ "Badly formed foreign function call" toFDesc (Constant (Str str)) = FStr str toFDesc tm
@@ -1,8 +1,7 @@ {-# LANGUAGE CPP #-} module IRTS.System(getDataFileName, getDataDir, getTargetDir,getCC,getLibFlags,getIdrisLibDir,- getIncFlags, getEnvFlags, getMvn,getExecutablePom, version) where+ getIncFlags, getEnvFlags, version) where -import Util.System import Data.List.Split import Control.Applicative ((<$>))@@ -17,28 +16,18 @@ import Paths_idris #endif +overrideDataDirWith :: String -> IO FilePath+overrideDataDirWith envVar = do envValue <- lookupEnv envVar+ maybe getDataDir return envValue+ getCC :: IO String-getCC = fromMaybe "gcc" <$> environment "IDRIS_CC"+getCC = fromMaybe "gcc" <$> lookupEnv "IDRIS_CC" getEnvFlags :: IO [String]-getEnvFlags = maybe [] (splitOn " ") <$> environment "IDRIS_CFLAGS"--mvnCommand :: String-#ifdef mingw32_HOST_OS-mvnCommand = "mvn.bat"-#else-mvnCommand = "mvn"-#endif--getMvn :: IO String-getMvn = fromMaybe mvnCommand <$> environment "IDRIS_MVN"--environment :: String -> IO (Maybe String)-environment x = catchIO (Just <$> getEnv x)- (\_ -> return Nothing)+getEnvFlags = maybe [] (splitOn " ") <$> lookupEnv "IDRIS_CFLAGS" getTargetDir :: IO String-getTargetDir = environment "TARGET" >>= maybe getDataDir return+getTargetDir = overrideDataDirWith "TARGET" #if defined(FREEBSD) || defined(DRAGONFLY) extraLib = ["-L/usr/local/lib"]@@ -56,9 +45,7 @@ return $ ["-L" ++ (dir </> "rts"), "-lidris_rts"] ++ extraLib ++ gmpLib ++ ["-lpthread"] -getIdrisLibDir = do libPath <- environment "IDRIS_LIBRARY_PATH"- dir <- maybe getDataDir return libPath- return $ addTrailingPathSeparator dir+getIdrisLibDir = addTrailingPathSeparator <$> overrideDataDirWith "IDRIS_LIBRARY_PATH" #if defined(FREEBSD) || defined(DRAGONFLY) extraInclude = ["-I/usr/local/include"]@@ -67,6 +54,3 @@ #endif getIncFlags = do dir <- getDataDir return $ ("-I" ++ dir </> "rts") : extraInclude--getExecutablePom = do dir <- getDataDir- return $ dir </> "java" </> "executable_pom.xml"
@@ -118,16 +118,13 @@ ist_callgraph :: Name -> Field IState CGInfo ist_callgraph n = maybe_default CGInfo- { argsdef = [], calls = [], scg = []- , argsused = [], usedpos = []+ { calls = [], scg = [], usedpos = [] } . ctxt_lookup n . Field idris_callgraph (\v ist -> ist{ idris_callgraph = v }) --- some fields of the CGInfo record cg_usedpos :: Field CGInfo [(Int, [UsageReason])] cg_usedpos = Field usedpos (\v cg -> cg{ usedpos = v })- -- Commandline flags --------------------
@@ -77,7 +77,7 @@ (\_ -> return Nothing)) $ libs case msum handle of Nothing -> return (Right $ "Could not load dynamic alternatives \"" ++- concat (intersperse "," libs) ++ "\"")+ intercalate "," libs ++ "\"") Just x -> do putIState $ i { idris_dynamic_libs = x:ls } return (Left x) where findDyLib :: [DynamicLib] -> String -> Maybe DynamicLib@@ -96,6 +96,33 @@ put (i { idris_options = opts { opt_autoImport = fp : opt_autoImport opts } } ) +addDefinedName :: Name -> Idris ()+addDefinedName n = do ist <- getIState+ putIState $ ist { idris_inmodule = S.insert n (idris_inmodule ist) }++getDefinedNames :: Idris [Name]+getDefinedNames = do ist <- getIState+ return (S.toList (idris_inmodule ist))++addTT :: Term -> Idris (Maybe Term)+addTT t = do ist <- getIState+ case M.lookup t (idris_ttstats ist) of+ Nothing -> do let tt' = M.insert t (1, t) (idris_ttstats ist)+ putIState $ ist { idris_ttstats = tt' }+ return Nothing+ Just (i, t') -> do let tt' = M.insert t' (i + 1, t') (idris_ttstats ist)+ putIState $ ist { idris_ttstats = tt' }+ return (Just t')++dumpTT :: Idris ()+dumpTT = do ist <- get+ let sts = sortBy count (M.toList (idris_ttstats ist))+ mapM_ dump sts+ return ()+ where+ count (_,x) (_,y) = compare y x+ dump (tm, val) = runIO $ putStrLn (show val ++ ": " ++ show tm)+ addHdr :: Codegen -> String -> Idris () addHdr tgt f = do i <- getIState; putIState $ i { idris_hdrs = nub $ (tgt, f) : idris_hdrs i } @@ -180,6 +207,11 @@ let ctxt = setAccess n a (tt_ctxt i) putIState $ i { tt_ctxt = ctxt } +-- | get the accessibility of a name outside this module+getFromHideList :: Name -> Idris (Maybe Accessibility)+getFromHideList n = do i <- getIState+ return $ lookupCtxtExact n (hide_list i)+ setTotality :: Name -> Totality -> Idris () setTotality n a = do i <- getIState@@ -203,8 +235,7 @@ findCoercions t (n : ns) = let ps = case lookupTy n (tt_ctxt i) of [ty'] -> case unApply (getRetTy (normalise (tt_ctxt i) [] ty')) of- (t', _) ->- if t == t' then [n] else []+ (t', _) -> [n | t == t'] _ -> [] in ps ++ findCoercions t ns @@ -213,6 +244,14 @@ = do i <- getIState putIState $ i { idris_callgraph = addDef n cg (idris_callgraph i) } +addCalls :: Name -> [Name] -> Idris ()+addCalls n calls+ = do i <- getIState+ case lookupCtxtExact n (idris_callgraph i) of+ Nothing -> addToCG n (CGInfo calls [] [])+ Just (CGInfo cs scg used) ->+ addToCG n (CGInfo (nub (calls ++ cs)) scg used)+ addTyInferred :: Name -> Idris () addTyInferred n = do i <- getIState@@ -228,7 +267,7 @@ findMVApps x y = do let (fx, argsx) = unApply x let (fy, argsy) = unApply y- if (not (fx == fy))+ if (fx /= fy) then do tryAddMV fx y tryAddMV fy x@@ -309,7 +348,7 @@ allNames ns n | n `elem` ns = return [] allNames ns n = do i <- getIState case lookupCtxtExact n (idris_callgraph i) of- Just ns' -> do more <- mapM (allNames (n:ns)) (map fst (calls ns'))+ Just ns' -> do more <- mapM (allNames (n:ns)) (calls ns') return (nub (n : concat more)) _ -> return [n] @@ -341,11 +380,6 @@ [ns] -> ns _ -> [] --- Issue #1737 in the Issue Tracker.--- https://github.com/idris-lang/Idris-dev/issues/1737-addToCalledG :: Name -> [Name] -> Idris ()-addToCalledG n ns = return () -- TODO- addDeprecated :: Name -> String -> Idris () addDeprecated n reason = do i <- getIState putIState $ i { idris_deprecated = addDef n reason (idris_deprecated i) }@@ -439,7 +473,8 @@ addIBC ibc = do i <- getIState; putIState $ i { ibc_write = ibc : ibc_write i } clearIBC :: Idris ()-clearIBC = do i <- getIState; putIState $ i { ibc_write = [] }+clearIBC = do i <- getIState; putIState $ i { ibc_write = [],+ idris_inmodule = S.empty } resetNameIdx :: Idris () resetNameIdx = do i <- getIState@@ -611,7 +646,7 @@ -- | Save information about a name that is not yet defined addDeferred' :: NameType- -> [(Name, (Int, Maybe Name, Type, [Name], Bool))]+ -> [(Name, (Int, Maybe Name, Type, [Name], Bool, Bool))] -- ^ The Name is the name being made into a metavar, -- the Int is the number of vars that are part of a -- putative proof context, the Maybe Name is the@@ -620,10 +655,11 @@ -- allowed -> Idris () addDeferred' nt ns- = do mapM_ (\(n, (i, _, t, _, _)) -> updateContext (addTyDecl n nt (tidyNames S.empty t))) ns+ = do mapM_ (\(n, (i, _, t, _, _, _)) -> updateContext (addTyDecl n nt (tidyNames S.empty t))) ns mapM_ (\(n, _) -> when (not (n `elem` primDefs)) $ addIBC (IBCMetavar n)) ns i <- getIState- putIState $ i { idris_metavars = map (\(n, (i, top, _, ns, isTopLevel)) -> (n, (top, i, ns, isTopLevel))) ns +++ putIState $ i { idris_metavars = map (\(n, (i, top, _, ns, isTopLevel, isDefinable)) -> + (n, (top, i, ns, isTopLevel, isDefinable))) ns ++ idris_metavars i } where -- 'tidyNames' is to generate user accessible names in case they are@@ -636,9 +672,13 @@ Bind n' b $ tidyNames (S.insert n' used) sc tidyNames used b = b -solveDeferred :: Name -> Idris ()-solveDeferred n = do i <- getIState- putIState $ i { idris_metavars =+solveDeferred :: FC -> Name -> Idris ()+solveDeferred fc n + = do i <- getIState+ case lookup n (idris_metavars i) of+ Just (_, _, _, _, False) ->+ throwError $ At fc $ Msg ("Can't define hole " ++ show n ++ " as it depends on other holes")+ _ -> putIState $ i { idris_metavars = filter (\(n', _) -> n/=n') (idris_metavars i), ibc_write =@@ -738,6 +778,16 @@ logLevel = do i <- getIState return (opt_logLevel (idris_options i)) +setAutoImpls :: Bool -> Idris ()+setAutoImpls b = do i <- getIState+ let opts = idris_options i+ let opt' = opts { opt_autoimpls = b }+ putIState $ i { idris_options = opt' }++getAutoImpls :: Idris Bool+getAutoImpls = do i <- getIState+ return (opt_autoimpls (idris_options i))+ setErrContext :: Bool -> Idris () setErrContext t = do i <- getIState let opts = idris_options i@@ -1024,7 +1074,7 @@ runIO . hPutStrLn h $ convSExp "log" good n where inCat :: [LogCat] -> [LogCat] -> Bool- inCat cs cats = or $ map (\x -> elem x cats) cs+ inCat cs cats = any (`elem` cats) cs cmdOptType :: Opt -> Idris Bool cmdOptType x = do i <- getIState@@ -1101,25 +1151,25 @@ | n `nselem` ns = PQuote (Var (dec n)) en 0 (PApp fc (PInferRef fc' hl n) as) | n `nselem` ns = PApp fc (PInferRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ (map ((pexp . (PRef fc hl)) . fst) ps ++ (map (fmap (en 0)) as)) en 0 (PApp fc (PRef fc' hl n) as) | n `elem` infs = PApp fc (PInferRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ (map ((pexp . (PRef fc hl)) . fst) ps ++ (map (fmap (en 0)) as)) | n `nselem` ns = PApp fc (PRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ (map ((pexp . (PRef fc hl)) . fst) ps ++ (map (fmap (en 0)) as)) en 0 (PAppBind fc (PRef fc' hl n) as) | n `elem` infs = PAppBind fc (PInferRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ (map ((pexp . (PRef fc hl)) . fst) ps ++ (map (fmap (en 0)) as)) | n `nselem` ns = PAppBind fc (PRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ (map ((pexp . (PRef fc hl)) . fst) ps ++ (map (fmap (en 0)) as)) en 0 (PRef fc hl n) | n `elem` infs = PApp fc (PInferRef fc hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps))+ (map ((pexp . (PRef fc hl)) . fst) ps) | n `nselem` ns = PApp fc (PRef fc hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps))+ (map ((pexp . (PRef fc hl)) . fst) ps) en 0 (PInferRef fc hl n) | n `nselem` ns = PApp fc (PInferRef fc hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps))+ (map ((pexp . (PRef fc hl)) . fst) ps) en 0 (PApp fc f as) = PApp fc (en 0 f) (map (fmap (en 0)) as) en 0 (PAppBind fc f as) = PAppBind fc (en 0 f) (map (fmap (en 0)) as) en 0 (PCase fc c os) = PCase fc (en 0 c) (map (pmap (en 0)) os)@@ -1191,7 +1241,7 @@ removeBound lhs ns = ns \\ nub (bnames lhs) bnames (PRef _ _ n) = [n]- bnames (PApp _ _ args) = concatMap bnames (map getTm args)+ bnames (PApp _ _ args) = concatMap (bnames . getTm) args bnames (PPair _ _ _ l r) = bnames l ++ bnames r bnames (PDPair _ _ _ l Placeholder r) = bnames l ++ bnames r bnames _ = []@@ -1227,10 +1277,10 @@ (map (expandParamsD rhs ist dec ps ns) decls) cn cd-expandParamsD rhs ist dec ps ns (PInstance doc argDocs info f cs n nfc params ty cn decls)+expandParamsD rhs ist dec ps ns (PInstance doc argDocs info f cs acc opts n nfc params ty cn decls) = PInstance doc argDocs info f (map (\ (n, t) -> (n, expandParams dec ps ns [] t)) cs)- n+ acc opts n nfc (map (expandParams dec ps ns []) params) (expandParams dec ps ns [] ty)@@ -1258,9 +1308,9 @@ pri (PPi _ _ _ x y) = max 5 (max (pri x) (pri y)) pri (PTrue _ _) = 0 pri (PRewrite _ l r _) = max 1 (max (pri l) (pri r))- pri (PApp _ f as) = max 1 (max (pri f) (foldr max 0 (map (pri.getTm) as)))- pri (PAppBind _ f as) = max 1 (max (pri f) (foldr max 0 (map (pri.getTm) as)))- pri (PCase _ f as) = max 1 (max (pri f) (foldr max 0 (map (pri.snd) as)))+ pri (PApp _ f as) = max 1 (max (pri f) (foldr (max . pri . getTm) 0 as))+ pri (PAppBind _ f as) = max 1 (max (pri f) (foldr (max . pri . getTm) 0 as))+ pri (PCase _ f as) = max 1 (max (pri f) (foldr (max . pri . snd) 0 as)) pri (PTyped l r) = pri l pri (PPair _ _ _ l r) = max 1 (max (pri l) (pri r)) pri (PDPair _ _ _ l t r) = max 1 (max (pri l) (max (pri t) (pri r)))@@ -1277,11 +1327,11 @@ let paramnames = nub $ case lookupCtxtExact n (idris_fninfo ist) of Just p -> getNamesFrom 0 (fn_params p) tm ++- concatMap (getParamNames ist) (map snd statics)- _ -> concatMap (getParamNames ist) (map snd statics)+ concatMap (getParamNames ist . snd) statics+ _ -> concatMap (getParamNames ist . snd) statics - let stnames = nub $ concatMap freeArgNames (map snd statics)- let dnames = (nub $ concatMap freeArgNames (map snd dynamics))+ let stnames = nub $ concatMap (freeArgNames . snd) statics+ let dnames = (nub $ concatMap (freeArgNames . snd) dynamics) \\ paramnames -- also get the arguments which are 'uniquely inferrable' from -- statics (see sec 4.2 of "Scrapping Your Inefficient Engine")@@ -1290,7 +1340,7 @@ filter (\x -> not (elem x dnames)) stnames let stpos = staticList statics' tm i <- getIState- when (not (null statics)) $+ unless (null statics) $ logLvl 3 $ "Statics for " ++ show n ++ " " ++ show tm ++ "\n" ++ showTmImpls ptm ++ "\n" ++ show statics ++ "\n" ++ show dynamics@@ -1376,7 +1426,7 @@ | otherwise = doAdd cs ns t mkConst c args = PApp fc (PRef fc [] c)- (map (\n -> PExp 0 [] (sMN 0 "carg") (PRef fc [] n)) args)+ (map (PExp 0 [] (sMN 0 "carg") . PRef fc []) args) getConstraints (PPi (Constraint _ _) _ _ c sc) = getcapp c ++ getConstraints sc@@ -1395,10 +1445,14 @@ addUsingImpls :: SyntaxInfo -> Name -> FC -> PTerm -> Idris PTerm addUsingImpls syn n fc t = do ist <- getIState- let ns = implicitNamesIn (map iname uimpls) ist t+ autoimpl <- getAutoImpls+ let ns_in = implicitNamesIn (map iname uimpls) ist t+ let ns = if autoimpl then ns_in+ else filter (\n -> n `elem` (map iname uimpls)) ns_in+ let badnames = filter (\n -> not (implicitable n) && n `notElem` (map iname uimpls)) ns- when (not (null badnames)) $+ unless (null badnames) $ throwError (At fc (Elaborating "type of " n Nothing (NoSuchVariable (head badnames)))) let cs = getArgnames t -- get already bound names@@ -1481,15 +1535,19 @@ implicit' :: ElabInfo -> SyntaxInfo -> [Name] -> Name -> PTerm -> Idris PTerm implicit' info syn ignore n ptm = do i <- getIState- let (tm', impdata) = implicitise syn ignore i ptm- defaultArgCheck (eInfoNames info ++ M.keys (idris_implicits i)) impdata--- let (tm'', spos) = findStatics i tm'- putIState $ i { idris_implicits = addDef n impdata (idris_implicits i) }- addIBC (IBCImp n)- logLvl 5 ("Implicit " ++ show n ++ " " ++ show impdata)--- i <- get--- putIState $ i { idris_statics = addDef n spos (idris_statics i) }- return tm'+ auto <- getAutoImpls+ if not auto+ then return ptm+ else do+ let (tm', impdata) = implicitise syn ignore i ptm+ defaultArgCheck (eInfoNames info ++ M.keys (idris_implicits i)) impdata+ -- let (tm'', spos) = findStatics i tm'+ putIState $ i { idris_implicits = addDef n impdata (idris_implicits i) }+ addIBC (IBCImp n)+ logLvl 5 ("Implicit " ++ show n ++ " " ++ show impdata)+ -- i <- get+ -- putIState $ i { idris_statics = addDef n spos (idris_statics i) }+ return tm' where -- Detect unknown names in default arguments and throw error if found. defaultArgCheck :: [Name] -> [PArg] -> Idris ()@@ -1534,12 +1592,12 @@ -- Find names in argument position in a type, suitable for implicit -- binding -- Not the function position, but do everything else...- implNamesIn uv (PApp fc f args) = concatMap (implNamesIn uv) (map getTm args)+ implNamesIn uv (PApp fc f args) = concatMap (implNamesIn uv . getTm) args implNamesIn uv t = namesIn uv ist t - imps top env (PApp _ f as)+ imps top env ty@(PApp _ f as) = do (decls, ns) <- get- let isn = concatMap (namesIn uvars ist) (map getTm as)+ let isn = nub (implNamesIn uvars ty) put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls))))) imps top env (PPi (Imp l _ _ _) n _ ty sc) = do let isn = nub (implNamesIn uvars ty) `dropAll` [n]@@ -1823,6 +1881,7 @@ notHidden n = case getAccessibility n of Hidden -> False+ Private -> False _ -> True getAccessibility n
@@ -94,6 +94,7 @@ , opt_printdepth :: Maybe Int , opt_evaltypes :: Bool -- ^ normalise types in :t , opt_desugarnats :: Bool+ , opt_autoimpls :: Bool } deriving (Show, Eq) defaultOpts = IOption { opt_logLevel = 0@@ -121,6 +122,7 @@ , opt_printdepth = Just 5000 , opt_evaltypes = True , opt_desugarnats = False+ , opt_autoimpls = True } data PPOption = PPOption {@@ -194,7 +196,6 @@ -- ^ list of lhs/rhs, and a list of missing clauses idris_flags :: Ctxt [FnOpt], idris_callgraph :: Ctxt CGInfo, -- name, args used in each pos- idris_calledgraph :: Ctxt [Name], idris_docstrings :: Ctxt (Docstring DocTerm, [(Name, Docstring DocTerm)]), idris_moduledocs :: Ctxt (Docstring DocTerm), -- ^ module documentation is saved in a special MN so the context@@ -210,12 +211,14 @@ idris_name :: Int, idris_lineapps :: [((FilePath, Int), PTerm)], -- ^ Full application LHS on source line- idris_metavars :: [(Name, (Maybe Name, Int, [Name], Bool))],+ idris_metavars :: [(Name, (Maybe Name, Int, [Name], Bool, Bool))], -- ^ The currently defined but not proven metavariables. The Int -- is the number of vars to display as a context, the Maybe Name -- is its top-level function, the [Name] is the list of local variables- -- available for proof search and the Bool is whether :p is- -- allowed+ -- available for proof search and the Bools are whether :p is+ -- allowed, and whether the variable is definable at all+ -- (Metavariables are not definable if they are applied in a term which+ -- still has hole bindings) idris_coercions :: [Name], idris_errRev :: [(Term, Term)], syntax_rules :: SyntaxRules,@@ -235,7 +238,7 @@ brace_stack :: [Maybe Int], lastTokenSpan :: Maybe FC, -- ^ What was the span of the latest token parsed? idris_parsedSpan :: Maybe FC,- hide_list :: [(Name, Maybe Accessibility)],+ hide_list :: Ctxt Accessibility, default_access :: Accessibility, default_total :: Bool, ibc_write :: [IBCWrite],@@ -262,7 +265,9 @@ idris_exports :: [Name], -- ^ Functions with ExportList idris_highlightedRegions :: [(FC, OutputAnnotation)], -- ^ Highlighting information to output idris_parserHighlights :: [(FC, OutputAnnotation)], -- ^ Highlighting information from the parser- idris_deprecated :: Ctxt String -- ^ Deprecated names and explanation+ idris_deprecated :: Ctxt String, -- ^ Deprecated names and explanation+ idris_inmodule :: S.Set Name, -- ^ Names defined in current module+ idris_ttstats :: M.Map Term (Int, Term) } -- Required for parsers library, and therefore trifecta@@ -279,11 +284,10 @@ type SCGEntry = (Name, [Maybe (Int, SizeChange)]) type UsageReason = (Name, Int) -- fn_name, its_arg_number -data CGInfo = CGInfo { argsdef :: [Name],- calls :: [(Name, [[Name]])],+data CGInfo = CGInfo { calls :: [Name], scg :: [SCGEntry],- argsused :: [Name],- usedpos :: [(Int, [UsageReason])] }+ usedpos :: [(Int, [UsageReason])]+ } deriving Show {-! deriving instance Binary CGInfo@@ -348,13 +352,14 @@ emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext- emptyContext emptyContext+ emptyContext [] [] [] defaultOpts 6 [] [] [] [] emptySyntaxRules [] [] [] [] [] [] []- [] [] Nothing [] Nothing [] [] Nothing Nothing [] Hidden False [] Nothing [] []+ [] [] Nothing [] Nothing [] [] Nothing Nothing emptyContext Private False [] Nothing [] [] (RawOutput stdout) True defaultTheme [] (0, emptyContext) emptyContext M.empty AutomaticWidth S.empty S.empty [] Nothing Nothing [] [] M.empty [] [] []- emptyContext+ emptyContext S.empty M.empty + -- | The monad for the main REPL - reading and processing files and updating -- global state (hence the IO inner monad). --type Idris = WriterT [Either String (IO ())] (State IState a))@@ -631,14 +636,18 @@ is_scoped (Imp _ _ _ s) = s is_scoped _ = Nothing -impl = Imp [] Dynamic False (Just (Impl False True))-forall_imp = Imp [] Dynamic False (Just (Impl False False))+impl = Imp [] Dynamic False (Just (Impl False True))++forall_imp = Imp [] Dynamic False (Just (Impl False False)) forall_constraint = Imp [] Dynamic False (Just (Impl True False))-expl = Exp [] Dynamic False-expl_param = Exp [] Dynamic True-constraint = Constraint [] Static-tacimpl t = TacImp [] Dynamic t +expl = Exp [] Dynamic False+expl_param = Exp [] Dynamic True++constraint = Constraint [] Static++tacimpl t = TacImp [] Dynamic t+ data FnOpt = Inlinable -- always evaluate when simplifying | TotalFn | PartialFn | CoveringFn | Coinductive | AssertTotal@@ -695,7 +704,7 @@ FC -- Record name precise location [(Name, FC, Plicity, t)] -- Parameters, where FC is precise name span [(Name, Docstring (Either Err t))] -- Param Docs- [((Maybe (Name, FC)), Plicity, t, Maybe (Docstring (Either Err t)))] -- Fields+ [(Maybe (Name, FC), Plicity, t, Maybe (Docstring (Either Err t)))] -- Fields (Maybe (Name, FC)) -- Optional constructor name and location (Docstring (Either Err t)) -- Constructor doc SyntaxInfo -- Constructor SyntaxInfo@@ -717,6 +726,8 @@ [(Name, Docstring (Either Err t))] -- Parameter docs SyntaxInfo FC [(Name, t)] -- constraints+ Accessibility+ FnOpts Name -- class FC -- precise location of class [t] -- parameters@@ -756,6 +767,7 @@ DErrorHandlers Name FC Name FC [(Name, FC)] | DLanguage LanguageExt | DDeprecate Name String |+ DAutoImplicits Bool | DUsed FC Name Name -- | A set of instructions for things that need to happen in IState@@ -875,10 +887,10 @@ (map (mapPDeclFC f g) body) (fmap (\(n, nfc) -> (n, g nfc)) ctor) ctorDoc-mapPDeclFC f g (PInstance doc paramDocs syn fc constrs cn cnfc params instTy instN body) =+mapPDeclFC f g (PInstance doc paramDocs syn fc constrs cn acc opts cnfc params instTy instN body) = PInstance doc paramDocs syn (f fc) (map (\(constrN, constrT) -> (constrN, mapPTermFC f g constrT)) constrs)- cn (g cnfc) (map (mapPTermFC f g) params)+ cn acc opts (g cnfc) (map (mapPTermFC f g) params) (mapPTermFC f g instTy) instN (map (mapPDeclFC f g) body)@@ -918,7 +930,7 @@ declared (PNamespace _ _ ds) = concatMap declared ds declared (PRecord _ _ _ _ n _ _ _ _ cn _ _) = n : map fst (maybeToList cn) declared (PClass _ _ _ _ n _ _ _ _ ms cn cd) = n : (map fst (maybeToList cn) ++ concatMap declared ms)-declared (PInstance _ _ _ _ _ _ _ _ _ _ _) = []+declared (PInstance _ _ _ _ _ _ _ _ _ _ _ _ _) = [] declared (PDSL n _) = [n] declared (PSyntax _ _) = [] declared (PMutual _ ds) = concatMap declared ds@@ -927,39 +939,39 @@ -- get the names declared, not counting nested parameter blocks tldeclared :: PDecl -> [Name]-tldeclared (PFix _ _ _) = []-tldeclared (PTy _ _ _ _ _ n _ t) = [n]-tldeclared (PPostulate _ _ _ _ _ _ n t) = [n]-tldeclared (PClauses _ _ n _) = [] -- not a declaration-tldeclared (PRecord _ _ _ _ n _ _ _ _ cn _ _) = n : map fst (maybeToList cn)+tldeclared (PFix _ _ _) = []+tldeclared (PTy _ _ _ _ _ n _ t) = [n]+tldeclared (PPostulate _ _ _ _ _ _ n t) = [n]+tldeclared (PClauses _ _ n _) = [] -- not a declaration+tldeclared (PRecord _ _ _ _ n _ _ _ _ cn _ _) = n : map fst (maybeToList cn) tldeclared (PData _ _ _ _ _ (PDatadecl n _ _ ts)) = n : map fstt ts where fstt (_, _, a, _, _, _, _) = a-tldeclared (PParams _ _ ds) = []-tldeclared (PMutual _ ds) = concatMap tldeclared ds-tldeclared (PNamespace _ _ ds) = concatMap tldeclared ds-tldeclared (PClass _ _ _ _ n _ _ _ _ ms cn _) = n : (map fst (maybeToList cn) ++ concatMap tldeclared ms)-tldeclared (PInstance _ _ _ _ _ _ _ _ _ _ _) = []-tldeclared _ = []+tldeclared (PParams _ _ ds) = []+tldeclared (PMutual _ ds) = concatMap tldeclared ds+tldeclared (PNamespace _ _ ds) = concatMap tldeclared ds+tldeclared (PClass _ _ _ _ n _ _ _ _ ms cn _) = n : (map fst (maybeToList cn) ++ concatMap tldeclared ms)+tldeclared (PInstance _ _ _ _ _ _ _ _ _ _ _ _ _) = []+tldeclared _ = [] defined :: PDecl -> [Name]-defined (PFix _ _ _) = []-defined (PTy _ _ _ _ _ n _ t) = []-defined (PPostulate _ _ _ _ _ _ n t) = []-defined (PClauses _ _ n _) = [n] -- not a declaration-defined (PCAF _ n _) = [n]-defined (PData _ _ _ _ _ (PDatadecl n _ _ ts)) = n : map fstt ts+defined (PFix _ _ _) = []+defined (PTy _ _ _ _ _ n _ t) = []+defined (PPostulate _ _ _ _ _ _ n t) = []+defined (PClauses _ _ n _) = [n] -- not a declaration+defined (PCAF _ n _) = [n]+defined (PData _ _ _ _ _ (PDatadecl n _ _ ts)) = n : map fstt ts where fstt (_, _, a, _, _, _, _) = a-defined (PData _ _ _ _ _ (PLaterdecl n _ _)) = []-defined (PParams _ _ ds) = concatMap defined ds-defined (PNamespace _ _ ds) = concatMap defined ds-defined (PRecord _ _ _ _ n _ _ _ _ cn _ _) = n : map fst (maybeToList cn)-defined (PClass _ _ _ _ n _ _ _ _ ms cn _) = n : (map fst (maybeToList cn) ++ concatMap defined ms)-defined (PInstance _ _ _ _ _ _ _ _ _ _ _) = []-defined (PDSL n _) = [n]-defined (PSyntax _ _) = []-defined (PMutual _ ds) = concatMap defined ds-defined (PDirective _) = []-defined _ = []+defined (PData _ _ _ _ _ (PLaterdecl n _ _)) = []+defined (PParams _ _ ds) = concatMap defined ds+defined (PNamespace _ _ ds) = concatMap defined ds+defined (PRecord _ _ _ _ n _ _ _ _ cn _ _) = n : map fst (maybeToList cn)+defined (PClass _ _ _ _ n _ _ _ _ ms cn _) = n : (map fst (maybeToList cn) ++ concatMap defined ms)+defined (PInstance _ _ _ _ _ _ _ _ _ _ _ _ _) = []+defined (PDSL n _) = [n]+defined (PSyntax _ _) = []+defined (PMutual _ ds) = concatMap defined ds+defined (PDirective _) = []+defined _ = [] updateN :: [(Name, Name)] -> Name -> Name updateN ns n | Just n' <- lookup n ns = n'@@ -1040,33 +1052,33 @@ -- general-purpose FCs, and the second transforms those that are used -- for semantic source highlighting, so they can be treated specially. mapPTermFC :: (FC -> FC) -> (FC -> FC) -> PTerm -> PTerm-mapPTermFC f g (PQuote q) = PQuote q-mapPTermFC f g (PRef fc fcs n) = PRef (g fc) (map g fcs) n-mapPTermFC f g (PInferRef fc fcs n) = PInferRef (g fc) (map g fcs) n-mapPTermFC f g (PPatvar fc n) = PPatvar (g fc) n-mapPTermFC f g (PLam fc n fc' t1 t2) = PLam (f fc) n (g fc') (mapPTermFC f g t1) (mapPTermFC f g t2)-mapPTermFC f g (PPi plic n fc t1 t2) = PPi plic n (g fc) (mapPTermFC f g t1) (mapPTermFC f g t2)-mapPTermFC f g (PLet fc n fc' t1 t2 t3) = PLet (f fc) n (g fc') (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)-mapPTermFC f g (PTyped t1 t2) = PTyped (mapPTermFC f g t1) (mapPTermFC f g t2)-mapPTermFC f g (PApp fc t args) = PApp (f fc) (mapPTermFC f g t) (map (fmap (mapPTermFC f g)) args)-mapPTermFC f g (PAppImpl t1 impls) = PAppImpl (mapPTermFC f g t1) impls-mapPTermFC f g (PAppBind fc t args) = PAppBind (f fc) (mapPTermFC f g t) (map (fmap (mapPTermFC f g)) args)-mapPTermFC f g (PMatchApp fc n) = PMatchApp (f fc) n-mapPTermFC f g (PIfThenElse fc t1 t2 t3) = PIfThenElse (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)-mapPTermFC f g (PCase fc t cases) = PCase (f fc) (mapPTermFC f g t) (map (\(l,r) -> (mapPTermFC f g l, mapPTermFC f g r)) cases)-mapPTermFC f g (PTrue fc info) = PTrue (f fc) info-mapPTermFC f g (PResolveTC fc) = PResolveTC (f fc)-mapPTermFC f g (PRewrite fc t1 t2 t3) = PRewrite (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (fmap (mapPTermFC f g) t3)-mapPTermFC f g (PPair fc hls info t1 t2) = PPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2)-mapPTermFC f g (PDPair fc hls info t1 t2 t3) = PDPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)-mapPTermFC f g (PAs fc n t) = PAs (f fc) n (mapPTermFC f g t)-mapPTermFC f g (PAlternative ns ty ts) = PAlternative ns ty (map (mapPTermFC f g) ts)-mapPTermFC f g (PHidden t) = PHidden (mapPTermFC f g t)-mapPTermFC f g (PType fc) = PType (f fc)-mapPTermFC f g (PUniverse u) = PUniverse u-mapPTermFC f g (PGoal fc t1 n t2) = PGoal (f fc) (mapPTermFC f g t1) n (mapPTermFC f g t2)-mapPTermFC f g (PConstant fc c) = PConstant (f fc) c-mapPTermFC f g Placeholder = Placeholder+mapPTermFC f g (PQuote q) = PQuote q+mapPTermFC f g (PRef fc fcs n) = PRef (g fc) (map g fcs) n+mapPTermFC f g (PInferRef fc fcs n) = PInferRef (g fc) (map g fcs) n+mapPTermFC f g (PPatvar fc n) = PPatvar (g fc) n+mapPTermFC f g (PLam fc n fc' t1 t2) = PLam (f fc) n (g fc') (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PPi plic n fc t1 t2) = PPi plic n (g fc) (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PLet fc n fc' t1 t2 t3) = PLet (f fc) n (g fc') (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)+mapPTermFC f g (PTyped t1 t2) = PTyped (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PApp fc t args) = PApp (f fc) (mapPTermFC f g t) (map (fmap (mapPTermFC f g)) args)+mapPTermFC f g (PAppImpl t1 impls) = PAppImpl (mapPTermFC f g t1) impls+mapPTermFC f g (PAppBind fc t args) = PAppBind (f fc) (mapPTermFC f g t) (map (fmap (mapPTermFC f g)) args)+mapPTermFC f g (PMatchApp fc n) = PMatchApp (f fc) n+mapPTermFC f g (PIfThenElse fc t1 t2 t3) = PIfThenElse (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)+mapPTermFC f g (PCase fc t cases) = PCase (f fc) (mapPTermFC f g t) (map (\(l,r) -> (mapPTermFC f g l, mapPTermFC f g r)) cases)+mapPTermFC f g (PTrue fc info) = PTrue (f fc) info+mapPTermFC f g (PResolveTC fc) = PResolveTC (f fc)+mapPTermFC f g (PRewrite fc t1 t2 t3) = PRewrite (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (fmap (mapPTermFC f g) t3)+mapPTermFC f g (PPair fc hls info t1 t2) = PPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PDPair fc hls info t1 t2 t3) = PDPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)+mapPTermFC f g (PAs fc n t) = PAs (f fc) n (mapPTermFC f g t)+mapPTermFC f g (PAlternative ns ty ts) = PAlternative ns ty (map (mapPTermFC f g) ts)+mapPTermFC f g (PHidden t) = PHidden (mapPTermFC f g t)+mapPTermFC f g (PType fc) = PType (f fc)+mapPTermFC f g (PUniverse u) = PUniverse u+mapPTermFC f g (PGoal fc t1 n t2) = PGoal (f fc) (mapPTermFC f g t1) n (mapPTermFC f g t2)+mapPTermFC f g (PConstant fc c) = PConstant (f fc) c+mapPTermFC f g Placeholder = Placeholder mapPTermFC f g (PDoBlock dos) = PDoBlock (map mapPDoFC dos) where mapPDoFC (DoExp fc t) = DoExp (f fc) (mapPTermFC f g t) mapPDoFC (DoBind fc n nfc t) = DoBind (f fc) n (g nfc) (mapPTermFC f g t)@@ -1074,22 +1086,22 @@ DoBindP (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (map (\(l,r)-> (mapPTermFC f g l, mapPTermFC f g r)) alts) mapPDoFC (DoLet fc n nfc t1 t2) = DoLet (f fc) n (g nfc) (mapPTermFC f g t1) (mapPTermFC f g t2) mapPDoFC (DoLetP fc t1 t2) = DoLetP (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2)-mapPTermFC f g (PIdiom fc t) = PIdiom (f fc) (mapPTermFC f g t)-mapPTermFC f g (PReturn fc) = PReturn (f fc)-mapPTermFC f g (PMetavar fc n) = PMetavar (g fc) n-mapPTermFC f g (PProof tacs) = PProof (map (fmap (mapPTermFC f g)) tacs)-mapPTermFC f g (PTactics tacs) = PTactics (map (fmap (mapPTermFC f g)) tacs)-mapPTermFC f g (PElabError err) = PElabError err-mapPTermFC f g PImpossible = PImpossible-mapPTermFC f g (PCoerced t) = PCoerced (mapPTermFC f g t)-mapPTermFC f g (PDisamb msg t) = PDisamb msg (mapPTermFC f g t)-mapPTermFC f g (PUnifyLog t) = PUnifyLog (mapPTermFC f g t)-mapPTermFC f g (PNoImplicits t) = PNoImplicits (mapPTermFC f g t)-mapPTermFC f g (PQuasiquote t1 t2) = PQuasiquote (mapPTermFC f g t1) (fmap (mapPTermFC f g) t2)-mapPTermFC f g (PUnquote t) = PUnquote (mapPTermFC f g t)-mapPTermFC f g (PRunElab fc tm ns) = PRunElab (f fc) (mapPTermFC f g tm) ns-mapPTermFC f g (PConstSugar fc tm) = PConstSugar (g fc) (mapPTermFC f g tm)-mapPTermFC f g (PQuoteName n x fc) = PQuoteName n x (g fc)+mapPTermFC f g (PIdiom fc t) = PIdiom (f fc) (mapPTermFC f g t)+mapPTermFC f g (PReturn fc) = PReturn (f fc)+mapPTermFC f g (PMetavar fc n) = PMetavar (g fc) n+mapPTermFC f g (PProof tacs) = PProof (map (fmap (mapPTermFC f g)) tacs)+mapPTermFC f g (PTactics tacs) = PTactics (map (fmap (mapPTermFC f g)) tacs)+mapPTermFC f g (PElabError err) = PElabError err+mapPTermFC f g PImpossible = PImpossible+mapPTermFC f g (PCoerced t) = PCoerced (mapPTermFC f g t)+mapPTermFC f g (PDisamb msg t) = PDisamb msg (mapPTermFC f g t)+mapPTermFC f g (PUnifyLog t) = PUnifyLog (mapPTermFC f g t)+mapPTermFC f g (PNoImplicits t) = PNoImplicits (mapPTermFC f g t)+mapPTermFC f g (PQuasiquote t1 t2) = PQuasiquote (mapPTermFC f g t1) (fmap (mapPTermFC f g) t2)+mapPTermFC f g (PUnquote t) = PUnquote (mapPTermFC f g t)+mapPTermFC f g (PRunElab fc tm ns) = PRunElab (f fc) (mapPTermFC f g tm) ns+mapPTermFC f g (PConstSugar fc tm) = PConstSugar (g fc) (mapPTermFC f g tm)+mapPTermFC f g (PQuoteName n x fc) = PQuoteName n x (g fc) {-! dg instance Binary PTerm@@ -1098,28 +1110,27 @@ mapPT :: (PTerm -> PTerm) -> PTerm -> PTerm mapPT f t = f (mpt t) where- mpt (PLam fc n nfc t s) = PLam fc n nfc (mapPT f t) (mapPT f s)- mpt (PPi p n nfc t s) = PPi p n nfc (mapPT f t) (mapPT f s)- mpt (PLet fc n nfc ty v s) = PLet fc n nfc (mapPT f ty) (mapPT f v) (mapPT f s)- mpt (PRewrite fc t s g) = PRewrite fc (mapPT f t) (mapPT f s)- (fmap (mapPT f) g)- mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)- mpt (PAppBind fc t as) = PAppBind fc (mapPT f t) (map (fmap (mapPT f)) as)- mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)- mpt (PIfThenElse fc c t e) = PIfThenElse fc (mapPT f c) (mapPT f t) (mapPT f e)- mpt (PTyped l r) = PTyped (mapPT f l) (mapPT f r)- mpt (PPair fc hls p l r) = PPair fc hls p (mapPT f l) (mapPT f r)+ mpt (PLam fc n nfc t s) = PLam fc n nfc (mapPT f t) (mapPT f s)+ mpt (PPi p n nfc t s) = PPi p n nfc (mapPT f t) (mapPT f s)+ mpt (PLet fc n nfc ty v s) = PLet fc n nfc (mapPT f ty) (mapPT f v) (mapPT f s)+ mpt (PRewrite fc t s g) = PRewrite fc (mapPT f t) (mapPT f s) (fmap (mapPT f) g)+ mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)+ mpt (PAppBind fc t as) = PAppBind fc (mapPT f t) (map (fmap (mapPT f)) as)+ mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)+ mpt (PIfThenElse fc c t e) = PIfThenElse fc (mapPT f c) (mapPT f t) (mapPT f e)+ mpt (PTyped l r) = PTyped (mapPT f l) (mapPT f r)+ mpt (PPair fc hls p l r) = PPair fc hls p (mapPT f l) (mapPT f r) mpt (PDPair fc hls p l t r) = PDPair fc hls p (mapPT f l) (mapPT f t) (mapPT f r)- mpt (PAlternative ns a as) = PAlternative ns a (map (mapPT f) as)- mpt (PHidden t) = PHidden (mapPT f t)- mpt (PDoBlock ds) = PDoBlock (map (fmap (mapPT f)) ds)- mpt (PProof ts) = PProof (map (fmap (mapPT f)) ts)- mpt (PTactics ts) = PTactics (map (fmap (mapPT f)) ts)- mpt (PUnifyLog tm) = PUnifyLog (mapPT f tm)- mpt (PDisamb ns tm) = PDisamb ns (mapPT f tm)- mpt (PNoImplicits tm) = PNoImplicits (mapPT f tm)- mpt (PGoal fc r n sc) = PGoal fc (mapPT f r) n (mapPT f sc)- mpt x = x+ mpt (PAlternative ns a as) = PAlternative ns a (map (mapPT f) as)+ mpt (PHidden t) = PHidden (mapPT f t)+ mpt (PDoBlock ds) = PDoBlock (map (fmap (mapPT f)) ds)+ mpt (PProof ts) = PProof (map (fmap (mapPT f)) ts)+ mpt (PTactics ts) = PTactics (map (fmap (mapPT f)) ts)+ mpt (PUnifyLog tm) = PUnifyLog (mapPT f tm)+ mpt (PDisamb ns tm) = PDisamb ns (mapPT f tm)+ mpt (PNoImplicits tm) = PNoImplicits (mapPT f tm)+ mpt (PGoal fc r n sc) = PGoal fc (mapPT f r) n (mapPT f sc)+ mpt x = x data PTactic' t = Intro [Name] | Intros | Focus Name@@ -1160,39 +1171,39 @@ deriving instance NFData PTactic' !-} instance Sized a => Sized (PTactic' a) where- size (Intro nms) = 1 + size nms- size Intros = 1- size (Focus nm) = 1 + size nm- size (Refine nm bs) = 1 + size nm + length bs- size (Rewrite t) = 1 + size t- size (Induction t) = 1 + size t- size (LetTac nm t) = 1 + size nm + size t- size (Exact t) = 1 + size t- size Compute = 1- size Trivial = 1- size Solve = 1- size Attack = 1- size ProofState = 1- size ProofTerm = 1- size Undo = 1- size (Try l r) = 1 + size l + size r- size (TSeq l r) = 1 + size l + size r- size (ApplyTactic t) = 1 + size t- size (Reflect t) = 1 + size t- size (Fill t) = 1 + size t- size Qed = 1- size Abandon = 1- size Skip = 1- size (TFail ts) = 1 + size ts- size SourceFC = 1- size DoUnify = 1- size (CaseTac x) = 1 + size x- size (Equiv t) = 1 + size t- size (Claim x y) = 1 + size x + size y- size Unfocus = 1- size (MatchRefine x) = 1 + size x+ size (Intro nms) = 1 + size nms+ size Intros = 1+ size (Focus nm) = 1 + size nm+ size (Refine nm bs) = 1 + size nm + length bs+ size (Rewrite t) = 1 + size t+ size (Induction t) = 1 + size t+ size (LetTac nm t) = 1 + size nm + size t+ size (Exact t) = 1 + size t+ size Compute = 1+ size Trivial = 1+ size Solve = 1+ size Attack = 1+ size ProofState = 1+ size ProofTerm = 1+ size Undo = 1+ size (Try l r) = 1 + size l + size r+ size (TSeq l r) = 1 + size l + size r+ size (ApplyTactic t) = 1 + size t+ size (Reflect t) = 1 + size t+ size (Fill t) = 1 + size t+ size Qed = 1+ size Abandon = 1+ size Skip = 1+ size (TFail ts) = 1 + size ts+ size SourceFC = 1+ size DoUnify = 1+ size (CaseTac x) = 1 + size x+ size (Equiv t) = 1 + size t+ size (Claim x y) = 1 + size x + size y+ size Unfocus = 1+ size (MatchRefine x) = 1 + size x size (LetTacTy x y z) = 1 + size x + size y + size z- size TCInstance = 1+ size TCInstance = 1 type PTactic = PTactic' PTerm @@ -1208,11 +1219,11 @@ !-} instance Sized a => Sized (PDo' a) where- size (DoExp fc t) = 1 + size fc + size t- size (DoBind fc nm nfc t) = 1 + size fc + size nm + size nfc + size t- size (DoBindP fc l r alts) = 1 + size fc + size l + size r + size alts- size (DoLet fc nm nfc l r) = 1 + size fc + size nm + size l + size r- size (DoLetP fc l r) = 1 + size fc + size l + size r+ size (DoExp fc t) = 1 + size fc + size t+ size (DoBind fc nm nfc t) = 1 + size fc + size nm + size nfc + size t+ size (DoBindP fc l r alts) = 1 + size fc + size l + size r + size alts+ size (DoLet fc nm nfc l r) = 1 + size fc + size nm + size l + size r+ size (DoLetP fc l r) = 1 + size fc + size l + size r type PDo = PDo' PTerm @@ -1244,10 +1255,10 @@ deriving (Show, Eq, Data, Typeable) instance Sized a => Sized (PArg' a) where- size (PImp p _ l nm trm) = 1 + size nm + size trm- size (PExp p l nm trm) = 1 + size nm + size trm- size (PConstraint p l nm trm) = 1 + size nm +size nm + size trm- size (PTacImplicit p l nm scr trm) = 1 + size nm + size scr + size trm+ size (PImp p _ l nm trm) = 1 + size nm + size trm+ size (PExp p l nm trm) = 1 + size nm + size trm+ size (PConstraint p l nm trm) = 1 + size nm +size nm + size trm+ size (PTacImplicit p l nm scr trm) = 1 + size nm + size scr + size trm {-! deriving instance Binary PArg'@@ -1255,43 +1266,43 @@ !-} pimp n t mach = PImp 1 mach [] n t-pexp t = PExp 1 [] (sMN 0 "arg") t-pconst t = PConstraint 1 [] (sMN 0 "carg") t+pexp t = PExp 1 [] (sMN 0 "arg") t+pconst t = PConstraint 1 [] (sMN 0 "carg") t ptacimp n s t = PTacImplicit 2 [] n s t type PArg = PArg' PTerm -- | Get the highest FC in a term, if one exists highestFC :: PTerm -> Maybe FC-highestFC (PQuote _) = Nothing-highestFC (PRef fc _ _) = Just fc-highestFC (PInferRef fc _ _) = Just fc-highestFC (PPatvar fc _) = Just fc-highestFC (PLam fc _ _ _ _) = Just fc-highestFC (PPi _ _ _ _ _) = Nothing-highestFC (PLet fc _ _ _ _ _) = Just fc-highestFC (PTyped tm ty) = highestFC tm <|> highestFC ty-highestFC (PApp fc _ _) = Just fc-highestFC (PAppBind fc _ _) = Just fc-highestFC (PMatchApp fc _) = Just fc-highestFC (PCase fc _ _) = Just fc-highestFC (PIfThenElse fc _ _ _) = Just fc-highestFC (PTrue fc _) = Just fc-highestFC (PResolveTC fc) = Just fc-highestFC (PRewrite fc _ _ _) = Just fc-highestFC (PPair fc _ _ _ _) = Just fc-highestFC (PDPair fc _ _ _ _ _) = Just fc-highestFC (PAs fc _ _) = Just fc+highestFC (PQuote _) = Nothing+highestFC (PRef fc _ _) = Just fc+highestFC (PInferRef fc _ _) = Just fc+highestFC (PPatvar fc _) = Just fc+highestFC (PLam fc _ _ _ _) = Just fc+highestFC (PPi _ _ _ _ _) = Nothing+highestFC (PLet fc _ _ _ _ _) = Just fc+highestFC (PTyped tm ty) = highestFC tm <|> highestFC ty+highestFC (PApp fc _ _) = Just fc+highestFC (PAppBind fc _ _) = Just fc+highestFC (PMatchApp fc _) = Just fc+highestFC (PCase fc _ _) = Just fc+highestFC (PIfThenElse fc _ _ _) = Just fc+highestFC (PTrue fc _) = Just fc+highestFC (PResolveTC fc) = Just fc+highestFC (PRewrite fc _ _ _) = Just fc+highestFC (PPair fc _ _ _ _) = Just fc+highestFC (PDPair fc _ _ _ _ _) = Just fc+highestFC (PAs fc _ _) = Just fc highestFC (PAlternative _ _ args) = case mapMaybe highestFC args of [] -> Nothing (fc:_) -> Just fc-highestFC (PHidden _) = Nothing-highestFC (PType fc) = Just fc-highestFC (PUniverse _) = Nothing-highestFC (PGoal fc _ _ _) = Just fc-highestFC (PConstant fc _) = Just fc-highestFC Placeholder = Nothing+highestFC (PHidden _) = Nothing+highestFC (PType fc) = Just fc+highestFC (PUniverse _) = Nothing+highestFC (PGoal fc _ _ _) = Just fc+highestFC (PConstant fc _) = Just fc+highestFC Placeholder = Nothing highestFC (PDoBlock lines) = case map getDoFC lines of [] -> Nothing@@ -1303,23 +1314,23 @@ getDoFC (DoLet fc nm nfc l r) = fc getDoFC (DoLetP fc l r) = fc -highestFC (PIdiom fc _) = Just fc-highestFC (PReturn fc) = Just fc-highestFC (PMetavar fc _) = Just fc-highestFC (PProof _) = Nothing-highestFC (PTactics _) = Nothing-highestFC (PElabError _) = Nothing-highestFC PImpossible = Nothing-highestFC (PCoerced tm) = highestFC tm-highestFC (PDisamb _ opts) = highestFC opts-highestFC (PUnifyLog tm) = highestFC tm-highestFC (PNoImplicits tm) = highestFC tm-highestFC (PQuasiquote _ _) = Nothing-highestFC (PUnquote tm) = highestFC tm-highestFC (PQuoteName _ _ fc) = Just fc-highestFC (PRunElab fc _ _) = Just fc-highestFC (PConstSugar fc _) = Just fc-highestFC (PAppImpl t _) = highestFC t+highestFC (PIdiom fc _) = Just fc+highestFC (PReturn fc) = Just fc+highestFC (PMetavar fc _) = Just fc+highestFC (PProof _) = Nothing+highestFC (PTactics _) = Nothing+highestFC (PElabError _) = Nothing+highestFC PImpossible = Nothing+highestFC (PCoerced tm) = highestFC tm+highestFC (PDisamb _ opts) = highestFC opts+highestFC (PUnifyLog tm) = highestFC tm+highestFC (PNoImplicits tm) = highestFC tm+highestFC (PQuasiquote _ _) = Nothing+highestFC (PUnquote tm) = highestFC tm+highestFC (PQuoteName _ _ fc) = Just fc+highestFC (PRunElab fc _ _) = Just fc+highestFC (PConstSugar fc _) = Just fc+highestFC (PAppImpl t _) = highestFC t -- Type class data @@ -1397,11 +1408,11 @@ syntaxNames :: Syntax -> [Name] syntaxNames (Rule syms _ _) = mapMaybe ename syms- where ename (Keyword n) = Just n- ename _ = Nothing+ where ename (Keyword n) = Just n+ ename _ = Nothing syntaxNames (DeclRule syms _) = mapMaybe ename syms- where ename (Keyword n) = Just n- ename _ = Nothing+ where ename (Keyword n) = Just n+ ename _ = Nothing syntaxSymbols :: Syntax -> [SSymbol] syntaxSymbols (Rule ss _ _) = ss@@ -1434,9 +1445,9 @@ where newRules = sortBy (ruleSort `on` syntaxSymbols) (rules ++ sr) - ruleSort [] [] = EQ- ruleSort [] _ = LT- ruleSort _ [] = GT+ ruleSort [] [] = EQ+ ruleSort [] _ = LT+ ruleSort _ [] = GT ruleSort (s1:ss1) (s2:ss2) = case symCompare s1 s2 of EQ -> ruleSort ss1 ss2@@ -1444,25 +1455,25 @@ -- Better than creating Ord instance for SSymbol since -- in general this ordering does not really make sense.- symCompare (Keyword n1) (Keyword n2) = compare n1 n2- symCompare (Keyword _) _ = LT- symCompare (Symbol _) (Keyword _) = GT- symCompare (Symbol s1) (Symbol s2) = compare s1 s2- symCompare (Symbol _) _ = LT- symCompare (Binding _) (Keyword _) = GT- symCompare (Binding _) (Symbol _) = GT- symCompare (Binding b1) (Binding b2) = compare b1 b2- symCompare (Binding _) _ = LT- symCompare (Expr _) (Keyword _) = GT- symCompare (Expr _) (Symbol _) = GT- symCompare (Expr _) (Binding _) = GT- symCompare (Expr e1) (Expr e2) = compare e1 e2- symCompare (Expr _) _ = LT- symCompare (SimpleExpr _) (Keyword _) = GT- symCompare (SimpleExpr _) (Symbol _) = GT- symCompare (SimpleExpr _) (Binding _) = GT- symCompare (SimpleExpr _) (Expr _) = GT- symCompare (SimpleExpr e1) (SimpleExpr e2) = compare e1 e2+ symCompare (Keyword n1) (Keyword n2) = compare n1 n2+ symCompare (Keyword _) _ = LT+ symCompare (Symbol _) (Keyword _) = GT+ symCompare (Symbol s1) (Symbol s2) = compare s1 s2+ symCompare (Symbol _) _ = LT+ symCompare (Binding _) (Keyword _) = GT+ symCompare (Binding _) (Symbol _) = GT+ symCompare (Binding b1) (Binding b2) = compare b1 b2+ symCompare (Binding _) _ = LT+ symCompare (Expr _) (Keyword _) = GT+ symCompare (Expr _) (Symbol _) = GT+ symCompare (Expr _) (Binding _) = GT+ symCompare (Expr e1) (Expr e2) = compare e1 e2+ symCompare (Expr _) _ = LT+ symCompare (SimpleExpr _) (Keyword _) = GT+ symCompare (SimpleExpr _) (Symbol _) = GT+ symCompare (SimpleExpr _) (Binding _) = GT+ symCompare (SimpleExpr _) (Expr _) = GT+ symCompare (SimpleExpr e1) (SimpleExpr e2) = compare e1 e2 initDSL = DSL (PRef f [] (sUN ">>=")) (PRef f [] (sUN "return"))@@ -1534,10 +1545,10 @@ getInferTerm (App _ (App _ _ _) tm) = tm getInferTerm tm = tm -- error ("getInferTerm " ++ show tm) -getInferType (Bind n b sc) = Bind n (toTy b) $ getInferType sc- where toTy (Lam t) = Pi Nothing t (TType (UVar 0))- toTy (PVar t) = PVTy t- toTy b = b+getInferType (Bind n b sc) = Bind n (toTy b) $ getInferType sc+ where toTy (Lam t) = Pi Nothing t (TType (UVar 0))+ toTy (PVar t) = PVTy t+ toTy b = b getInferType (App _ (App _ _ ty) _) = ty @@ -1562,9 +1573,9 @@ upairTy = sNS (sUN "UPair") ["Builtins"] upairCon = sNS (sUN "MkUPair") ["Builtins"] -eqTy = sUN "="+eqTy = sUN "=" eqCon = sUN "Refl"-eqDoc = fmap (const (Left $ Msg "")) . parseDocstring . T.pack $+eqDoc = fmap (const (Left $ Msg "")) . parseDocstring . T.pack $ "The propositional equality type. A proof that `x` = `y`." ++ "\n\n" ++ "To use such a proof, pattern-match on it, and the two equal things will " ++@@ -1607,8 +1618,8 @@ modDocName = sMN 0 "ModuleDocs" -- Defined in builtins.idr-sigmaTy = sNS (sUN "Sigma") ["Builtins"]-sigmaCon = sNS (sUN "MkSigma") ["Builtins"]+sigmaTy = sNS (sUN "DPair") ["Builtins"]+sigmaCon = sNS (sUN "MkDPair") ["Builtins"] piBind :: [(Name, PTerm)] -> PTerm -> PTerm piBind = piBindp expl@@ -1648,11 +1659,11 @@ in Just $ if constIsType c then typeColour theme else dataColour theme-annotationColour ist (AnnData _ _) = Just $ dataColour (idris_colourTheme ist)-annotationColour ist (AnnType _ _) = Just $ typeColour (idris_colourTheme ist)-annotationColour ist (AnnBoundName _ True) = Just $ implicitColour (idris_colourTheme ist)+annotationColour ist (AnnData _ _) = Just $ dataColour (idris_colourTheme ist)+annotationColour ist (AnnType _ _) = Just $ typeColour (idris_colourTheme ist)+annotationColour ist (AnnBoundName _ True) = Just $ implicitColour (idris_colourTheme ist) annotationColour ist (AnnBoundName _ False) = Just $ boundVarColour (idris_colourTheme ist)-annotationColour ist AnnKeyword = Just $ keywordColour (idris_colourTheme ist)+annotationColour ist AnnKeyword = Just $ keywordColour (idris_colourTheme ist) annotationColour ist (AnnName n _ _ _) = let ctxt = tt_ctxt ist theme = idris_colourTheme ist@@ -1738,7 +1749,7 @@ st = case s of- Static -> text "[static]" <> space+ Static -> text "%static" <> space _ -> empty prettySe d p bnd (PPi (Imp l s _ fa) n _ ty sc) | ppopt_impl ppo =@@ -1749,12 +1760,12 @@ where st = case s of- Static -> text "[static]" <> space+ Static -> text "%static" <> space _ -> empty prettySe d p bnd (PPi (Constraint _ _) n _ ty sc) = depth d . bracket p startPrec $ prettySe (decD d) (startPrec + 1) bnd ty <+> text "=>" </> prettySe (decD d) startPrec ((n, True):bnd) sc- prettySe d p bnd (PPi (TacImp _ _ (PTactics [ProofSearch _ _ _ _ _ _])) n _ ty sc) =+ prettySe d p bnd (PPi (TacImp _ _ (PTactics [ProofSearch{}])) n _ ty sc) = lbrace <> kwd "auto" <+> pretty n <+> colon <+> prettySe (decD d) startPrec bnd ty <> rbrace <+> text "->" </> prettySe (decD d) startPrec ((n, True):bnd) sc prettySe d p bnd (PPi (TacImp _ _ s) n _ ty sc) =@@ -1791,7 +1802,7 @@ [x] -> group (opName True <$> group (prettySe (decD d) startPrec bnd (getTm x))) [l,r] -> let precedence = maybe (startPrec - 1) prec f in depth d . bracket p precedence $ inFix (getTm l) (getTm r)- (l@(PExp _ _ _ _) : r@(PExp _ _ _ _) : rest) ->+ (l@(PExp{}) : r@(PExp{}) : rest) -> depth d . bracket p funcAppPrec $ enclose lparen rparen (inFix (getTm l) (getTm r)) <+> align (group (vsep (map (prettyArgS d bnd) rest)))@@ -1842,20 +1853,20 @@ -- disambiguation on PDPair. vars tm = filter noNS (allNamesIn tm) noNS (NS _ _) = False- noNS _ = True+ noNS _ = True prettySe d p bnd (PIfThenElse _ c t f) = depth d . bracket p funcAppPrec . group . align . hang 2 . vsep $- [ kwd "if" <+> prettySe (decD d) startPrec bnd c+ [ kwd "if" <+> prettySe (decD d) startPrec bnd c , kwd "then" <+> prettySe (decD d) startPrec bnd t , kwd "else" <+> prettySe (decD d) startPrec bnd f ]- prettySe d p bnd (PHidden tm) = text "." <> prettySe (decD d) funcAppPrec bnd tm- prettySe d p bnd (PResolveTC _) = kwd "%instance"- prettySe d p bnd (PTrue _ IsType) = annName unitTy $ text "()"- prettySe d p bnd (PTrue _ IsTerm) = annName unitCon $ text "()"+ prettySe d p bnd (PHidden tm) = text "." <> prettySe (decD d) funcAppPrec bnd tm+ prettySe d p bnd (PResolveTC _) = kwd "%instance"+ prettySe d p bnd (PTrue _ IsType) = annName unitTy $ text "()"+ prettySe d p bnd (PTrue _ IsTerm) = annName unitCon $ text "()" prettySe d p bnd (PTrue _ TypeOrTerm) = text "()"- prettySe d p bnd (PRewrite _ l r _) =+ prettySe d p bnd (PRewrite _ l r _) = depth d . bracket p startPrec $ text "rewrite" <+> prettySe (decD d) (startPrec + 1) bnd l <+> text "in" <+> prettySe (decD d) startPrec bnd r prettySe d p bnd (PTyped l r) =@@ -1865,9 +1876,9 @@ align . group . vsep . punctuate (ann comma) $ map (prettySe (decD d) startPrec bnd) elts where ann = case pun of- TypeOrTerm -> id- IsType -> annName pairTy- IsTerm -> annName pairCon+ TypeOrTerm -> id+ IsType -> annName pairTy+ IsTerm -> annName pairCon prettySe d p bnd (PDPair _ _ pun l t r) = depth d $ annotated lparen <>@@ -1876,30 +1887,32 @@ prettySe (decD d) startPrec (addBinding bnd) r <> annotated rparen where annotated = case pun of- IsType -> annName sigmaTy- IsTerm -> annName sigmaCon- TypeOrTerm -> id+ IsType -> annName sigmaTy+ IsTerm -> annName sigmaCon+ TypeOrTerm -> id (left, addBinding) = case (l, pun) of (PRef _ _ n, IsType) -> (bindingOf n False <+> text ":" <+> prettySe (decD d) startPrec bnd t, ((n, False) :))- _ -> (prettySe (decD d) startPrec bnd l, id)+ _ -> (prettySe (decD d) startPrec bnd l, id) prettySe d p bnd (PAlternative ns a as) = lparen <> text "|" <> prettyAs <> text "|" <> rparen where prettyAs =- foldr (\l -> \r -> l <+> text "," <+> r) empty $ map (depth d . prettySe (decD d) startPrec bnd) as- prettySe d p bnd (PType _) = annotate (AnnType "Type" "The type of types") $ text "Type"- prettySe d p bnd (PUniverse u) = annotate (AnnType (show u) "The type of unique types") $ text (show u)- prettySe d p bnd (PConstant _ c) = annotate (AnnConst c) (text (show c))+ foldr ((\ l r -> l <+> text "," <+> r) .+ depth d . prettySe (decD d) startPrec bnd)+ empty as+ prettySe d p bnd (PType _) = annotate (AnnType "Type" "The type of types") $ text "Type"+ prettySe d p bnd (PUniverse u) = annotate (AnnType (show u) "The type of unique types") $ text (show u)+ prettySe d p bnd (PConstant _ c) = annotate (AnnConst c) (text (show c)) -- XXX: add pretty for tactics- prettySe d p bnd (PProof ts) =+ prettySe d p bnd (PProof ts) = kwd "proof" <+> lbrace <> ellipsis <> rbrace- prettySe d p bnd (PTactics ts) =+ prettySe d p bnd (PTactics ts) = kwd "tactics" <+> lbrace <> ellipsis <> rbrace- prettySe d p bnd (PMetavar _ n) = annotate (AnnName n (Just MetavarOutput) Nothing Nothing) $ text "?" <> pretty n- prettySe d p bnd (PReturn f) = kwd "return"- prettySe d p bnd PImpossible = kwd "impossible"- prettySe d p bnd Placeholder = text "_"- prettySe d p bnd (PDoBlock dos) =+ prettySe d p bnd (PMetavar _ n) = annotate (AnnName n (Just MetavarOutput) Nothing Nothing) $ text "?" <> pretty n+ prettySe d p bnd (PReturn f) = kwd "return"+ prettySe d p bnd PImpossible = kwd "impossible"+ prettySe d p bnd Placeholder = text "_"+ prettySe d p bnd (PDoBlock dos) = bracket p startPrec $ kwd "do" <+> align (vsep (map (group . align . hang 2) (ppdo bnd dos))) where ppdo bnd (DoExp _ tm:dos) = prettySe (decD d) startPrec bnd tm : ppdo bnd dos@@ -1921,47 +1934,46 @@ text "no pretty printer for pattern-matching do binding" : ppdo bnd dos ppdo _ [] = []- prettySe d p bnd (PCoerced t) = prettySe d p bnd t- prettySe d p bnd (PElabError s) = pretty s+ prettySe d p bnd (PCoerced t) = prettySe d p bnd t+ prettySe d p bnd (PElabError s) = pretty s -- Quasiquote pprinting ignores bound vars- prettySe d p bnd (PQuasiquote t Nothing) = text "`(" <> prettySe (decD d) p [] t <> text ")"+ prettySe d p bnd (PQuasiquote t Nothing) = text "`(" <> prettySe (decD d) p [] t <> text ")" prettySe d p bnd (PQuasiquote t (Just g)) = text "`(" <> prettySe (decD d) p [] t <+> colon <+> prettySe (decD d) p [] g <> text ")"- prettySe d p bnd (PUnquote t) = text "~" <> prettySe (decD d) p bnd t- prettySe d p bnd (PQuoteName n res _) = text start <> prettyName True (ppopt_impl ppo) bnd n <> text end+ prettySe d p bnd (PUnquote t) = text "~" <> prettySe (decD d) p bnd t+ prettySe d p bnd (PQuoteName n res _) = text start <> prettyName True (ppopt_impl ppo) bnd n <> text end where start = if res then "`{" else "`{{" end = if res then "}" else "}}"- prettySe d p bnd (PRunElab _ tm _) =+ prettySe d p bnd (PRunElab _ tm _) = bracket p funcAppPrec . group . align . hang 2 $ text "%runElab" <$> prettySe (decD d) funcAppPrec bnd tm- prettySe d p bnd (PConstSugar fc tm) = prettySe d p bnd tm -- should never occur, but harmless-- prettySe d p bnd _ = text "missing pretty-printer for term"+ prettySe d p bnd (PConstSugar fc tm) = prettySe d p bnd tm -- should never occur, but harmless+ prettySe d p bnd _ = text "missing pretty-printer for term" prettyBindingOf :: Name -> Bool -> Doc OutputAnnotation prettyBindingOf n imp = annotate (AnnBoundName n imp) (text (display n)) where display (UN n) = T.unpack n display (MN _ n) = T.unpack n -- If a namespace is specified on a binding form, we'd better show it regardless of the implicits settings- display (NS n ns) = (concat . intersperse "." . map T.unpack . reverse) ns ++ "." ++ display n+ display (NS n ns) = (intercalate "." . map T.unpack . reverse) ns ++ "." ++ display n display n = show n - prettyArgS d bnd (PImp _ _ _ n tm) = prettyArgSi d bnd (n, tm)- prettyArgS d bnd (PExp _ _ _ tm) = prettyArgSe d bnd tm- prettyArgS d bnd (PConstraint _ _ _ tm) = prettyArgSc d bnd tm- prettyArgS d bnd (PTacImplicit _ _ n _ tm) = prettyArgSti d bnd (n, tm)+ prettyArgS d bnd (PImp _ _ _ n tm) = prettyArgSi d bnd (n, tm)+ prettyArgS d bnd (PExp _ _ _ tm) = prettyArgSe d bnd tm+ prettyArgS d bnd (PConstraint _ _ _ tm) = prettyArgSc d bnd tm+ prettyArgS d bnd (PTacImplicit _ _ n _ tm) = prettyArgSti d bnd (n, tm) - prettyArgSe d bnd arg = prettySe d (funcAppPrec + 1) bnd arg- prettyArgSi d bnd (n, val) = lbrace <> pretty n <+> text "=" <+> prettySe (decD d) startPrec bnd val <> rbrace- prettyArgSc d bnd val = lbrace <> lbrace <> prettySe (decD d) startPrec bnd val <> rbrace <> rbrace+ prettyArgSe d bnd arg = prettySe d (funcAppPrec + 1) bnd arg+ prettyArgSi d bnd (n, val) = lbrace <> pretty n <+> text "=" <+> prettySe (decD d) startPrec bnd val <> rbrace+ prettyArgSc d bnd val = lbrace <> lbrace <> prettySe (decD d) startPrec bnd val <> rbrace <> rbrace prettyArgSti d bnd (n, val) = lbrace <> kwd "auto" <+> pretty n <+> text "=" <+> prettySe (decD d) startPrec bnd val <> rbrace annName :: Name -> Doc OutputAnnotation -> Doc OutputAnnotation annName n = annotate (AnnName n Nothing Nothing Nothing) opStr :: Name -> String- opStr (NS n _) = opStr n- opStr (UN n) = T.unpack n+ opStr (NS n _) = opStr n+ opStr (UN n) = T.unpack n slist' :: Maybe Int -> Int -> [(Name, Bool)] -> PTerm -> Maybe [Doc OutputAnnotation] slist' (Just d) _ _ _ | d <= 0 = Nothing@@ -2023,7 +2035,7 @@ ellipsis = text "..." depth Nothing = id- depth (Just d) = if d <= 0 then const (ellipsis) else id+ depth (Just d) = if d <= 0 then const ellipsis else id decD = fmap (\x -> x - 1) @@ -2038,7 +2050,7 @@ -- | Strip away namespace information basename :: Name -> Name basename (NS n _) = basename n-basename n = n+basename n = n -- | Determine whether a name was the one inserted for a hole or -- guess by the delaborator@@ -2058,15 +2070,15 @@ -> Name -- ^^ the name to pprint -> Doc OutputAnnotation prettyName infixParen showNS bnd n- | (MN _ s) <- n, isPrefixOf "_" $ T.unpack s = text "_"- | (UN n') <- n, T.unpack n' == "_" = text "_"- | Just imp <- lookup n bnd = annotate (AnnBoundName n imp) fullName- | otherwise = annotate (AnnName n Nothing Nothing Nothing) fullName+ | (MN _ s) <- n, isPrefixOf "_" $ T.unpack s = text "_"+ | (UN n') <- n, T.unpack n' == "_" = text "_"+ | Just imp <- lookup n bnd = annotate (AnnBoundName n imp) fullName+ | otherwise = annotate (AnnName n Nothing Nothing Nothing) fullName where fullName = text nameSpace <> parenthesise (text (baseName n))- baseName (UN n) = T.unpack n- baseName (NS n ns) = baseName n- baseName (MN i s) = T.unpack s- baseName other = show other+ baseName (UN n) = T.unpack n+ baseName (NS n ns) = baseName n+ baseName (MN i s) = T.unpack s+ baseName other = show other nameSpace = case n of (NS n' ns) -> if showNS then (concatMap (++ ".") . map T.unpack . reverse) ns else "" _ -> ""@@ -2081,13 +2093,13 @@ = prettyImp ppo l <+> showWs ws <+> text "=" <+> prettyImp ppo r <+> text "where" <+> text (show w) where- showWs [] = empty+ showWs [] = empty showWs (x : xs) = text "|" <+> prettyImp ppo x <+> showWs xs showCImp ppo (PWith _ n l ws r pn w) = prettyImp ppo l <+> showWs ws <+> text "with" <+> prettyImp ppo r <+> braces (text (show w)) where- showWs [] = empty+ showWs [] = empty showWs (x : xs) = text "|" <+> prettyImp ppo x <+> showWs xs @@ -2099,43 +2111,43 @@ showDecls :: PPOption -> [PDecl] -> Doc OutputAnnotation showDecls o ds = vsep (map (showDeclImp o) ds) -showDeclImp _ (PFix _ f ops) = text (show f) <+> cat (punctuate (text ",") (map text ops))+showDeclImp _ (PFix _ f ops) = text (show f) <+> cat (punctuate (text ",") (map text ops)) showDeclImp o (PTy _ _ _ _ _ n _ t) = text "tydecl" <+> text (showCG n) <+> colon <+> prettyImp o t-showDeclImp o (PClauses _ _ n cs) = text "pat" <+> text (showCG n) <+> text "\t" <+>+showDeclImp o (PClauses _ _ n cs) = text "pat" <+> text (showCG n) <+> text "\t" <+> indent 2 (vsep (map (showCImp o) cs))-showDeclImp o (PData _ _ _ _ _ d) = showDImp o { ppopt_impl = True } d-showDeclImp o (PParams _ ns ps) = text "params" <+> braces (text (show ns) <> line <> showDecls o ps <> line)-showDeclImp o (PNamespace n fc ps) = text "namespace" <+> text n <> braces (line <> showDecls o ps <> line)+showDeclImp o (PData _ _ _ _ _ d) = showDImp o { ppopt_impl = True } d+showDeclImp o (PParams _ ns ps) = text "params" <+> braces (text (show ns) <> line <> showDecls o ps <> line)+showDeclImp o (PNamespace n fc ps) = text "namespace" <+> text n <> braces (line <> showDecls o ps <> line) showDeclImp _ (PSyntax _ syn) = text "syntax" <+> text (show syn) showDeclImp o (PClass _ _ _ cs n _ ps _ _ ds _ _) = text "interface" <+> text (show cs) <+> text (show n) <+> text (show ps) <> line <> showDecls o ds-showDeclImp o (PInstance _ _ _ _ cs n _ _ t _ ds)+showDeclImp o (PInstance _ _ _ _ cs acc _ n _ _ t _ ds) = text "implementation" <+> text (show cs) <+> text (show n) <+> prettyImp o t <> line <> showDecls o ds showDeclImp _ _ = text "..." -- showDeclImp (PImport o) = "import " ++ o getImps :: [PArg] -> [(Name, PTerm)] getImps [] = []-getImps (PImp _ _ _ n tm : xs) = (n, tm) : getImps xs-getImps (_ : xs) = getImps xs+getImps (PImp _ _ _ n tm : xs) = (n, tm) : getImps xs+getImps (_ : xs) = getImps xs getExps :: [PArg] -> [PTerm] getExps [] = []-getExps (PExp _ _ _ tm : xs) = tm : getExps xs-getExps (_ : xs) = getExps xs+getExps (PExp _ _ _ tm : xs) = tm : getExps xs+getExps (_ : xs) = getExps xs getShowArgs :: [PArg] -> [PArg] getShowArgs [] = [] getShowArgs (e@(PExp _ _ _ tm) : xs) = e : getShowArgs xs getShowArgs (e : xs) | AlwaysShow `elem` argopts e = e : getShowArgs xs | PImp _ _ _ _ tm <- e- , containsHole tm = e : getShowArgs xs+ , containsHole tm = e : getShowArgs xs getShowArgs (_ : xs) = getShowArgs xs getConsts :: [PArg] -> [PTerm]-getConsts [] = []+getConsts [] = [] getConsts (PConstraint _ _ _ tm : xs) = tm : getConsts xs-getConsts (_ : xs) = getConsts xs+getConsts (_ : xs) = getConsts xs getAll :: [PArg] -> [PTerm] getAll = map getTm@@ -2149,13 +2161,13 @@ -> Name -- ^^ the term to show -> String showName ist bnd ppo colour n = case ist of- Just i -> if colour then colourise n (idris_colourTheme i) else showbasic n- Nothing -> showbasic n+ Just i -> if colour then colourise n (idris_colourTheme i) else showbasic n+ Nothing -> showbasic n where name = if ppopt_impl ppo then show n else showbasic n- showbasic n@(UN _) = showCG n- showbasic (MN i s) = str s- showbasic (NS n s) = showSep "." (map str (reverse s)) ++ "." ++ showbasic n- showbasic (SN s) = show s+ showbasic n@(UN _) = showCG n+ showbasic (MN i s) = str s+ showbasic (NS n s) = showSep "." (map str (reverse s)) ++ "." ++ showbasic n+ showbasic (SN s) = show s fst3 (x, _, _) = x colourise n t = let ctxt' = fmap tt_ctxt ist in case ctxt' of@@ -2187,42 +2199,42 @@ instance Sized PTerm where- size (PQuote rawTerm) = size rawTerm- size (PRef fc _ name) = size name- size (PLam fc name _ ty bdy) = 1 + size ty + size bdy- size (PPi plicity name fc ty bdy) = 1 + size ty + size fc + size bdy- size (PLet fc name nfc ty def bdy) = 1 + size ty + size def + size bdy- size (PTyped trm ty) = 1 + size trm + size ty- size (PApp fc name args) = 1 + size args- size (PAppBind fc name args) = 1 + size args- size (PCase fc trm bdy) = 1 + size trm + size bdy- size (PIfThenElse fc c t f) = 1 + sum (map size [c, t, f])- size (PTrue fc _) = 1- size (PResolveTC fc) = 1- size (PRewrite fc left right _) = 1 + size left + size right- size (PPair fc _ _ left right) = 1 + size left + size right- size (PDPair fs _ _ left ty right) = 1 + size left + size ty + size right- size (PAlternative _ a alts) = 1 + size alts- size (PHidden hidden) = size hidden- size (PUnifyLog tm) = size tm- size (PDisamb _ tm) = size tm- size (PNoImplicits tm) = size tm- size (PType _) = 1- size (PUniverse _) = 1- size (PConstant fc const) = 1 + size fc + size const- size Placeholder = 1- size (PDoBlock dos) = 1 + size dos- size (PIdiom fc term) = 1 + size term- size (PReturn fc) = 1- size (PMetavar _ name) = 1- size (PProof tactics) = size tactics- size (PElabError err) = size err- size PImpossible = 1- size _ = 0+ size (PQuote rawTerm) = size rawTerm+ size (PRef fc _ name) = size name+ size (PLam fc name _ ty bdy) = 1 + size ty + size bdy+ size (PPi plicity name fc ty bdy) = 1 + size ty + size fc + size bdy+ size (PLet fc name nfc ty def bdy) = 1 + size ty + size def + size bdy+ size (PTyped trm ty) = 1 + size trm + size ty+ size (PApp fc name args) = 1 + size args+ size (PAppBind fc name args) = 1 + size args+ size (PCase fc trm bdy) = 1 + size trm + size bdy+ size (PIfThenElse fc c t f) = 1 + sum (map size [c, t, f])+ size (PTrue fc _) = 1+ size (PResolveTC fc) = 1+ size (PRewrite fc left right _) = 1 + size left + size right+ size (PPair fc _ _ left right) = 1 + size left + size right+ size (PDPair fs _ _ left ty right) = 1 + size left + size ty + size right+ size (PAlternative _ a alts) = 1 + size alts+ size (PHidden hidden) = size hidden+ size (PUnifyLog tm) = size tm+ size (PDisamb _ tm) = size tm+ size (PNoImplicits tm) = size tm+ size (PType _) = 1+ size (PUniverse _) = 1+ size (PConstant fc const) = 1 + size fc + size const+ size Placeholder = 1+ size (PDoBlock dos) = 1 + size dos+ size (PIdiom fc term) = 1 + size term+ size (PReturn fc) = 1+ size (PMetavar _ name) = 1+ size (PProof tactics) = size tactics+ size (PElabError err) = size err+ size PImpossible = 1+ size _ = 0 getPArity :: PTerm -> Int-getPArity (PPi _ _ _ _ sc) = 1 + getPArity sc-getPArity _ = 0+getPArity (PPi _ _ _ _ sc) = 1 + getPArity sc+getPArity _ = 0 -- Return all names, free or globally bound, in the given term. @@ -2230,31 +2242,30 @@ allNamesIn tm = nub $ ni 0 [] tm where -- TODO THINK added niTacImp, but is it right? ni 0 env (PRef _ _ n)- | not (n `elem` env) = [n]- ni 0 env (PPatvar _ n) = [n]- ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)- ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)- ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env) (map snd os)- ni 0 env (PIfThenElse _ c t f) = ni 0 env c ++ ni 0 env t ++ ni 0 env f- ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc- ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc- ni 0 env (PLet _ n _ ty val sc) = ni 0 env ty ++ ni 0 env val ++ ni 0 (n:env) sc- ni 0 env (PHidden tm) = ni 0 env tm- ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r- ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r- ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r- ni 0 env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni 0 env r- ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r- ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r- ni 0 env (PAlternative ns a ls) = concatMap (ni 0 env) ls- ni 0 env (PUnifyLog tm) = ni 0 env tm- ni 0 env (PDisamb _ tm) = ni 0 env tm- ni 0 env (PNoImplicits tm) = ni 0 env tm-- ni i env (PQuasiquote tm ty) = ni (i+1) env tm ++ maybe [] (ni i env) ty- ni i env (PUnquote tm) = ni (i - 1) env tm+ | not (n `elem` env) = [n]+ ni 0 env (PPatvar _ n) = [n]+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env . getTm) as+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env . getTm) as+ ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env . snd) os+ ni 0 env (PIfThenElse _ c t f) = ni 0 env c ++ ni 0 env t ++ ni 0 env f+ ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PLet _ n _ ty val sc) = ni 0 env ty ++ ni 0 env val ++ ni 0 (n:env) sc+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r+ ni 0 env (PAlternative ns a ls) = concatMap (ni 0 env) ls+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm - ni i env tm = concatMap (ni i env) (children tm)+ ni i env (PQuasiquote tm ty) = ni (i+1) env tm ++ maybe [] (ni i env) ty+ ni i env (PUnquote tm) = ni (i - 1) env tm+ ni i env tm = concatMap (ni i env) (children tm) niTacImp i env (TacImp _ _ scr) = ni i env scr niTacImp _ _ _ = []@@ -2265,32 +2276,32 @@ boundNamesIn tm = S.toList (ni 0 S.empty tm) where -- TODO THINK Added niTacImp, but is it right? ni :: Int -> S.Set Name -> PTerm -> S.Set Name- ni 0 set (PApp _ f as) = niTms 0 (ni 0 set f) (map getTm as)- ni 0 set (PAppBind _ f as) = niTms 0 (ni 0 set f) (map getTm as)- ni 0 set (PCase _ c os) = niTms 0 (ni 0 set c) (map snd os)- ni 0 set (PIfThenElse _ c t f) = niTms 0 set [c, t, f]- ni 0 set (PLam fc n _ ty sc) = S.insert n $ ni 0 (ni 0 set ty) sc- ni 0 set (PLet fc n nfc ty val sc) = S.insert n $ ni 0 (ni 0 (ni 0 set ty) val) sc- ni 0 set (PPi p n _ ty sc) = niTacImp 0 (S.insert n $ ni 0 (ni 0 set ty) sc) p- ni 0 set (PRewrite _ l r _) = ni 0 (ni 0 set l) r- ni 0 set (PTyped l r) = ni 0 (ni 0 set l) r- ni 0 set (PPair _ _ _ l r) = ni 0 (ni 0 set l) r+ ni 0 set (PApp _ f as) = niTms 0 (ni 0 set f) (map getTm as)+ ni 0 set (PAppBind _ f as) = niTms 0 (ni 0 set f) (map getTm as)+ ni 0 set (PCase _ c os) = niTms 0 (ni 0 set c) (map snd os)+ ni 0 set (PIfThenElse _ c t f) = niTms 0 set [c, t, f]+ ni 0 set (PLam fc n _ ty sc) = S.insert n $ ni 0 (ni 0 set ty) sc+ ni 0 set (PLet fc n nfc ty val sc) = S.insert n $ ni 0 (ni 0 (ni 0 set ty) val) sc+ ni 0 set (PPi p n _ ty sc) = niTacImp 0 (S.insert n $ ni 0 (ni 0 set ty) sc) p+ ni 0 set (PRewrite _ l r _) = ni 0 (ni 0 set l) r+ ni 0 set (PTyped l r) = ni 0 (ni 0 set l) r+ ni 0 set (PPair _ _ _ l r) = ni 0 (ni 0 set l) r ni 0 set (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 (ni 0 set t) r- ni 0 set (PDPair _ _ _ l t r) = ni 0 (ni 0 (ni 0 set l) t) r- ni 0 set (PAlternative ns a as) = niTms 0 set as- ni 0 set (PHidden tm) = ni 0 set tm- ni 0 set (PUnifyLog tm) = ni 0 set tm- ni 0 set (PDisamb _ tm) = ni 0 set tm- ni 0 set (PNoImplicits tm) = ni 0 set tm+ ni 0 set (PDPair _ _ _ l t r) = ni 0 (ni 0 (ni 0 set l) t) r+ ni 0 set (PAlternative ns a as) = niTms 0 set as+ ni 0 set (PHidden tm) = ni 0 set tm+ ni 0 set (PUnifyLog tm) = ni 0 set tm+ ni 0 set (PDisamb _ tm) = ni 0 set tm+ ni 0 set (PNoImplicits tm) = ni 0 set tm - ni i set (PQuasiquote tm ty) = ni (i + 1) set tm `S.union` maybe S.empty (ni i set) ty- ni i set (PUnquote tm) = ni (i - 1) set tm+ ni i set (PQuasiquote tm ty) = ni (i + 1) set tm `S.union` maybe S.empty (ni i set) ty+ ni i set (PUnquote tm) = ni (i - 1) set tm - ni i set tm = foldr S.union set (map (ni i set) (children tm))+ ni i set tm = foldr (S.union . ni i set) set (children tm) niTms :: Int -> S.Set Name -> [PTerm] -> S.Set Name- niTms i set [] = set- niTms i set (x : xs) = niTms i (ni i set x) xs+ niTms i set [] = set+ niTms i set (x : xs) = niTms i (ni i set x) xs niTacImp i set (TacImp _ _ scr) = ni i set scr niTacImp i set _ = set@@ -2306,18 +2317,19 @@ addFn n = do (imps, fns) <- get put (imps, n: fns) - notCAF [] = False+ notCAF [] = False notCAF (PExp _ _ _ _ : _) = True- notCAF (_ : xs) = notCAF xs+ notCAF (_ : xs) = notCAF xs notHidden (n, _) = case getAccessibility n of- Hidden -> False- _ -> True+ Hidden -> False+ Private -> False+ _ -> True getAccessibility n = case lookupDefAccExact n False (tt_ctxt ist) of- Just (n,t) -> t- _ -> Public+ Just (n,t) -> t+ _ -> Public ni 0 env (PRef _ _ n@(NS _ _)) | not (n `elem` env)@@ -2327,44 +2339,44 @@ | not (n `elem` env) && implicitable n || n `elem` uvars = addImp n ni 0 env (PApp _ f@(PRef _ _ n) as) | n `elem` uvars = do ni 0 env f- mapM_ (ni 0 env) (map getTm as)+ mapM_ (ni 0 env . getTm) as | otherwise = do case lookupTy n (tt_ctxt ist) of- [] -> return ()- _ -> addFn n- mapM_ (ni 0 env) (map getTm as)+ [] -> return ()+ _ -> addFn n+ mapM_ (ni 0 env . getTm) as ni 0 env (PApp _ f as) = do ni 0 env f- mapM_ (ni 0 env) (map getTm as)+ mapM_ (ni 0 env . getTm) as ni 0 env (PAppBind _ f as) = do ni 0 env f- mapM_ (ni 0 env) (map getTm as)+ mapM_ (ni 0 env . getTm) as ni 0 env (PCase _ c os) = do ni 0 env c -- names in 'os', not counting the names bound in the cases- mapM_ (ni 0 env) (map snd os)+ mapM_ (ni 0 env . snd) os (imps, fns) <- get put ([] ,[])- mapM_ (ni 0 env) (map fst os)+ mapM_ (ni 0 env . fst) os (impsfst, _) <- get put (nub imps \\ nub impsfst, fns)- ni 0 env (PIfThenElse _ c t f) = mapM_ (ni 0 env) [c, t, f]- ni 0 env (PLam fc n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc- ni 0 env (PPi p n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc- ni 0 env (PRewrite _ l r _) = do ni 0 env l; ni 0 env r- ni 0 env (PTyped l r) = do ni 0 env l; ni 0 env r- ni 0 env (PPair _ _ _ l r) = do ni 0 env l; ni 0 env r- ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = do ni 0 env t; ni 0 (n:env) r- ni 0 env (PDPair _ _ _ l t r) = do ni 0 env l- ni 0 env t- ni 0 env r- ni 0 env (PAlternative ns a as) = mapM_ (ni 0 env) as- ni 0 env (PHidden tm) = ni 0 env tm- ni 0 env (PUnifyLog tm) = ni 0 env tm- ni 0 env (PDisamb _ tm) = ni 0 env tm- ni 0 env (PNoImplicits tm) = ni 0 env tm+ ni 0 env (PIfThenElse _ c t f) = mapM_ (ni 0 env) [c, t, f]+ ni 0 env (PLam fc n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc+ ni 0 env (PPi p n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc+ ni 0 env (PRewrite _ l r _) = do ni 0 env l; ni 0 env r+ ni 0 env (PTyped l r) = do ni 0 env l; ni 0 env r+ ni 0 env (PPair _ _ _ l r) = do ni 0 env l; ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = do ni 0 env t; ni 0 (n:env) r+ ni 0 env (PDPair _ _ _ l t r) = do ni 0 env l+ ni 0 env t+ ni 0 env r+ ni 0 env (PAlternative ns a as) = mapM_ (ni 0 env) as+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm ni i env (PQuasiquote tm ty) = do ni (i + 1) env tm maybe (return ()) (ni i env) ty ni i env (PUnquote tm) = ni (i - 1) env tm - ni i env tm = mapM_ (ni i env) (children tm)+ ni i env tm = mapM_ (ni i env) (children tm) -- Return names which are free in the given term. namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name]@@ -2373,32 +2385,32 @@ ni 0 env (PRef _ _ n) | not (n `elem` env) = case lookupTy n (tt_ctxt ist) of- [] -> [n]- _ -> if n `elem` (map fst uvars) then [n] else []- ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)- ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)- ni 0 env (PCase _ c os) = ni 0 env c +++ [] -> [n]+ _ -> [n | n `elem` (map fst uvars)]+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env . getTm) as+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env . getTm) as+ ni 0 env (PCase _ c os) = ni 0 env c ++ -- names in 'os', not counting the names bound in the cases- (nub (concatMap (ni 0 env) (map snd os))- \\ nub (concatMap (ni 0 env) (map fst os)))- ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]+ (nub (concatMap (ni 0 env . snd) os)+ \\ nub (concatMap (ni 0 env . fst) os))+ ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f] ni 0 env (PLam fc n nfc ty sc) = ni 0 env ty ++ ni 0 (n:env) sc- ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc- ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r- ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r- ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r- ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r ni 0 env (PAlternative ns a as) = concatMap (ni 0 env) as- ni 0 env (PHidden tm) = ni 0 env tm- ni 0 env (PUnifyLog tm) = ni 0 env tm- ni 0 env (PDisamb _ tm) = ni 0 env tm- ni 0 env (PNoImplicits tm) = ni 0 env tm+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm - ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty- ni i env (PUnquote tm) = ni (i - 1) env tm+ ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty+ ni i env (PUnquote tm) = ni (i - 1) env tm - ni i env tm = concatMap (ni i env) (children tm)+ ni i env tm = concatMap (ni i env) (children tm) niTacImp i env (TacImp _ _ scr) = ni i env scr niTacImp _ _ _ = []@@ -2413,27 +2425,27 @@ = case lookupDefExact n (tt_ctxt ist) of Nothing -> [n] _ -> []- ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)- ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)- ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env) (map snd os)- ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]- ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc- ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc- ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r- ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r- ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env . getTm) as+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env . getTm) as+ ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env . snd) os+ ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]+ ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r- ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r ni 0 env (PAlternative ns a as) = concatMap (ni 0 env) as- ni 0 env (PHidden tm) = ni 0 env tm- ni 0 env (PUnifyLog tm) = ni 0 env tm- ni 0 env (PDisamb _ tm) = ni 0 env tm- ni 0 env (PNoImplicits tm) = ni 0 env tm+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm - ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty- ni i env (PUnquote tm) = ni (i - 1) env tm+ ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty+ ni i env (PUnquote tm) = ni (i - 1) env tm - ni i env tm = concatMap (ni i env) (children tm)+ ni i env tm = concatMap (ni i env) (children tm) niTacImp i env (TacImp _ _ scr) = ni i env scr niTacImp _ _ _ = []
@@ -77,7 +77,7 @@ logElab 1 ("New patterns " ++ showSep ", " (map showTmImpls splits)) let newPats_in = zipWith (replaceVar ctxt n) splits (repeat t)- logElab 4 ("Working from " ++ show t)+ logElab 4 ("Working from " ++ showTmImpls t) logElab 4 ("Trying " ++ showSep "\n" (map (showTmImpls) newPats_in)) newPats_in <- mapM elabNewPat newPats_in@@ -227,7 +227,8 @@ i <- getIState return (True, delab i tm)) (\e -> do i <- getIState- logElab 5 $ "Not a valid split:\n" ++ pshow i e+ logElab 5 $ "Not a valid split:\n" ++ showTmImpls t ++ "\n" + ++ pshow i e return (False, t)) findPats :: IState -> Type -> [PTerm]
@@ -47,9 +47,9 @@ mkSGR :: IdrisColour -> [SGR] mkSGR (IdrisColour c v u b i) = fg c ++- (if u then [SetUnderlining SingleUnderline] else []) ++- (if b then [SetConsoleIntensity BoldIntensity] else []) ++- (if i then [SetItalicized True] else [])+ [SetUnderlining SingleUnderline | u] +++ [SetConsoleIntensity BoldIntensity | b] +++ [SetItalicized True | i] where fg Nothing = [] fg (Just c) = [SetColor Foreground (if v then Vivid else Dull) c]@@ -71,9 +71,9 @@ colouriseWithSTX :: IdrisColour -> String -> String colouriseWithSTX (IdrisColour c v u b i) str = setSGRCode sgr ++ "\STX" ++ str ++ setSGRCode [Reset] ++ "\STX" where sgr = fg c ++- (if u then [SetUnderlining SingleUnderline] else []) ++- (if b then [SetConsoleIntensity BoldIntensity] else []) ++- (if i then [SetItalicized True] else [])+ [SetUnderlining SingleUnderline | u] +++ [SetConsoleIntensity BoldIntensity | b] +++ [SetItalicized True | i] fg Nothing = [] fg (Just c) = [SetColor Foreground (if v then Vivid else Dull) c]
@@ -9,10 +9,10 @@ import Idris.Help import Idris.Imports (installedPackages) import Idris.Colours-import Idris.ParseHelpers(opChars)-import qualified Idris.ParseExpr (constants, tactics)-import Idris.ParseExpr (TacticArg (..))-import Idris.REPLParser (allHelp, setOptions)+import Idris.Parser.Helpers(opChars)+import qualified Idris.Parser.Expr (constants, tactics)+import Idris.Parser.Expr (TacticArg (..))+import Idris.REPL.Parser (allHelp, setOptions) import Control.Monad.State.Strict import Data.List@@ -26,7 +26,7 @@ commands = [ n | (names, _, _) <- allHelp ++ extraHelp, n <- names ] tacticArgs :: [(String, Maybe TacticArg)]-tacticArgs = [ (name, args) | (names, args, _) <- Idris.ParseExpr.tactics+tacticArgs = [ (name, args) | (names, args, _) <- Idris.Parser.Expr.tactics , name <- names ] tactics = map fst tacticArgs @@ -48,11 +48,11 @@ let ctxt = tt_ctxt i return . nub $ mapMaybe (nameString . fst) (ctxtAlist ctxt) ++- "Type" : map fst Idris.ParseExpr.constants+ "Type" : map fst Idris.Parser.Expr.constants metavars :: Idris [String] metavars = do i <- get- return . map (show . nsroot) $ map fst (filter (\(_, (_,_,_,t)) -> not t) (idris_metavars i)) \\ primDefs+ return . map (show . nsroot) $ map fst (filter (\(_, (_,_,_,t,_)) -> not t) (idris_metavars i)) \\ primDefs modules :: Idris [String]
@@ -113,8 +113,9 @@ put x put y put z- put (CantResolve _ t) = do putWord8 15- put t+ put (CantResolve _ t u) = do putWord8 15+ put t+ put u put (CantResolveAlts ns) = do putWord8 16 put ns put (IncompleteTerm t) = do putWord8 17@@ -218,7 +219,7 @@ 13 -> fmap NoTypeDecl get 14 -> do x <- get ; y <- get ; z <- get return $ NotInjective x y z- 15 -> fmap (CantResolve False) get+ 15 -> CantResolve False <$> get <*> get 16 -> fmap CantResolveAlts get 17 -> fmap IncompleteTerm get 18 -> UniverseError <$> get <*> get <*> get <*> get <*> get
@@ -152,10 +152,10 @@ nua ps (SucCase _ sc) = nu' ps sc nua ps (DefaultCase sc) = nu' ps sc - nut ps (P Ref n _) | n `elem` ps = []+ nut ps (P _ n _) | n `elem` ps = [] | otherwise = [(n, [])] -- tmp nut ps fn@(App _ f a)- | (P Ref n _, args) <- unApply fn+ | (P _ n _, args) <- unApply fn = if n `elem` ps then nut ps f ++ nut ps a else [(n, map argNames args)] ++ concatMap (nut ps) args | (P (TCon _ _) n _, _) <- unApply fn = []
@@ -134,7 +134,7 @@ rnf (NoTypeDecl x1) = rnf x1 `seq` () rnf (NotInjective x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` ()- rnf (CantResolve x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (CantResolve x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf (InvalidTCArg x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (CantResolveAlts x1) = rnf x1 `seq` () rnf (NoValidAlts x1) = rnf x1 `seq` ()@@ -239,6 +239,7 @@ rnf Public = () rnf Frozen = () rnf Hidden = ()+ rnf Private = () instance NFData Totality where
@@ -12,7 +12,7 @@ addDatatype, addCasedef, simplifyCasedef, addOperator, lookupNames, lookupTyName, lookupTyNameExact, lookupTy, lookupTyExact, lookupP, lookupP_all, lookupDef, lookupNameDef, lookupDefExact, lookupDefAcc, lookupDefAccExact, lookupVal,- mapDefCtxt,+ mapDefCtxt, lookupTotal, lookupNameTotal, lookupMetaInformation, lookupTyEnv, isTCDict, isDConName, canBeDConName, isTConName, isConName, isFnName, Value(..), Quote(..), initEval, uniqueNameCtxt, uniqueBindersCtxt, definitions, isUniverse) where@@ -247,18 +247,16 @@ | otherwise = do (u, ntimes) <- usable spec n ntimes_in if u then- do let val = lookupDefAcc n (spec || atRepl) ctxt+ do let val = lookupDefAcc n (spec || atRepl || runtime) ctxt case val of [(Function _ tm, _)] | sUN "assert_total" `elem` stk -> ev ntimes (n:stk) True env tm [(Function _ tm, Public)] -> ev ntimes (n:stk) True env tm- [(Function _ tm, Hidden)] ->- ev ntimes (n:stk) True env tm [(TyDecl nt ty, _)] -> do vty <- ev ntimes stk True env ty return $ VP nt n vty [(CaseOp ci _ _ _ _ cd, acc)]- | (acc /= Frozen || sUN "assert_total" `elem` stk) &&+ | (acc == Public || acc == Hidden || sUN "assert_total" `elem` stk) && null (fst (cases_totcheck cd)) -> -- unoptimised version let (ns, tree) = getCases cd in if blockSimplify ci n stk@@ -319,7 +317,7 @@ evApply ntimes' stk top env [l',t',arg'] d' -- Treat "assert_total" specially, as long as it's defined! ev ntimes stk top env (App _ (App _ (P _ n@(UN at) _) _) arg)- | [(CaseOp _ _ _ _ _ _, _)] <- lookupDefAcc n (spec || atRepl) ctxt,+ | [(CaseOp _ _ _ _ _ _, _)] <- lookupDefAcc n (spec || atRepl || runtime) ctxt, at == txt "assert_total" && not simpl = ev ntimes (n : stk) top env arg ev ntimes stk top env (App _ f a)@@ -347,7 +345,7 @@ = apply ntimes stk top env f args reapply ntimes stk top env f@(VP Ref n ty) args- = let val = lookupDefAcc n (spec || atRepl) ctxt in+ = let val = lookupDefAcc n (spec || atRepl || runtime) ctxt in case val of [(CaseOp ci _ _ _ _ cd, acc)] -> let (ns, tree) = getCases cd in@@ -373,10 +371,10 @@ | otherwise = do (u, ntimes) <- usable spec n ntimes_in if u then- do let val = lookupDefAcc n (spec || atRepl) ctxt+ do let val = lookupDefAcc n (spec || atRepl || runtime) ctxt case val of [(CaseOp ci _ _ _ _ cd, acc)]- | acc /= Frozen || sUN "assert_total" `elem` stk ->+ | acc == Public || acc == Hidden || sUN "assert_total" `elem` stk -> -- unoptimised version let (ns, tree) = getCases cd in if blockSimplify ci n stk@@ -742,15 +740,23 @@ ------- --- Frozen => doesn't reduce--- Hidden => doesn't reduce and invisible to type checker+-- Hidden => Programs can't access the name at all+-- Public => Programs can access the name and use at will+-- Frozen => Programs can access the name, which doesn't reduce+-- Private => Programs can't access the name, doesn't reduce internally -data Accessibility = Public | Frozen | Hidden- deriving (Show, Eq)+data Accessibility = Hidden | Public | Frozen | Private + deriving (Eq, Ord) {-! deriving instance NFData Accessibility !-} +instance Show Accessibility where+ show Public = "public export"+ show Frozen = "export"+ show Private = "private"+ show Hidden = "hidden"+ -- | The result of totality checking data Totality = Total [Int] -- ^ well-founded arguments | Productive -- ^ productive@@ -1039,6 +1045,7 @@ (Operator ty _ _, a, _, _) -> return (P Ref n' ty, a) case snd p of Hidden -> if all then return (fst p) else []+ Private -> if all then return (fst p) else [] _ -> return (fst p) where names = let ns = lookupCtxtName n (definitions ctxt) in
@@ -206,6 +206,14 @@ merge acc ns | otherwise = merge ((n, t): acc) ns +dropSwaps :: [(Name, TT Name)] -> [(Name, TT Name)]+dropSwaps [] = []+dropSwaps (p@(x, P _ y _) : xs) | solvedIn y x xs = dropSwaps xs+ where solvedIn _ _ [] = False+ solvedIn y x ((y', P _ x' _) : xs) | y == y' && x == x' = True+ solvedIn y x (_ : xs) = solvedIn y x xs+dropSwaps (p : xs) = p : dropSwaps xs+ unify' :: Context -> Env -> (TT Name, Maybe Provenance) -> (TT Name, Maybe Provenance) ->@@ -242,7 +250,8 @@ -- problem for each. uns <- mergeSolutions env (u' ++ ns) ps <- get- let (ns', probs') = updateProblems ps uns (fails ++ problems ps)+ let (ns_p, probs') = updateProblems ps uns (fails ++ problems ps)+ let ns' = dropSwaps ns_p let (notu', probs_notu) = mergeNotunified env (holes ps) (notu ++ notunified ps) traceWhen (unifylog ps) ("Now solved: " ++ show ns' ++
@@ -268,7 +268,7 @@ | NoTypeDecl Name | NotInjective t t t | CantResolve Bool -- True if postponed, False if fatal- t+ t (Err' t) -- any further information | InvalidTCArg Name t | CantResolveAlts [Name] | NoValidAlts [Name]@@ -354,7 +354,7 @@ size (NoSuchVariable name) = size name size (NoTypeDecl name) = size name size (NotInjective l c r) = size l + size c + size r- size (CantResolve _ trm) = size trm+ size (CantResolve _ trm _) = size trm size (NoRewriting trm) = size trm size (CantResolveAlts _) = 1 size (IncompleteTerm trm) = size trm@@ -397,7 +397,7 @@ show (WithFnType _) = "WithFnType" show (NoTypeDecl _) = "NoTypeDecl" show (NotInjective _ _ _) = "NotInjective"- show (CantResolve _ _) = "CantResolve"+ show (CantResolve _ _ _) = "CantResolve" show (InvalidTCArg _ _) = "InvalidTCArg" show (CantResolveAlts _) = "CantResolveAlts" show (NoValidAlts _) = "NoValidAlts"@@ -588,7 +588,7 @@ tcname (SN (ParentN _ _)) = True tcname _ = False -implicitable (NS n _) = implicitable n+implicitable (NS n _) = False implicitable (UN xs) | T.null xs = False | otherwise = isLower (T.head xs) || T.head xs == '_' implicitable (MN _ x) = not (tnull x) && thead x /= '_'
@@ -59,10 +59,16 @@ let lhs_tms' = zipWith mergePlaceholders lhs_tms (map (stripUnmatchable i) (map flattenArgs given)) let lhss = map pUnApply lhs_tms'+ nty <- case lookupTyExact n (tt_ctxt i) of+ Just t -> return (normalise (tt_ctxt i) [] t)+ _ -> fail "Can't happen - genClauses, lookupTyExact" let argss = transpose lhss- let all_args = map (genAll i) argss+ let all_args = map (genAll i) (zip (genPH i nty) argss) logCoverage 5 $ "COVERAGE of " ++ show n+ logCoverage 5 $ "using type " ++ show nty+ logCoverage 5 $ "non-concrete args " ++ show (genPH i nty)+ logCoverage 5 $ show (lhs_tms, lhss) logCoverage 5 $ show (map length argss) ++ "\n" ++ show (map length all_args) logCoverage 10 $ show argss ++ "\n" ++ show all_args@@ -89,6 +95,18 @@ | (f, args) <- unApply term = map (\t -> delab' i t True True) args | otherwise = [] + -- if an argument has a non-concrete type (i.e. it's a function+ -- that calculates something from a previous argument) we'll also+ -- need to generate a placeholder pattern for it since it could be+ -- anything based on earlier values+ genPH :: IState -> Type -> [Bool]+ genPH ist (Bind n (Pi _ ty _) sc) = notConcrete ist ty : genPH ist sc+ genPH ist ty = [] ++ notConcrete ist t | (P _ n _, args) <- unApply t,+ not (isConName n (tt_ctxt ist)) = True+ notConcrete _ _ = False+ pUnApply (PApp _ f args) = map getTm args pUnApply _ = [] @@ -135,6 +153,7 @@ = case (unApply topx, unApply topy) of ((P _ x _, _), (P _ y _, _)) -> x == y _ -> False+validCoverageCase ctxt (InfiniteUnify _ _ _) = False validCoverageCase ctxt (CantConvert _ _ _) = False validCoverageCase ctxt (At _ e) = validCoverageCase ctxt e validCoverageCase ctxt (Elaborating _ _ _ e) = validCoverageCase ctxt e@@ -171,16 +190,14 @@ recoverableCoverage ctxt (ElaboratingArg _ _ _ e) = recoverableCoverage ctxt e recoverableCoverage _ _ = False --- FIXME: Just look for which one is the deepest, then generate all--- possibilities up to that depth.--- This and below issues for this function are tracked as Issue #1741 on the issue tracker.--- https://github.com/idris-lang/Idris-dev/issues/1741-genAll :: IState -> [PTerm] -> [PTerm]-genAll i args+genAll :: IState -> (Bool, [PTerm]) -> [PTerm]+genAll i (addPH, args) = case filter (/=Placeholder) $ fnub (concatMap otherPats (fnub args)) of [] -> [Placeholder]- xs -> inventConsts xs+ xs -> ph $ inventConsts xs where+ ph ts = if addPH then Placeholder : ts else ts+ -- if they're constants, invent a new one to make sure that -- constants which are not explicitly handled are covered inventConsts cs@(PConstant fc c : _) = map (PConstant NoFC) (ic' (mapMaybe getConst cs))@@ -203,7 +220,6 @@ ic' xs@(B64 _ : _) = firstMissing xs (lotsOfNums B64) ic' xs@(Ch _ : _) = firstMissing xs lotsOfChars ic' xs@(Str _ : _) = firstMissing xs lotsOfStrings- -- TODO: Bit vectors -- The rest are types with only one case ic' xs = xs @@ -218,19 +234,19 @@ nubMap f acc (x : xs) = nubMap f (fnub' acc (f x)) xs otherPats :: PTerm -> [PTerm]- otherPats o@(PRef fc hl n) = ops fc n [] o- otherPats o@(PApp _ (PRef fc hl n) xs) = ops fc n xs o+ otherPats o@(PRef fc hl n) = ph $ ops fc n [] o+ otherPats o@(PApp _ (PRef fc hl n) xs) = ph $ ops fc n xs o otherPats o@(PPair fc hls _ l r)- = ops fc pairCon+ = ph $ ops fc pairCon ([pimp (sUN "A") Placeholder True, pimp (sUN "B") Placeholder True] ++ [pexp l, pexp r]) o otherPats o@(PDPair fc hls p t _ v)- = ops fc sigmaCon+ = ph $ ops fc sigmaCon ([pimp (sUN "a") Placeholder True, pimp (sUN "P") Placeholder True] ++ [pexp t,pexp v]) o- otherPats o@(PConstant _ c) = inventConsts [o] -- return o+ otherPats o@(PConstant _ c) = ph $ inventConsts [o] -- return o otherPats arg = return Placeholder ops fc n xs o@@ -313,7 +329,7 @@ [Partial _] -> case lookupCtxt n (idris_callgraph i) of [cg] -> mapM_ (checkAllCovering fc (n : done) top)- (map fst (calls cg))+ (calls cg) _ -> return () x -> return () -- stop if total checkAllCovering _ _ _ _ = return ()@@ -324,9 +340,9 @@ checkPositive :: [Name] -> (Name, Type) -> Idris Totality checkPositive mut_ns (cn, ty')- = do let ty = delazy' True ty'+ = do i <- getIState+ let ty = delazy' True (normalise (tt_ctxt i) [] ty') let p = cp ty- i <- getIState let tot = if p then Total (args ty) else Partial NotPositive let ctxt' = setTotal cn tot (tt_ctxt i) putIState (i { tt_ctxt = ctxt' })@@ -441,12 +457,18 @@ _ -> [] when (CoveringFn `elem` opts) $ checkAllCovering fc [] n n t <- checkTotality [] fc n+ let acc = case lookupDefAccExact n False (tt_ctxt i) of+ Just (n, a) -> a+ _ -> Public case t of -- if it's not total, it can't reduce, to keep- -- typechecking decidable- p@(Partial _) -> do setAccessibility n Frozen- addIBC (IBCAccess n Frozen)- logCoverage 5 $ "HIDDEN: "+ -- typechecking decidable.+ -- So if it's currently public export, set it as+ -- export instead.+ p@(Partial _) -> do let newacc = max Frozen acc+ setAccessibility n newacc+ addIBC (IBCAccess n newacc)+ logCoverage 5 $ "Set to " ++ show newacc ++ ":" ++ show n ++ show p _ -> return () return t@@ -474,6 +496,7 @@ let newscg = buildSCG' ist (rights pats) args logCoverage 5 $ "SCG is: " ++ show newscg addToCG n ( cg { scg = newscg } )+ _ -> return () -- CG comes from a type declaration only [] -> logCoverage 5 $ "Could not build SCG for " ++ show n ++ "\n" x -> error $ "buildSCG: " ++ show (n, x) @@ -574,7 +597,7 @@ toJust (n, t) = Just t getType n = case lookupTy n (tt_ctxt ist) of- [ty] -> delazy ty -- must exist+ [ty] -> delazy (normalise (tt_ctxt ist) [] ty) -- must exist isInductive (P _ nty _) (P _ nty' _) = let co = case lookupCtxt nty (idris_datatypes ist) of
@@ -199,7 +199,8 @@ opt_optimise opt_printdepth opt_evaltypes- opt_desugarnats) =+ opt_desugarnats+ opt_autoimpls) = rnf opt_logLevel `seq` rnf opt_typecase `seq` rnf opt_typeintype@@ -224,6 +225,7 @@ `seq` rnf opt_printdepth `seq` rnf opt_evaltypes `seq` rnf opt_desugarnats+ `seq` rnf opt_autoimpls `seq` () instance NFData LanguageExt where@@ -365,9 +367,9 @@ rnf _ = () instance NFData CGInfo where- rnf (CGInfo x1 x2 x3 x4 x5)+ rnf (CGInfo x1 x2 x3) = rnf x1 `seq`- rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` ()+ rnf x2 `seq` rnf x3 `seq` () instance NFData Fixity where rnf (Infixl x1) = rnf x1 `seq` ()@@ -466,7 +468,7 @@ rnf x9 `seq` rnf x10 `seq` rnf x11 `seq` rnf x12 `seq` ()- rnf (PInstance x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11)+ rnf (PInstance x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq`@@ -475,7 +477,7 @@ rnf x6 `seq` rnf x7 `seq` rnf x8 `seq`- rnf x9 `seq` rnf x10 `seq` rnf x11 `seq` ()+ rnf x9 `seq` rnf x10 `seq` rnf x11 `seq` rnf x12 `seq` rnf x13 `seq` () rnf (PDSL x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PSyntax x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PMutual x1 x2) = rnf x1 `seq` rnf x2 `seq` ()@@ -696,8 +698,8 @@ rnf (IState x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60- x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74)+ x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` rnf x8 `seq` rnf x9 `seq` rnf x10 `seq` () `seq` rnf x11 `seq` rnf x12 `seq` rnf x13 `seq` rnf x14 `seq` rnf x15 `seq` rnf x16 `seq` rnf x17 `seq` rnf x18 `seq` rnf x19 `seq` rnf x20 `seq` rnf x21 `seq` rnf x22 `seq` rnf x23 `seq` rnf x24 `seq` rnf x25 `seq` rnf x26 `seq` rnf x27 `seq` rnf x28 `seq` rnf x29 `seq` rnf x30 `seq` rnf x31 `seq` rnf x32 `seq` rnf x33 `seq` rnf x34 `seq` rnf x35 `seq` rnf x36 `seq` rnf x37 `seq` rnf x38 `seq` rnf x39 `seq` rnf x40 `seq` rnf x41 `seq` rnf x42 `seq` rnf x43 `seq` rnf x44 `seq` rnf x45 `seq` rnf x46 `seq` rnf x47 `seq` rnf x48 `seq` rnf x49 `seq` rnf x50 `seq` rnf x51 `seq` rnf x52 `seq` rnf x53 `seq` rnf x54 `seq` rnf x55 `seq` rnf x56 `seq` rnf x57 `seq` rnf x58 `seq` rnf x59 `seq` rnf x60 `seq`- rnf x61 `seq` rnf x62 `seq` rnf x63 `seq` rnf x64 `seq` rnf x65 `seq` rnf x66 `seq` rnf x67 `seq` rnf x68 `seq` rnf x69 `seq` rnf x70 `seq` rnf x71 `seq` rnf x72 `seq` rnf x73 `seq` rnf x74 `seq` ()+ rnf x61 `seq` rnf x62 `seq` rnf x63 `seq` rnf x64 `seq` rnf x65 `seq` rnf x66 `seq` rnf x67 `seq` rnf x68 `seq` rnf x69 `seq` rnf x70 `seq` rnf x71 `seq` rnf x72 `seq` rnf x73 `seq` rnf x74 `seq` rnf x75 `seq` ()
@@ -106,7 +106,7 @@ | Just n' <- lookup n env = PRef un [] n' | otherwise = case lookup n (idris_metavars ist) of- Just (Just _, mi, _, _) -> mkMVApp n []+ Just (Just _, mi, _, _, _) -> mkMVApp n [] _ -> PRef un [] n de env _ (Bind n (Lam ty) sc) = PLam un n NoFC (de env [] ty) (de ((n,n):env) [] sc)@@ -172,7 +172,7 @@ = PApp un (de env [] f) (map pexp (map (de env []) args)) deFn env (P _ n _) args | not mvs = case lookup n (idris_metavars ist) of- Just (Just _, mi, _, _) ->+ Just (Just _, mi, _, _, _) -> mkMVApp n (drop mi (map (de env []) args)) _ -> mkPApp n (map (de env []) args) | otherwise = mkPApp n (map (de env []) args)@@ -317,7 +317,7 @@ flagUnique (Bind n b sc) = Bind n (fmap flagUnique b) (flagUnique sc) flagUnique t = t pprintErr' i (CantSolveGoal x env) =- text "Can't solve goal " <>+ text "Can't find a value of type " <> indented (annTm x (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delabSugared i x))) <> if (opt_errContext (idris_options i)) then line <> showSc i env else empty pprintErr' i (UnifyScope n out tm env) =@@ -346,7 +346,13 @@ text "Can't verify injectivity of" <+> annTm p (pprintTerm i (delabSugared i p)) <+> text " when unifying" <+> annTm x (pprintTerm i (delabSugared i x)) <+> text "and" <+> annTm y (pprintTerm i (delabSugared i y))-pprintErr' i (CantResolve _ c) = text "Can't find implementation for" <+> pprintTerm i (delabSugared i c)+pprintErr' i (CantResolve _ c e) + = text "Can't find implementation for" <+> pprintTerm i (delabSugared i c)+ <>+ case e of+ Msg "" -> empty+ _ -> line <> line <> text "Possible cause:" <>+ indented (pprintErr' i e) pprintErr' i (InvalidTCArg n t) = annTm t (pprintTerm i (delabSugared i t)) <+> text " cannot be a parameter of " <> annName n <$>
@@ -21,8 +21,10 @@ addIBC (IBCObj cgn obj) -- just name, search on loading ibc addObjectFile cgn o -directiveAction (DFlag cgn flag) = do addIBC (IBCCGFlag cgn flag)- addFlag cgn flag+directiveAction (DFlag cgn flag) = do+ let flags = words flag+ mapM_ (\f -> addIBC (IBCCGFlag cgn f)) flags+ mapM_ (addFlag cgn) flags directiveAction (DInclude cgn hdr) = do addHdr cgn hdr addIBC (IBCHeader cgn hdr)@@ -68,6 +70,8 @@ = do n' <- disambiguate n addDeprecated n' reason addIBC (IBCDeprecate n' reason)+directiveAction (DAutoImplicits b)+ = setAutoImpls b directiveAction (DUsed fc fn arg) = addUsedName fc fn arg disambiguate :: Name -> Idris Name
@@ -19,7 +19,7 @@ import Data.List import qualified Data.Text as T --- TODO: Only include names with public/abstract accessibility+-- TODO: Only include names with public/export accessibility -- -- Issue #1573 on the Issue tracker. -- https://github.com/idris-lang/Idris-dev/issues/1573@@ -319,8 +319,8 @@ namedInst n@(UN _) = Just n namedInst _ = Nothing - getDInst (PInstance _ _ _ _ _ _ _ _ t _ _) = Just t- getDInst _ = Nothing+ getDInst (PInstance _ _ _ _ _ _ _ _ _ _ t _ _) = Just t+ getDInst _ = Nothing isSubclass (PPi (Constraint _ _) _ _ (PApp _ _ args) (PApp _ (PRef _ _ nm) args')) = nm == n && map getTm args == map getTm args'
@@ -78,6 +78,12 @@ let idecls = filter instdecl ds -- default superclass instance declarations mapM_ checkDefaultSuperclassInstance idecls let mnames = map getMName mdecls+ ist <- getIState+ let constraintNames = nub $ + concatMap (namesIn [] ist) (map snd constraints)++ mapM_ (checkConstraintName (map (\(x, _, _) -> x) ps)) constraintNames+ logElab 1 $ "Building methods " ++ show mnames ims <- mapM (tdecl mnames) mdecls defs <- mapM (defdecl (map (\ (x,y,z) -> z) ims) constraint)@@ -138,7 +144,7 @@ -- TODO: probably should normalise checkDefaultSuperclassInstance :: PDecl -> Idris ()- checkDefaultSuperclassInstance (PInstance _ _ _ fc cs n _ ps _ _ _)+ checkDefaultSuperclassInstance (PInstance _ _ _ fc cs _ _ n _ ps _ _ _) = do when (not $ null cs) . tclift $ tfail (At fc (Msg $ "Default superclass instances can't have constraints.")) i <- getIState@@ -148,6 +154,14 @@ $ tfail (At fc (Msg $ "Default instances must be for a superclass constraint on the containing class.")) return () + checkConstraintName :: [Name] -> Name -> Idris ()+ checkConstraintName bound cname+ | cname `notElem` bound + = tclift $ tfail (At fc (Msg $ "Name " ++ show cname ++ + " is not bound in interface " ++ show tn+ ++ " " ++ showSep " " (map show bound))) + | otherwise = return ()+ impbind :: [(Name, PTerm)] -> PTerm -> PTerm impbind [] x = x impbind ((n, ty): ns) x = PPi impl n NoFC ty (impbind ns x)@@ -184,7 +198,7 @@ tydecl (PTy _ _ _ _ _ _ _ _) = True tydecl _ = False- instdecl (PInstance _ _ _ _ _ _ _ _ _ _ _) = True+ instdecl (PInstance _ _ _ _ _ _ _ _ _ _ _ _ _) = True instdecl _ = False clause (PClauses _ _ _ _) = True clause _ = False
@@ -80,19 +80,21 @@ let atys = map snd (getArgTys fty) cs_elab <- mapM (elabClause info opts) (zip [0..] cs)+ ctxt <- getContext -- pats_raw is the version we'll work with at compile time: -- no simplification or PE let (pats_in, cs_full) = unzip cs_elab- let pats_raw = map (simple_lhs (tt_ctxt ist)) pats_in+ let pats_raw = map (simple_lhs ctxt) pats_in logElab 3 $ "Elaborated patterns:\n" ++ show pats_raw - solveDeferred n+ solveDeferred fc n -- just ensure that the structure exists fmodifyState (ist_optimisation n) id addIBC (IBCOpt n) ist <- getIState+ ctxt <- getContext -- Don't apply rules if this is a partial evaluation definition, -- or we'll make something that just runs itself! let tpats = case specNames opts of@@ -103,7 +105,7 @@ -- RHS pe_tm <- doPartialEval ist tpats let pats_pe = if petrans- then map (simple_lhs (tt_ctxt ist)) pe_tm+ then map (simple_lhs ctxt) pe_tm else pats_raw let tcase = opt_typecase (idris_options ist)@@ -163,9 +165,12 @@ cov <- coverage pmissing <- if cov && not (hasDefault pats_raw)- then do missing <- genClauses fc n (map getLHS pdef) cs_full+ then do -- Generate clauses from the given possible cases+ missing <- genClauses fc n (map getLHS pdef) cs_full -- missing <- genMissing n scargs sc missing' <- filterM (checkPossible info fc True n) missing+ -- Filter out the ones which match one of the+ -- given cases (including impossible ones) let clhs = map getLHS pdef logElab 2 $ "Must be unreachable:\n" ++ showSep "\n" (map showTmImpls missing') ++@@ -183,7 +188,8 @@ -- pdef' is the version that gets compiled for run-time, -- so we start from the partially evaluated version pdef_in' <- applyOpts $ map (\(ns, lhs, rhs) -> (map fst ns, lhs, rhs)) pdef_pe- let pdef' = map (simple_rt (tt_ctxt ist)) pdef_in'+ ctxt <- getContext+ let pdef' = map (simple_rt ctxt) pdef_in' logElab 5 $ "After data structure transformations:\n" ++ show pdef' @@ -241,24 +247,28 @@ ctxt setContext ctxt' addIBC (IBCDef n)+ addDefinedName n setTotality n tot when (not reflect && PEGenerated `notElem` opts) $ do totcheck (fc, n) defer_totcheck (fc, n) when (tot /= Unchecked) $ addIBC (IBCTotal n tot) i <- getIState- case lookupDef n (tt_ctxt i) of+ ctxt <- getContext+ case lookupDef n ctxt of (CaseOp _ _ _ _ _ cd : _) ->- let (scargs, sc) = cases_compiletime cd- (scargs', sc') = cases_runtime cd in- do let calls = findCalls sc' scargs'- let used = findUsedArgs sc' scargs'+ let (scargs, sc) = cases_compiletime cd in+ do let calls = map fst $ findCalls sc scargs -- let scg = buildSCG i sc scargs -- add SCG later, when checking totality- let cg = CGInfo scargs' calls [] used [] -- TODO: remove this, not needed anymore- logElab 2 $ "Called names: " ++ show cg- addToCG n cg- addToCalledG n (nub (map fst calls)) -- plus names in type!+ logElab 2 $ "Called names: " ++ show calls+ -- if the definition is public, make sure+ -- it only uses public names+ nvis <- getFromHideList n+ case nvis of+ Just Public -> mapM_ (checkVisibility fc n Public Public) calls+ _ -> return ()+ addCalls n calls addIBC (IBCCG n) _ -> return () return ()@@ -305,7 +315,6 @@ , (f, args) <- unApply tm = all (isPatVar pvs) args hasDefault _ = False - getLHS (_, l, _) = l simple_lhs ctxt (Right (x, y)) = Right (normalise ctxt [] x, y)@@ -353,11 +362,12 @@ mkSpecialised :: (Name, [(PEArgType, Term)]) -> Idris [(Term, Term)] mkSpecialised specapp_in = do ist <- getIState+ ctxt <- getContext let (specTy, specapp) = getSpecTy ist specapp_in let (n, newnm, specdecl) = getSpecClause ist specapp let lhs = pe_app specdecl let rhs = pe_def specdecl- let undef = case lookupDefExact newnm (tt_ctxt ist) of+ let undef = case lookupDefExact newnm ctxt of Nothing -> True _ -> False logElab 5 $ show (newnm, undef, map (concreteArg ist) (snd specapp))@@ -370,7 +380,7 @@ let cgns' = filter (\x -> x /= n && notStatic ist x) cgns -- set small reduction limit on partial/productive things- let maxred = case lookupTotal n (tt_ctxt ist) of+ let maxred = case lookupTotal n ctxt of [Total _] -> 65536 [Productive] -> 16 _ -> 1@@ -485,7 +495,7 @@ processTacticDecls info newDecls sendHighlighting highlights let lhs_tm = orderPats (getInferTerm lhs')- case recheck ctxt [] (forget lhs_tm) lhs_tm of+ case recheck ctxt' [] (forget lhs_tm) lhs_tm of OK _ -> return True err -> return False -- if it's a recoverable error, the case may become possible@@ -558,7 +568,7 @@ (Msg "unexpected patterns outside of \"with\" block"))) -- get the parameters first, to pass through to any where block- let fn_ty = case lookupTy fname (tt_ctxt i) of+ let fn_ty = case lookupTy fname ctxt of [t] -> t _ -> error "Can't happen (elabClause function type)" let fn_is = case lookupCtxt fname (idris_implicits i) of@@ -573,7 +583,7 @@ -- let lhs = mkLHSapp $ -- propagateParams i params fn_ty (addImplPat i lhs_in) logElab 10 (show (params, fn_ty) ++ " " ++ showTmImpls (addImplPat i lhs_in))- logElab 5 ("LHS: " ++ show fc ++ " " ++ showTmImpls lhs)+ logElab 5 ("LHS: " ++ show opts ++ "\n" ++ show fc ++ " " ++ showTmImpls lhs) logElab 4 ("Fixed parameters: " ++ show params ++ " from " ++ show lhs_in ++ "\n" ++ show (fn_ty, fn_is)) @@ -602,6 +612,7 @@ -- If we're inferring metavariables in the type, don't recheck, -- because we're only doing this to try to work out those metavariables+ ctxt <- getContext (clhs_c, clhsty) <- if not inf then recheckC_borrowing False (PEGenerated `notElem` opts) [] fc id [] lhs_tm@@ -627,6 +638,8 @@ logElab 5 ("Checked " ++ show clhs ++ "\n" ++ show clhsty) -- Elaborate where block ist <- getIState+ ctxt <- getContext+ windex <- getName let decls = nub (concatMap declared whereblock) let defs = nub (decls ++ concatMap defined whereblock)@@ -635,7 +648,7 @@ -- Unique arguments must be passed to the where block explicitly -- (since we can't control "usage" easlily otherwise). Remove them -- from newargs here- let uniqargs = findUnique (tt_ctxt ist) [] lhs_tm+ let uniqargs = findUnique ctxt [] lhs_tm let newargs = filter (\(n,_) -> n `notElem` uniqargs) newargs_all let winfo = (pinfo info newargs defs windex) { elabFC = Just fc }@@ -657,7 +670,7 @@ logElab 2 $ "RHS: " ++ show (map fst newargs_all) ++ " " ++ showTmImpls rhs ctxt <- getContext -- new context with where block added logElab 5 "STARTING CHECK"- ((rhs', defer, is, probs, ctxt', newDecls, highlights), _) <-+ ((rhs', defer, holes, is, probs, ctxt', newDecls, highlights), _) <- tclift $ elaborate ctxt (idris_datatypes i) (sMN 0 "patRHS") clhsty initEState (do pbinds ist lhs_tm -- proof search can use explicitly written names@@ -674,7 +687,8 @@ let (tm, ds) = runState (collectDeferred (Just fname) (map fst $ case_decls aux) ctxt tt) [] probs <- get_probs- return (tm, ds, is, probs, ctxt', newDecls, highlights))+ hs <- get_holes+ return (tm, ds, hs, is, probs, ctxt', newDecls, highlights)) setContext ctxt' processTacticDecls info newDecls sendHighlighting highlights@@ -685,9 +699,12 @@ logElab 4 $ "---> " ++ show rhs' when (not (null defer)) $ logElab 1 $ "DEFERRED " ++ show (map (\ (n, (_,_,t,_)) -> (n, t)) defer)- def' <- checkDef fc (\n -> Elaborating "deferred type of " n Nothing) defer- let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def'++ -- If there's holes, set the metavariables as undefinable+ def' <- checkDef fc (\n -> Elaborating "deferred type of " n Nothing) (null holes) defer+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False, null holes))) def' addDeferred def''+ mapM_ (\(n, _) -> addIBC (IBCDef n)) def'' when (not (null def')) $ do@@ -703,11 +720,23 @@ logElab 5 $ "Rechecking" logElab 6 $ " ==> " ++ show (forget rhs') - (crhs, crhsty) <- if not inf- then recheckC_borrowing True (PEGenerated `notElem` opts)- borrowed fc id [] rhs'- else return (rhs', clhsty)+ (crhs, crhsty) -- if there's holes && deferred things, it's okay+ -- but we'll need to freeze the definition and not+ -- allow the deferred things to be definable+ -- (this is just to allow users to inspect intermediate+ -- things)+ <- if (null holes || null def') && not inf + then recheckC_borrowing True (PEGenerated `notElem` opts)+ borrowed fc id [] rhs'+ else return (rhs', clhsty)+ logElab 6 $ " ==> " ++ showEnvDbg [] crhsty ++ " against " ++ showEnvDbg [] clhsty++ -- If there's holes, make sure this definition is frozen+ when (not (null holes)) $ do+ logElab 5 $ "Making " ++ show fname ++ " frozen due to " ++ show holes+ setAccessibility fname Frozen+ ctxt <- getContext let constv = next_tvar ctxt case LState.runStateT (convertsC ctxt [] crhsty clhsty) (constv, []) of@@ -798,7 +827,7 @@ -- pattern bindings i <- getIState -- get the parameters first, to pass through to any where block- let fn_ty = case lookupTy fname (tt_ctxt i) of+ let fn_ty = case lookupTy fname ctxt of [t] -> t _ -> error "Can't happen (elabClause function type)" let fn_is = case lookupCtxt fname (idris_implicits i) of@@ -819,6 +848,7 @@ processTacticDecls info newDecls sendHighlighting highlights + ctxt <- getContext let lhs_tm = orderPats (getInferTerm lhs') let lhs_ty = getInferType lhs' let ret_ty = getRetTy (explicitNames (normalise ctxt [] lhs_ty))@@ -847,11 +877,13 @@ processTacticDecls info newDecls sendHighlighting highlights - def' <- checkDef fc iderr defer- let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def'+ def' <- checkDef fc iderr True defer+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False, True))) def' addDeferred def'' mapM_ (elabCaseBlock info opts) is logElab 5 ("Checked wval " ++ show wval')++ ctxt <- getContext (cwval, cwvalty) <- recheckC fc id [] (getInferTerm wval') let cwvaltyN = explicitNames (normalise ctxt [] cwvalty) let cwvalN = explicitNames (normalise ctxt [] cwval)@@ -910,8 +942,8 @@ addIBC (IBCImp wname) addIBC (IBCStatic wname) - def' <- checkDef fc iderr [(wname, (-1, Nothing, wtype, []))]- let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def'+ def' <- checkDef fc iderr True [(wname, (-1, Nothing, wtype, []))]+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False, True))) def' addDeferred def'' -- in the subdecls, lhs becomes:@@ -951,8 +983,8 @@ processTacticDecls info newDecls sendHighlighting highlights - def' <- checkDef fc iderr defer- let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def'+ def' <- checkDef fc iderr True defer+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False, True))) def' addDeferred def'' mapM_ (elabCaseBlock info opts) is logElab 5 ("Checked RHS " ++ show rhs')
@@ -60,7 +60,7 @@ = do let codata = Codata `elem` opts logElab 1 (show (fc, doc)) checkUndefined fc n- when (implicitable n) $ warnLC fc n+ when (implicitable (nsroot n)) $ warnLC fc n (cty, _, t, inacc) <- buildType info syn fc [] n t_in addIBC (IBCDef n)@@ -71,7 +71,7 @@ = do let codata = Codata `elem` opts logElab 1 (show fc) undef <- isUndefined fc n- when (implicitable n) $ warnLC fc n+ when (implicitable (nsroot n)) $ warnLC fc n (cty, ckind, t, inacc) <- buildType info syn fc [] n t_in -- if n is defined already, make sure it is just a type declaration -- with the same type we've just elaborated, and no constructors@@ -231,7 +231,7 @@ Idris (Name, Type) elabCon info syn tn codata expkind dkind (doc, argDocs, n, nfc, t_in, fc, forcenames) = do checkUndefined fc n- when (implicitable n) $ warnLC fc n+ when (implicitable (nsroot n)) $ warnLC fc n logElab 2 $ show fc ++ ":Constructor " ++ show n ++ " : " ++ show t_in (cty, ckind, t, inacc) <- buildType info syn fc [Constructor] n (if codata then mkLazy t_in else t_in) ctxt <- getContext@@ -244,7 +244,7 @@ logElab 5 $ show fc ++ ":Constructor " ++ show n ++ " elaborated : " ++ show t logElab 5 $ "Inaccessible args: " ++ show inacc- logElab 2 $ "---> " ++ show n ++ " : " ++ show cty'+ logElab 2 $ "---> " ++ show n ++ " : " ++ show cty -- Add to the context (this is temporary, so that later constructors -- can be indexed by it)@@ -259,9 +259,14 @@ addIBC (IBCDoc n) fputState (opt_inaccessible . ist_optimisation n) inacc addIBC (IBCOpt n)- return (n, cty')+ return (n, cty) where- tyIs con (Bind n b sc) = tyIs con sc+ tyIs con (Bind n b sc) = tyIs con (substV (P Bound n Erased) sc)+ tyIs con t | (P Bound n' _, _) <- unApply t+ = if n' /= tn then + tclift $ tfail (At fc (Elaborating "constructor " con Nothing + (Msg ("Type level variable " ++ show n' ++ " is not " ++ show tn))))+ else return () tyIs con t | (P _ n' _, _) <- unApply t = if n' /= tn then tclift $ tfail (At fc (Elaborating "constructor " con Nothing (Msg (show n' ++ " is not " ++ show tn)))) else return ()@@ -350,7 +355,7 @@ (ierror . Elaborating "type declaration of " elimDeclName Nothing) -- Do not elaborate clauses if there aren't any case eliminatorClauses of- [] -> State.lift $ solveDeferred elimDeclName -- Remove meta-variable for type+ [] -> State.lift $ solveDeferred emptyFC elimDeclName -- Remove meta-variable for type _ -> State.lift $ idrisCatch (rec_elabDecl info EAll info eliminatorDef) (ierror . Elaborating "clauses of " elimDeclName Nothing) where elimLog :: String -> EliminatorState ()
@@ -55,28 +55,35 @@ [(Name, Docstring (Either Err PTerm))] -> ElabWhat -> -- phase FC -> [(Name, PTerm)] -> -- constraints+ Accessibility ->+ FnOpts -> Name -> -- the class FC -> -- precise location of class name [PTerm] -> -- class parameters (i.e. instance) PTerm -> -- full instance type Maybe Name -> -- explicit name [PDecl] -> Idris ()-elabInstance info syn doc argDocs what fc cs n nfc ps t expn ds = do- i <- getIState- (n, ci) <- case lookupCtxtName n (idris_classes i) of+elabInstance info syn doc argDocs what fc cs acc opts n nfc ps t expn ds = do+ ist <- getIState+ (n, ci) <- case lookupCtxtName n (idris_classes ist) of [c] -> return c [] -> ifail $ show fc ++ ":" ++ show n ++ " is not a type class" cs -> tclift $ tfail $ At fc (CantResolveAlts (map fst cs)) let constraint = PApp fc (PRef fc [] n) (map pexp ps) let iname = mkiname n (namespace info) ps expn+ putIState (ist { hide_list = addDef iname acc (hide_list ist) })+ ist <- getIState++ let totopts = Dictionary : opts+ let emptyclass = null (class_methods ci) when (what /= EDefns) $ do- nty <- elabType' True info syn doc argDocs fc [] iname NoFC t+ nty <- elabType' True info syn doc argDocs fc totopts iname NoFC t -- if the instance type matches any of the instances we have already, -- and it's not a named instance, then it's overlapping, so report an error case expn of- Nothing -> do mapM_ (maybe (return ()) overlapping . findOverlapping i (class_determiners ci) (delab i nty))+ Nothing -> do mapM_ (maybe (return ()) overlapping . findOverlapping ist (class_determiners ci) (delab ist nty)) (map fst $ class_instances ci) addInstance intInst True n iname Just _ -> addInstance intInst False n iname@@ -95,7 +102,7 @@ let pnames = nub $ map pname (concat (nub wparams)) ++ concatMap (namesIn [] ist) ps let superclassInstances = map (substInstance ips pnames) (class_default_superclasses ci)- undefinedSuperclassInstances <- filterM (fmap not . isOverlapping i) superclassInstances+ undefinedSuperclassInstances <- filterM (fmap not . isOverlapping ist) superclassInstances mapM_ (rec_elabDecl info EAll info) undefinedSuperclassInstances let all_meths = map (nsroot . fst) (class_methods ci) let mtys = map (\ (n, (op, t)) ->@@ -108,7 +115,7 @@ (class_methods ci) logElab 3 (show (mtys, ips)) logElab 5 ("Before defaults: " ++ show ds ++ "\n" ++ show (map fst (class_methods ci)))- let ds_defs = insertDefaults i iname (class_defaults ci) ns ds+ let ds_defs = insertDefaults ist iname (class_defaults ci) ns ds logElab 3 ("After defaults: " ++ show ds_defs ++ "\n") let ds' = reorderDefs (map fst (class_methods ci)) $ ds_defs logElab 1 ("Reordered: " ++ show ds' ++ "\n")@@ -134,10 +141,10 @@ let rhs = PApp fc (PRef fc [] (instanceCtorName ci)) (map (pexp . mkMethApp) mtys) - logElab 5 $ "Instance LHS " ++ show lhs ++ " " ++ show headVars+ logElab 5 $ "Instance LHS " ++ show totopts ++ "\n" ++ show lhs ++ " " ++ show headVars logElab 5 $ "Instance RHS " ++ show rhs - let idecls = [PClauses fc [Dictionary] iname+ let idecls = [PClauses fc totopts iname [PClause fc iname lhs [] rhs wb]] logElab 1 (show idecls) push_estack iname True@@ -159,10 +166,10 @@ Just m -> sNS (SN (sInstanceN n' (map show ps'))) m Just nm -> nm - substInstance ips pnames (PInstance doc argDocs syn _ cs n nfc ps t expn ds)- = PInstance doc argDocs syn fc cs n nfc (map (substMatchesShadow ips pnames) ps) (substMatchesShadow ips pnames t) expn ds+ substInstance ips pnames (PInstance doc argDocs syn _ cs acc opts n nfc ps t expn ds)+ = PInstance doc argDocs syn fc cs acc opts n nfc (map (substMatchesShadow ips pnames) ps) (substMatchesShadow ips pnames t) expn ds - isOverlapping i (PInstance doc argDocs syn _ _ n nfc ps t expn _)+ isOverlapping i (PInstance doc argDocs syn _ _ _ _ n nfc ps t expn _) = case lookupCtxtName n (idris_classes i) of [(n, ci)] -> let iname = (mkiname n (namespace info) ps expn) in case lookupTy iname (tt_ctxt i) of
@@ -0,0 +1,173 @@+module Idris.Elab.Quasiquote (extractUnquotes) where++import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.TT+import Idris.AbsSyntax+++extract1 :: Int -> (PTerm -> a) -> PTerm -> Elab' aux (a, [(Name, PTerm)])+extract1 n c tm = do (tm', ex) <- extractUnquotes n tm+ return (c tm', ex)++extract2 :: Int -> (PTerm -> PTerm -> a) -> PTerm -> PTerm -> Elab' aux (a, [(Name, PTerm)])+extract2 n c a b = do (a', ex1) <- extractUnquotes n a+ (b', ex2) <- extractUnquotes n b+ return (c a' b', ex1 ++ ex2)++extractTUnquotes :: Int -> PTactic -> Elab' aux (PTactic, [(Name, PTerm)])+extractTUnquotes n (Rewrite t) = extract1 n Rewrite t+extractTUnquotes n (Induction t) = extract1 n Induction t+extractTUnquotes n (LetTac name t) = extract1 n (LetTac name) t+extractTUnquotes n (LetTacTy name t1 t2) = extract2 n (LetTacTy name) t1 t2+extractTUnquotes n (Exact tm) = extract1 n Exact tm+extractTUnquotes n (Try tac1 tac2)+ = do (tac1', ex1) <- extractTUnquotes n tac1+ (tac2', ex2) <- extractTUnquotes n tac2+ return (Try tac1' tac2', ex1 ++ ex2)+extractTUnquotes n (TSeq tac1 tac2)+ = do (tac1', ex1) <- extractTUnquotes n tac1+ (tac2', ex2) <- extractTUnquotes n tac2+ return (TSeq tac1' tac2', ex1 ++ ex2)+extractTUnquotes n (ApplyTactic t) = extract1 n ApplyTactic t+extractTUnquotes n (ByReflection t) = extract1 n ByReflection t+extractTUnquotes n (Reflect t) = extract1 n Reflect t+extractTUnquotes n (GoalType s tac)+ = do (tac', ex) <- extractTUnquotes n tac+ return (GoalType s tac', ex)+extractTUnquotes n (TCheck t) = extract1 n TCheck t+extractTUnquotes n (TEval t) = extract1 n TEval t+extractTUnquotes n (Claim name t) = extract1 n (Claim name) t+extractTUnquotes n tac = return (tac, []) -- the rest don't contain PTerms, or have been desugared away++extractPArgUnquotes :: Int -> PArg -> Elab' aux (PArg, [(Name, PTerm)])+extractPArgUnquotes d (PImp p m opts n t) =+ do (t', ex) <- extractUnquotes d t+ return (PImp p m opts n t', ex)+extractPArgUnquotes d (PExp p opts n t) =+ do (t', ex) <- extractUnquotes d t+ return (PExp p opts n t', ex)+extractPArgUnquotes d (PConstraint p opts n t) =+ do (t', ex) <- extractUnquotes d t+ return (PConstraint p opts n t', ex)+extractPArgUnquotes d (PTacImplicit p opts n scpt t) =+ do (scpt', ex1) <- extractUnquotes d scpt+ (t', ex2) <- extractUnquotes d t+ return (PTacImplicit p opts n scpt' t', ex1 ++ ex2)++extractDoUnquotes :: Int -> PDo -> Elab' aux (PDo, [(Name, PTerm)])+extractDoUnquotes d (DoExp fc tm)+ = do (tm', ex) <- extractUnquotes d tm+ return (DoExp fc tm', ex)+extractDoUnquotes d (DoBind fc n nfc tm)+ = do (tm', ex) <- extractUnquotes d tm+ return (DoBind fc n nfc tm', ex)+extractDoUnquotes d (DoBindP fc t t' alts)+ = fail "Pattern-matching binds cannot be quasiquoted"+extractDoUnquotes d (DoLet fc n nfc v b)+ = do (v', ex1) <- extractUnquotes d v+ (b', ex2) <- extractUnquotes d b+ return (DoLet fc n nfc v' b', ex1 ++ ex2)+extractDoUnquotes d (DoLetP fc t t') = fail "Pattern-matching lets cannot be quasiquoted"+++extractUnquotes :: Int -> PTerm -> Elab' aux (PTerm, [(Name, PTerm)])+extractUnquotes n (PLam fc name nfc ty body)+ = do (ty', ex1) <- extractUnquotes n ty+ (body', ex2) <- extractUnquotes n body+ return (PLam fc name nfc ty' body', ex1 ++ ex2)+extractUnquotes n (PPi plicity name fc ty body)+ = do (ty', ex1) <- extractUnquotes n ty+ (body', ex2) <- extractUnquotes n body+ return (PPi plicity name fc ty' body', ex1 ++ ex2)+extractUnquotes n (PLet fc name nfc ty val body)+ = do (ty', ex1) <- extractUnquotes n ty+ (val', ex2) <- extractUnquotes n val+ (body', ex3) <- extractUnquotes n body+ return (PLet fc name nfc ty' val' body', ex1 ++ ex2 ++ ex3)+extractUnquotes n (PTyped tm ty)+ = do (tm', ex1) <- extractUnquotes n tm+ (ty', ex2) <- extractUnquotes n ty+ return (PTyped tm' ty', ex1 ++ ex2)+extractUnquotes n (PApp fc f args)+ = do (f', ex1) <- extractUnquotes n f+ args' <- mapM (extractPArgUnquotes n) args+ let (args'', exs) = unzip args'+ return (PApp fc f' args'', ex1 ++ concat exs)+extractUnquotes n (PAppBind fc f args)+ = do (f', ex1) <- extractUnquotes n f+ args' <- mapM (extractPArgUnquotes n) args+ let (args'', exs) = unzip args'+ return (PAppBind fc f' args'', ex1 ++ concat exs)+extractUnquotes n (PCase fc expr cases)+ = do (expr', ex1) <- extractUnquotes n expr+ let (pats, rhss) = unzip cases+ (pats', exs1) <- fmap unzip $ mapM (extractUnquotes n) pats+ (rhss', exs2) <- fmap unzip $ mapM (extractUnquotes n) rhss+ return (PCase fc expr' (zip pats' rhss'), ex1 ++ concat exs1 ++ concat exs2)+extractUnquotes n (PIfThenElse fc c t f)+ = do (c', ex1) <- extractUnquotes n c+ (t', ex2) <- extractUnquotes n t+ (f', ex3) <- extractUnquotes n f+ return (PIfThenElse fc c' t' f', ex1 ++ ex2 ++ ex3)+extractUnquotes n (PRewrite fc x y z)+ = do (x', ex1) <- extractUnquotes n x+ (y', ex2) <- extractUnquotes n y+ case z of+ Just zz -> do (z', ex3) <- extractUnquotes n zz+ return (PRewrite fc x' y' (Just z'), ex1 ++ ex2 ++ ex3)+ Nothing -> return (PRewrite fc x' y' Nothing, ex1 ++ ex2)+extractUnquotes n (PPair fc hls info l r)+ = do (l', ex1) <- extractUnquotes n l+ (r', ex2) <- extractUnquotes n r+ return (PPair fc hls info l' r', ex1 ++ ex2)+extractUnquotes n (PDPair fc hls info a b c)+ = do (a', ex1) <- extractUnquotes n a+ (b', ex2) <- extractUnquotes n b+ (c', ex3) <- extractUnquotes n c+ return (PDPair fc hls info a' b' c', ex1 ++ ex2 ++ ex3)+extractUnquotes n (PAlternative ms b alts)+ = do alts' <- mapM (extractUnquotes n) alts+ let (alts'', exs) = unzip alts'+ return (PAlternative ms b alts'', concat exs)+extractUnquotes n (PHidden tm)+ = do (tm', ex) <- extractUnquotes n tm+ return (PHidden tm', ex)+extractUnquotes n (PGoal fc a name b)+ = do (a', ex1) <- extractUnquotes n a+ (b', ex2) <- extractUnquotes n b+ return (PGoal fc a' name b', ex1 ++ ex2)+extractUnquotes n (PDoBlock steps)+ = do steps' <- mapM (extractDoUnquotes n) steps+ let (steps'', exs) = unzip steps'+ return (PDoBlock steps'', concat exs)+extractUnquotes n (PIdiom fc tm)+ = fmap (\(tm', ex) -> (PIdiom fc tm', ex)) $ extractUnquotes n tm+extractUnquotes n (PProof tacs)+ = do (tacs', exs) <- fmap unzip $ mapM (extractTUnquotes n) tacs+ return (PProof tacs', concat exs)+extractUnquotes n (PTactics tacs)+ = do (tacs', exs) <- fmap unzip $ mapM (extractTUnquotes n) tacs+ return (PTactics tacs', concat exs)+extractUnquotes n (PElabError err) = fail "Can't quasiquote an error"+extractUnquotes n (PCoerced tm)+ = do (tm', ex) <- extractUnquotes n tm+ return (PCoerced tm', ex)+extractUnquotes n (PDisamb ns tm)+ = do (tm', ex) <- extractUnquotes n tm+ return (PDisamb ns tm', ex)+extractUnquotes n (PUnifyLog tm)+ = fmap (\(tm', ex) -> (PUnifyLog tm', ex)) $ extractUnquotes n tm+extractUnquotes n (PNoImplicits tm)+ = fmap (\(tm', ex) -> (PNoImplicits tm', ex)) $ extractUnquotes n tm+extractUnquotes n (PQuasiquote tm goal)+ = fmap (\(tm', ex) -> (PQuasiquote tm' goal, ex)) $ extractUnquotes (n+1) tm+extractUnquotes n (PUnquote tm)+ | n == 0 = do n <- getNameFrom (sMN 0 "unquotation")+ return (PRef (fileFC "(unquote)") [] n, [(n, tm)])+ | otherwise = fmap (\(tm', ex) -> (PUnquote tm', ex)) $+ extractUnquotes (n-1) tm+extractUnquotes n (PRunElab fc tm ns)+ = fmap (\(tm', ex) -> (PRunElab fc tm' ns, ex)) $ extractUnquotes n tm+extractUnquotes n (PConstSugar fc tm)+ = extractUnquotes n tm+extractUnquotes n x = return (x, []) -- no subterms!
@@ -17,7 +17,7 @@ import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting) import IRTS.Lang -import Idris.ParseExpr (tryFullExpr)+import Idris.Parser.Expr (tryFullExpr) import Idris.Elab.Type import Idris.Elab.Data
@@ -20,7 +20,7 @@ import Idris.Core.WHNF (whnf) import Idris.Coverage (buildSCG, checkDeclTotality, genClauses, recoverableCoverage, validCoverageCase) import Idris.ErrReverse (errReverse)-import Idris.ElabQuasiquote (extractUnquotes)+import Idris.Elab.Quasiquote (extractUnquotes) import Idris.Elab.Utils import Idris.Reflection import qualified Util.Pretty as U@@ -236,6 +236,7 @@ pattern = emode == ELHS intransform = emode == ETransLHS bindfree = emode == ETyDecl || emode == ELHS || emode == ETransLHS+ autoimpls = opt_autoimpls (idris_options ist) get_delayed_elab est = let ds = delayed_elab est in@@ -614,7 +615,8 @@ [] -> False _ -> True bindable (NS _ _) = False- bindable n = implicitable n+ bindable (MN _ _) = True+ bindable n = implicitable n && autoimpls elab' ina _ f@(PInferRef fc hls n) = elab' ina (Just fc) (PApp NoFC f []) elab' ina fc' tm@(PRef fc hls n) | pattern && not reflection && not (e_qq ina) && not (e_intype ina)@@ -1702,8 +1704,8 @@ -- Return true if the given error suggests a type class failure is -- recoverable tcRecoverable :: ElabMode -> Err -> Bool-tcRecoverable ERHS (CantResolve f g) = f-tcRecoverable ETyDecl (CantResolve f g) = f+tcRecoverable ERHS (CantResolve f g _) = f+tcRecoverable ETyDecl (CantResolve f g _) = f tcRecoverable e (ElaboratingArg _ _ _ err) = tcRecoverable e err tcRecoverable e (At _ err) = tcRecoverable e err tcRecoverable _ _ = True@@ -2476,8 +2478,10 @@ OK hs -> return hs -- Normalize error handler terms to produce the new messages+ -- Need to use 'normaliseAll' since we have to reduce private+ -- names in error handlers too ctxt <- getContext- let results = map (normalise ctxt []) (map fst handlers)+ let results = map (normaliseAll ctxt []) (map fst handlers) logElab 3 $ "New error message info: " ++ concat (intersperse " and " (map show results)) -- For each handler term output, either discard it if it is Nothing or reify it the Haskell equivalent@@ -2504,7 +2508,7 @@ updateIState $ \i -> i { idris_implicits = addDef n impls (idris_implicits i) } addIBC (IBCImp n)- ds <- checkDef fc (\_ e -> e) [(n, (-1, Nothing, ty, []))]+ ds <- checkDef fc (\_ e -> e) True [(n, (-1, Nothing, ty, []))] addIBC (IBCDef n) ctxt <- getContext case lookupDef n ctxt of@@ -2513,7 +2517,7 @@ -- then it must be added as a metavariable. This needs guarding -- to prevent overwriting case defs with a metavar, if the case -- defs come after the type decl in the same script!- let ds' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, True))) ds+ let ds' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, True, True))) ds in addDeferred ds' _ -> return () RAddInstance className instName ->@@ -2524,7 +2528,7 @@ addIBC (IBCInstance False True className instName) RClausesInstrs n cs -> do logElab 3 $ "Pattern-matching definition from tactics: " ++ show n- solveDeferred n+ solveDeferred emptyFC n let lhss = map (\(_, lhs, _) -> lhs) cs let fc = fileFC "elab_reflected" pmissing <-@@ -2549,13 +2553,9 @@ -- we refer to, so that if they aren't total, the whole -- thing won't be. let (scargs, sc) = cases_compiletime cd- (scargs', sc') = cases_runtime cd- calls = findCalls sc' scargs- used = findUsedArgs sc' scargs'- cg = CGInfo scargs' calls [] used []- in do logElab 2 $ "Called names in reflected elab: " ++ show cg- addToCG n cg- addToCalledG n (nub (map fst calls))+ calls = map fst $ findCalls sc scargs+ in do logElab 2 $ "Called names in reflected elab: " ++ show calls+ addCalls n calls addIBC $ IBCCG n Just _ -> return () -- TODO throw internal error Nothing -> return ()
@@ -78,7 +78,7 @@ logElab 3 $ show ty ++ "\nElaborated: " ++ show tyT' - ds <- checkAddDef True False fc iderr defer+ ds <- checkAddDef True False fc iderr True defer -- if the type is not complete, note that we'll need to infer -- things later (for solving metavariables) when (length ds > length is) -- more deferred than case blocks@@ -102,6 +102,18 @@ logElab 3 ("Implicit " ++ show n ++ " " ++ show impls) addIBC (IBCImp n) + -- Add the names referenced to the call graph, and check we're not+ -- referring to anything less visible+ -- In particular, a public/export type can not refer to anything + -- private, but can refer to any public/export+ let refs = freeNames cty+ nvis <- getFromHideList n+ case nvis of+ Nothing -> return ()+ Just acc -> mapM_ (checkVisibility fc n (max Frozen acc) acc) refs+ addCalls n refs+ addIBC (IBCCG n)+ when (Constructor `notElem` opts) $ do let pnames = getParamsInType i [] impls cty let fninfo = FnInfo (param_pos 0 pnames cty)@@ -161,9 +173,10 @@ -- Productivity checking now via checking for guarded 'Delay' let opts' = opts -- if corec then (Coinductive : opts) else opts let usety = if norm then nty' else nty- ds <- checkDef fc iderr [(n, (-1, Nothing, usety, []))]+ ds <- checkDef fc iderr True [(n, (-1, Nothing, usety, []))] addIBC (IBCDef n)- let ds' = map (\(n, (i, top, fam, ns)) -> (n, (i, top, fam, ns, True))) ds+ addDefinedName n+ let ds' = map (\(n, (i, top, fam, ns)) -> (n, (i, top, fam, ns, True, True))) ds addDeferred ds' setFlags n opts' checkDocs fc argDocs ty@@ -242,7 +255,7 @@ sendHighlighting [(nfc, AnnName n (Just PostulateOutput) Nothing Nothing)] -- remove it from the deferred definitions list- solveDeferred n+ solveDeferred fc n elabExtern :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> FC -> FnOpts -> Name -> PTerm -> Idris ()@@ -255,4 +268,4 @@ addIBC (IBCExtern (n, arity)) -- remove it from the deferred definitions list- solveDeferred n+ solveDeferred fc n
@@ -56,21 +56,23 @@ iderr :: Name -> Err -> Err iderr _ e = e -checkDef :: FC -> (Name -> Err -> Err) -> [(Name, (Int, Maybe Name, Type, [Name]))]- -> Idris [(Name, (Int, Maybe Name, Type, [Name]))]-checkDef fc mkerr ns = checkAddDef False True fc mkerr ns+checkDef :: FC -> (Name -> Err -> Err) -> Bool ->+ [(Name, (Int, Maybe Name, Type, [Name]))] ->+ Idris [(Name, (Int, Maybe Name, Type, [Name]))]+checkDef fc mkerr definable ns+ = checkAddDef False True fc mkerr definable ns -checkAddDef :: Bool -> Bool -> FC -> (Name -> Err -> Err)+checkAddDef :: Bool -> Bool -> FC -> (Name -> Err -> Err) -> Bool -> [(Name, (Int, Maybe Name, Type, [Name]))] -> Idris [(Name, (Int, Maybe Name, Type, [Name]))]-checkAddDef add toplvl fc mkerr [] = return []-checkAddDef add toplvl fc mkerr ((n, (i, top, t, psns)) : ns)+checkAddDef add toplvl fc mkerr def [] = return []+checkAddDef add toplvl fc mkerr definable ((n, (i, top, t, psns)) : ns) = do ctxt <- getContext- logElab 5 $ "Rechecking deferred name " ++ show (n, t)+ logElab 5 $ "Rechecking deferred name " ++ show (n, t, definable) (t', _) <- recheckC fc (mkerr n) [] t- when add $ do addDeferred [(n, (i, top, t, psns, toplvl))]+ when add $ do addDeferred [(n, (i, top, t, psns, toplvl, definable))] addIBC (IBCDef n)- ns' <- checkAddDef add toplvl fc mkerr ns+ ns' <- checkAddDef add toplvl fc mkerr definable ns return ((n, (i, top, t', psns)) : ns') -- | Get the list of (index, name) of inaccessible arguments from an elaborated@@ -314,3 +316,19 @@ | n `elem` ns = PPi (p { pstatic = Static }) n fc ty (mkStaticTy ns sc) | otherwise = PPi p n fc ty (mkStaticTy ns sc) mkStaticTy ns t = t++-- Check that a name has the minimum required accessibility+checkVisibility :: FC -> Name -> Accessibility -> Accessibility -> Name -> Idris ()+checkVisibility fc n minAcc acc ref + = do nvis <- getFromHideList ref+ case nvis of+ Nothing -> return ()+ Just acc' -> if acc' > minAcc + then tclift $ tfail (At fc + (Msg $ show acc ++ " " ++ show n ++ + " can't refer to " ++ + show acc' ++ " " ++ show ref))+ else return ()+++
@@ -75,8 +75,8 @@ let vtm = orderPats (getInferTerm tm') - def' <- checkDef (fileFC "(input)") iderr defer- let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, True))) def'+ def' <- checkDef (fileFC "(input)") iderr True defer+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, True, True))) def' addDeferred def'' mapM_ (elabCaseBlock info []) is
@@ -242,9 +242,9 @@ | what /= EDefns = do logElab 1 $ "Elaborating class " ++ show n elabClass info (s { syn_params = [] }) doc f cs n nfc ps pdocs fds ds cn cd-elabDecl' what info (PInstance doc argDocs s f cs n nfc ps t expn ds)+elabDecl' what info (PInstance doc argDocs s f cs acc fnopts n nfc ps t expn ds) = do logElab 1 $ "Elaborating instance " ++ show n- elabInstance info s doc argDocs what f cs n nfc ps t expn ds+ elabInstance info s doc argDocs what f cs acc fnopts n nfc ps t expn ds elabDecl' what info (PRecord doc rsyn fc opts name nfc ps pdocs fs cname cdoc csyn) = do logElab 1 $ "Elaborating record " ++ show name elabRecord info what doc rsyn fc opts name nfc ps pdocs fs cname cdoc csyn
@@ -1,175 +0,0 @@-module Idris.ElabQuasiquote (extractUnquotes) where--import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.TT-import Idris.AbsSyntax---extract1 :: Int -> (PTerm -> a) -> PTerm -> Elab' aux (a, [(Name, PTerm)])-extract1 n c tm = do (tm', ex) <- extractUnquotes n tm- return (c tm', ex)--extract2 :: Int -> (PTerm -> PTerm -> a) -> PTerm -> PTerm -> Elab' aux (a, [(Name, PTerm)])-extract2 n c a b = do (a', ex1) <- extractUnquotes n a- (b', ex2) <- extractUnquotes n b- return (c a' b', ex1 ++ ex2)--extractTUnquotes :: Int -> PTactic -> Elab' aux (PTactic, [(Name, PTerm)])-extractTUnquotes n (Rewrite t) = extract1 n Rewrite t-extractTUnquotes n (Induction t) = extract1 n Induction t-extractTUnquotes n (LetTac name t) = extract1 n (LetTac name) t-extractTUnquotes n (LetTacTy name t1 t2) = extract2 n (LetTacTy name) t1 t2-extractTUnquotes n (Exact tm) = extract1 n Exact tm-extractTUnquotes n (Try tac1 tac2)- = do (tac1', ex1) <- extractTUnquotes n tac1- (tac2', ex2) <- extractTUnquotes n tac2- return (Try tac1' tac2', ex1 ++ ex2)-extractTUnquotes n (TSeq tac1 tac2)- = do (tac1', ex1) <- extractTUnquotes n tac1- (tac2', ex2) <- extractTUnquotes n tac2- return (TSeq tac1' tac2', ex1 ++ ex2)-extractTUnquotes n (ApplyTactic t) = extract1 n ApplyTactic t-extractTUnquotes n (ByReflection t) = extract1 n ByReflection t-extractTUnquotes n (Reflect t) = extract1 n Reflect t-extractTUnquotes n (GoalType s tac)- = do (tac', ex) <- extractTUnquotes n tac- return (GoalType s tac', ex)-extractTUnquotes n (TCheck t) = extract1 n TCheck t-extractTUnquotes n (TEval t) = extract1 n TEval t-extractTUnquotes n (Claim name t) = extract1 n (Claim name) t-extractTUnquotes n tac = return (tac, []) -- the rest don't contain PTerms, or have been desugared away--extractPArgUnquotes :: Int -> PArg -> Elab' aux (PArg, [(Name, PTerm)])-extractPArgUnquotes d (PImp p m opts n t) =- do (t', ex) <- extractUnquotes d t- return (PImp p m opts n t', ex)-extractPArgUnquotes d (PExp p opts n t) =- do (t', ex) <- extractUnquotes d t- return (PExp p opts n t', ex)-extractPArgUnquotes d (PConstraint p opts n t) =- do (t', ex) <- extractUnquotes d t- return (PConstraint p opts n t', ex)-extractPArgUnquotes d (PTacImplicit p opts n scpt t) =- do (scpt', ex1) <- extractUnquotes d scpt- (t', ex2) <- extractUnquotes d t- return (PTacImplicit p opts n scpt' t', ex1 ++ ex2)--extractDoUnquotes :: Int -> PDo -> Elab' aux (PDo, [(Name, PTerm)])-extractDoUnquotes d (DoExp fc tm)- = do (tm', ex) <- extractUnquotes d tm- return (DoExp fc tm', ex)-extractDoUnquotes d (DoBind fc n nfc tm)- = do (tm', ex) <- extractUnquotes d tm- return (DoBind fc n nfc tm', ex)-extractDoUnquotes d (DoBindP fc t t' alts)- = fail "Pattern-matching binds cannot be quasiquoted"-extractDoUnquotes d (DoLet fc n nfc v b)- = do (v', ex1) <- extractUnquotes d v- (b', ex2) <- extractUnquotes d b- return (DoLet fc n nfc v' b', ex1 ++ ex2)-extractDoUnquotes d (DoLetP fc t t') = fail "Pattern-matching lets cannot be quasiquoted"---extractUnquotes :: Int -> PTerm -> Elab' aux (PTerm, [(Name, PTerm)])-extractUnquotes n (PLam fc name nfc ty body)- = do (ty', ex1) <- extractUnquotes n ty- (body', ex2) <- extractUnquotes n body- return (PLam fc name nfc ty' body', ex1 ++ ex2)-extractUnquotes n (PPi plicity name fc ty body)- = do (ty', ex1) <- extractUnquotes n ty- (body', ex2) <- extractUnquotes n body- return (PPi plicity name fc ty' body', ex1 ++ ex2)-extractUnquotes n (PLet fc name nfc ty val body)- = do (ty', ex1) <- extractUnquotes n ty- (val', ex2) <- extractUnquotes n val- (body', ex3) <- extractUnquotes n body- return (PLet fc name nfc ty' val' body', ex1 ++ ex2 ++ ex3)-extractUnquotes n (PTyped tm ty)- = do (tm', ex1) <- extractUnquotes n tm- (ty', ex2) <- extractUnquotes n ty- return (PTyped tm' ty', ex1 ++ ex2)-extractUnquotes n (PApp fc f args)- = do (f', ex1) <- extractUnquotes n f- args' <- mapM (extractPArgUnquotes n) args- let (args'', exs) = unzip args'- return (PApp fc f' args'', ex1 ++ concat exs)-extractUnquotes n (PAppBind fc f args)- = do (f', ex1) <- extractUnquotes n f- args' <- mapM (extractPArgUnquotes n) args- let (args'', exs) = unzip args'- return (PAppBind fc f' args'', ex1 ++ concat exs)-extractUnquotes n (PCase fc expr cases)- = do (expr', ex1) <- extractUnquotes n expr- let (pats, rhss) = unzip cases- (pats', exs1) <- fmap unzip $ mapM (extractUnquotes n) pats- (rhss', exs2) <- fmap unzip $ mapM (extractUnquotes n) rhss- return (PCase fc expr' (zip pats' rhss'), ex1 ++ concat exs1 ++ concat exs2)-extractUnquotes n (PIfThenElse fc c t f)- = do (c', ex1) <- extractUnquotes n c- (t', ex2) <- extractUnquotes n t- (f', ex3) <- extractUnquotes n f- return (PIfThenElse fc c' t' f', ex1 ++ ex2 ++ ex3)-extractUnquotes n (PRewrite fc x y z)- = do (x', ex1) <- extractUnquotes n x- (y', ex2) <- extractUnquotes n y- case z of- Just zz -> do (z', ex3) <- extractUnquotes n zz- return (PRewrite fc x' y' (Just z'), ex1 ++ ex2 ++ ex3)- Nothing -> return (PRewrite fc x' y' Nothing, ex1 ++ ex2)-extractUnquotes n (PPair fc hls info l r)- = do (l', ex1) <- extractUnquotes n l- (r', ex2) <- extractUnquotes n r- return (PPair fc hls info l' r', ex1 ++ ex2)-extractUnquotes n (PDPair fc hls info a b c)- = do (a', ex1) <- extractUnquotes n a- (b', ex2) <- extractUnquotes n b- (c', ex3) <- extractUnquotes n c- return (PDPair fc hls info a' b' c', ex1 ++ ex2 ++ ex3)-extractUnquotes n (PAlternative ms b alts)- = do alts' <- mapM (extractUnquotes n) alts- let (alts'', exs) = unzip alts'- return (PAlternative ms b alts'', concat exs)-extractUnquotes n (PHidden tm)- = do (tm', ex) <- extractUnquotes n tm- return (PHidden tm', ex)-extractUnquotes n (PGoal fc a name b)- = do (a', ex1) <- extractUnquotes n a- (b', ex2) <- extractUnquotes n b- return (PGoal fc a' name b', ex1 ++ ex2)-extractUnquotes n (PDoBlock steps)- = do steps' <- mapM (extractDoUnquotes n) steps- let (steps'', exs) = unzip steps'- return (PDoBlock steps'', concat exs)-extractUnquotes n (PIdiom fc tm)- = fmap (\(tm', ex) -> (PIdiom fc tm', ex)) $ extractUnquotes n tm-extractUnquotes n (PProof tacs)- = do (tacs', exs) <- fmap unzip $ mapM (extractTUnquotes n) tacs- return (PProof tacs', concat exs)-extractUnquotes n (PTactics tacs)- = do (tacs', exs) <- fmap unzip $ mapM (extractTUnquotes n) tacs- return (PTactics tacs', concat exs)-extractUnquotes n (PElabError err) = fail "Can't quasiquote an error"-extractUnquotes n (PCoerced tm)- = do (tm', ex) <- extractUnquotes n tm- return (PCoerced tm', ex)-extractUnquotes n (PDisamb ns tm)- = do (tm', ex) <- extractUnquotes n tm- return (PDisamb ns tm', ex)-extractUnquotes n (PUnifyLog tm)- = fmap (\(tm', ex) -> (PUnifyLog tm', ex)) $ extractUnquotes n tm-extractUnquotes n (PNoImplicits tm)- = fmap (\(tm', ex) -> (PNoImplicits tm', ex)) $ extractUnquotes n tm-extractUnquotes n (PQuasiquote tm goal)- = fmap (\(tm', ex) -> (PQuasiquote tm' goal, ex)) $ extractUnquotes (n+1) tm-extractUnquotes n (PUnquote tm)- | n == 0 = do n <- getNameFrom (sMN 0 "unquotation")- return (PRef (fileFC "(unquote)") [] n, [(n, tm)])- | otherwise = fmap (\(tm', ex) -> (PUnquote tm', ex)) $- extractUnquotes (n-1) tm-extractUnquotes n (PRunElab fc tm ns)- = fmap (\(tm', ex) -> (PRunElab fc tm' ns, ex)) $ extractUnquotes n tm-extractUnquotes n (PConstSugar fc tm)- = extractUnquotes n tm-extractUnquotes n x = return (x, []) -- no subterms!--
@@ -3,7 +3,7 @@ module Idris.IBC (loadIBC, loadPkgIndex, writeIBC, writePkgIndex,- hasValidIBCVersion) where+ hasValidIBCVersion, IBCPhase(..)) where import Idris.Core.Evaluate import Idris.Core.TT@@ -40,10 +40,18 @@ import Codec.Archive.Zip ibcVersion :: Word16-ibcVersion = 128+ibcVersion = 136 +-- When IBC is being loaded - we'll load different things (and omit different+-- structures/definitions) depending on which phase we're in+data IBCPhase = IBC_Building -- ^ when building the module tree+ | IBC_REPL Bool -- ^ when loading modules for the REPL+ -- Bool = True for top level module+ deriving (Show, Eq)+ data IBCFile = IBCFile { ver :: Word16, sourcefile :: FilePath,+ ibc_reachablenames :: ![Name], ibc_imports :: ![(Bool, FilePath)], ibc_importdirs :: ![FilePath], ibc_implicits :: ![(Name, [PArg])],@@ -62,13 +70,10 @@ ibc_cgflags :: ![(Codegen, String)], ibc_dynamic_libs :: ![String], ibc_hdrs :: ![(Codegen, String)],- ibc_access :: ![(Name, Accessibility)],- ibc_total :: ![(Name, Totality)], ibc_totcheckfail :: ![(FC, String)], ibc_flags :: ![(Name, [FnOpt])], ibc_fninfo :: ![(Name, FnInfo)], ibc_cg :: ![(Name, CGInfo)],- ibc_defs :: ![(Name, Def)], ibc_docstrings :: ![(Name, (Docstring D.DocTerm, [(Name, Docstring D.DocTerm)]))], ibc_moduledocs :: ![(Name, Docstring D.DocTerm)], ibc_transforms :: ![(Name, (Term, Term))],@@ -79,7 +84,7 @@ ibc_metainformation :: ![(Name, MetaInformation)], ibc_errorhandlers :: ![Name], ibc_function_errorhandlers :: ![(Name, Name, Name)], -- fn, arg, handler- ibc_metavars :: ![(Name, (Maybe Name, Int, [Name], Bool))],+ ibc_metavars :: ![(Name, (Maybe Name, Int, [Name], Bool, Bool))], ibc_patdefs :: ![(Name, ([([(Name, Term)], Term, Term)], [PTerm]))], ibc_postulates :: ![Name], ibc_externs :: ![(Name, Int)],@@ -87,7 +92,10 @@ ibc_usage :: ![(Name, Int)], ibc_exports :: ![Name], ibc_autohints :: ![(Name, Name)],- ibc_deprecated :: ![(Name, String)]+ ibc_deprecated :: ![(Name, String)],+ ibc_defs :: ![(Name, Def)],+ ibc_total :: ![(Name, Totality)],+ ibc_access :: ![(Name, Accessibility)] } deriving Show {-!@@ -95,7 +103,7 @@ !-} initIBC :: IBCFile-initIBC = IBCFile ibcVersion "" [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] [] [] []+initIBC = IBCFile ibcVersion "" [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] [] [] [] [] [] [] hasValidIBCVersion :: FilePath -> Idris Bool hasValidIBCVersion fp = do@@ -106,8 +114,9 @@ return (ver == ibcVersion) loadIBC :: Bool -- ^ True = reexport, False = make everything private+ -> IBCPhase -> FilePath -> Idris ()-loadIBC reexport fp+loadIBC reexport phase fp = do imps <- getImported let redo = case lookup fp imps of Nothing -> True@@ -118,15 +127,16 @@ case toArchiveOrFail archiveFile of Left _ -> ifail $ fp ++ " isn't loadable, it may have an old ibc format.\n" ++ "Please clean and rebuild it."- Right archive -> do process reexport archive fp+ Right archive -> do process reexport phase archive fp addImported reexport fp+-- dumpTT -- | Load an entire package from its index file loadPkgIndex :: String -> Idris () loadPkgIndex pkg = do ddir <- runIO $ getIdrisLibDir addImportDir (ddir </> pkg) fp <- findPkgIndex pkg- loadIBC True fp+ loadIBC True IBC_Building fp makeEntry :: (Binary b) => String -> [b] -> Maybe Entry@@ -156,13 +166,10 @@ makeEntry "ibc_cgflags" (ibc_cgflags i), makeEntry "ibc_dynamic_libs" (ibc_dynamic_libs i), makeEntry "ibc_hdrs" (ibc_hdrs i),- makeEntry "ibc_access" (ibc_access i),- makeEntry "ibc_total" (ibc_total i), makeEntry "ibc_totcheckfail" (ibc_totcheckfail i), makeEntry "ibc_flags" (ibc_flags i), makeEntry "ibc_fninfo" (ibc_fninfo i), makeEntry "ibc_cg" (ibc_cg i),- makeEntry "ibc_defs" (ibc_defs i), makeEntry "ibc_docstrings" (ibc_docstrings i), makeEntry "ibc_moduledocs" (ibc_moduledocs i), makeEntry "ibc_transforms" (ibc_transforms i),@@ -181,7 +188,10 @@ makeEntry "ibc_usage" (ibc_usage i), makeEntry "ibc_exports" (ibc_exports i), makeEntry "ibc_autohints" (ibc_autohints i),- makeEntry "ibc_deprecated" (ibc_deprecated i)]+ makeEntry "ibc_deprecated" (ibc_deprecated i),+ makeEntry "ibc_defs" (ibc_defs i),+ makeEntry "ibc_total" (ibc_total i),+ makeEntry "ibc_access" (ibc_access i)] writeArchive :: FilePath -> IBCFile -> Idris () writeArchive fp i = do let a = L.foldl (\x y -> addEntryToArchive y x) emptyArchive (entries i)@@ -315,8 +325,9 @@ Just e -> return $! (force . decode . fromEntry) e process :: Bool -- ^ Reexporting+ -> IBCPhase -> Archive -> FilePath -> Idris ()-process reexp i fn = do+process reexp phase i fn = do ver <- getEntry 0 "ver" i when (ver /= ibcVersion) $ do logIBC 1 "ibc out of date"@@ -328,7 +339,7 @@ srcok <- runIO $ doesFileExist source when srcok $ timestampOlder source fn pImportDirs =<< getEntry [] "ibc_importdirs" i- pImports reexp =<< getEntry [] "ibc_imports" i+ pImports reexp phase =<< getEntry [] "ibc_imports" i pImps =<< getEntry [] "ibc_implicits" i pFixes =<< getEntry [] "ibc_fixes" i pStatics =<< getEntry [] "ibc_statics" i@@ -345,12 +356,9 @@ pCGFlags =<< getEntry [] "ibc_cgflags" i pDyLibs =<< getEntry [] "ibc_dynamic_libs" i pHdrs =<< getEntry [] "ibc_hdrs" i- pDefs reexp =<< getEntry [] "ibc_defs" i pPatdefs =<< getEntry [] "ibc_patdefs" i- pAccess reexp =<< getEntry [] "ibc_access" i pFlags =<< getEntry [] "ibc_flags" i pFnInfo =<< getEntry [] "ibc_fninfo" i- pTotal =<< getEntry [] "ibc_total" i pTotCheckErr =<< getEntry [] "ibc_totcheckfail" i pCG =<< getEntry [] "ibc_cg" i pDocs =<< getEntry [] "ibc_docstrings" i@@ -371,6 +379,9 @@ pExports =<< getEntry [] "ibc_exports" i pAutoHints =<< getEntry [] "ibc_autohints" i pDeprecate =<< getEntry [] "ibc_deprecated" i+ pDefs reexp =<< getEntry [] "ibc_defs" i+ pTotal =<< getEntry [] "ibc_total" i+ pAccess reexp phase =<< getEntry [] "ibc_access" i timestampOlder :: FilePath -> FilePath -> Idris () timestampOlder src ibc = do srct <- runIO $ getModificationTime src@@ -404,8 +415,8 @@ pImportDirs :: [FilePath] -> Idris () pImportDirs fs = mapM_ addImportDir fs -pImports :: Bool -> [(Bool, FilePath)] -> Idris ()-pImports reexp fs+pImports :: Bool -> IBCPhase -> [(Bool, FilePath)] -> Idris ()+pImports reexp phase fs = do mapM_ (\(re, f) -> do i <- getIState ibcsd <- valIBCSubDir i@@ -414,6 +425,9 @@ -- if (f `elem` imported i) -- then logLvl 1 $ "Already read " ++ f putIState (i { imported = f : imported i })+ let phase' = case phase of+ IBC_REPL _ -> IBC_REPL False+ p -> p case fp of LIDR fn -> do logIBC 1 $ "Failed at " ++ fn@@ -421,7 +435,7 @@ IDR fn -> do logIBC 1 $ "Failed at " ++ fn ifail "Must be an ibc"- IBC fn src -> loadIBC (reexp && re) fn)+ IBC fn src -> loadIBC (reexp && re) phase' fn) fs pImps :: [(Name, [PArg])] -> Idris ()@@ -429,6 +443,7 @@ do i <- getIState case lookupDefAccExact n False (tt_ctxt i) of Just (n, Hidden) -> return ()+ Just (n, Private) -> return () _ -> putIState (i { idris_implicits = addDef n imp (idris_implicits i) })) imps@@ -518,12 +533,9 @@ case d' of TyDecl _ _ -> return () _ -> do logIBC 1 $ "SOLVING " ++ show n- solveDeferred n+ solveDeferred emptyFC n updateIState (\i -> i { tt_ctxt = addCtxtDef n d' (tt_ctxt i) })--- logLvl 1 $ "Added " ++ show (n, d')- if (not reexp) then do logIBC 1 $ "Not exporting " ++ show n- setAccessibility n Hidden- else logIBC 1 $ "Exporting " ++ show n) ds+ ) ds where updateDef (CaseOp c t args o s cd) = do o' <- mapM updateOrig o@@ -537,11 +549,9 @@ return $ Right (l', r') updateCD (CaseDefs (ts, t) (cs, c) (is, i) (rs, r))- = do t' <- updateSC t- c' <- updateSC c- i' <- updateSC i+ = do c' <- updateSC c r' <- updateSC r- return $ CaseDefs (ts, t') (cs, c') (is, i') (rs, r')+ return $ CaseDefs (cs, c') (cs, c') (cs, c') (rs, r') updateSC (Case t n alts) = do alts' <- mapM updateAlt alts return (Case t n alts')@@ -562,19 +572,28 @@ updateAlt (DefaultCase t) = do t' <- updateSC t return (DefaultCase t') - update (P t n ty) = do n' <- getSymbol n- return $ P t n' ty- update (App s f a) = liftM2 (App s) (update f) (update a)- update (Bind n b sc) = do b' <- updateB b- sc' <- update sc- return $ Bind n b' sc'+ -- We get a lot of repetition in sub terms and can save a fair chunk+ -- of memory if we make sure they're shared. addTT looks for a term+ -- and returns it if it exists already, while also keeping stats of+ -- how many times a subterm is repeated.+ update t = do tm <- addTT t+ case tm of+ Nothing -> update' t+ Just t' -> return t'++ update' (P t n ty) = do n' <- getSymbol n+ return $ P t n' ty+ update' (App s f a) = liftM2 (App s) (update' f) (update' a)+ update' (Bind n b sc) = do b' <- updateB b+ sc' <- update sc+ return $ Bind n b' sc' where- updateB (Let t v) = liftM2 Let (update t) (update v)- updateB b = do ty' <- update (binderTy b)+ updateB (Let t v) = liftM2 Let (update' t) (update' v)+ updateB b = do ty' <- update' (binderTy b) return (b { binderTy = ty' })- update (Proj t i) = do t' <- update t- return $ Proj t' i- update t = return t+ update' (Proj t i) = do t' <- update' t+ return $ Proj t' i+ update' t = return t pDocs :: [(Name, (Docstring D.DocTerm, [(Name, Docstring D.DocTerm)]))] -> Idris () pDocs ds = mapM_ (\(n, a) -> addDocStr n (fst a) (snd a)) ds@@ -584,13 +603,23 @@ i { idris_moduledocs = addDef n d (idris_moduledocs i) })) ds pAccess :: Bool -- ^ Reexporting?+ -> IBCPhase -> [(Name, Accessibility)] -> Idris ()-pAccess reexp ds+pAccess reexp phase ds = mapM_ (\ (n, a_in) -> do let a = if reexp then a_in else Hidden logIBC 3 $ "Setting " ++ show (a, n) ++ " to " ++ show a- updateIState (\i -> i { tt_ctxt = setAccess n a (tt_ctxt i) })) ds+ updateIState (\i -> i { tt_ctxt = setAccess n a (tt_ctxt i) }) + if (not reexp) then do logIBC 1 $ "Not exporting " ++ show n+ setAccessibility n Hidden+ else logIBC 1 $ "Exporting " ++ show n+ -- Everything should be available at the REPL from+ -- things imported publicly+ when (phase == IBC_REPL True) $ + setAccessibility n Public+ ) ds+ pFlags :: [(Name, [FnOpt])] -> Idris () pFlags ds = mapM_ (\ (n, a) -> setFlags n a) ds @@ -633,7 +662,7 @@ pFunctionErrorHandlers ns = mapM_ (\ (fn,arg,handler) -> addFunctionErrorHandlers fn arg [handler]) ns -pMetavars :: [(Name, (Maybe Name, Int, [Name], Bool))] -> Idris ()+pMetavars :: [(Name, (Maybe Name, Int, [Name], Bool, Bool))] -> Idris () pMetavars ns = updateIState (\i -> i { idris_metavars = L.reverse ns ++ idris_metavars i }) ----- For Cheapskate and docstrings@@ -753,18 +782,14 @@ _ -> error "Corrupted binary data for SizeChange" instance Binary CGInfo where- put (CGInfo x1 x2 x3 x4 x5)+ put (CGInfo x1 x2 x3) = do put x1- put x2 -- put x3 -- Already used SCG info for totality check- put x4- put x5+ put x3 get = do x1 <- get- x2 <- get- x4 <- get- x5 <- get- return (CGInfo x1 x2 [] x4 x5)+ x3 <- get+ return (CGInfo x1 [] x3) instance Binary CaseType where put x = case x of@@ -883,13 +908,13 @@ put x2 -- all primitives just get added at the start, don't write Operator x1 x2 x3 -> do return ()- CaseOp x1 x2 x2a x3 x3a x4 -> do putWord8 3- put x1- put x2- put x2a- put x3- -- no x3a- put x4+ -- no need to add/load original patterns, because they're not+ -- used again after totality checking+ CaseOp x1 x2 x3 _ _ x4 -> do putWord8 3+ put x1+ put x2+ put x3+ put x4 get = do i <- getWord8 case i of@@ -903,10 +928,10 @@ 3 -> do x1 <- get x2 <- get x3 <- get- x4 <- get+-- x4 <- get -- x3 <- get always [] x5 <- get- return (CaseOp x1 x2 x3 x4 [] x5)+ return (CaseOp x1 x2 x3 [] [] x5) _ -> error "Corrupted binary data for Def" instance Binary Accessibility where@@ -914,13 +939,15 @@ = case x of Public -> putWord8 0 Frozen -> putWord8 1- Hidden -> putWord8 2+ Private -> putWord8 2+ Hidden -> putWord8 3 get = do i <- getWord8 case i of 0 -> return Public 1 -> return Frozen- 2 -> return Hidden+ 2 -> return Private+ 3 -> return Hidden _ -> error "Corrupted binary data for Accessibility" safeToEnum :: (Enum a, Bounded a, Integral int) => String -> int -> a@@ -1235,7 +1262,7 @@ put x10 put x11 put x12- PInstance x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 ->+ PInstance x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 -> do putWord8 8 put x1 put x2@@ -1248,6 +1275,8 @@ put x9 put x10 put x11+ put x12+ put x13 PDSL x1 x2 -> do putWord8 9 put x1 put x2@@ -1362,7 +1391,9 @@ x9 <- get x10 <- get x11 <- get- return (PInstance x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11)+ x12 <- get+ x13 <- get+ return (PInstance x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13) 9 -> do x1 <- get x2 <- get return (PDSL x1 x2)
@@ -10,7 +10,7 @@ import Idris.Core.Evaluate (ctxtAlist, Def (..), lookupDefAcc, Accessibility (..), isDConName, isFnName, isTConName)-import Idris.ParseHelpers (opChars)+import Idris.Parser.Helpers (opChars) import Idris.AbsSyntax import Idris.Docs import Idris.Docstrings (nullDocstring)@@ -182,7 +182,7 @@ -- | Whether a NsItem should be included in the documentation.--- It must not be Hidden and filterName must return True for the name.+-- It must not be Hidden/Private and filterName must return True for the name. -- Also it must have Docs -- without Docs, nothing can be done. filterInclude :: NsItem -- ^ Accessibility to check -> Bool -- ^ Predicate result@@ -254,7 +254,7 @@ let res = lookupDefAcc n False (tt_ctxt ist) in case res of [(_, acc)] -> acc- _ -> Hidden+ _ -> Private -- | Simple predicate for whether an NsItem has Docs hasDoc :: NsItem -- ^ The NsItem to test
@@ -76,7 +76,7 @@ getIndent i n xs | take 9 xs == "instance " = i getIndent i n xs | take (length n) xs == n = i getIndent i n (x : xs) = getIndent (i + 1) n xs- + getAppName (PApp _ r _) = getAppName r getAppName (PRef _ _ r) = r getAppName (PTyped n _) = getAppName n@@ -120,7 +120,7 @@ if updatefile then do let fb = fn ++ "~" runIO $ writeSource fb (unlines (before ++ nonblank)- ++ extras ++ + ++ extras ++ (if null extras then "" else "\n" ++ unlines rest)) runIO $ copyFile fb fn@@ -193,7 +193,7 @@ case findSubstr ('?':n) line of Just (before, pos, after) -> [before ++ (if b then "(" else "") ++ "case _ of",- take (pos + (if b then 6 else 5)) (repeat ' ') ++ + take (pos + (if b then 6 else 5)) (repeat ' ') ++ "case_val => ?" ++ n ++ (if b then ")" else "") ++ after] Nothing -> fail "No such metavariable"@@ -208,7 +208,7 @@ findSubstr n xs = findSubstr' [] 0 n xs - findSubstr' acc i n xs | take (length n) xs == n + findSubstr' acc i n xs | take (length n) xs == n = Just (reverse acc, i, drop (length n) xs) findSubstr' acc i n [] = Nothing findSubstr' acc i n (x : xs) = findSubstr' (x : acc) (i + 1) n xs@@ -217,7 +217,7 @@ -doProofSearch :: FilePath -> Bool -> Bool -> +doProofSearch :: FilePath -> Bool -> Bool -> Int -> Name -> [Name] -> Maybe Int -> Idris () doProofSearch fn updatefile rec l n hints Nothing = doProofSearch fn updatefile rec l n hints (Just 20)@@ -230,15 +230,15 @@ [] -> return n ns -> ierror (CantResolveAlts ns) i <- getIState- let (top, envlen, psnames, _) + let (top, envlen, psnames) = case lookup mn (idris_metavars i) of- Just (t, e, ns, False) -> (t, e, ns, False)- _ -> (Nothing, 0, [], True)+ Just (t, e, ns, False, d) -> (t, e, ns)+ _ -> (Nothing, 0, []) let fc = fileFC fn let body t = PProof [Try (TSeq Intros (ProofSearch rec False depth t psnames hints)) (ProofSearch rec False depth t psnames hints)] let def = PClause fc mn (PRef fc [] mn) [] (body top) []- newmv <- idrisCatch+ newmv_pre <- idrisCatch (do elabDecl' EAll recinfo (PClauses fc [] mn [def]) (tm, ty) <- elabVal recinfo ERHS (PRef fc [] mn) ctxt <- getContext@@ -249,10 +249,11 @@ (dropCtxt envlen (delab i (fst (specialise ctxt [] [(mn, 1)] tm)))))) (\e -> return ("?" ++ show n))+ let newmv = guessBrackets False tyline (show n) newmv_pre if updatefile then do let fb = fn ++ "~" runIO $ writeSource fb (unlines before ++- updateMeta False tyline (show n) newmv ++ "\n"+ updateMeta tyline (show n) newmv ++ "\n" ++ unlines later) runIO $ copyFile fb fn else iPrintResult newmv@@ -270,18 +271,34 @@ nsroot (SN (WhereN _ _ n)) = nsroot n nsroot n = n -updateMeta brack ('?':cs) n new+updateMeta ('?':cs) n new | length cs >= length n = case splitAt (length n) cs of (mv, c:cs) -> if ((isSpace c || c == ')' || c == '}') && mv == n)- then addBracket brack new ++ (c : cs)- else '?' : mv ++ c : updateMeta True cs n new+ then new ++ (c : cs)+ else '?' : mv ++ c : updateMeta cs n new+ (mv, []) -> if (mv == n) then new else '?' : mv+updateMeta ('=':'>':cs) n new = '=':'>':updateMeta cs n new+updateMeta ('=':cs) n new = '=':updateMeta cs n new+updateMeta (c:cs) n new+ = c : updateMeta cs n new+updateMeta [] n new = ""++guessBrackets brack ('?':cs) n new+ | length cs >= length n+ = case splitAt (length n) cs of+ (mv, c:cs) ->+ if ((isSpace c || c == ')' || c == '}') && mv == n)+ then addBracket brack new+ else guessBrackets True cs n new (mv, []) -> if (mv == n) then addBracket brack new else '?' : mv-updateMeta brack ('=':cs) n new = '=':updateMeta False cs n new-updateMeta brack (c:cs) n new - = c : updateMeta (brack || not (isSpace c)) cs n new-updateMeta brack [] n new = ""+guessBrackets brack ('=':'>':cs) n new = guessBrackets False cs n new+guessBrackets brack ('-':'>':cs) n new = guessBrackets False cs n new+guessBrackets brack ('=':cs) n new = guessBrackets False cs n new+guessBrackets brack (c:cs) n new+ = guessBrackets (brack || not (isSpace c)) cs n new+guessBrackets brack [] n new = "" checkProv line n = isProv' False line n where@@ -291,7 +308,7 @@ isProv' _ ('}':cs) n = isProv' True cs n isProv' p (_:cs) n = isProv' p cs n isProv' _ [] n = False- + addBracket False new = new addBracket True new@('(':xs) | last xs == ')' = new addBracket True new | any isSpace new = '(' : new ++ ")"@@ -305,7 +322,7 @@ -- if the name is in braces, rather than preceded by a ?, treat it -- as a lemma in a provisional definition- + let isProv = checkProv tyline (show n) ctxt <- getContext@@ -315,18 +332,19 @@ ns -> ierror (CantResolveAlts (map fst ns)) i <- getIState margs <- case lookup fname (idris_metavars i) of- Just (_, arity, _, _) -> return arity+ Just (_, arity, _, _, _) -> return arity _ -> return (-1) if (not isProv) then do let skip = guessImps i (tt_ctxt i) mty- let classes = guessClasses i (tt_ctxt i) mty+ let impty = stripMNBind skip margs (delab i mty)+ let classes = guessClasses i (tt_ctxt i) [] (allNamesIn impty) mty - let lem = show n ++ " : " ++ + let lem = show n ++ " : " ++ constraints i classes mty ++ showTmOpts (defaultPPOption { ppopt_pinames = True })- (stripMNBind skip margs (delab i mty))- let lem_app = show n ++ appArgs skip margs mty+ impty+ let lem_app = guessBrackets False tyline (show n) (show n ++ appArgs skip margs mty) if updatefile then do let fb = fn ++ "~"@@ -362,27 +380,34 @@ where getIndent s = length (takeWhile isSpace s) appArgs skip 0 _ = ""- appArgs skip i (Bind n@(UN c) (Pi _ _ _) sc) + appArgs skip i (Bind n@(UN c) (Pi _ _ _) sc) | (thead c /= '_' && n `notElem` skip) = " " ++ show n ++ appArgs skip (i - 1) sc appArgs skip i (Bind _ (Pi _ _ _) sc) = appArgs skip (i - 1) sc appArgs skip i _ = "" - stripMNBind _ args t | args <= 0 = t- stripMNBind skip args (PPi b n@(UN c) _ ty sc) + stripMNBind _ args t | args <= 0 = stripImp t+ stripMNBind skip args (PPi b n@(UN c) _ ty sc) | n `notElem` skip || take 4 (str c) == "__pi" -- keep in type, but not in app- = PPi b n NoFC ty (stripMNBind skip (args - 1) sc)+ = PPi b n NoFC (stripImp ty) (stripMNBind skip (args - 1) sc) stripMNBind skip args (PPi b _ _ ty sc) = stripMNBind skip (args - 1) sc- stripMNBind skip args t = t+ stripMNBind skip args t = stripImp t + stripImp (PApp fc f as) = PApp fc (stripImp f) (map placeholderImp as)+ where+ placeholderImp tm@(PImp _ _ _ _ _) = tm { getTm = Placeholder }+ placeholderImp tm = tm { getTm = stripImp (getTm tm) }+ stripImp (PPi b n f ty sc) = PPi b n f (stripImp ty) (stripImp sc)+ stripImp t = t+ constraints :: IState -> [Name] -> Type -> String constraints i [] ty = "" constraints i [n] ty = showSep ", " (showConstraints i [n] ty) ++ " => " constraints i ns ty = "(" ++ showSep ", " (showConstraints i ns ty) ++ ") => " showConstraints i ns (Bind n (Pi _ ty _) sc)- | n `elem` ns = show (delab i ty) : + | n `elem` ns = show (delab i ty) : showConstraints i ns (substV (P Bound n Erased) sc) | otherwise = showConstraints i ns (substV (P Bound n Erased) sc) showConstraints _ _ _ = []@@ -393,10 +418,10 @@ -- Also, make type class instances implicit guessImps :: IState -> Context -> Term -> [Name] -- machine names aren't lifted- guessImps ist ctxt (Bind n@(MN _ _) (Pi _ ty _) sc) + guessImps ist ctxt (Bind n@(MN _ _) (Pi _ ty _) sc) = n : guessImps ist ctxt sc guessImps ist ctxt (Bind n (Pi _ ty _) sc)- | guarded ctxt n (substV (P Bound n Erased) sc) + | guarded ctxt n (substV (P Bound n Erased) sc) = n : guessImps ist ctxt sc | isClass ist ty = n : guessImps ist ctxt sc@@ -404,30 +429,37 @@ | ignoreName n = n : guessImps ist ctxt sc | otherwise = guessImps ist ctxt sc guessImps ist ctxt _ = []- + paramty (TType _) = True paramty (Bind _ (Pi _ (TType _) _) sc) = paramty sc paramty _ = False- + -- TMP HACK unusable name so don't lift ignoreName n = case show n of "_aX" -> True _ -> False - guessClasses :: IState -> Context -> Term -> [Name]- guessClasses ist ctxt (Bind n (Pi _ ty _) sc)- | isParamClass ist ty- = n : guessClasses ist ctxt sc- | otherwise = guessClasses ist ctxt sc- guessClasses ist ctxt _ = []+ guessClasses :: IState -> Context -> [Name] -> [Name] -> Term -> [Name]+ guessClasses ist ctxt binders usednames (Bind n (Pi _ ty _) sc)+ | isParamClass ist ty && any (\x -> elem x usednames)+ (paramNames binders ty)+ = n : guessClasses ist ctxt (n : binders) usednames sc+ | otherwise = guessClasses ist ctxt (n : binders) usednames sc+ guessClasses ist ctxt _ _ _ = [] + paramNames bs ty | (P _ _ _, args) <- unApply ty+ = vnames args+ where vnames [] = []+ vnames (V i : xs) | i < length bs = bs !! i : vnames xs+ vnames (_ : xs) = vnames xs+ isClass ist t | (P _ n _, args) <- unApply t = case lookupCtxtExact n (idris_classes ist) of Just _ -> True _ -> False | otherwise = False- + isParamClass ist t | (P _ n _, args) <- unApply t = case lookupCtxtExact n (idris_classes ist) of@@ -443,18 +475,18 @@ isConName f ctxt = any (guarded ctxt n) args -- guarded ctxt n (Bind (UN cn) (Pi t) sc) -- ignore shadows -- | thead cn /= '_' = guarded ctxt n t || guarded ctxt n sc- guarded ctxt n (Bind _ (Pi _ t _) sc) + guarded ctxt n (Bind _ (Pi _ t _) sc) = guarded ctxt n t || guarded ctxt n sc guarded ctxt n _ = False blank = all isSpace addLem before tyline lem lem_app later- = let (bef_end, blankline : bef_start) + = let (bef_end, blankline : bef_start) = case span (not . blank) (reverse before) of (bef, []) -> (bef, "" : []) x -> x- mvline = updateMeta False tyline (show n) lem_app in+ mvline = updateMeta tyline (show n) lem_app in unlines $ reverse bef_start ++ [blankline, lem, blankline] ++ reverse bef_end ++ mvline : later@@ -464,6 +496,6 @@ = case span (not . blank) later of (bef, []) -> (bef, "" : []) x -> x in- unlines $ before ++ tyline : + unlines $ before ++ tyline : (later_bef ++ [blankline, lem_app, blankline] ++ later_end)
@@ -1,338 +0,0 @@-{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}-module Idris.ParseData where--import Prelude hiding (pi)--import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err)-import Text.Parser.LookAhead-import Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi--import Idris.AbsSyntax-import Idris.ParseHelpers-import Idris.ParseOps-import Idris.ParseExpr-import Idris.DSL--import Idris.Core.TT-import Idris.Core.Evaluate--import Idris.Docstrings--import Control.Applicative-import Control.Monad-import Control.Monad.State.Strict--import Data.Maybe-import qualified Data.List.Split as Spl-import Data.List-import Data.Monoid-import Data.Char-import qualified Data.HashSet as HS-import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8--import Debug.Trace--{- |Parses a record type declaration-Record ::=- DocComment Accessibility? 'record' FnName TypeSig 'where' OpenBlock Constructor KeepTerminator CloseBlock;--}-record :: SyntaxInfo -> IdrisParser PDecl-record syn = do (doc, paramDocs, acc, opts) <- try (do- (doc, paramDocs) <- option noDocs docComment- ist <- get- let doc' = annotCode (tryFullExpr syn ist) doc- paramDocs' = [ (n, annotCode (tryFullExpr syn ist) d)- | (n, d) <- paramDocs ]- acc <- optional accessibility- opts <- dataOpts []- co <- recordI- return (doc', paramDocs', acc, opts ++ co))- fc <- getFC- (tyn_in, nfc) <- fnName- let tyn = expandNS syn tyn_in- let rsyn = syn { syn_namespace = show (nsroot tyn) :- syn_namespace syn }- params <- manyTill (recordParameter rsyn) (reservedHL "where")- (fields, cname, cdoc) <- indentedBlockS $ recordBody rsyn tyn- case cname of- Just cn' -> accData acc tyn [fst cn']- Nothing -> return ()- return $ PRecord doc rsyn fc opts tyn nfc params paramDocs fields cname cdoc syn- <?> "record type declaration"- where- getRecNames :: SyntaxInfo -> PTerm -> [Name]- getRecNames syn (PPi _ n _ _ sc) = [expandNS syn n, expandNS syn (mkType n)]- ++ getRecNames syn sc- getRecNames _ _ = []-- toFreeze :: Maybe Accessibility -> Maybe Accessibility- toFreeze (Just Frozen) = Just Hidden- toFreeze x = x-- recordBody :: SyntaxInfo -> Name -> IdrisParser ([((Maybe (Name, FC)), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))], Maybe (Name, FC), Docstring (Either Err PTerm))- recordBody syn tyn = do- ist <- get- fc <- getFC-- (constructorName, constructorDoc) <- option (Nothing, emptyDocstring)- (do (doc, _) <- option noDocs docComment- n <- constructor- return (Just n, doc))-- let constructorDoc' = annotate syn ist constructorDoc-- fields <- many . indented $ fieldLine syn-- return (concat fields, constructorName, constructorDoc')- where- fieldLine :: SyntaxInfo -> IdrisParser [(Maybe (Name, FC), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))]- fieldLine syn = do- doc <- optional docComment- c <- optional $ lchar '{'- let oneName = (do (n, nfc) <- fnName- return $ Just (expandNS syn n, nfc))- <|> (symbol "_" >> return Nothing)- ns <- commaSeparated oneName- lchar ':'- t <- typeExpr (allowImp syn)- p <- endPlicity c- ist <- get- let doc' = case doc of -- Temp: Throws away any possible arg docs- Just (d,_) -> Just $ annotate syn ist d- Nothing -> Nothing- return $ map (\n -> (n, p, t, doc')) ns-- constructor :: IdrisParser (Name, FC)- constructor = (reservedHL "constructor") *> fnName--- endPlicity :: Maybe Char -> IdrisParser Plicity- endPlicity (Just _) = do lchar '}'- return impl- endPlicity Nothing = return expl-- annotate :: SyntaxInfo -> IState -> Docstring () -> Docstring (Either Err PTerm)- annotate syn ist = annotCode $ tryFullExpr syn ist--recordParameter :: SyntaxInfo -> IdrisParser (Name, FC, Plicity, PTerm)-recordParameter syn =- (do lchar '('- (n, nfc, pt) <- (namedTy syn <|> onlyName syn)- lchar ')'- return (n, nfc, expl, pt))- <|>- (do (n, nfc, pt) <- onlyName syn- return (n, nfc, expl, pt))- where- namedTy :: SyntaxInfo -> IdrisParser (Name, FC, PTerm)- namedTy syn =- do (n, nfc) <- fnName- lchar ':'- ty <- typeExpr (allowImp syn)- return (expandNS syn n, nfc, ty)- onlyName :: SyntaxInfo -> IdrisParser (Name, FC, PTerm)- onlyName syn =- do (n, nfc) <- fnName- fc <- getFC- return (expandNS syn n, nfc, PType fc)--{- | Parses data declaration type (normal or codata)-DataI ::= 'data' | 'codata';--}-dataI :: IdrisParser DataOpts-dataI = do reservedHL "data"; return []- <|> do reservedHL "codata"; return [Codata]--recordI :: IdrisParser DataOpts-recordI = do reservedHL "record"; return []- <|> do reservedHL "corecord"; return [Codata]--{- | Parses if a data should not have a default eliminator-DefaultEliminator ::= 'noelim'?- -}-dataOpts :: DataOpts -> IdrisParser DataOpts-dataOpts opts- = do fc <- reservedFC "%elim"- warnElim fc- dataOpts (DefaultEliminator : DefaultCaseFun : opts)- <|> do fc <- reservedFC "%case"- warnElim fc- dataOpts (DefaultCaseFun : opts)- <|> do reserved "%error_reverse"; dataOpts (DataErrRev : opts)- <|> return opts- <?> "data options"- where warnElim fc =- do ist <- get- let cmdline = opt_cmdline (idris_options ist)- unless (NoElimDeprecationWarnings `elem` cmdline) $- put ist { parserWarnings =- (fc, Msg "Eliminator generation is deprecated. Use an eliminator generator in a library instead.") : parserWarnings ist }--{- | Parses a data type declaration-Data ::= DocComment? Accessibility? DataI DefaultEliminator FnName TypeSig ExplicitTypeDataRest?- | DocComment? Accessibility? DataI DefaultEliminator FnName Name* DataRest?- ;-Constructor' ::= Constructor KeepTerminator;-ExplicitTypeDataRest ::= 'where' OpenBlock Constructor'* CloseBlock;--DataRest ::= '=' SimpleConstructorList Terminator- | 'where'!- ;-SimpleConstructorList ::=- SimpleConstructor- | SimpleConstructor '|' SimpleConstructorList- ;--}-data_ :: SyntaxInfo -> IdrisParser PDecl-data_ syn = do (doc, argDocs, acc, dataOpts) <- try (do- (doc, argDocs) <- option noDocs docComment- pushIndent- acc <- optional accessibility- elim <- dataOpts []- co <- dataI- ist <- get- let dataOpts = combineDataOpts (elim ++ co)- doc' = annotCode (tryFullExpr syn ist) doc- argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)- | (n, d) <- argDocs ]- return (doc', argDocs', acc, dataOpts))- fc <- getFC- (tyn_in, nfc) <- fnName- (do try (lchar ':')- popIndent- ty <- typeExpr (allowImp syn)- let tyn = expandNS syn tyn_in- option (PData doc argDocs syn fc dataOpts (PLaterdecl tyn nfc ty)) (do- reservedHL "where"- cons <- indentedBlock (constructor syn)- accData acc tyn (map (\ (_, _, n, _, _, _, _) -> n) cons)- return $ PData doc argDocs syn fc dataOpts (PDatadecl tyn nfc ty cons))) <|> (do- args <- many (fst <$> name)- let ty = bindArgs (map (const (PType fc)) args) (PType fc)- let tyn = expandNS syn tyn_in- option (PData doc argDocs syn fc dataOpts (PLaterdecl tyn nfc ty)) (do- try (lchar '=') <|> do reservedHL "where"- let kw = (if DefaultEliminator `elem` dataOpts then "%elim" else "") ++ (if Codata `elem` dataOpts then "co" else "") ++ "data "- let n = show tyn_in ++ " "- let s = kw ++ n- let as = concat (intersperse " " $ map show args) ++ " "- let ns = concat (intersperse " -> " $ map ((\x -> "(" ++ x ++ " : Type)") . show) args)- let ss = concat (intersperse " -> " $ map (const "Type") args)- let fix1 = s ++ as ++ " = ..."- let fix2 = s ++ ": " ++ ns ++ " -> Type where\n ..."- let fix3 = s ++ ": " ++ ss ++ " -> Type where\n ..."- fail $ fixErrorMsg "unexpected \"where\"" [fix1, fix2, fix3]- cons <- sepBy1 (simpleConstructor syn) (reservedOp "|")- terminator- let conty = mkPApp fc (PRef fc [] tyn) (map (PRef fc []) args)- cons' <- mapM (\ (doc, argDocs, x, xfc, cargs, cfc, fs) ->- do let cty = bindArgs cargs conty- return (doc, argDocs, x, xfc, cty, cfc, fs)) cons- accData acc tyn (map (\ (_, _, n, _, _, _, _) -> n) cons')- return $ PData doc argDocs syn fc dataOpts (PDatadecl tyn nfc ty cons')))- <?> "data type declaration"- where- mkPApp :: FC -> PTerm -> [PTerm] -> PTerm- mkPApp fc t [] = t- mkPApp fc t xs = PApp fc t (map pexp xs)- bindArgs :: [PTerm] -> PTerm -> PTerm- bindArgs xs t = foldr (PPi expl (sMN 0 "_t") NoFC) t xs- combineDataOpts :: DataOpts -> DataOpts- combineDataOpts opts = if Codata `elem` opts- then delete DefaultEliminator opts- else opts---{- | Parses a type constructor declaration- Constructor ::= DocComment? FnName TypeSig;--}-constructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, FC, PTerm, FC, [Name])-constructor syn- = do (doc, argDocs) <- option noDocs docComment- (cn_in, nfc) <- fnName; fc <- getFC- let cn = expandNS syn cn_in- lchar ':'- fs <- option [] (do lchar '%'; reserved "erase"- sepBy1 (fst <$> name) (lchar ','))- ty <- typeExpr (allowImp syn)- ist <- get- let doc' = annotCode (tryFullExpr syn ist) doc- argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)- | (n, d) <- argDocs ]- return (doc', argDocs', cn, nfc, ty, fc, fs)- <?> "constructor"--{- | Parses a constructor for simple discriminated union data types- SimpleConstructor ::= FnName SimpleExpr* DocComment?--}-simpleConstructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, FC, [PTerm], FC, [Name])-simpleConstructor syn- = do (doc, _) <- option noDocs (try docComment)- ist <- get- let doc' = annotCode (tryFullExpr syn ist) doc- (cn_in, nfc) <- fnName- let cn = expandNS syn cn_in- fc <- getFC- args <- many (do notEndApp- simpleExpr syn)- return (doc', [], cn, nfc, args, fc, [])- <?> "constructor"--{- | Parses a dsl block declaration-DSL ::= 'dsl' FnName OpenBlock Overload'+ CloseBlock;- -}-dsl :: SyntaxInfo -> IdrisParser PDecl-dsl syn = do reservedHL "dsl"- n <- fst <$> fnName- bs <- indentedBlock (overload syn)- let dsl = mkDSL bs (dsl_info syn)- checkDSL dsl- i <- get- put (i { idris_dsls = addDef n dsl (idris_dsls i) })- return (PDSL n dsl)- <?> "dsl block declaration"- where mkDSL :: [(String, PTerm)] -> DSL -> DSL- mkDSL bs dsl = let var = lookup "variable" bs- first = lookup "index_first" bs- next = lookup "index_next" bs- leto = lookup "let" bs- lambda = lookup "lambda" bs- pi = lookup "pi" bs in- initDSL { dsl_var = var,- index_first = first,- index_next = next,- dsl_lambda = lambda,- dsl_let = leto,- dsl_pi = pi }--{- | Checks DSL for errors -}--- FIXME: currently does nothing, check if DSL is really sane------ Issue #1595 on the Issue Tracker------ https://github.com/idris-lang/Idris-dev/issues/1595----checkDSL :: DSL -> IdrisParser ()-checkDSL dsl = return ()--{- | Parses a DSL overload declaration-OverloadIdentifier ::= 'let' | Identifier;-Overload ::= OverloadIdentifier '=' Expr;--}-overload :: SyntaxInfo -> IdrisParser (String, PTerm)-overload syn = do (o, fc) <- identifier <|> do fc <- reservedFC "let"- return ("let", fc)- if o `notElem` overloadable- then fail $ show o ++ " is not an overloading"- else do- highlightP fc AnnKeyword- lchar '='- t <- expr syn- return (o, t)- <?> "dsl overload declaratioN"- where overloadable = ["let","lambda","pi","index_first","index_next","variable"]
@@ -1,1553 +0,0 @@-{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards, TupleSections #-}-module Idris.ParseExpr where--import Prelude hiding (pi)--import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err)-import Text.Parser.LookAhead-import Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi--import Idris.AbsSyntax-import Idris.ParseHelpers-import Idris.ParseOps-import Idris.DSL--import Idris.Core.TT--import Control.Applicative-import Control.Monad-import Control.Monad.State.Strict--import Data.Function (on)-import Data.Maybe-import qualified Data.List.Split as Spl-import Data.List-import Data.Monoid-import Data.Char-import qualified Data.HashSet as HS-import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8--import Debug.Trace---- | Allow implicit type declarations-allowImp :: SyntaxInfo -> SyntaxInfo-allowImp syn = syn { implicitAllowed = True }---- | Disallow implicit type declarations-disallowImp :: SyntaxInfo -> SyntaxInfo-disallowImp syn = syn { implicitAllowed = False }--{-| Parses an expression as a whole-@- FullExpr ::= Expr EOF_t;-@- -}-fullExpr :: SyntaxInfo -> IdrisParser PTerm-fullExpr syn = do x <- expr syn- eof- i <- get- return $ debindApp syn (desugar syn i x)--tryFullExpr :: SyntaxInfo -> IState -> String -> Either Err PTerm-tryFullExpr syn st input =- case runparser (fullExpr syn) st "" input of- Success tm -> Right tm- Failure e -> Left (Msg (show e))--{- | Parses an expression-@- Expr ::= Pi-@- -}-expr :: SyntaxInfo -> IdrisParser PTerm-expr = pi--{- | Parses an expression with possible operator applied-@- OpExpr ::= {- Expression Parser with Operators based on Expr' -};-@--}-opExpr :: SyntaxInfo -> IdrisParser PTerm-opExpr syn = do i <- get- buildExpressionParser (table (idris_infixes i)) (expr' syn)--{- | Parses either an internally defined expression or- a user-defined one-@-Expr' ::= "External (User-defined) Syntax"- | InternalExpr;-@- -}-expr' :: SyntaxInfo -> IdrisParser PTerm-expr' syn = try (externalExpr syn)- <|> internalExpr syn- <?> "expression"--{- | Parses a user-defined expression -}-externalExpr :: SyntaxInfo -> IdrisParser PTerm-externalExpr syn = do i <- get- (FC fn start _) <- getFC- expr <- extensions syn (syntaxRulesList $ syntax_rules i)- (FC _ _ end) <- getFC- let outerFC = FC fn start end- return (mapPTermFC (fixFC outerFC) (fixFCH fn outerFC) expr)- <?> "user-defined expression"- where -- Fix non-highlighting FCs by approximating with the span of the syntax application- fixFC outer inner | inner `fcIn` outer = inner- | otherwise = outer- -- Fix highlighting FCs by making them useless, to avoid spurious highlights- fixFCH fn outer inner | inner `fcIn` outer = inner- | otherwise = FileFC fn--{- | Parses a simple user-defined expression -}-simpleExternalExpr :: SyntaxInfo -> IdrisParser PTerm-simpleExternalExpr syn = do i <- get- extensions syn (filter isSimple (syntaxRulesList $ syntax_rules i))- where- isSimple (Rule (Expr x:xs) _ _) = False- isSimple (Rule (SimpleExpr x:xs) _ _) = False- isSimple (Rule [Keyword _] _ _) = True- isSimple (Rule [Symbol _] _ _) = True- isSimple (Rule (_:xs) _ _) = case last xs of- Keyword _ -> True- Symbol _ -> True- _ -> False- isSimple _ = False--{- | Tries to parse a user-defined expression given a list of syntactic extensions -}-extensions :: SyntaxInfo -> [Syntax] -> IdrisParser PTerm-extensions syn rules = extension syn [] (filter isValid rules)- <?> "user-defined expression"- where- isValid :: Syntax -> Bool- isValid (Rule _ _ AnySyntax) = True- isValid (Rule _ _ PatternSyntax) = inPattern syn- isValid (Rule _ _ TermSyntax) = not (inPattern syn)- isValid (DeclRule _ _) = False--data SynMatch = SynTm PTerm | SynBind FC Name -- ^ the FC is for highlighting information- deriving Show--extension :: SyntaxInfo -> [Maybe (Name, SynMatch)] -> [Syntax] -> IdrisParser PTerm-extension syn ns rules =- choice $ flip map (groupBy (ruleGroup `on` syntaxSymbols) rules) $ \rs ->- case head rs of -- can never be []- Rule (symb:_) _ _ -> try $ do- n <- extensionSymbol symb- extension syn (n : ns) [Rule ss t ctx | (Rule (_:ss) t ctx) <- rs]- -- If we have more than one Rule in this bucket, our grammar is- -- nondeterministic.- Rule [] ptm _ -> return (flatten (updateSynMatch (mapMaybe id ns) ptm))- where- ruleGroup [] [] = True- ruleGroup (s1:_) (s2:_) = s1 == s2- ruleGroup _ _ = False-- extensionSymbol :: SSymbol -> IdrisParser (Maybe (Name, SynMatch))- extensionSymbol (Keyword n) = do fc <- reservedFC (show n)- highlightP fc AnnKeyword- return Nothing- extensionSymbol (Expr n) = do tm <- expr syn- return $ Just (n, SynTm tm)- extensionSymbol (SimpleExpr n) = do tm <- simpleExpr syn- return $ Just (n, SynTm tm)- extensionSymbol (Binding n) = do (b, fc) <- name- return $ Just (n, SynBind fc b)- extensionSymbol (Symbol s) = do fc <- symbolFC s- highlightP fc AnnKeyword- return Nothing- - flatten :: PTerm -> PTerm -- flatten application- flatten (PApp fc (PApp _ f as) bs) = flatten (PApp fc f (as ++ bs))- flatten t = t--updateSynMatch = update- where- updateB :: [(Name, SynMatch)] -> (Name, FC) -> (Name, FC)- updateB ns (n, fc) = case lookup n ns of- Just (SynBind tfc t) -> (t, tfc)- _ -> (n, fc)-- update :: [(Name, SynMatch)] -> PTerm -> PTerm- update ns (PRef fc hls n) = case lookup n ns of- Just (SynTm t) -> t- _ -> PRef fc hls n- update ns (PPatvar fc n) = uncurry (flip PPatvar) $ updateB ns (n, fc)- update ns (PLam fc n nfc ty sc)- = let (n', nfc') = updateB ns (n, nfc)- in PLam fc n' nfc' (update ns ty) (update (dropn n ns) sc)- update ns (PPi p n fc ty sc)- = let (n', nfc') = updateB ns (n, fc)- in PPi (updTacImp ns p) n' nfc'- (update ns ty) (update (dropn n ns) sc)- update ns (PLet fc n nfc ty val sc)- = let (n', nfc') = updateB ns (n, nfc)- in PLet fc n' nfc' (update ns ty)- (update ns val) (update (dropn n ns) sc)- update ns (PApp fc t args)- = PApp fc (update ns t) (map (fmap (update ns)) args)- update ns (PAppBind fc t args)- = PAppBind fc (update ns t) (map (fmap (update ns)) args)- update ns (PMatchApp fc n) = let (n', nfc') = updateB ns (n, fc)- in PMatchApp nfc' n'- update ns (PIfThenElse fc c t f)- = PIfThenElse fc (update ns c) (update ns t) (update ns f)- update ns (PCase fc c opts)- = PCase fc (update ns c) (map (pmap (update ns)) opts)- update ns (PRewrite fc eq tm mty)- = PRewrite fc (update ns eq) (update ns tm) (fmap (update ns) mty)- update ns (PPair fc hls p l r) = PPair fc hls p (update ns l) (update ns r)- update ns (PDPair fc hls p l t r)- = PDPair fc hls p (update ns l) (update ns t) (update ns r)- update ns (PAs fc n t) = PAs fc (fst $ updateB ns (n, NoFC)) (update ns t)- update ns (PAlternative ms a as) = PAlternative ms a (map (update ns) as)- update ns (PHidden t) = PHidden (update ns t)- update ns (PGoal fc r n sc) = PGoal fc (update ns r) n (update ns sc)- update ns (PDoBlock ds) = PDoBlock $ map (upd ns) ds- where upd :: [(Name, SynMatch)] -> PDo -> PDo- upd ns (DoExp fc t) = DoExp fc (update ns t)- upd ns (DoBind fc n nfc t) = DoBind fc n nfc (update ns t)- upd ns (DoLet fc n nfc ty t) = DoLet fc n nfc (update ns ty) (update ns t)- upd ns (DoBindP fc i t ts)- = DoBindP fc (update ns i) (update ns t)- (map (\(l,r) -> (update ns l, update ns r)) ts)- upd ns (DoLetP fc i t) = DoLetP fc (update ns i) (update ns t)- update ns (PIdiom fc t) = PIdiom fc $ update ns t- update ns (PMetavar fc n) = uncurry (flip PMetavar) $ updateB ns (n, fc)- update ns (PProof tacs) = PProof $ map (updTactic ns) tacs- update ns (PTactics tacs) = PTactics $ map (updTactic ns) tacs- update ns (PDisamb nsps t) = PDisamb nsps $ update ns t- update ns (PUnifyLog t) = PUnifyLog $ update ns t- update ns (PNoImplicits t) = PNoImplicits $ update ns t- update ns (PQuasiquote tm mty) = PQuasiquote (update ns tm) (fmap (update ns) mty)- update ns (PUnquote t) = PUnquote $ update ns t- update ns (PQuoteName n res fc) = let (n', fc') = (updateB ns (n, fc))- in PQuoteName n' res fc'- update ns (PRunElab fc t nsp) = PRunElab fc (update ns t) nsp- update ns (PConstSugar fc t) = PConstSugar fc $ update ns t- -- PConstSugar probably can't contain anything substitutable, but it's hard to track- update ns t = t-- updTactic :: [(Name, SynMatch)] -> PTactic -> PTactic- -- handle all the ones with Names explicitly, then use fmap for the rest with PTerms- updTactic ns (Intro ns') = Intro $ map (fst . updateB ns . (, NoFC)) ns'- updTactic ns (Focus n) = Focus . fst $ updateB ns (n, NoFC)- updTactic ns (Refine n bs) = Refine (fst $ updateB ns (n, NoFC)) bs- updTactic ns (Claim n t) = Claim (fst $ updateB ns (n, NoFC)) (update ns t)- updTactic ns (MatchRefine n) = MatchRefine (fst $ updateB ns (n, NoFC))- updTactic ns (LetTac n t) = LetTac (fst $ updateB ns (n, NoFC)) (update ns t)- updTactic ns (LetTacTy n ty tm) = LetTacTy (fst $ updateB ns (n, NoFC)) (update ns ty) (update ns tm)- updTactic ns (ProofSearch rec prover depth top psns hints) = ProofSearch rec prover depth- (fmap (fst . updateB ns . (, NoFC)) top) (map (fst . updateB ns . (, NoFC)) psns) (map (fst . updateB ns . (, NoFC)) hints)- updTactic ns (Try l r) = Try (updTactic ns l) (updTactic ns r)- updTactic ns (TSeq l r) = TSeq (updTactic ns l) (updTactic ns r)- updTactic ns (GoalType s tac) = GoalType s $ updTactic ns tac- updTactic ns (TDocStr (Left n)) = TDocStr . Left . fst $ updateB ns (n, NoFC)- updTactic ns t = fmap (update ns) t-- updTacImp ns (TacImp o st scr) = TacImp o st (update ns scr)- updTacImp _ x = x- - dropn :: Name -> [(Name, a)] -> [(Name, a)]- dropn n [] = []- dropn n ((x,t) : xs) | n == x = xs- | otherwise = (x,t):dropn n xs---{- | Parses a (normal) built-in expression-@-InternalExpr ::=- UnifyLog- | RecordType- | SimpleExpr- | Lambda- | QuoteGoal- | Let- | If- | RewriteTerm- | CaseExpr- | DoBlock- | App- ;-@--}-internalExpr :: SyntaxInfo -> IdrisParser PTerm-internalExpr syn =- unifyLog syn- <|> runElab syn- <|> disamb syn- <|> noImplicits syn- <|> recordType syn- <|> if_ syn- <|> lambda syn- <|> quoteGoal syn- <|> let_ syn- <|> rewriteTerm syn- <|> doBlock syn- <|> caseExpr syn- <|> app syn- <?> "expression"--{- | Parses the "impossible" keyword-@-Impossible ::= 'impossible'-@--}-impossible :: IdrisParser PTerm-impossible = do fc <- reservedFC "impossible"- highlightP fc AnnKeyword- return PImpossible--{- | Parses a case expression-@-CaseExpr ::=- 'case' Expr 'of' OpenBlock CaseOption+ CloseBlock;-@--}-caseExpr :: SyntaxInfo -> IdrisParser PTerm-caseExpr syn = do kw1 <- reservedFC "case"; fc <- getFC- scr <- expr syn; kw2 <- reservedFC "of";- opts <- indentedBlock1 (caseOption syn)- highlightP kw1 AnnKeyword- highlightP kw2 AnnKeyword- return (PCase fc scr opts)- <?> "case expression"--{- | Parses a case in a case expression-@-CaseOption ::=- Expr (Impossible | '=>' Expr) Terminator- ;-@--}-caseOption :: SyntaxInfo -> IdrisParser (PTerm, PTerm)-caseOption syn = do lhs <- expr (syn { inPattern = True })- r <- impossible <|> symbol "=>" *> expr syn- return (lhs, r)- <?> "case option"--warnTacticDeprecation :: FC -> IdrisParser ()-warnTacticDeprecation fc =- do ist <- get- let cmdline = opt_cmdline (idris_options ist)- unless (NoOldTacticDeprecationWarnings `elem` cmdline) $- put ist { parserWarnings =- (fc, Msg "This style of tactic proof is deprecated. See %runElab for the replacement.") : parserWarnings ist }--{- | Parses a proof block-@-ProofExpr ::=- 'proof' OpenBlock Tactic'* CloseBlock- ;-@--}-proofExpr :: SyntaxInfo -> IdrisParser PTerm-proofExpr syn = do kw <- reservedFC "proof"- ts <- indentedBlock1 (tactic syn)- highlightP kw AnnKeyword- warnTacticDeprecation kw- return $ PProof ts- <?> "proof block"--{- | Parses a tactics block-@-TacticsExpr :=- 'tactics' OpenBlock Tactic'* CloseBlock-;-@--}-tacticsExpr :: SyntaxInfo -> IdrisParser PTerm-tacticsExpr syn = do kw <- reservedFC "tactics"- ts <- indentedBlock1 (tactic syn)- highlightP kw AnnKeyword- warnTacticDeprecation kw- return $ PTactics ts- <?> "tactics block"--{- | Parses a simple expression-@-SimpleExpr ::=- {- External (User-defined) Simple Expression -}- | '?' Name- | % 'instance'- | 'Refl' ('{' Expr '}')?- | ProofExpr- | TacticsExpr- | FnName- | Idiom- | List- | Alt- | Bracketed- | Constant- | Type- | 'Void'- | Quasiquote- | NameQuote- | Unquote- | '_'- ;-@--}-simpleExpr :: SyntaxInfo -> IdrisParser PTerm-simpleExpr syn =- try (simpleExternalExpr syn)- <|> do (x, FC f (l, c) end) <- try (lchar '?' *> name)- return (PMetavar (FC f (l, c-1) end) x)- <|> do lchar '%'; fc <- getFC; reserved "instance"; return (PResolveTC fc)- <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t))- <|> proofExpr syn- <|> tacticsExpr syn- <|> try (do reserved "Type"; symbol "*"; return $ PUniverse AllTypes)- <|> do reserved "AnyType"; return $ PUniverse AllTypes- <|> PType <$> reservedFC "Type"- <|> do reserved "UniqueType"; return $ PUniverse UniqueType- <|> do reserved "NullType"; return $ PUniverse NullType- <|> do (c, cfc) <- constant- fc <- getFC- return (modifyConst syn fc (PConstant cfc c))- <|> do symbol "'"; fc <- getFC; str <- fst <$> name- return (PApp fc (PRef fc [] (sUN "Symbol_"))- [pexp (PConstant NoFC (Str (show str)))])- <|> do (x, fc) <- fnName- if inPattern syn- then option (PRef fc [fc] x)- (do reservedOp "@"- s <- simpleExpr syn- fcIn <- getFC- return (PAs fcIn x s))- else return (PRef fc [fc] x)- <|> idiom syn- <|> listExpr syn- <|> alt syn- <|> do reservedOp "!"- s <- simpleExpr syn- fc <- getFC- return (PAppBind fc s [])- <|> bracketed (disallowImp syn)- <|> quasiquote syn- <|> namequote syn- <|> unquote syn- <|> do lchar '_'; return Placeholder- <?> "expression"--{- |Parses an expression in braces-@-Bracketed ::= '(' Bracketed'-@- -}-bracketed :: SyntaxInfo -> IdrisParser PTerm-bracketed syn = do (FC fn (sl, sc) _) <- getFC- lchar '(' <?> "parenthesized expression"- bracketed' (FC fn (sl, sc) (sl, sc+1)) syn-{- |Parses the rest of an expression in braces-@-Bracketed' ::=- ')'- | Expr ')'- | ExprList ')'- | Expr '**' Expr ')'- | Operator Expr ')'- | Expr Operator ')'- | Name ':' Expr '**' Expr ')'- ;-@--}-bracketed' :: FC -> SyntaxInfo -> IdrisParser PTerm-bracketed' open syn =- do (FC f start (l, c)) <- getFC- lchar ')'- return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm- <|> try (do (ln, lnfc) <- name- colonFC <- lcharFC ':'- lty <- expr syn- starsFC <- reservedOpFC "**"- fc <- getFC- r <- expr syn- close <- lcharFC ')'- return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r))- <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'- -- No prefix operators! (bit of a hack here...)- if (o == "-" || o == "!")- then fail "minus not allowed in section"- else return $ PLam fc (sMN 1000 "ARG") NoFC Placeholder- (PApp fc (PRef fc [] (sUN o)) [pexp (PRef fc [] (sMN 1000 "ARG")),- pexp e]))- <|> try (do l <- simpleExpr syn- op <- option Nothing (do o <- operator- lchar ')'- return (Just o)) - fc0 <- getFC- case op of- Nothing -> bracketedExpr syn open l- Just o -> return $ PLam fc0 (sMN 1000 "ARG") NoFC Placeholder- (PApp fc0 (PRef fc0 [] (sUN o)) [pexp l,- pexp (PRef fc0 [] (sMN 1000 "ARG"))]))- <|> do l <- expr syn- bracketedExpr syn open l---- | Parse the contents of parentheses, after an expression has been parsed.-bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm-bracketedExpr syn openParenFC e =- do lchar ')'; return e- <|> do exprs <- many (do comma <- lcharFC ','- r <- expr syn- return (r, comma))- closeParenFC <- lcharFC ')'- let hilite = [openParenFC, closeParenFC] ++ map snd exprs- return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)- <|> do starsFC <- reservedOpFC "**"- r <- expr syn- closeParenFC <- lcharFC ')'- return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r)- <?> "end of bracketed expression"- where mergePairs :: [(PTerm, FC)] -> PTerm- mergePairs [(t, fc)] = t- mergePairs ((t, fc):rs) = PPair fc [] TypeOrTerm t (mergePairs rs)---- bit of a hack here. If the integer doesn't fit in an Int, treat it as a--- big integer, otherwise try fromInteger and the constants as alternatives.--- a better solution would be to fix fromInteger to work with Integer, as the--- name suggests, rather than Int-{-| Finds optimal type for integer constant -}-modifyConst :: SyntaxInfo -> FC -> PTerm -> PTerm-modifyConst syn fc (PConstant inFC (BI x))- | not (inPattern syn)- = PConstSugar inFC $ -- wrap in original location for highlighting- PAlternative [] FirstSuccess- (PApp fc (PRef fc [] (sUN "fromInteger")) [pexp (PConstant NoFC (BI (fromInteger x)))]- : consts)- | otherwise = PConstSugar inFC $- PAlternative [] FirstSuccess consts- where- consts = [ PConstant inFC (BI x)- , PConstant inFC (I (fromInteger x))- , PConstant inFC (B8 (fromInteger x))- , PConstant inFC (B16 (fromInteger x))- , PConstant inFC (B32 (fromInteger x))- , PConstant inFC (B64 (fromInteger x))- ]-modifyConst syn fc x = x--{- | Parses an alternative expression-@- Alt ::= '(|' Expr_List '|)';-- Expr_List ::=- Expr'- | Expr' ',' Expr_List- ;-@--}-alt :: SyntaxInfo -> IdrisParser PTerm-alt syn = do symbol "(|"; alts <- sepBy1 (expr' syn) (lchar ','); symbol "|)"- return (PAlternative [] FirstSuccess alts)--{- | Parses a possibly hidden simple expression-@-HSimpleExpr ::=- '.' SimpleExpr- | SimpleExpr- ;-@--}-hsimpleExpr :: SyntaxInfo -> IdrisParser PTerm-hsimpleExpr syn =- do lchar '.'- e <- simpleExpr syn- return $ PHidden e- <|> simpleExpr syn- <?> "expression"--{- | Parses a unification log expression-UnifyLog ::=- '%' 'unifyLog' SimpleExpr- ;--}-unifyLog :: SyntaxInfo -> IdrisParser PTerm-unifyLog syn = do (FC fn (sl, sc) kwEnd) <- try (lchar '%' *> reservedFC "unifyLog")- tm <- simpleExpr syn- highlightP (FC fn (sl, sc-1) kwEnd) AnnKeyword- return (PUnifyLog tm)- <?> "unification log expression"--{- | Parses a new-style tactics expression-RunTactics ::=- '%' 'runElab' SimpleExpr- ;--}-runElab :: SyntaxInfo -> IdrisParser PTerm-runElab syn = do (FC fn (sl, sc) kwEnd) <- try (lchar '%' *> reservedFC "runElab")- fc <- getFC- tm <- simpleExpr syn- highlightP (FC fn (sl, sc-1) kwEnd) AnnKeyword- return $ PRunElab fc tm (syn_namespace syn)- <?> "new-style tactics expression"--{- | Parses a disambiguation expression -Disamb ::=- '%' 'disamb' NameList Expr- ;--}-disamb :: SyntaxInfo -> IdrisParser PTerm-disamb syn = do kw <- reservedFC "with"- ns <- sepBy1 (fst <$> name) (lchar ',')- tm <- expr' syn- highlightP kw AnnKeyword- return (PDisamb (map tons ns) tm)- <?> "namespace disambiguation expression"- where tons (NS n s) = txt (show n) : s- tons n = [txt (show n)]-{- | Parses a no implicits expression-@-NoImplicits ::=- '%' 'noImplicits' SimpleExpr- ;-@--}-noImplicits :: SyntaxInfo -> IdrisParser PTerm-noImplicits syn = do try (lchar '%' *> reserved "noImplicits")- tm <- simpleExpr syn- return (PNoImplicits tm)- <?> "no implicits expression"--{- | Parses a function application expression-@-App ::=- 'mkForeign' Arg Arg*- | MatchApp- | SimpleExpr Arg*- ;-MatchApp ::=- SimpleExpr '<==' FnName- ;-@--}-app :: SyntaxInfo -> IdrisParser PTerm-app syn = do f <- simpleExpr syn- (do try $ reservedOp "<=="- fc <- getFC- ff <- fst <$> fnName- return (PLet fc (sMN 0 "match") NoFC- f- (PMatchApp fc ff)- (PRef fc [] (sMN 0 "match")))- <?> "matching application expression") <|> (do- fc <- getFC- i <- get- args <- many (do notEndApp; arg syn)- case args of- [] -> return f- _ -> return (flattenFromInt fc f args))- <?> "function application"- where- -- bit of a hack to deal with the situation where we're applying a- -- literal to an argument, which we may want for obscure applications- -- of fromInteger, and this will help disambiguate better.- -- We know, at least, it won't be one of the constants!- flattenFromInt fc (PAlternative _ x alts) args- | Just i <- getFromInt alts- = PApp fc (PRef fc [] (sUN "fromInteger")) (i : args)- flattenFromInt fc f args = PApp fc f args-- getFromInt ((PApp _ (PRef _ _ n) [a]) : _) | n == sUN "fromInteger" = Just a- getFromInt (_ : xs) = getFromInt xs- getFromInt _ = Nothing--{-| Parses a function argument-@-Arg ::=- ImplicitArg- | ConstraintArg- | SimpleExpr- ;-@--}-arg :: SyntaxInfo -> IdrisParser PArg-arg syn = implicitArg syn- <|> constraintArg syn- <|> do e <- simpleExpr syn- return (pexp e)- <?> "function argument"--{-| Parses an implicit function argument-@-ImplicitArg ::=- '{' Name ('=' Expr)? '}'- ;-@--}-implicitArg :: SyntaxInfo -> IdrisParser PArg-implicitArg syn = do lchar '{'- (n, nfc) <- name- fc <- getFC- v <- option (PRef nfc [nfc] n) (do lchar '='- expr syn)- lchar '}'- return (pimp n v True)- <?> "implicit function argument"--{-| Parses a constraint argument (for selecting a named type class instance)--> ConstraintArg ::=-> '@{' Expr '}'-> ;---}-constraintArg :: SyntaxInfo -> IdrisParser PArg-constraintArg syn = do symbol "@{"- e <- expr syn- symbol "}"- return (pconst e)- <?> "constraint argument"--{-| Parses a quasiquote expression (for building reflected terms using the elaborator)--> Quasiquote ::= '`(' Expr ')'---}-quasiquote :: SyntaxInfo -> IdrisParser PTerm-quasiquote syn = do startFC <- symbolFC "`("- e <- expr syn { syn_in_quasiquote = (syn_in_quasiquote syn) + 1 ,- inPattern = False }- g <- optional $- do fc <- symbolFC ":"- ty <- expr syn { inPattern = False } -- don't allow antiquotes- return (ty, fc)- endFC <- symbolFC ")"- mapM_ (uncurry highlightP) [(startFC, AnnKeyword), (endFC, AnnKeyword), (spanFC startFC endFC, AnnQuasiquote)]- case g of- Just (_, fc) -> highlightP fc AnnKeyword- _ -> return ()- return $ PQuasiquote e (fst <$> g)- <?> "quasiquotation"--{-| Parses an unquoting inside a quasiquotation (for building reflected terms using the elaborator)--> Unquote ::= ',' Expr---}-unquote :: SyntaxInfo -> IdrisParser PTerm-unquote syn = do guard (syn_in_quasiquote syn > 0)- startFC <- symbolFC "~"- e <- simpleExpr syn { syn_in_quasiquote = syn_in_quasiquote syn - 1 }- endFC <- getFC- highlightP startFC AnnKeyword- highlightP (spanFC startFC endFC) AnnAntiquote- return $ PUnquote e- <?> "unquotation"--{-| Parses a quotation of a name (for using the elaborator to resolve boring details)--> NameQuote ::= '`{' Name '}'---}-namequote :: SyntaxInfo -> IdrisParser PTerm-namequote syn = do (startFC, res) <-- try (do fc <- symbolFC "`{{"- return (fc, False)) <|>- (do fc <- symbolFC "`{"- return (fc, True))- (n, nfc) <- fnName- endFC <- if res then symbolFC "}" else symbolFC "}}"- mapM_ (uncurry highlightP)- [ (startFC, AnnKeyword)- , (endFC, AnnKeyword)- , (spanFC startFC endFC, AnnQuasiquote)- ]- return $ PQuoteName n res nfc- <?> "quoted name"---{-| Parses a record field setter expression-@-RecordType ::=- 'record' '{' FieldTypeList '}';-@-@-FieldTypeList ::=- FieldType- | FieldType ',' FieldTypeList- ;-@-@-FieldType ::=- FnName '=' Expr- ;-@--}-recordType :: SyntaxInfo -> IdrisParser PTerm-recordType syn =- do kw <- reservedFC "record"- lchar '{'- fgs <- fieldGetOrSet- lchar '}'- fc <- getFC- rec <- optional (simpleExpr syn)- highlightP kw AnnKeyword- case fgs of- Left fields ->- case rec of- Nothing ->- return (PLam fc (sMN 0 "fldx") NoFC Placeholder- (applyAll fc fields (PRef fc [] (sMN 0 "fldx"))))- Just v -> return (applyAll fc fields v)- Right fields ->- case rec of- Nothing ->- return (PLam fc (sMN 0 "fldx") NoFC Placeholder- (getAll fc (reverse fields)- (PRef fc [] (sMN 0 "fldx"))))- Just v -> return (getAll fc (reverse fields) v)-- <?> "record setting expression"- where fieldSet :: IdrisParser ([Name], PTerm)- fieldSet = do ns <- fieldGet- lchar '='- e <- expr syn- return (ns, e)- <?> "field setter"-- fieldGet :: IdrisParser [Name]- fieldGet = sepBy1 (fst <$> fnName) (symbol "->")-- fieldGetOrSet :: IdrisParser (Either [([Name], PTerm)] [Name])- fieldGetOrSet = try (do fs <- sepBy1 fieldSet (lchar ',')- return (Left fs))- <|> do f <- fieldGet- return (Right f)-- applyAll :: FC -> [([Name], PTerm)] -> PTerm -> PTerm- applyAll fc [] x = x- applyAll fc ((ns, e) : es) x- = applyAll fc es (doUpdate fc ns e x)-- doUpdate fc [n] e get- = PApp fc (PRef fc [] (mkType n)) [pexp e, pexp get]- doUpdate fc (n : ns) e get- = PApp fc (PRef fc [] (mkType n))- [pexp (doUpdate fc ns e (PApp fc (PRef fc [] n) [pexp get])),- pexp get]-- getAll :: FC -> [Name] -> PTerm -> PTerm- getAll fc [n] e = PApp fc (PRef fc [] n) [pexp e]- getAll fc (n:ns) e = PApp fc (PRef fc [] n) [pexp (getAll fc ns e)]----- | Creates setters for record types on necessary functions-mkType :: Name -> Name-mkType (UN n) = sUN ("set_" ++ str n)-mkType (MN 0 n) = sMN 0 ("set_" ++ str n)-mkType (NS n s) = NS (mkType n) s--{- | Parses a type signature-@-TypeSig ::=- ':' Expr- ;-@-@-TypeExpr ::= ConstraintList? Expr;-@- -}-typeExpr :: SyntaxInfo -> IdrisParser PTerm-typeExpr syn = do cs <- if implicitAllowed syn then constraintList syn else return []- sc <- expr syn- return (bindList (PPi constraint) cs sc)- <?> "type signature"--{- | Parses a lambda expression-@-Lambda ::=- '\\' TypeOptDeclList LambdaTail- | '\\' SimpleExprList LambdaTail- ;-@-@-SimpleExprList ::=- SimpleExpr- | SimpleExpr ',' SimpleExprList- ;-@-@-LambdaTail ::=- Impossible- | '=>' Expr-@--}-lambda :: SyntaxInfo -> IdrisParser PTerm-lambda syn = do lchar '\\' <?> "lambda expression"- ((do xt <- try $ tyOptDeclList syn- fc <- getFC- sc <- lambdaTail- return (bindList (PLam fc) xt sc))- <|>- (do ps <- sepBy (do fc <- getFC- e <- simpleExpr (syn { inPattern = True })- return (fc, e))- (lchar ',')- sc <- lambdaTail- return (pmList (zip [0..] ps) sc)))- <?> "lambda expression"- where pmList :: [(Int, (FC, PTerm))] -> PTerm -> PTerm- pmList [] sc = sc- pmList ((i, (fc, x)) : xs) sc- = PLam fc (sMN i "lamp") NoFC Placeholder- (PCase fc (PRef fc [] (sMN i "lamp"))- [(x, pmList xs sc)])- lambdaTail :: IdrisParser PTerm- lambdaTail = impossible <|> symbol "=>" *> expr syn--{- | Parses a term rewrite expression-@-RewriteTerm ::=- 'rewrite' Expr ('==>' Expr)? 'in' Expr- ;-@--}-rewriteTerm :: SyntaxInfo -> IdrisParser PTerm-rewriteTerm syn = do kw <- reservedFC "rewrite"- fc <- getFC- prf <- expr syn- giving <- optional (do symbol "==>"; expr' syn)- kw' <- reservedFC "in"; sc <- expr syn- highlightP kw AnnKeyword- highlightP kw' AnnKeyword- return (PRewrite fc- (PApp fc (PRef fc [] (sUN "sym")) [pexp prf]) sc- giving)- <?> "term rewrite expression"--{- |Parses a let binding-@-Let ::=- 'let' Name TypeSig'? '=' Expr 'in' Expr-| 'let' Expr' '=' Expr' 'in' Expr--TypeSig' ::=- ':' Expr'- ;-@- -}-let_ :: SyntaxInfo -> IdrisParser PTerm-let_ syn = try (do kw <- reservedFC "let"- ls <- indentedBlock (let_binding syn)- kw' <- reservedFC "in"; sc <- expr syn- highlightP kw AnnKeyword; highlightP kw' AnnKeyword- return (buildLets ls sc))- <?> "let binding"- where buildLets [] sc = sc- buildLets ((fc, PRef nfc _ n, ty, v, []) : ls) sc- = PLet fc n nfc ty v (buildLets ls sc)- buildLets ((fc, pat, ty, v, alts) : ls) sc- = PCase fc v ((pat, buildLets ls sc) : alts)--let_binding syn = do fc <- getFC;- pat <- expr' (syn { inPattern = True })- ty <- option Placeholder (do lchar ':'; expr' syn)- lchar '='- v <- expr syn- ts <- option [] (do lchar '|'- sepBy1 (do_alt syn) (lchar '|'))- return (fc,pat,ty,v,ts)--{- | Parses a conditional expression-@-If ::= 'if' Expr 'then' Expr 'else' Expr-@---}-if_ :: SyntaxInfo -> IdrisParser PTerm-if_ syn = (do ifFC <- reservedFC "if"- fc <- getFC- c <- expr syn- thenFC <- reservedFC "then"- t <- expr syn- elseFC <- reservedFC "else"- f <- expr syn- mapM_ (flip highlightP AnnKeyword) [ifFC, thenFC, elseFC]- return (PIfThenElse fc c t f))- <?> "conditional expression"---{- | Parses a quote goal--@-QuoteGoal ::=- 'quoteGoal' Name 'by' Expr 'in' Expr- ;-@- -}-quoteGoal :: SyntaxInfo -> IdrisParser PTerm-quoteGoal syn = do kw1 <- reservedFC "quoteGoal"; n <- fst <$> name;- kw2 <- reservedFC "by"- r <- expr syn- kw3 <- reservedFC "in"- fc <- getFC- sc <- expr syn- mapM_ (flip highlightP AnnKeyword) [kw1, kw2, kw3]- return (PGoal fc r n sc)- <?> "quote goal expression"--{- | Parses a dependent type signature--@-Pi ::= PiOpts Static? Pi'-@--@-Pi' ::=- OpExpr ('->' Pi)?- | '(' TypeDeclList ')' '->' Pi- | '{' TypeDeclList '}' '->' Pi- | '{' 'auto' TypeDeclList '}' '->' Pi- | '{' 'default' SimpleExpr TypeDeclList '}' '->' Pi- ;-@- -}--bindsymbol opts st syn - = do symbol "->"- return (Exp opts st False)--explicitPi opts st syn- = do xt <- try (lchar '(' *> typeDeclList syn <* lchar ')')- binder <- bindsymbol opts st syn- sc <- expr syn- return (bindList (PPi binder) xt sc)- -autoImplicit opts st syn- = do kw <- reservedFC "auto"- when (st == Static) $ fail "auto implicits can not be static"- xt <- typeDeclList syn- lchar '}'- symbol "->"- sc <- expr syn- highlightP kw AnnKeyword- return (bindList (PPi- (TacImp [] Dynamic (PTactics [ProofSearch True True 100 Nothing [] []]))) xt sc) --defaultImplicit opts st syn = do- kw <- reservedFC "default"- when (st == Static) $ fail "default implicits can not be static"- ist <- get- script' <- simpleExpr syn- let script = debindApp syn . desugar syn ist $ script'- xt <- typeDeclList syn- lchar '}'- symbol "->"- sc <- expr syn- highlightP kw AnnKeyword- return (bindList (PPi (TacImp [] Dynamic script)) xt sc)--normalImplicit opts st syn = do- xt <- typeDeclList syn <* lchar '}'- symbol "->"- cs <- constraintList syn- sc <- expr syn- let (im,cl)- = if implicitAllowed syn- then (Imp opts st False (Just (Impl False True)),- constraint)- else (Imp opts st False (Just (Impl False False)),- Imp opts st False (Just (Impl True False)))- return (bindList (PPi im) xt - (bindList (PPi cl) cs sc))--implicitPi opts st syn =- autoImplicit opts st syn- <|> defaultImplicit opts st syn- <|> normalImplicit opts st syn--unboundPi opts st syn = do- x <- opExpr syn- (do binder <- bindsymbol opts st syn- sc <- expr syn- return (PPi binder (sUN "__pi_arg") NoFC x sc))- <|> return x--pi :: SyntaxInfo -> IdrisParser PTerm-pi syn =- do opts <- piOpts syn- st <- static- explicitPi opts st syn- <|> try (do lchar '{'; implicitPi opts st syn)- <|> unboundPi opts st syn- <?> "dependent type signature"--{- | Parses Possible Options for Pi Expressions-@- PiOpts ::= '.'?-@--}-piOpts :: SyntaxInfo -> IdrisParser [ArgOpt]-piOpts syn | implicitAllowed syn =- lchar '.' *> return [InaccessibleArg]- <|> return []-piOpts syn = return []--{- | Parses a type constraint list--@-ConstraintList ::=- '(' Expr_List ')' '=>'- | Expr '=>'- ;-@--}-constraintList :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]-constraintList syn = try (constraintList1 syn)- <|> return []--constraintList1 :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]-constraintList1 syn = try (do lchar '('- tys <- sepBy1 nexpr (lchar ',')- lchar ')'- reservedOp "=>"- return tys)- <|> try (do t <- opExpr (disallowImp syn)- reservedOp "=>"- return [(defname, NoFC, t)])- <?> "type constraint list"- where nexpr = try (do (n, fc) <- name; lchar ':'- e <- expr syn- return (n, fc, e))- <|> do e <- expr syn- return (defname, NoFC, e)- defname = sMN 0 "constraint"--{- | Parses a type declaration list-@-TypeDeclList ::=- FunctionSignatureList- | NameList TypeSig- ;-@--@-FunctionSignatureList ::=- Name TypeSig- | Name TypeSig ',' FunctionSignatureList- ;-@--}-typeDeclList :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]-typeDeclList syn = try (sepBy1 (do (x, xfc) <- fnName- lchar ':'- t <- typeExpr (disallowImp syn)- return (x, xfc, t))- (lchar ','))- <|> do ns <- sepBy1 name (lchar ',')- lchar ':'- t <- typeExpr (disallowImp syn)- return (map (\(x, xfc) -> (x, xfc, t)) ns)- <?> "type declaration list"--{- | Parses a type declaration list with optional parameters-@-TypeOptDeclList ::=- NameOrPlaceholder TypeSig?- | NameOrPlaceholder TypeSig? ',' TypeOptDeclList- ;-@--@-NameOrPlaceHolder ::= Name | '_';-@--}-tyOptDeclList :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]-tyOptDeclList syn = sepBy1 (do (x, fc) <- nameOrPlaceholder- t <- option Placeholder (do lchar ':'- expr syn)- return (x, fc, t))- (lchar ',')- <?> "type declaration list"- where nameOrPlaceholder :: IdrisParser (Name, FC)- nameOrPlaceholder = fnName- <|> do symbol "_"- return (sMN 0 "underscore", NoFC)- <?> "name or placeholder"--{- | Parses a list literal expression e.g. [1,2,3] or a comprehension [ (x, y) | x <- xs , y <- ys ]-@-ListExpr ::=- '[' ']'- | '[' Expr '|' DoList ']'- | '[' ExprList ']'-;-@-@-DoList ::=- Do- | Do ',' DoList- ;-@-@-ExprList ::=- Expr- | Expr ',' ExprList- ;-@- -}-listExpr :: SyntaxInfo -> IdrisParser PTerm-listExpr syn = do (FC f (l, c) _) <- getFC- lchar '['; fc <- getFC;- (try . token $ do (char ']' <?> "end of list expression")- (FC _ _ (l', c')) <- getFC- return (mkNil (FC f (l, c) (l', c'))))- <|> (do x <- expr syn <?> "expression"- (do try (lchar '|') <?> "list comprehension"- qs <- sepBy1 (do_ syn) (lchar ',')- lchar ']'- return (PDoBlock (map addGuard qs ++- [DoExp fc (PApp fc (PRef fc [] (sUN "return"))- [pexp x])]))) <|>- (do xs <- many (do (FC fn (sl, sc) _) <- getFC- lchar ',' <?> "list element"- let commaFC = FC fn (sl, sc) (sl, sc + 1)- elt <- expr syn- return (elt, commaFC))- (FC fn (sl, sc) _) <- getFC- lchar ']' <?> "end of list expression"- let rbrackFC = FC fn (sl, sc) (sl, sc+1)- return (mkList fc rbrackFC ((x, (FC f (l, c) (l, c+1))) : xs))))- <?> "list expression"- where- mkNil :: FC -> PTerm- mkNil fc = PRef fc [fc] (sUN "Nil")- mkList :: FC -> FC -> [(PTerm, FC)] -> PTerm- mkList errFC nilFC [] = PRef nilFC [nilFC] (sUN "Nil")- mkList errFC nilFC ((x, fc) : xs) = PApp errFC (PRef fc [fc] (sUN "::")) [pexp x, pexp (mkList errFC nilFC xs)]- addGuard :: PDo -> PDo- addGuard (DoExp fc e) = DoExp fc (PApp fc (PRef fc [] (sUN "guard"))- [pexp e])- addGuard x = x--{- | Parses a do-block-@-Do' ::= Do KeepTerminator;-@--@-DoBlock ::=- 'do' OpenBlock Do'+ CloseBlock- ;-@- -}-doBlock :: SyntaxInfo -> IdrisParser PTerm-doBlock syn- = do kw <- reservedFC "do"- ds <- indentedBlock1 (do_ syn)- highlightP kw AnnKeyword- return (PDoBlock ds)- <?> "do block"--{- | Parses an expression inside a do block-@-Do ::=- 'let' Name TypeSig'? '=' Expr- | 'let' Expr' '=' Expr- | Name '<-' Expr- | Expr' '<-' Expr- | Expr- ;-@--}-do_ :: SyntaxInfo -> IdrisParser PDo-do_ syn- = try (do kw <- reservedFC "let"- (i, ifc) <- name- ty <- option Placeholder (do lchar ':'- expr' syn)- reservedOp "="- fc <- getFC- e <- expr syn- highlightP kw AnnKeyword- return (DoLet fc i ifc ty e))- <|> try (do kw <- reservedFC "let"- i <- expr' syn- reservedOp "="- fc <- getFC- sc <- expr syn- highlightP kw AnnKeyword- return (DoLetP fc i sc))- <|> try (do (i, ifc) <- name- symbol "<-"- fc <- getFC- e <- expr syn;- option (DoBind fc i ifc e)- (do lchar '|'- ts <- sepBy1 (do_alt syn) (lchar '|')- return (DoBindP fc (PRef ifc [ifc] i) e ts)))- <|> try (do i <- expr' syn- symbol "<-"- fc <- getFC- e <- expr syn;- option (DoBindP fc i e [])- (do lchar '|'- ts <- sepBy1 (do_alt syn) (lchar '|')- return (DoBindP fc i e ts)))- <|> do e <- expr syn- fc <- getFC- return (DoExp fc e)- <?> "do block expression"--do_alt syn = do l <- expr' syn- option (Placeholder, l)- (do symbol "=>"- r <- expr' syn- return (l, r))--{- | Parses an expression in idiom brackets-@-Idiom ::= '[|' Expr '|]';-@--}-idiom :: SyntaxInfo -> IdrisParser PTerm-idiom syn- = do symbol "[|"- fc <- getFC- e <- expr syn- symbol "|]"- return (PIdiom fc e)- <?> "expression in idiom brackets"--{- |Parses a constant or literal expression--@-Constant ::=- 'Integer'- | 'Int'- | 'Char'- | 'Double'- | 'String'- | 'Bits8'- | 'Bits16'- | 'Bits32'- | 'Bits64'- | Float_t- | Natural_t- | VerbatimString_t- | String_t- | Char_t- ;-@--}--constants :: [(String, Idris.Core.TT.Const)]-constants =- [ ("Integer", AType (ATInt ITBig))- , ("Int", AType (ATInt ITNative))- , ("Char", AType (ATInt ITChar))- , ("Double", AType ATFloat)- , ("String", StrType)- , ("prim__WorldType", WorldType)- , ("prim__TheWorld", TheWorld)- , ("Bits8", AType (ATInt (ITFixed IT8)))- , ("Bits16", AType (ATInt (ITFixed IT16)))- , ("Bits32", AType (ATInt (ITFixed IT32)))- , ("Bits64", AType (ATInt (ITFixed IT64)))- ]---- | Parse a constant and its source span-constant :: IdrisParser (Idris.Core.TT.Const, FC)-constant = choice [ do fc <- reservedFC name; return (ty, fc)- | (name, ty) <- constants- ]- <|> do (f, fc) <- try float; return (Fl f, fc)- <|> do (i, fc) <- natural; return (BI i, fc)- <|> do (s, fc) <- verbatimStringLiteral; return (Str s, fc)- <|> do (s, fc) <- stringLiteral; return (Str s, fc)- <|> do (c, fc) <- try charLiteral; return (Ch c, fc) --Currently ambigous with symbols- <?> "constant or literal"--{- | Parses a verbatim multi-line string literal (triple-quoted)--@-VerbatimString_t ::=- '\"\"\"' ~'\"\"\"' '\"\"\"'-;-@- -}-verbatimStringLiteral :: MonadicParsing m => m (String, FC)-verbatimStringLiteral = token $ do (FC f start _) <- getFC- try $ string "\"\"\""- str <- manyTill anyChar $ try (string "\"\"\"")- (FC _ _ end) <- getFC- return (str, FC f start end)--{- | Parses a static modifier--@-Static ::=- '[' static ']'-;-@--}-static :: IdrisParser Static-static = do reserved "[static]"; return Static- <|> return Dynamic- <?> "static modifier"--{- | Parses a tactic script--@-Tactic ::= 'intro' NameList?- | 'intros'- | 'refine' Name Imp+- | 'mrefine' Name- | 'rewrite' Expr- | 'induction' Expr- | 'equiv' Expr- | 'let' Name ':' Expr' '=' Expr- | 'let' Name '=' Expr- | 'focus' Name- | 'exact' Expr- | 'applyTactic' Expr- | 'reflect' Expr- | 'fill' Expr- | 'try' Tactic '|' Tactic- | '{' TacticSeq '}'- | 'compute'- | 'trivial'- | 'solve'- | 'attack'- | 'state'- | 'term'- | 'undo'- | 'qed'- | 'abandon'- | ':' 'q'- ;--Imp ::= '?' | '_';--TacticSeq ::=- Tactic ';' Tactic- | Tactic ';' TacticSeq- ;-@--}---- | A specification of the arguments that tactics can take-data TacticArg = NameTArg -- ^ Names: n1, n2, n3, ... n- | ExprTArg- | AltsTArg- | StringLitTArg---- The FIXMEs are Issue #1766 in the issue tracker.--- https://github.com/idris-lang/Idris-dev/issues/1766--- | A list of available tactics and their argument requirements-tactics :: [([String], Maybe TacticArg, SyntaxInfo -> IdrisParser PTactic)]-tactics = - [ (["intro"], Nothing, const $ -- FIXME syntax for intro (fresh name)- do ns <- sepBy (spaced (fst <$> name)) (lchar ','); return $ Intro ns)- , noArgs ["intros"] Intros- , noArgs ["unfocus"] Unfocus- , (["refine"], Just ExprTArg, const $- do n <- spaced (fst <$> fnName)- imps <- many imp- return $ Refine n imps)- , (["claim"], Nothing, \syn ->- do n <- indentPropHolds gtProp *> (fst <$> name)- goal <- indentPropHolds gtProp *> expr syn- return $ Claim n goal)- , (["mrefine"], Just ExprTArg, const $- do n <- spaced (fst <$> fnName)- return $ MatchRefine n)- , expressionTactic ["rewrite"] Rewrite- , expressionTactic ["case"] CaseTac- , expressionTactic ["induction"] Induction- , expressionTactic ["equiv"] Equiv- , (["let"], Nothing, \syn -> -- FIXME syntax for let- do n <- (indentPropHolds gtProp *> (fst <$> name))- (do indentPropHolds gtProp *> lchar ':'- ty <- indentPropHolds gtProp *> expr' syn- indentPropHolds gtProp *> lchar '='- t <- indentPropHolds gtProp *> expr syn- i <- get- return $ LetTacTy n (desugar syn i ty) (desugar syn i t))- <|> (do indentPropHolds gtProp *> lchar '='- t <- indentPropHolds gtProp *> expr syn- i <- get- return $ LetTac n (desugar syn i t)))-- , (["focus"], Just ExprTArg, const $- do n <- spaced (fst <$> name)- return $ Focus n)- , expressionTactic ["exact"] Exact- , expressionTactic ["applyTactic"] ApplyTactic- , expressionTactic ["byReflection"] ByReflection- , expressionTactic ["reflect"] Reflect- , expressionTactic ["fill"] Fill- , (["try"], Just AltsTArg, \syn ->- do t <- spaced (tactic syn)- lchar '|'- t1 <- spaced (tactic syn)- return $ Try t t1)- , noArgs ["compute"] Compute- , noArgs ["trivial"] Trivial- , noArgs ["unify"] DoUnify- , (["search"], Nothing, const $- do depth <- option 10 $ fst <$> natural- return (ProofSearch True True (fromInteger depth) Nothing [] []))- , noArgs ["instance"] TCInstance- , noArgs ["solve"] Solve- , noArgs ["attack"] Attack- , noArgs ["state", ":state"] ProofState- , noArgs ["term", ":term"] ProofTerm- , noArgs ["undo", ":undo"] Undo- , noArgs ["qed", ":qed"] Qed- , noArgs ["abandon", ":q"] Abandon- , noArgs ["skip"] Skip- , noArgs ["sourceLocation"] SourceFC- , expressionTactic [":e", ":eval"] TEval- , expressionTactic [":t", ":type"] TCheck- , expressionTactic [":search"] TSearch- , (["fail"], Just StringLitTArg, const $- do msg <- fst <$> stringLiteral- return $ TFail [Idris.Core.TT.TextPart msg])- , ([":doc"], Just ExprTArg, const $- do whiteSpace- doc <- (Right . fst <$> constant) <|> (Left . fst <$> fnName)- eof- return (TDocStr doc))- ]- where- expressionTactic names tactic = (names, Just ExprTArg, \syn ->- do t <- spaced (expr syn)- i <- get- return $ tactic (desugar syn i t))- noArgs names tactic = (names, Nothing, const (return tactic))- spaced parser = indentPropHolds gtProp *> parser- imp :: IdrisParser Bool- imp = do lchar '?'; return False- <|> do lchar '_'; return True- --tactic :: SyntaxInfo -> IdrisParser PTactic-tactic syn = choice [ do choice (map reserved names); parser syn- | (names, _, parser) <- tactics ]- <|> do lchar '{'- t <- tactic syn;- lchar ';';- ts <- sepBy1 (tactic syn) (lchar ';')- lchar '}'- return $ TSeq t (mergeSeq ts)- <|> ((lchar ':' >> empty) <?> "prover command")- <?> "tactic"- where- mergeSeq :: [PTactic] -> PTactic- mergeSeq [t] = t- mergeSeq (t:ts) = TSeq t (mergeSeq ts)---- | Parses a tactic as a whole-fullTactic :: SyntaxInfo -> IdrisParser PTactic-fullTactic syn = do t <- tactic syn- eof- return t-
@@ -1,668 +0,0 @@-{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards, StandaloneDeriving #-}-#if !(MIN_VERSION_base(4,8,0))-{-# LANGUAGE OverlappingInstances #-}-#endif-module Idris.ParseHelpers where--import Prelude hiding (pi)--import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)-import Text.Parser.LookAhead-import Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi--import Idris.AbsSyntax--import Idris.Core.TT-import Idris.Core.Evaluate-import Idris.Delaborate (pprintErr)-import Idris.Docstrings-import Idris.Output (iWarn)--import qualified Util.Pretty as Pretty (text)--import Control.Applicative-import Control.Monad-import Control.Monad.State.Strict--import Data.Maybe-import qualified Data.List.Split as Spl-import Data.List-import Data.Monoid-import Data.Char-import qualified Data.Map as M-import qualified Data.HashSet as HS-import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8--import System.FilePath--import Debug.Trace---- | Idris parser with state used during parsing-type IdrisParser = StateT IState IdrisInnerParser--newtype IdrisInnerParser a = IdrisInnerParser { runInnerParser :: Parser a }- deriving (Monad, Functor, MonadPlus, Applicative, Alternative, CharParsing, LookAheadParsing, DeltaParsing, MarkParsing Delta, Monoid, TokenParsing)--deriving instance Parsing IdrisInnerParser--#if MIN_VERSION_base(4,8,0)-instance {-# OVERLAPPING #-} TokenParsing IdrisParser where-#else-instance TokenParsing IdrisParser where-#endif- someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()- token p = do s <- get- (FC fn (sl, sc) _) <- getFC --TODO: Update after fixing getFC- -- See Issue #1594- r <- p- (FC fn _ (el, ec)) <- getFC- whiteSpace- put (s { lastTokenSpan = Just (FC fn (sl, sc) (el, ec)) })- return r--- | Generalized monadic parsing constraint type-type MonadicParsing m = (DeltaParsing m, LookAheadParsing m, TokenParsing m, Monad m)--class HasLastTokenSpan m where- getLastTokenSpan :: m (Maybe FC)--instance HasLastTokenSpan IdrisParser where- getLastTokenSpan = lastTokenSpan <$> get---- | Helper to run Idris inner parser based stateT parsers-runparser :: StateT st IdrisInnerParser res -> st -> String -> String -> Result res-runparser p i inputname =- parseString (runInnerParser (evalStateT p i))- (Directed (UTF8.fromString inputname) 0 0 0 0)--highlightP :: FC -> OutputAnnotation -> IdrisParser ()-highlightP fc annot = do ist <- get- put ist { idris_parserHighlights = (fc, annot) : idris_parserHighlights ist}--noDocCommentHere :: String -> IdrisParser ()-noDocCommentHere msg =- optional (do fc <- getFC- docComment- ist <- get- put ist { parserWarnings = (fc, Msg msg) : parserWarnings ist}) *>- pure ()--clearParserWarnings :: Idris ()-clearParserWarnings = do ist <- getIState- putIState ist { parserWarnings = [] }--reportParserWarnings :: Idris ()-reportParserWarnings = do ist <- getIState- mapM_ (uncurry iWarn)- (map (\ (fc, err) -> (fc, pprintErr ist err)) .- reverse .- nubBy (\(fc, err) (fc', err') ->- FC' fc == FC' fc' && err == err') $- parserWarnings ist)- clearParserWarnings--{- * Space, comments and literals (token/lexing like parsers) -}---- | Consumes any simple whitespace (any character which satisfies Char.isSpace)-simpleWhiteSpace :: MonadicParsing m => m ()-simpleWhiteSpace = satisfy isSpace *> pure ()---- | Checks if a charcter is end of line-isEol :: Char -> Bool-isEol '\n' = True-isEol _ = False---- | A parser that succeeds at the end of the line-eol :: MonadicParsing m => m ()-eol = (satisfy isEol *> pure ()) <|> lookAhead eof <?> "end of line"--{- | Consumes a single-line comment--@- SingleLineComment_t ::= '--' ~EOL_t* EOL_t ;-@- -}-singleLineComment :: MonadicParsing m => m ()-singleLineComment = (string "--" *>- many (satisfy (not . isEol)) *>- eol *> pure ())- <?> ""--{- | Consumes a multi-line comment--@- MultiLineComment_t ::=- '{ -- }'- | '{ -' InCommentChars_t- ;-@--@- InCommentChars_t ::=- '- }'- | MultiLineComment_t InCommentChars_t- | ~'- }'+ InCommentChars_t- ;-@--}-multiLineComment :: MonadicParsing m => m ()-multiLineComment = try (string "{-" *> (string "-}") *> pure ())- <|> string "{-" *> inCommentChars- <?> ""- where inCommentChars :: MonadicParsing m => m ()- inCommentChars = string "-}" *> pure ()- <|> try (multiLineComment) *> inCommentChars- <|> string "|||" *> many (satisfy (not . isEol)) *> eol *> inCommentChars- <|> skipSome (noneOf startEnd) *> inCommentChars- <|> oneOf startEnd *> inCommentChars- <?> "end of comment"- startEnd :: String- startEnd = "{}-"--{-| Parses a documentation comment--@- DocComment_t ::= '|||' ~EOL_t* EOL_t- ;-@- -}-docComment :: IdrisParser (Docstring (), [(Name, Docstring ())])-docComment = do dc <- pushIndent *> docCommentLine- rest <- many (indented docCommentLine)- args <- many $ do (name, first) <- indented argDocCommentLine- rest <- many (indented docCommentLine)- return (name, concat (intersperse "\n" (first:rest)))- popIndent- return (parseDocstring $ T.pack (concat (intersperse "\n" (dc:rest))),- map (\(n, d) -> (n, parseDocstring (T.pack d))) args)-- where docCommentLine :: MonadicParsing m => m String- docCommentLine = try (do string "|||"- many (satisfy (==' '))- contents <- option "" (do first <- satisfy (\c -> not (isEol c || c == '@'))- res <- many (satisfy (not . isEol))- return $ first:res)- eol ; someSpace- return contents)-- ++ concat rest))- <?> ""-- argDocCommentLine = do string "|||"- many (satisfy isSpace)- char '@'- many (satisfy isSpace)- n <- fst <$> name- many (satisfy isSpace)- docs <- many (satisfy (not . isEol))- eol ; someSpace- return (n, docs)---- | Parses some white space-whiteSpace :: MonadicParsing m => m ()-whiteSpace = Tok.whiteSpace---- | Parses a string literal-stringLiteral :: (MonadicParsing m, HasLastTokenSpan m) => m (String, FC)-stringLiteral = do str <- Tok.stringLiteral- fc <- getLastTokenSpan- return (str, fromMaybe NoFC fc)---- | Parses a char literal-charLiteral :: (MonadicParsing m, HasLastTokenSpan m) => m (Char, FC)-charLiteral = do ch <- Tok.charLiteral- fc <- getLastTokenSpan- return (ch, fromMaybe NoFC fc)---- | Parses a natural number-natural :: (MonadicParsing m, HasLastTokenSpan m) => m (Integer, FC)-natural = do n <- Tok.natural- fc <- getLastTokenSpan- return (n, fromMaybe NoFC fc)---- | Parses an integral number-integer :: MonadicParsing m => m Integer-integer = Tok.integer---- | Parses a floating point number-float :: (MonadicParsing m, HasLastTokenSpan m) => m (Double, FC)-float = do f <- Tok.double- fc <- getLastTokenSpan- return (f, fromMaybe NoFC fc)--{- * Symbols, identifiers, names and operators -}----- | Idris Style for parsing identifiers/reserved keywords-idrisStyle :: MonadicParsing m => IdentifierStyle m-idrisStyle = IdentifierStyle _styleName _styleStart _styleLetter _styleReserved Hi.Identifier Hi.ReservedIdentifier- where _styleName = "Idris"- _styleStart = satisfy isAlpha <|> oneOf "_"- _styleLetter = satisfy isAlphaNum <|> oneOf "_'."- _styleReserved = HS.fromList ["let", "in", "data", "codata", "record", "corecord", "Type",- "do", "dsl", "import", "impossible",- "case", "of", "total", "partial", "mutual",- "infix", "infixl", "infixr", "rewrite",- "where", "with", "syntax", "proof", "postulate",- "using", "namespace", "class", "instance", - "interface", "implementation", "parameters",- "public", "private", "abstract", "implicit",- "quoteGoal", "constructor",- "if", "then", "else"]--char :: MonadicParsing m => Char -> m Char-char = Chr.char--string :: MonadicParsing m => String -> m String-string = Chr.string---- | Parses a character as a token-lchar :: MonadicParsing m => Char -> m Char-lchar = token . char---- | Parses a character as a token, returning the source span of the character-lcharFC :: MonadicParsing m => Char -> m FC-lcharFC ch = do (FC file (l, c) _) <- getFC- _ <- token (char ch)- return $ FC file (l, c) (l, c+1)---- | Parses string as a token-symbol :: MonadicParsing m => String -> m String-symbol = Tok.symbol--symbolFC :: MonadicParsing m => String -> m FC-symbolFC str = do (FC file (l, c) _) <- getFC- Tok.symbol str- return $ FC file (l, c) (l, c + length str)---- | Parses a reserved identifier-reserved :: MonadicParsing m => String -> m ()-reserved = Tok.reserve idrisStyle---- | Parses a reserved identifier, computing its span. Assumes that--- reserved identifiers never contain line breaks.-reservedFC :: MonadicParsing m => String -> m FC-reservedFC str = do (FC file (l, c) _) <- getFC- Tok.reserve idrisStyle str- return $ FC file (l, c) (l, c + length str)---- | Parse a reserved identfier, highlighting its span as a keyword-reservedHL :: String -> IdrisParser ()-reservedHL str = reservedFC str >>= flip highlightP AnnKeyword---- Taken from Parsec (c) Daan Leijen 1999-2001, (c) Paolo Martini 2007--- | Parses a reserved operator-reservedOp :: MonadicParsing m => String -> m ()-reservedOp name = token $ try $- do string name- notFollowedBy (operatorLetter) <?> ("end of " ++ show name)--reservedOpFC :: MonadicParsing m => String -> m FC-reservedOpFC name = token $ try $ do (FC f (l, c) _) <- getFC- string name- notFollowedBy (operatorLetter) <?> ("end of " ++ show name)- return (FC f (l, c) (l, c + length name))---- | Parses an identifier as a token-identifier :: (MonadicParsing m) => m (String, FC)-identifier = try(do (i, fc) <-- token $ do (FC f (l, c) _) <- getFC- i <- Tok.ident idrisStyle- return (i, FC f (l, c) (l, c + length i))- when (i == "_") $ unexpected "wildcard"- return (i, fc))---- | Parses an identifier with possible namespace as a name-iName :: (MonadicParsing m, HasLastTokenSpan m) => [String] -> m (Name, FC)-iName bad = do (n, fc) <- maybeWithNS identifier False bad- return (n, fc)- <?> "name"---- | Parses an string possibly prefixed by a namespace-maybeWithNS :: (MonadicParsing m, HasLastTokenSpan m) => m (String, FC) -> Bool -> [String] -> m (Name, FC)-maybeWithNS parser ascend bad = do- fc <- getFC- i <- option "" (lookAhead (fst <$> identifier))- when (i `elem` bad) $ unexpected "reserved identifier"- let transf = if ascend then id else reverse- (x, xs, fc) <- choice (transf (parserNoNS parser : parsersNS parser i))- return (mkName (x, xs), fc)- where parserNoNS :: MonadicParsing m => m (String, FC) -> m (String, String, FC)- parserNoNS parser = do startFC <- getFC- (x, nameFC) <- parser- return (x, "", spanFC startFC nameFC)- parserNS :: MonadicParsing m => m (String, FC) -> String -> m (String, String, FC)- parserNS parser ns = do startFC <- getFC- xs <- string ns- lchar '.'; (x, nameFC) <- parser- return (x, xs, spanFC startFC nameFC)- parsersNS :: MonadicParsing m => m (String, FC) -> String -> [m (String, String, FC)]- parsersNS parser i = [try (parserNS parser ns) | ns <- (initsEndAt (=='.') i)]---- | Parses a name-name :: IdrisParser (Name, FC)-name = (<?> "name") $ do- keywords <- syntax_keywords <$> get- aliases <- module_aliases <$> get- (n, fc) <- iName keywords- return (unalias aliases n, fc)- where- unalias :: M.Map [T.Text] [T.Text] -> Name -> Name- unalias aliases (NS n ns) | Just ns' <- M.lookup ns aliases = NS n ns'- unalias aliases name = name--{- | List of all initial segments in ascending order of a list. Every-such initial segment ends right before an element satisfying the given-condition.--}-initsEndAt :: (a -> Bool) -> [a] -> [[a]]-initsEndAt p [] = []-initsEndAt p (x:xs) | p x = [] : x_inits_xs- | otherwise = x_inits_xs- where x_inits_xs = [x : cs | cs <- initsEndAt p xs]---{- | Create a `Name' from a pair of strings representing a base name and its- namespace.--}-mkName :: (String, String) -> Name-mkName (n, "") = sUN n-mkName (n, ns) = sNS (sUN n) (reverse (parseNS ns))- where parseNS x = case span (/= '.') x of- (x, "") -> [x]- (x, '.':y) -> x : parseNS y--opChars :: String-opChars = ":!#$%&*+./<=>?@\\^|-~"--operatorLetter :: MonadicParsing m => m Char-operatorLetter = oneOf opChars---commentMarkers :: [String]-commentMarkers = [ "--", "|||" ]--invalidOperators :: [String]-invalidOperators = [":", "=>", "->", "<-", "=", "?=", "|", "**", "==>", "\\", "%", "~", "?", "!"]---- | Parses an operator-operator :: MonadicParsing m => m String-operator = do op <- token . some $ operatorLetter- when (op `elem` (invalidOperators ++ commentMarkers)) $- fail $ op ++ " is not a valid operator"- return op---- | Parses an operator-operatorFC :: MonadicParsing m => m (String, FC)-operatorFC = do (op, fc) <- token $ do (FC f (l, c) _) <- getFC- op <- some operatorLetter- return (op, FC f (l, c) (l, c + length op))- when (op `elem` (invalidOperators ++ commentMarkers)) $- fail $ op ++ " is not a valid operator"- return (op, fc)--{- * Position helpers -}-{- | Get filename from position (returns "(interactive)" when no source file is given) -}-fileName :: Delta -> String-fileName (Directed fn _ _ _ _) = UTF8.toString fn-fileName _ = "(interactive)"--{- | Get line number from position -}-lineNum :: Delta -> Int-lineNum (Lines l _ _ _) = fromIntegral l + 1-lineNum (Directed _ l _ _ _) = fromIntegral l + 1-lineNum _ = 0--{- | Get column number from position -}-columnNum :: Delta -> Int-columnNum pos = fromIntegral (column pos) + 1---{- | Get file position as FC -}-getFC :: MonadicParsing m => m FC-getFC = do s <- position- let (dir, file) = splitFileName (fileName s)- let f = if dir == addTrailingPathSeparator "." then file else fileName s- return $ FC f (lineNum s, columnNum s) (lineNum s, columnNum s) -- TODO: Change to actual spanning- -- Issue #1594 on the Issue Tracker.- -- https://github.com/idris-lang/Idris-dev/issues/1594---{-* Syntax helpers-}--- | Bind constraints to term-bindList :: (Name -> FC -> PTerm -> PTerm -> PTerm) -> [(Name, FC, PTerm)] -> PTerm -> PTerm-bindList b [] sc = sc-bindList b ((n, fc, t):bs) sc = b n fc t (bindList b bs sc)--{- | @commaSeparated p@ parses one or more occurences of `p`,- separated by commas and optional whitespace. -}-commaSeparated :: MonadicParsing m => m a -> m [a]-commaSeparated p = p `sepBy1` (spaces >> char ',' >> spaces)--{- * Layout helpers -}---- | Push indentation to stack-pushIndent :: IdrisParser ()-pushIndent = do pos <- position- ist <- get- put (ist { indent_stack = (fromIntegral (column pos) + 1) : indent_stack ist })---- | Pops indentation from stack-popIndent :: IdrisParser ()-popIndent = do ist <- get- case indent_stack ist of- [] -> error "The impossible happened! Tried to pop an indentation level where none was pushed (underflow)."- (x : xs) -> put (ist { indent_stack = xs })----- | Gets current indentation-indent :: IdrisParser Int-indent = liftM ((+1) . fromIntegral . column) position---- | Gets last indentation-lastIndent :: IdrisParser Int-lastIndent = do ist <- get- case indent_stack ist of- (x : xs) -> return x- _ -> return 1---- | Applies parser in an indented position-indented :: IdrisParser a -> IdrisParser a-indented p = notEndBlock *> p <* keepTerminator---- | Applies parser to get a block (which has possibly indented statements)-indentedBlock :: IdrisParser a -> IdrisParser [a]-indentedBlock p = do openBlock- pushIndent- res <- many (indented p)- popIndent- closeBlock- return res---- | Applies parser to get a block with at least one statement (which has possibly indented statements)-indentedBlock1 :: IdrisParser a -> IdrisParser [a]-indentedBlock1 p = do openBlock- pushIndent- res <- some (indented p)- popIndent- closeBlock- return res---- | Applies parser to get a block with exactly one (possibly indented) statement-indentedBlockS :: IdrisParser a -> IdrisParser a-indentedBlockS p = do openBlock- pushIndent- res <- indented p- popIndent- closeBlock- return res----- | Checks if the following character matches provided parser-lookAheadMatches :: MonadicParsing m => m a -> m Bool-lookAheadMatches p = do match <- lookAhead (optional p)- return $ isJust match---- | Parses a start of block-openBlock :: IdrisParser ()-openBlock = do lchar '{'- ist <- get- put (ist { brace_stack = Nothing : brace_stack ist })- <|> do ist <- get- lvl' <- indent- -- if we're not indented further, it's an empty block, so- -- increment lvl to ensure we get to the end- let lvl = case brace_stack ist of- Just lvl_old : _ ->- if lvl' <= lvl_old then lvl_old+1- else lvl'- [] -> if lvl' == 1 then 2 else lvl'- _ -> lvl'- put (ist { brace_stack = Just lvl : brace_stack ist })- <?> "start of block"---- | Parses an end of block-closeBlock :: IdrisParser ()-closeBlock = do ist <- get- bs <- case brace_stack ist of- [] -> eof >> return []- Nothing : xs -> lchar '}' >> return xs <?> "end of block"- Just lvl : xs -> (do i <- indent- isParen <- lookAheadMatches (char ')')- isIn <- lookAheadMatches (reserved "in")- if i >= lvl && not (isParen || isIn)- then fail "not end of block"- else return xs)- <|> (do notOpenBraces- eof- return [])- put (ist { brace_stack = bs })---- | Parses a terminator-terminator :: IdrisParser ()-terminator = do lchar ';'; popIndent- <|> do c <- indent; l <- lastIndent- if c <= l then popIndent else fail "not a terminator"- <|> do isParen <- lookAheadMatches (oneOf ")}")- if isParen then popIndent else fail "not a terminator"- <|> lookAhead eof---- | Parses and keeps a terminator-keepTerminator :: IdrisParser ()-keepTerminator = do lchar ';'; return ()- <|> do c <- indent; l <- lastIndent- unless (c <= l) $ fail "not a terminator"- <|> do isParen <- lookAheadMatches (oneOf ")}|")- isIn <- lookAheadMatches (reserved "in")- unless (isIn || isParen) $ fail "not a terminator"- <|> lookAhead eof---- | Checks if application expression does not end-notEndApp :: IdrisParser ()-notEndApp = do c <- indent; l <- lastIndent- when (c <= l) (fail "terminator")---- | Checks that it is not end of block-notEndBlock :: IdrisParser ()-notEndBlock = do ist <- get- case brace_stack ist of- Just lvl : xs -> do i <- indent- isParen <- lookAheadMatches (char ')')- when (i < lvl || isParen) (fail "end of block")- _ -> return ()---- | Representation of an operation that can compare the current indentation with the last indentation, and an error message if it fails-data IndentProperty = IndentProperty (Int -> Int -> Bool) String---- | Allows comparison of indent, and fails if property doesn't hold-indentPropHolds :: IndentProperty -> IdrisParser ()-indentPropHolds (IndentProperty op msg) = do- li <- lastIndent- i <- indent- when (not $ op i li) $ fail ("Wrong indention: " ++ msg)---- | Greater-than indent property-gtProp :: IndentProperty-gtProp = IndentProperty (>) "should be greater than context indentation"---- | Greater-than or equal to indent property-gteProp :: IndentProperty-gteProp = IndentProperty (>=) "should be greater than or equal context indentation"---- | Equal indent property-eqProp :: IndentProperty-eqProp = IndentProperty (==) "should be equal to context indentation"---- | Less-than indent property-ltProp :: IndentProperty-ltProp = IndentProperty (<) "should be less than context indentation"---- | Less-than or equal to indent property-lteProp :: IndentProperty-lteProp = IndentProperty (<=) "should be less than or equal to context indentation"----- | Checks that there are no braces that are not closed-notOpenBraces :: IdrisParser ()-notOpenBraces = do ist <- get- when (hasNothing $ brace_stack ist) $ fail "end of input"- where hasNothing :: [Maybe a] -> Bool- hasNothing = any isNothing--{- | Parses an accessibilty modifier (e.g. public, private) -}-accessibility :: IdrisParser Accessibility-accessibility = do reserved "public"; return Public- <|> do reserved "abstract"; return Frozen- <|> do reserved "private"; return Hidden- <?> "accessibility modifier"---- | Adds accessibility option for function-addAcc :: Name -> Maybe Accessibility -> IdrisParser ()-addAcc n a = do i <- get- put (i { hide_list = (n, a) : hide_list i })--{- | Add accessbility option for data declarations- (works for classes too - 'abstract' means the data/class is visible but members not) -}-accData :: Maybe Accessibility -> Name -> [Name] -> IdrisParser ()-accData (Just Frozen) n ns = do addAcc n (Just Frozen)- mapM_ (\n -> addAcc n (Just Hidden)) ns-accData a n ns = do addAcc n a- mapM_ (`addAcc` a) ns---{- * Error reporting helpers -}-{- | Error message with possible fixes list -}-fixErrorMsg :: String -> [String] -> String-fixErrorMsg msg fixes = msg ++ ", possible fixes:\n" ++ (concat $ intersperse "\n\nor\n\n" fixes)---- | Collect 'PClauses' with the same function name-collect :: [PDecl] -> [PDecl]-collect (c@(PClauses _ o _ _) : ds)- = clauses (cname c) [] (c : ds)- where clauses :: Maybe Name -> [PClause] -> [PDecl] -> [PDecl]- clauses j@(Just n) acc (PClauses fc _ _ [PClause fc' n' l ws r w] : ds)- | n == n' = clauses j (PClause fc' n' l ws r (collect w) : acc) ds- clauses j@(Just n) acc (PClauses fc _ _ [PWith fc' n' l ws r pn w] : ds)- | n == n' = clauses j (PWith fc' n' l ws r pn (collect w) : acc) ds- clauses (Just n) acc xs = PClauses (fcOf c) o n (reverse acc) : collect xs- clauses Nothing acc (x:xs) = collect xs- clauses Nothing acc [] = []-- cname :: PDecl -> Maybe Name- cname (PClauses fc _ _ [PClause _ n _ _ _ _]) = Just n- cname (PClauses fc _ _ [PWith _ n _ _ _ _ _]) = Just n- cname (PClauses fc _ _ [PClauseR _ _ _ _]) = Nothing- cname (PClauses fc _ _ [PWithR _ _ _ _ _]) = Nothing- fcOf :: PDecl -> FC- fcOf (PClauses fc _ _ _) = fc-collect (PParams f ns ps : ds) = PParams f ns (collect ps) : collect ds-collect (PMutual f ms : ds) = PMutual f (collect ms) : collect ds-collect (PNamespace ns fc ps : ds) = PNamespace ns fc (collect ps) : collect ds-collect (PClass doc f s cs n nfc ps pdocs fds ds cn cd : ds')- = PClass doc f s cs n nfc ps pdocs fds (collect ds) cn cd : collect ds'-collect (PInstance doc argDocs f s cs n nfc ps t en ds : ds')- = PInstance doc argDocs f s cs n nfc ps t en (collect ds) : collect ds'-collect (d : ds) = d : collect ds-collect [] = []
@@ -1,173 +0,0 @@-{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}-module Idris.ParseOps where--import Prelude hiding (pi)--import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)-import Text.Parser.LookAhead-import Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi--import Idris.AbsSyntax-import Idris.ParseHelpers--import Idris.Core.TT--import Control.Applicative-import Control.Monad-import Control.Monad.State.Strict--import Data.Maybe-import qualified Data.List.Split as Spl-import Data.List-import Data.Monoid-import Data.Char-import qualified Data.HashSet as HS-import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8--import Debug.Trace---- | Creates table for fixity declarations to build expression parser--- using pre-build and user-defined operator/fixity declarations-table :: [FixDecl] -> OperatorTable IdrisParser PTerm-table fixes- = [[prefix "-" (\fc x -> PApp fc (PRef fc [fc] (sUN "negate")) [pexp x])]] ++- toTable (reverse fixes) ++- [[backtick],- [binary "$" (\fc x y -> flatten $ PApp fc x [pexp y]) AssocRight],- [binary "=" (\fc x y -> PApp fc (PRef fc [fc] eqTy) [pexp x, pexp y]) AssocLeft],- [nofixityoperator]]- where- flatten :: PTerm -> PTerm -- flatten application- flatten (PApp fc (PApp _ f as) bs) = flatten (PApp fc f (as ++ bs))- flatten t = t----- | Calculates table for fixity declarations-toTable :: [FixDecl] -> OperatorTable IdrisParser PTerm-toTable fs = map (map toBin)- (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs)- where toBin (Fix (PrefixN _) op) = prefix op- (\fc x -> PApp fc (PRef fc [] (sUN op)) [pexp x])- toBin (Fix f op)- = binary op (\fc x y -> PApp fc (PRef fc [] (sUN op)) [pexp x,pexp y]) (assoc f)- assoc (Infixl _) = AssocLeft- assoc (Infixr _) = AssocRight- assoc (InfixN _) = AssocNone---- | Binary operator-binary :: String -> (FC -> PTerm -> PTerm -> PTerm) -> Assoc -> Operator IdrisParser PTerm-binary name f = Infix (do indentPropHolds gtProp- fc <- reservedOpFC name- indentPropHolds gtProp- return (f fc))---- | Prefix operator-prefix :: String -> (FC -> PTerm -> PTerm) -> Operator IdrisParser PTerm-prefix name f = Prefix (do reservedOp name- fc <- getFC- indentPropHolds gtProp- return (f fc))---- | Backtick operator-backtick :: Operator IdrisParser PTerm-backtick = Infix (do indentPropHolds gtProp- lchar '`'; (n, fc) <- fnName- lchar '`'- indentPropHolds gtProp- return (\x y -> PApp fc (PRef fc [fc] n) [pexp x, pexp y])) AssocNone---- | Operator without fixity (throws an error)-nofixityoperator :: Operator IdrisParser PTerm-nofixityoperator = Infix (do indentPropHolds gtProp- op <- try operator- unexpected $ "Operator without known fixity: " ++ op) AssocNone---{- | Parses an operator in function position i.e. enclosed by `()', with an- optional namespace--@- OperatorFront ::=- '(' '=' ')'- | (Identifier_t '.')? '(' Operator_t ')'- ;-@---}-operatorFront :: IdrisParser (Name, FC)-operatorFront = try (do (FC f (l, c) _) <- getFC- op <- lchar '(' *> reservedOp "=" <* lchar ')'- return (eqTy, FC f (l, c) (l, c+3)))- <|> maybeWithNS (do (FC f (l, c) _) <- getFC- op <- lchar '(' *> operator- (FC _ _ (l', c')) <- getFC- lchar ')'- return (op, (FC f (l, c) (l', c' + 1)))) False []--{- | Parses a function (either normal name or operator)--@- FnName ::= Name | OperatorFront;-@--}-fnName :: IdrisParser (Name, FC)-fnName = try operatorFront <|> name <?> "function name"--{- | Parses a fixity declaration-@-Fixity ::=- FixityType Natural_t OperatorList Terminator- ;-@--}-fixity :: IdrisParser PDecl-fixity = do pushIndent- f <- fixityType; i <- fst <$> natural;- ops <- sepBy1 operator (lchar ',')- terminator- let prec = fromInteger i- istate <- get- let infixes = idris_infixes istate- let fs = map (Fix (f prec)) ops- let redecls = map (alreadyDeclared infixes) fs- let ill = filter (not . checkValidity) redecls- if null ill- then do put (istate { idris_infixes = nub $ sort (fs ++ infixes)- , ibc_write = map IBCFix fs ++ ibc_write istate- })- fc <- getFC- return (PFix fc (f prec) ops)- else fail $ concatMap (\(f, (x:xs)) -> "Illegal redeclaration of fixity:\n\t\""- ++ show f ++ "\" overrides \"" ++ show x ++ "\"") ill- <?> "fixity declaration"- where alreadyDeclared :: [FixDecl] -> FixDecl -> (FixDecl, [FixDecl])- alreadyDeclared fs f = (f, filter ((extractName f ==) . extractName) fs)-- checkValidity :: (FixDecl, [FixDecl]) -> Bool- checkValidity (f, fs) = all (== f) fs-- extractName :: FixDecl -> String- extractName (Fix _ n) = n--{- | Parses a fixity declaration type (i.e. infix or prefix, associtavity)-@- FixityType ::=- 'infixl'- | 'infixr'- | 'infix'- | 'prefix'- ;-@- -}-fixityType :: IdrisParser (Int -> Fixity)-fixityType = do reserved "infixl"; return Infixl- <|> do reserved "infixr"; return Infixr- <|> do reserved "infix"; return InfixN- <|> do reserved "prefix"; return PrefixN- <?> "fixity type"-
@@ -1,10 +1,10 @@ {-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-} {-# OPTIONS_GHC -O0 #-} module Idris.Parser(module Idris.Parser,- module Idris.ParseExpr,- module Idris.ParseData,- module Idris.ParseHelpers,- module Idris.ParseOps) where+ module Idris.Parser.Expr,+ module Idris.Parser.Data,+ module Idris.Parser.Helpers,+ module Idris.Parser.Ops) where import Prelude hiding (pi) @@ -35,10 +35,10 @@ import Idris.Providers import Idris.Output -import Idris.ParseHelpers-import Idris.ParseOps-import Idris.ParseExpr-import Idris.ParseData+import Idris.Parser.Helpers+import Idris.Parser.Ops+import Idris.Parser.Expr+import Idris.Parser.Data import Idris.Docstrings hiding (Unchecked) @@ -211,7 +211,7 @@ declBody continue) <|> fail "End of readable input" where declBody :: Bool -> IdrisParser [PDecl]- declBody b = + declBody b = try (instance_ True syn) <|> declBody' b <|> using_ syn@@ -337,8 +337,8 @@ (map (updateNs ns) ds) (updateRecCon ns cname) cdocs- updateNs ns (PInstance docs pdocs s fc cs cn fc' ps ity ni ds)- = PInstance docs pdocs s fc cs (updateB ns cn) fc'+ updateNs ns (PInstance docs pdocs s fc cs acc opts cn fc' ps ity ni ds)+ = PInstance docs pdocs s fc cs acc opts (updateB ns cn) fc' ps ity (fmap (updateB ns) ni) (map (updateNs ns) ds) updateNs ns (PMutual fc ds) = PMutual fc (map (updateNs ns) ds)@@ -502,7 +502,9 @@ body' <- fixBind ((n,n'):rens) body return $ PLam fc n' nfc ty' body' fixBind rens (PPi plic n nfc argTy body)- | n `elem` userNames = liftM2 (PPi plic n nfc) (fixBind rens argTy) (fixBind rens body)+ | n `elem` userNames = liftM2 (PPi plic n nfc)+ (fixBind rens argTy)+ (fixBind rens body) | otherwise = do ty' <- fixBind rens argTy n' <- gensym n@@ -521,6 +523,10 @@ return $ PLet fc n' nfc ty' val' body' fixBind rens (PMatchApp fc n) | Just n' <- lookup n rens = return $ PMatchApp fc n'+ -- Also rename resolved quotations, to allow syntax rules to+ -- have quoted references to their own bindings.+ fixBind rens (PQuoteName n True fc) | Just n' <- lookup n rens =+ return $ PQuoteName n' True fc fixBind rens x = descendM (fixBind rens) x gensym :: Name -> IdrisParser Name@@ -584,7 +590,7 @@ then [TotalFn] else [] opts <- fnOpts initOpts- acc <- optional accessibility+ acc <- accessibility opts' <- fnOpts opts (n_in, nfc) <- fnName let n = expandNS syn n_in@@ -698,7 +704,7 @@ then [TotalFn] else [] opts <- fnOpts initOpts- acc <- optional accessibility+ acc <- accessibility opts' <- fnOpts opts (n_in, nfc) <- fnName let n = expandNS syn n_in@@ -856,7 +862,7 @@ class_ :: SyntaxInfo -> IdrisParser [PDecl] class_ syn = do (doc, argDocs, acc) <- try (do (doc, argDocs) <- docstring syn- acc <- optional accessibility+ acc <- accessibility classKeyword return (doc, argDocs, acc)) fc <- getFC@@ -873,15 +879,12 @@ where fundeps :: IdrisParser [(Name, FC)] fundeps = do lchar '|'; sepBy name (lchar ',')- + classKeyword :: IdrisParser () classKeyword = reservedHL "interface" <|> do reservedHL "class" fc <- getFC- ist <- get- put ist { parserWarnings = - (fc, Msg "The 'class' keyword is deprecated. Use 'interface' instead.")- : parserWarnings ist }+ parserWarning fc Nothing (Msg "The 'class' keyword is deprecated. Use 'interface' instead.") carg :: IdrisParser (Name, FC, PTerm) carg = do lchar '('; (i, ifc) <- name; lchar ':'; ty <- expr syn; lchar ')'@@ -903,8 +906,16 @@ @ -} instance_ :: Bool -> SyntaxInfo -> IdrisParser [PDecl]-instance_ kwopt syn - = do (doc, argDocs)+instance_ kwopt syn+ = do ist <- get+ let initOpts = if default_total ist+ then [TotalFn]+ else []+ opts <- fnOpts initOpts+ acc <- accessibility+ opts' <- fnOpts opts++ (doc, argDocs) <- try (docstring syn <* if kwopt then optional instanceKeyword else do instanceKeyword return (Just ()))@@ -917,7 +928,7 @@ let sc = PApp fc (PRef cnfc [cnfc] cn) (map pexp args) let t = bindList (PPi constraint) cs sc ds <- instanceBlock syn- return [PInstance doc argDocs syn fc cs' cn cnfc args t en ds]+ return [PInstance doc argDocs syn fc cs' acc opts' cn cnfc args t en ds] <?> "implementation declaration" where instanceName :: IdrisParser Name instanceName = do lchar '['; n_in <- fst <$> fnName; lchar ']'@@ -928,11 +939,7 @@ instanceKeyword = reservedHL "implementation" <|> do reservedHL "instance" fc <- getFC- ist <- get- put ist { parserWarnings = - (fc, Msg "The 'instance' keyword is deprecated. Use 'implementation' (or omit it) instead.")- : parserWarnings ist }-+ parserWarning fc Nothing (Msg "The 'instance' keyword is deprecated. Use 'implementation' (or omit it) instead.") -- | Parse a docstring docstring :: SyntaxInfo@@ -1321,7 +1328,10 @@ return [PDirective (DHide n)] <|> do try (lchar '%' *> reserved "freeze"); n <- fst <$> iName [] return [PDirective (DFreeze n)]- <|> do try (lchar '%' *> reserved "access"); acc <- accessibility+ <|> do try (lchar '%' *> reserved "access")+ acc <- accessibility+ ist <- get+ put ist { default_access = acc } return [PDirective (DAccess acc)] <|> do try (lchar '%' *> reserved "default"); tot <- totality i <- get@@ -1353,7 +1363,12 @@ fn <- fst <$> fnName arg <- fst <$> iName [] return [PDirective (DUsed fc fn arg)]+ <|> do try (lchar '%' *> reserved "auto_implicits")+ b <- on_off+ return [PDirective (DAutoImplicits b)] <?> "directive"+ where on_off = do reserved "on"; return True+ <|> do reserved "off"; return False pLangExt :: IdrisParser LanguageExt pLangExt = (reserved "TypeProviders" >> return TypeProviders)@@ -1491,14 +1506,23 @@ [(FC, OutputAnnotation)], IState) imports = do whiteSpace (mdoc, mname, annots) <- moduleHeader- ps <- many import_+ ps_exp <- many import_ mrk <- mark isEof <- lookAheadMatches eof let mrk' = if isEof then Nothing else Just mrk i <- get+ -- add Builtins and Prelude, unless options say+ -- not to+ let ps = ps_exp -- imp "Builtins" : imp "Prelude" : ps_exp return ((mdoc, mname, ps, mrk'), annots, i)++ imp m = ImportInfo False (toPath m)+ Nothing [] NoFC NoFC+ ns = Spl.splitOn "."+ toPath = foldl1' (</>) . ns+ addPath :: [(FC, OutputAnnotation)] -> FilePath -> [(FC, OutputAnnotation)] addPath [] _ = [] addPath ((fc, AnnNamespace ns Nothing) : annots) path =@@ -1556,17 +1580,17 @@ return (ds, i') {- | Load idris module and show error if something wrong happens -}-loadModule :: FilePath -> Idris (Maybe String)-loadModule f- = idrisCatch (loadModule' f)+loadModule :: FilePath -> IBCPhase -> Idris (Maybe String)+loadModule f phase+ = idrisCatch (loadModule' f phase) (\e -> do setErrSpan (getErrSpan e) ist <- getIState iWarn (getErrSpan e) $ pprintErr ist e return Nothing) {- | Load idris module -}-loadModule' :: FilePath -> Idris (Maybe String)-loadModule' f+loadModule' :: FilePath -> IBCPhase -> Idris (Maybe String)+loadModule' f phase = do i <- getIState let file = takeWhile (/= ' ') f ibcsd <- valIBCSubDir i@@ -1580,7 +1604,7 @@ IDR fn -> loadSource False fn Nothing LIDR fn -> loadSource True fn Nothing IBC fn src ->- idrisCatch (loadIBC True fn)+ idrisCatch (loadIBC True phase fn) (\c -> do logParser 1 $ fn ++ " failed " ++ pshow i c case src of IDR sfn -> loadSource False sfn Nothing@@ -1588,18 +1612,18 @@ return $ Just file {- | Load idris code from file -}-loadFromIFile :: Bool -> IFileType -> Maybe Int -> Idris ()-loadFromIFile reexp i@(IBC fn src) maxline+loadFromIFile :: Bool -> IBCPhase -> IFileType -> Maybe Int -> Idris ()+loadFromIFile reexp phase i@(IBC fn src) maxline = do logParser 1 $ "Skipping " ++ getSrcFile i- idrisCatch (loadIBC reexp fn)+ idrisCatch (loadIBC reexp phase fn) (\err -> ierror $ LoadingFailed fn err) where getSrcFile (IDR fn) = fn getSrcFile (LIDR fn) = fn getSrcFile (IBC f src) = getSrcFile src -loadFromIFile _ (IDR fn) maxline = loadSource' False fn maxline-loadFromIFile _ (LIDR fn) maxline = loadSource' True fn maxline+loadFromIFile _ _ (IDR fn) maxline = loadSource' False fn maxline+loadFromIFile _ _ (LIDR fn) maxline = loadSource' True fn maxline {-| Load idris source code and show error if something wrong happens -} loadSource' :: Bool -> FilePath -> Maybe Int -> Idris ()@@ -1630,7 +1654,7 @@ LIDR fn -> ifail $ "No ibc for " ++ f IDR fn -> ifail $ "No ibc for " ++ f IBC fn src ->- do loadIBC True fn+ do loadIBC True IBC_Building fn let srcFn = case src of IDR fn -> Just fn LIDR fn -> Just fn@@ -1662,7 +1686,7 @@ (n,fc):_ -> throwError . At fc . Msg $ "import alias not unique: " ++ show n i <- getIState- putIState (i { default_access = Hidden, module_aliases = modAliases })+ putIState (i { default_access = Private, module_aliases = modAliases }) clearIBC -- start a new .ibc file -- record package info in .ibc imps <- allImportDirs@@ -1760,7 +1784,7 @@ clearHighlights i <- getIState putIState (i { default_total = def_total,- hide_list = [] })+ hide_list = emptyContext }) return () where namespaces :: [String] -> [PDecl] -> [PDecl]@@ -1790,16 +1814,9 @@ parsedDocs ist = annotCode (tryFullExpr syn ist) docs {- | Adds names to hide list -}-addHides :: [(Name, Maybe Accessibility)] -> Idris ()+addHides :: Ctxt Accessibility -> Idris () addHides xs = do i <- getIState let defh = default_access i- let (hs, as) = partition isNothing xs- unless (null as) $- mapM_ doHide- (map (\ (n, _) -> (n, defh)) hs ++- map (\ (n, Just a) -> (n, a)) as)- where isNothing (_, Nothing) = True- isNothing _ = False-- doHide (n, a) = do setAccessibility n a+ mapM_ doHide (toAlist xs)+ where doHide (n, a) = do setAccessibility n a addIBC (IBCAccess n a)
@@ -0,0 +1,338 @@+{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}+module Idris.Parser.Data where++import Prelude hiding (pi)++import Text.Trifecta.Delta+import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err)+import Text.Parser.LookAhead+import Text.Parser.Expression+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Char as Chr+import qualified Text.Parser.Token.Highlight as Hi++import Idris.AbsSyntax+import Idris.Parser.Helpers+import Idris.Parser.Ops+import Idris.Parser.Expr+import Idris.DSL++import Idris.Core.TT+import Idris.Core.Evaluate++import Idris.Docstrings++import Control.Applicative+import Control.Monad+import Control.Monad.State.Strict++import Data.Maybe+import qualified Data.List.Split as Spl+import Data.List+import Data.Monoid+import Data.Char+import qualified Data.HashSet as HS+import qualified Data.Text as T+import qualified Data.ByteString.UTF8 as UTF8++import Debug.Trace++{- |Parses a record type declaration+Record ::=+ DocComment Accessibility? 'record' FnName TypeSig 'where' OpenBlock Constructor KeepTerminator CloseBlock;+-}+record :: SyntaxInfo -> IdrisParser PDecl+record syn = do (doc, paramDocs, acc, opts) <- try (do+ (doc, paramDocs) <- option noDocs docComment+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc+ paramDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- paramDocs ]+ acc <- accessibility+ opts <- dataOpts []+ co <- recordI+ return (doc', paramDocs', acc, opts ++ co))+ fc <- getFC+ (tyn_in, nfc) <- fnName+ let tyn = expandNS syn tyn_in+ let rsyn = syn { syn_namespace = show (nsroot tyn) :+ syn_namespace syn }+ params <- manyTill (recordParameter rsyn) (reservedHL "where")+ (fields, cname, cdoc) <- indentedBlockS $ recordBody rsyn tyn+ let fnames = map (expandNS rsyn) (mapMaybe getName fields)+ case cname of+ Just cn' -> accData acc tyn (fst cn' : fnames)+ Nothing -> return ()+ return $ PRecord doc rsyn fc opts tyn nfc params paramDocs fields cname cdoc syn+ <?> "record type declaration"+ where+ getRecNames :: SyntaxInfo -> PTerm -> [Name]+ getRecNames syn (PPi _ n _ _ sc) = [expandNS syn n, expandNS syn (mkType n)]+ ++ getRecNames syn sc+ getRecNames _ _ = []++ getName (Just (n, _), _, _, _) = Just n+ getName _ = Nothing++ toFreeze :: Maybe Accessibility -> Maybe Accessibility+ toFreeze (Just Frozen) = Just Private+ toFreeze x = x++ recordBody :: SyntaxInfo -> Name -> IdrisParser ([((Maybe (Name, FC)), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))], Maybe (Name, FC), Docstring (Either Err PTerm))+ recordBody syn tyn = do+ ist <- get+ fc <- getFC++ (constructorName, constructorDoc) <- option (Nothing, emptyDocstring)+ (do (doc, _) <- option noDocs docComment+ n <- constructor+ return (Just n, doc))++ let constructorDoc' = annotate syn ist constructorDoc++ fields <- many . indented $ fieldLine syn++ return (concat fields, constructorName, constructorDoc')+ where+ fieldLine :: SyntaxInfo -> IdrisParser [(Maybe (Name, FC), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))]+ fieldLine syn = do+ doc <- optional docComment+ c <- optional $ lchar '{'+ let oneName = (do (n, nfc) <- fnName+ return $ Just (expandNS syn n, nfc))+ <|> (symbol "_" >> return Nothing)+ ns <- commaSeparated oneName+ lchar ':'+ t <- typeExpr (allowImp syn)+ p <- endPlicity c+ ist <- get+ let doc' = case doc of -- Temp: Throws away any possible arg docs+ Just (d,_) -> Just $ annotate syn ist d+ Nothing -> Nothing+ return $ map (\n -> (n, p, t, doc')) ns++ constructor :: IdrisParser (Name, FC)+ constructor = (reservedHL "constructor") *> fnName+++ endPlicity :: Maybe Char -> IdrisParser Plicity+ endPlicity (Just _) = do lchar '}'+ return impl+ endPlicity Nothing = return expl++ annotate :: SyntaxInfo -> IState -> Docstring () -> Docstring (Either Err PTerm)+ annotate syn ist = annotCode $ tryFullExpr syn ist++recordParameter :: SyntaxInfo -> IdrisParser (Name, FC, Plicity, PTerm)+recordParameter syn =+ (do lchar '('+ (n, nfc, pt) <- (namedTy syn <|> onlyName syn)+ lchar ')'+ return (n, nfc, expl, pt))+ <|>+ (do (n, nfc, pt) <- onlyName syn+ return (n, nfc, expl, pt))+ where+ namedTy :: SyntaxInfo -> IdrisParser (Name, FC, PTerm)+ namedTy syn =+ do (n, nfc) <- fnName+ lchar ':'+ ty <- typeExpr (allowImp syn)+ return (expandNS syn n, nfc, ty)+ onlyName :: SyntaxInfo -> IdrisParser (Name, FC, PTerm)+ onlyName syn =+ do (n, nfc) <- fnName+ fc <- getFC+ return (expandNS syn n, nfc, PType fc)++{- | Parses data declaration type (normal or codata)+DataI ::= 'data' | 'codata';+-}+dataI :: IdrisParser DataOpts+dataI = do reservedHL "data"; return []+ <|> do reservedHL "codata"; return [Codata]++recordI :: IdrisParser DataOpts+recordI = do reservedHL "record"; return []+ <|> do reservedHL "corecord"; return [Codata]++{- | Parses if a data should not have a default eliminator+DefaultEliminator ::= 'noelim'?+ -}+dataOpts :: DataOpts -> IdrisParser DataOpts+dataOpts opts+ = do fc <- reservedFC "%elim"+ warnElim fc+ dataOpts (DefaultEliminator : DefaultCaseFun : opts)+ <|> do fc <- reservedFC "%case"+ warnElim fc+ dataOpts (DefaultCaseFun : opts)+ <|> do reserved "%error_reverse"; dataOpts (DataErrRev : opts)+ <|> return opts+ <?> "data options"+ where warnElim fc =+ parserWarning fc (Just NoElimDeprecationWarnings) (Msg "The 'class' keyword is deprecated. Use 'interface' instead.")++{- | Parses a data type declaration+Data ::= DocComment? Accessibility? DataI DefaultEliminator FnName TypeSig ExplicitTypeDataRest?+ | DocComment? Accessibility? DataI DefaultEliminator FnName Name* DataRest?+ ;+Constructor' ::= Constructor KeepTerminator;+ExplicitTypeDataRest ::= 'where' OpenBlock Constructor'* CloseBlock;++DataRest ::= '=' SimpleConstructorList Terminator+ | 'where'!+ ;+SimpleConstructorList ::=+ SimpleConstructor+ | SimpleConstructor '|' SimpleConstructorList+ ;+-}+data_ :: SyntaxInfo -> IdrisParser PDecl+data_ syn = do (doc, argDocs, acc, dataOpts) <- try (do+ (doc, argDocs) <- option noDocs docComment+ pushIndent+ acc <- accessibility+ elim <- dataOpts []+ co <- dataI+ ist <- get+ let dataOpts = combineDataOpts (elim ++ co)+ doc' = annotCode (tryFullExpr syn ist) doc+ argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- argDocs ]+ return (doc', argDocs', acc, dataOpts))+ fc <- getFC+ (tyn_in, nfc) <- fnName+ (do try (lchar ':')+ popIndent+ ty <- typeExpr (allowImp syn)+ let tyn = expandNS syn tyn_in+ option (PData doc argDocs syn fc dataOpts (PLaterdecl tyn nfc ty)) (do+ reservedHL "where"+ cons <- indentedBlock (constructor syn)+ accData acc tyn (map (\ (_, _, n, _, _, _, _) -> n) cons)+ return $ PData doc argDocs syn fc dataOpts (PDatadecl tyn nfc ty cons))) <|> (do+ args <- many (fst <$> name)+ let ty = bindArgs (map (const (PType fc)) args) (PType fc)+ let tyn = expandNS syn tyn_in+ option (PData doc argDocs syn fc dataOpts (PLaterdecl tyn nfc ty)) (do+ try (lchar '=') <|> do reservedHL "where"+ let kw = (if DefaultEliminator `elem` dataOpts then "%elim" else "") ++ (if Codata `elem` dataOpts then "co" else "") ++ "data "+ let n = show tyn_in ++ " "+ let s = kw ++ n+ let as = concat (intersperse " " $ map show args) ++ " "+ let ns = concat (intersperse " -> " $ map ((\x -> "(" ++ x ++ " : Type)") . show) args)+ let ss = concat (intersperse " -> " $ map (const "Type") args)+ let fix1 = s ++ as ++ " = ..."+ let fix2 = s ++ ": " ++ ns ++ " -> Type where\n ..."+ let fix3 = s ++ ": " ++ ss ++ " -> Type where\n ..."+ fail $ fixErrorMsg "unexpected \"where\"" [fix1, fix2, fix3]+ cons <- sepBy1 (simpleConstructor syn) (reservedOp "|")+ terminator+ let conty = mkPApp fc (PRef fc [] tyn) (map (PRef fc []) args)+ cons' <- mapM (\ (doc, argDocs, x, xfc, cargs, cfc, fs) ->+ do let cty = bindArgs cargs conty+ return (doc, argDocs, x, xfc, cty, cfc, fs)) cons+ accData acc tyn (map (\ (_, _, n, _, _, _, _) -> n) cons')+ return $ PData doc argDocs syn fc dataOpts (PDatadecl tyn nfc ty cons')))+ <?> "data type declaration"+ where+ mkPApp :: FC -> PTerm -> [PTerm] -> PTerm+ mkPApp fc t [] = t+ mkPApp fc t xs = PApp fc t (map pexp xs)+ bindArgs :: [PTerm] -> PTerm -> PTerm+ bindArgs xs t = foldr (PPi expl (sMN 0 "_t") NoFC) t xs+ combineDataOpts :: DataOpts -> DataOpts+ combineDataOpts opts = if Codata `elem` opts+ then delete DefaultEliminator opts+ else opts+++{- | Parses a type constructor declaration+ Constructor ::= DocComment? FnName TypeSig;+-}+constructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, FC, PTerm, FC, [Name])+constructor syn+ = do (doc, argDocs) <- option noDocs docComment+ (cn_in, nfc) <- fnName; fc <- getFC+ let cn = expandNS syn cn_in+ lchar ':'+ fs <- option [] (do lchar '%'; reserved "erase"+ sepBy1 (fst <$> name) (lchar ','))+ ty <- typeExpr (allowImp syn)+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc+ argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- argDocs ]+ return (doc', argDocs', cn, nfc, ty, fc, fs)+ <?> "constructor"++{- | Parses a constructor for simple discriminated union data types+ SimpleConstructor ::= FnName SimpleExpr* DocComment?+-}+simpleConstructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, FC, [PTerm], FC, [Name])+simpleConstructor syn+ = do (doc, _) <- option noDocs (try docComment)+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc+ (cn_in, nfc) <- fnName+ let cn = expandNS syn cn_in+ fc <- getFC+ args <- many (do notEndApp+ simpleExpr syn)+ return (doc', [], cn, nfc, args, fc, [])+ <?> "constructor"++{- | Parses a dsl block declaration+DSL ::= 'dsl' FnName OpenBlock Overload'+ CloseBlock;+ -}+dsl :: SyntaxInfo -> IdrisParser PDecl+dsl syn = do reservedHL "dsl"+ n <- fst <$> fnName+ bs <- indentedBlock (overload syn)+ let dsl = mkDSL bs (dsl_info syn)+ checkDSL dsl+ i <- get+ put (i { idris_dsls = addDef n dsl (idris_dsls i) })+ return (PDSL n dsl)+ <?> "dsl block declaration"+ where mkDSL :: [(String, PTerm)] -> DSL -> DSL+ mkDSL bs dsl = let var = lookup "variable" bs+ first = lookup "index_first" bs+ next = lookup "index_next" bs+ leto = lookup "let" bs+ lambda = lookup "lambda" bs+ pi = lookup "pi" bs in+ initDSL { dsl_var = var,+ index_first = first,+ index_next = next,+ dsl_lambda = lambda,+ dsl_let = leto,+ dsl_pi = pi }++{- | Checks DSL for errors -}+-- FIXME: currently does nothing, check if DSL is really sane+--+-- Issue #1595 on the Issue Tracker+--+-- https://github.com/idris-lang/Idris-dev/issues/1595+--+checkDSL :: DSL -> IdrisParser ()+checkDSL dsl = return ()++{- | Parses a DSL overload declaration+OverloadIdentifier ::= 'let' | Identifier;+Overload ::= OverloadIdentifier '=' Expr;+-}+overload :: SyntaxInfo -> IdrisParser (String, PTerm)+overload syn = do (o, fc) <- identifier <|> do fc <- reservedFC "let"+ return ("let", fc)+ if o `notElem` overloadable+ then fail $ show o ++ " is not an overloading"+ else do+ highlightP fc AnnKeyword+ lchar '='+ t <- expr syn+ return (o, t)+ <?> "dsl overload declaratioN"+ where overloadable = ["let","lambda","pi","index_first","index_next","variable"]
@@ -0,0 +1,1552 @@+{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards, TupleSections #-}+module Idris.Parser.Expr where++import Prelude hiding (pi)++import Text.Trifecta.Delta+import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err)+import Text.Parser.LookAhead+import Text.Parser.Expression+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Char as Chr+import qualified Text.Parser.Token.Highlight as Hi++import Idris.AbsSyntax+import Idris.Parser.Helpers+import Idris.Parser.Ops+import Idris.DSL++import Idris.Core.TT++import Control.Applicative+import Control.Monad+import Control.Monad.State.Strict++import Data.Function (on)+import Data.Maybe+import qualified Data.List.Split as Spl+import Data.List+import Data.Monoid+import Data.Char+import qualified Data.HashSet as HS+import qualified Data.Text as T+import qualified Data.ByteString.UTF8 as UTF8++import Debug.Trace++-- | Allow implicit type declarations+allowImp :: SyntaxInfo -> SyntaxInfo+allowImp syn = syn { implicitAllowed = True }++-- | Disallow implicit type declarations+disallowImp :: SyntaxInfo -> SyntaxInfo+disallowImp syn = syn { implicitAllowed = False }++{-| Parses an expression as a whole+@+ FullExpr ::= Expr EOF_t;+@+ -}+fullExpr :: SyntaxInfo -> IdrisParser PTerm+fullExpr syn = do x <- expr syn+ eof+ i <- get+ return $ debindApp syn (desugar syn i x)++tryFullExpr :: SyntaxInfo -> IState -> String -> Either Err PTerm+tryFullExpr syn st input =+ case runparser (fullExpr syn) st "" input of+ Success tm -> Right tm+ Failure e -> Left (Msg (show e))++{- | Parses an expression+@+ Expr ::= Pi+@+ -}+expr :: SyntaxInfo -> IdrisParser PTerm+expr = pi++{- | Parses an expression with possible operator applied+@+ OpExpr ::= {- Expression Parser with Operators based on Expr' -};+@+-}+opExpr :: SyntaxInfo -> IdrisParser PTerm+opExpr syn = do i <- get+ buildExpressionParser (table (idris_infixes i)) (expr' syn)++{- | Parses either an internally defined expression or+ a user-defined one+@+Expr' ::= "External (User-defined) Syntax"+ | InternalExpr;+@+ -}+expr' :: SyntaxInfo -> IdrisParser PTerm+expr' syn = try (externalExpr syn)+ <|> internalExpr syn+ <?> "expression"++{- | Parses a user-defined expression -}+externalExpr :: SyntaxInfo -> IdrisParser PTerm+externalExpr syn = do i <- get+ (FC fn start _) <- getFC+ expr <- extensions syn (syntaxRulesList $ syntax_rules i)+ (FC _ _ end) <- getFC+ let outerFC = FC fn start end+ return (mapPTermFC (fixFC outerFC) (fixFCH fn outerFC) expr)+ <?> "user-defined expression"+ where -- Fix non-highlighting FCs by approximating with the span of the syntax application+ fixFC outer inner | inner `fcIn` outer = inner+ | otherwise = outer+ -- Fix highlighting FCs by making them useless, to avoid spurious highlights+ fixFCH fn outer inner | inner `fcIn` outer = inner+ | otherwise = FileFC fn++{- | Parses a simple user-defined expression -}+simpleExternalExpr :: SyntaxInfo -> IdrisParser PTerm+simpleExternalExpr syn = do i <- get+ extensions syn (filter isSimple (syntaxRulesList $ syntax_rules i))+ where+ isSimple (Rule (Expr x:xs) _ _) = False+ isSimple (Rule (SimpleExpr x:xs) _ _) = False+ isSimple (Rule [Keyword _] _ _) = True+ isSimple (Rule [Symbol _] _ _) = True+ isSimple (Rule (_:xs) _ _) = case last xs of+ Keyword _ -> True+ Symbol _ -> True+ _ -> False+ isSimple _ = False++{- | Tries to parse a user-defined expression given a list of syntactic extensions -}+extensions :: SyntaxInfo -> [Syntax] -> IdrisParser PTerm+extensions syn rules = extension syn [] (filter isValid rules)+ <?> "user-defined expression"+ where+ isValid :: Syntax -> Bool+ isValid (Rule _ _ AnySyntax) = True+ isValid (Rule _ _ PatternSyntax) = inPattern syn+ isValid (Rule _ _ TermSyntax) = not (inPattern syn)+ isValid (DeclRule _ _) = False++data SynMatch = SynTm PTerm | SynBind FC Name -- ^ the FC is for highlighting information+ deriving Show++extension :: SyntaxInfo -> [Maybe (Name, SynMatch)] -> [Syntax] -> IdrisParser PTerm+extension syn ns rules =+ choice $ flip map (groupBy (ruleGroup `on` syntaxSymbols) rules) $ \rs ->+ case head rs of -- can never be []+ Rule (symb:_) _ _ -> try $ do+ n <- extensionSymbol symb+ extension syn (n : ns) [Rule ss t ctx | (Rule (_:ss) t ctx) <- rs]+ -- If we have more than one Rule in this bucket, our grammar is+ -- nondeterministic.+ Rule [] ptm _ -> return (flatten (updateSynMatch (mapMaybe id ns) ptm))+ where+ ruleGroup [] [] = True+ ruleGroup (s1:_) (s2:_) = s1 == s2+ ruleGroup _ _ = False++ extensionSymbol :: SSymbol -> IdrisParser (Maybe (Name, SynMatch))+ extensionSymbol (Keyword n) = do fc <- reservedFC (show n)+ highlightP fc AnnKeyword+ return Nothing+ extensionSymbol (Expr n) = do tm <- expr syn+ return $ Just (n, SynTm tm)+ extensionSymbol (SimpleExpr n) = do tm <- simpleExpr syn+ return $ Just (n, SynTm tm)+ extensionSymbol (Binding n) = do (b, fc) <- name+ return $ Just (n, SynBind fc b)+ extensionSymbol (Symbol s) = do fc <- symbolFC s+ highlightP fc AnnKeyword+ return Nothing++ flatten :: PTerm -> PTerm -- flatten application+ flatten (PApp fc (PApp _ f as) bs) = flatten (PApp fc f (as ++ bs))+ flatten t = t++updateSynMatch = update+ where+ updateB :: [(Name, SynMatch)] -> (Name, FC) -> (Name, FC)+ updateB ns (n, fc) = case lookup n ns of+ Just (SynBind tfc t) -> (t, tfc)+ _ -> (n, fc)++ update :: [(Name, SynMatch)] -> PTerm -> PTerm+ update ns (PRef fc hls n) = case lookup n ns of+ Just (SynTm t) -> t+ _ -> PRef fc hls n+ update ns (PPatvar fc n) = uncurry (flip PPatvar) $ updateB ns (n, fc)+ update ns (PLam fc n nfc ty sc)+ = let (n', nfc') = updateB ns (n, nfc)+ in PLam fc n' nfc' (update ns ty) (update (dropn n ns) sc)+ update ns (PPi p n fc ty sc)+ = let (n', nfc') = updateB ns (n, fc)+ in PPi (updTacImp ns p) n' nfc'+ (update ns ty) (update (dropn n ns) sc)+ update ns (PLet fc n nfc ty val sc)+ = let (n', nfc') = updateB ns (n, nfc)+ in PLet fc n' nfc' (update ns ty)+ (update ns val) (update (dropn n ns) sc)+ update ns (PApp fc t args)+ = PApp fc (update ns t) (map (fmap (update ns)) args)+ update ns (PAppBind fc t args)+ = PAppBind fc (update ns t) (map (fmap (update ns)) args)+ update ns (PMatchApp fc n) = let (n', nfc') = updateB ns (n, fc)+ in PMatchApp nfc' n'+ update ns (PIfThenElse fc c t f)+ = PIfThenElse fc (update ns c) (update ns t) (update ns f)+ update ns (PCase fc c opts)+ = PCase fc (update ns c) (map (pmap (update ns)) opts)+ update ns (PRewrite fc eq tm mty)+ = PRewrite fc (update ns eq) (update ns tm) (fmap (update ns) mty)+ update ns (PPair fc hls p l r) = PPair fc hls p (update ns l) (update ns r)+ update ns (PDPair fc hls p l t r)+ = PDPair fc hls p (update ns l) (update ns t) (update ns r)+ update ns (PAs fc n t) = PAs fc (fst $ updateB ns (n, NoFC)) (update ns t)+ update ns (PAlternative ms a as) = PAlternative ms a (map (update ns) as)+ update ns (PHidden t) = PHidden (update ns t)+ update ns (PGoal fc r n sc) = PGoal fc (update ns r) n (update ns sc)+ update ns (PDoBlock ds) = PDoBlock $ map (upd ns) ds+ where upd :: [(Name, SynMatch)] -> PDo -> PDo+ upd ns (DoExp fc t) = DoExp fc (update ns t)+ upd ns (DoBind fc n nfc t) = DoBind fc n nfc (update ns t)+ upd ns (DoLet fc n nfc ty t) = DoLet fc n nfc (update ns ty) (update ns t)+ upd ns (DoBindP fc i t ts)+ = DoBindP fc (update ns i) (update ns t)+ (map (\(l,r) -> (update ns l, update ns r)) ts)+ upd ns (DoLetP fc i t) = DoLetP fc (update ns i) (update ns t)+ update ns (PIdiom fc t) = PIdiom fc $ update ns t+ update ns (PMetavar fc n) = uncurry (flip PMetavar) $ updateB ns (n, fc)+ update ns (PProof tacs) = PProof $ map (updTactic ns) tacs+ update ns (PTactics tacs) = PTactics $ map (updTactic ns) tacs+ update ns (PDisamb nsps t) = PDisamb nsps $ update ns t+ update ns (PUnifyLog t) = PUnifyLog $ update ns t+ update ns (PNoImplicits t) = PNoImplicits $ update ns t+ update ns (PQuasiquote tm mty) = PQuasiquote (update ns tm) (fmap (update ns) mty)+ update ns (PUnquote t) = PUnquote $ update ns t+ update ns (PQuoteName n res fc) = let (n', fc') = (updateB ns (n, fc))+ in PQuoteName n' res fc'+ update ns (PRunElab fc t nsp) = PRunElab fc (update ns t) nsp+ update ns (PConstSugar fc t) = PConstSugar fc $ update ns t+ -- PConstSugar probably can't contain anything substitutable, but it's hard to track+ update ns t = t++ updTactic :: [(Name, SynMatch)] -> PTactic -> PTactic+ -- handle all the ones with Names explicitly, then use fmap for the rest with PTerms+ updTactic ns (Intro ns') = Intro $ map (fst . updateB ns . (, NoFC)) ns'+ updTactic ns (Focus n) = Focus . fst $ updateB ns (n, NoFC)+ updTactic ns (Refine n bs) = Refine (fst $ updateB ns (n, NoFC)) bs+ updTactic ns (Claim n t) = Claim (fst $ updateB ns (n, NoFC)) (update ns t)+ updTactic ns (MatchRefine n) = MatchRefine (fst $ updateB ns (n, NoFC))+ updTactic ns (LetTac n t) = LetTac (fst $ updateB ns (n, NoFC)) (update ns t)+ updTactic ns (LetTacTy n ty tm) = LetTacTy (fst $ updateB ns (n, NoFC)) (update ns ty) (update ns tm)+ updTactic ns (ProofSearch rec prover depth top psns hints) = ProofSearch rec prover depth+ (fmap (fst . updateB ns . (, NoFC)) top) (map (fst . updateB ns . (, NoFC)) psns) (map (fst . updateB ns . (, NoFC)) hints)+ updTactic ns (Try l r) = Try (updTactic ns l) (updTactic ns r)+ updTactic ns (TSeq l r) = TSeq (updTactic ns l) (updTactic ns r)+ updTactic ns (GoalType s tac) = GoalType s $ updTactic ns tac+ updTactic ns (TDocStr (Left n)) = TDocStr . Left . fst $ updateB ns (n, NoFC)+ updTactic ns t = fmap (update ns) t++ updTacImp ns (TacImp o st scr) = TacImp o st (update ns scr)+ updTacImp _ x = x++ dropn :: Name -> [(Name, a)] -> [(Name, a)]+ dropn n [] = []+ dropn n ((x,t) : xs) | n == x = xs+ | otherwise = (x,t):dropn n xs+++{- | Parses a (normal) built-in expression+@+InternalExpr ::=+ UnifyLog+ | RecordType+ | SimpleExpr+ | Lambda+ | QuoteGoal+ | Let+ | If+ | RewriteTerm+ | CaseExpr+ | DoBlock+ | App+ ;+@+-}+internalExpr :: SyntaxInfo -> IdrisParser PTerm+internalExpr syn =+ unifyLog syn+ <|> runElab syn+ <|> disamb syn+ <|> noImplicits syn+ <|> recordType syn+ <|> if_ syn+ <|> lambda syn+ <|> quoteGoal syn+ <|> let_ syn+ <|> rewriteTerm syn+ <|> doBlock syn+ <|> caseExpr syn+ <|> app syn+ <?> "expression"++{- | Parses the "impossible" keyword+@+Impossible ::= 'impossible'+@+-}+impossible :: IdrisParser PTerm+impossible = do fc <- reservedFC "impossible"+ highlightP fc AnnKeyword+ return PImpossible++{- | Parses a case expression+@+CaseExpr ::=+ 'case' Expr 'of' OpenBlock CaseOption+ CloseBlock;+@+-}+caseExpr :: SyntaxInfo -> IdrisParser PTerm+caseExpr syn = do kw1 <- reservedFC "case"; fc <- getFC+ scr <- expr syn; kw2 <- reservedFC "of";+ opts <- indentedBlock1 (caseOption syn)+ highlightP kw1 AnnKeyword+ highlightP kw2 AnnKeyword+ return (PCase fc scr opts)+ <?> "case expression"++{- | Parses a case in a case expression+@+CaseOption ::=+ Expr (Impossible | '=>' Expr) Terminator+ ;+@+-}+caseOption :: SyntaxInfo -> IdrisParser (PTerm, PTerm)+caseOption syn = do lhs <- expr (syn { inPattern = True })+ r <- impossible <|> symbol "=>" *> expr syn+ return (lhs, r)+ <?> "case option"++warnTacticDeprecation :: FC -> IdrisParser ()+warnTacticDeprecation fc =+ parserWarning fc (Just NoOldTacticDeprecationWarnings) (Msg "This style of tactic proof is deprecated. See %runElab for the replacement.")++{- | Parses a proof block+@+ProofExpr ::=+ 'proof' OpenBlock Tactic'* CloseBlock+ ;+@+-}+proofExpr :: SyntaxInfo -> IdrisParser PTerm+proofExpr syn = do kw <- reservedFC "proof"+ ts <- indentedBlock1 (tactic syn)+ highlightP kw AnnKeyword+ warnTacticDeprecation kw+ return $ PProof ts+ <?> "proof block"++{- | Parses a tactics block+@+TacticsExpr :=+ 'tactics' OpenBlock Tactic'* CloseBlock+;+@+-}+tacticsExpr :: SyntaxInfo -> IdrisParser PTerm+tacticsExpr syn = do kw <- reservedFC "tactics"+ ts <- indentedBlock1 (tactic syn)+ highlightP kw AnnKeyword+ warnTacticDeprecation kw+ return $ PTactics ts+ <?> "tactics block"++{- | Parses a simple expression+@+SimpleExpr ::=+ {- External (User-defined) Simple Expression -}+ | '?' Name+ | % 'instance'+ | 'Refl' ('{' Expr '}')?+ | ProofExpr+ | TacticsExpr+ | FnName+ | Idiom+ | List+ | Alt+ | Bracketed+ | Constant+ | Type+ | 'Void'+ | Quasiquote+ | NameQuote+ | Unquote+ | '_'+ ;+@+-}+simpleExpr :: SyntaxInfo -> IdrisParser PTerm+simpleExpr syn =+ try (simpleExternalExpr syn)+ <|> do (x, FC f (l, c) end) <- try (lchar '?' *> name)+ return (PMetavar (FC f (l, c-1) end) x)+ <|> do lchar '%'; fc <- getFC; reserved "instance"; return (PResolveTC fc)+ <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t))+ <|> proofExpr syn+ <|> tacticsExpr syn+ <|> try (do reserved "Type"; symbol "*"; return $ PUniverse AllTypes)+ <|> do reserved "AnyType"; return $ PUniverse AllTypes+ <|> PType <$> reservedFC "Type"+ <|> do reserved "UniqueType"; return $ PUniverse UniqueType+ <|> do reserved "NullType"; return $ PUniverse NullType+ <|> do (c, cfc) <- constant+ fc <- getFC+ return (modifyConst syn fc (PConstant cfc c))+ <|> do symbol "'"; fc <- getFC; str <- fst <$> name+ return (PApp fc (PRef fc [] (sUN "Symbol_"))+ [pexp (PConstant NoFC (Str (show str)))])+ <|> do (x, fc) <- fnName+ if inPattern syn+ then option (PRef fc [fc] x)+ (do reservedOp "@"+ s <- simpleExpr syn+ fcIn <- getFC+ return (PAs fcIn x s))+ else return (PRef fc [fc] x)+ <|> idiom syn+ <|> listExpr syn+ <|> alt syn+ <|> do reservedOp "!"+ s <- simpleExpr syn+ fc <- getFC+ return (PAppBind fc s [])+ <|> bracketed (disallowImp syn)+ <|> quasiquote syn+ <|> namequote syn+ <|> unquote syn+ <|> do lchar '_'; return Placeholder+ <?> "expression"++{- |Parses an expression in braces+@+Bracketed ::= '(' Bracketed'+@+ -}+bracketed :: SyntaxInfo -> IdrisParser PTerm+bracketed syn = do (FC fn (sl, sc) _) <- getFC+ lchar '(' <?> "parenthesized expression"+ bracketed' (FC fn (sl, sc) (sl, sc+1)) syn+{- |Parses the rest of an expression in braces+@+Bracketed' ::=+ ')'+ | Expr ')'+ | ExprList ')'+ | Expr '**' Expr ')'+ | Operator Expr ')'+ | Expr Operator ')'+ | Name ':' Expr '**' Expr ')'+ ;+@+-}+bracketed' :: FC -> SyntaxInfo -> IdrisParser PTerm+bracketed' open syn =+ do (FC f start (l, c)) <- getFC+ lchar ')'+ return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm+ <|> try (do (ln, lnfc) <- name+ colonFC <- lcharFC ':'+ lty <- expr syn+ starsFC <- reservedOpFC "**"+ fc <- getFC+ r <- expr syn+ close <- lcharFC ')'+ return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r))+ <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'+ -- No prefix operators! (bit of a hack here...)+ if (o == "-" || o == "!")+ then fail "minus not allowed in section"+ else return $ PLam fc (sMN 1000 "ARG") NoFC Placeholder+ (PApp fc (PRef fc [] (sUN o)) [pexp (PRef fc [] (sMN 1000 "ARG")),+ pexp e]))+ <|> try (do l <- simpleExpr syn+ op <- option Nothing (do o <- operator+ lchar ')'+ return (Just o))+ fc0 <- getFC+ case op of+ Nothing -> bracketedExpr syn open l+ Just o -> return $ PLam fc0 (sMN 1000 "ARG") NoFC Placeholder+ (PApp fc0 (PRef fc0 [] (sUN o)) [pexp l,+ pexp (PRef fc0 [] (sMN 1000 "ARG"))]))+ <|> do l <- expr syn+ bracketedExpr syn open l++-- | Parse the contents of parentheses, after an expression has been parsed.+bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm+bracketedExpr syn openParenFC e =+ do lchar ')'; return e+ <|> do exprs <- many (do comma <- lcharFC ','+ r <- expr syn+ return (r, comma))+ closeParenFC <- lcharFC ')'+ let hilite = [openParenFC, closeParenFC] ++ map snd exprs+ return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)+ <|> do starsFC <- reservedOpFC "**"+ r <- expr syn+ closeParenFC <- lcharFC ')'+ return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r)+ <?> "end of bracketed expression"+ where mergePairs :: [(PTerm, FC)] -> PTerm+ mergePairs [(t, fc)] = t+ mergePairs ((t, fc):rs) = PPair fc [] TypeOrTerm t (mergePairs rs)++-- bit of a hack here. If the integer doesn't fit in an Int, treat it as a+-- big integer, otherwise try fromInteger and the constants as alternatives.+-- a better solution would be to fix fromInteger to work with Integer, as the+-- name suggests, rather than Int+{-| Finds optimal type for integer constant -}+modifyConst :: SyntaxInfo -> FC -> PTerm -> PTerm+modifyConst syn fc (PConstant inFC (BI x))+ | not (inPattern syn)+ = PConstSugar inFC $ -- wrap in original location for highlighting+ PAlternative [] FirstSuccess+ (PApp fc (PRef fc [] (sUN "fromInteger")) [pexp (PConstant NoFC (BI (fromInteger x)))]+ : consts)+ | otherwise = PConstSugar inFC $+ PAlternative [] FirstSuccess consts+ where+ consts = [ PConstant inFC (BI x)+ , PConstant inFC (I (fromInteger x))+ , PConstant inFC (B8 (fromInteger x))+ , PConstant inFC (B16 (fromInteger x))+ , PConstant inFC (B32 (fromInteger x))+ , PConstant inFC (B64 (fromInteger x))+ ]+modifyConst syn fc x = x++{- | Parses an alternative expression+@+ Alt ::= '(|' Expr_List '|)';++ Expr_List ::=+ Expr'+ | Expr' ',' Expr_List+ ;+@+-}+alt :: SyntaxInfo -> IdrisParser PTerm+alt syn = do symbol "(|"; alts <- sepBy1 (expr' syn) (lchar ','); symbol "|)"+ return (PAlternative [] FirstSuccess alts)++{- | Parses a possibly hidden simple expression+@+HSimpleExpr ::=+ '.' SimpleExpr+ | SimpleExpr+ ;+@+-}+hsimpleExpr :: SyntaxInfo -> IdrisParser PTerm+hsimpleExpr syn =+ do lchar '.'+ e <- simpleExpr syn+ return $ PHidden e+ <|> simpleExpr syn+ <?> "expression"++{- | Parses a unification log expression+UnifyLog ::=+ '%' 'unifyLog' SimpleExpr+ ;+-}+unifyLog :: SyntaxInfo -> IdrisParser PTerm+unifyLog syn = do (FC fn (sl, sc) kwEnd) <- try (lchar '%' *> reservedFC "unifyLog")+ tm <- simpleExpr syn+ highlightP (FC fn (sl, sc-1) kwEnd) AnnKeyword+ return (PUnifyLog tm)+ <?> "unification log expression"++{- | Parses a new-style tactics expression+RunTactics ::=+ '%' 'runElab' SimpleExpr+ ;+-}+runElab :: SyntaxInfo -> IdrisParser PTerm+runElab syn = do (FC fn (sl, sc) kwEnd) <- try (lchar '%' *> reservedFC "runElab")+ fc <- getFC+ tm <- simpleExpr syn+ highlightP (FC fn (sl, sc-1) kwEnd) AnnKeyword+ return $ PRunElab fc tm (syn_namespace syn)+ <?> "new-style tactics expression"++{- | Parses a disambiguation expression+Disamb ::=+ '%' 'disamb' NameList Expr+ ;+-}+disamb :: SyntaxInfo -> IdrisParser PTerm+disamb syn = do kw <- reservedFC "with"+ ns <- sepBy1 (fst <$> name) (lchar ',')+ tm <- expr' syn+ highlightP kw AnnKeyword+ return (PDisamb (map tons ns) tm)+ <?> "namespace disambiguation expression"+ where tons (NS n s) = txt (show n) : s+ tons n = [txt (show n)]+{- | Parses a no implicits expression+@+NoImplicits ::=+ '%' 'noImplicits' SimpleExpr+ ;+@+-}+noImplicits :: SyntaxInfo -> IdrisParser PTerm+noImplicits syn = do try (lchar '%' *> reserved "noImplicits")+ tm <- simpleExpr syn+ return (PNoImplicits tm)+ <?> "no implicits expression"++{- | Parses a function application expression+@+App ::=+ 'mkForeign' Arg Arg*+ | MatchApp+ | SimpleExpr Arg*+ ;+MatchApp ::=+ SimpleExpr '<==' FnName+ ;+@+-}+app :: SyntaxInfo -> IdrisParser PTerm+app syn = do f <- simpleExpr syn+ (do try $ reservedOp "<=="+ fc <- getFC+ ff <- fst <$> fnName+ return (PLet fc (sMN 0 "match") NoFC+ f+ (PMatchApp fc ff)+ (PRef fc [] (sMN 0 "match")))+ <?> "matching application expression") <|> (do+ fc <- getFC+ i <- get+ args <- many (do notEndApp; arg syn)+ case args of+ [] -> return f+ _ -> return (flattenFromInt fc f args))+ <?> "function application"+ where+ -- bit of a hack to deal with the situation where we're applying a+ -- literal to an argument, which we may want for obscure applications+ -- of fromInteger, and this will help disambiguate better.+ -- We know, at least, it won't be one of the constants!+ flattenFromInt fc (PAlternative _ x alts) args+ | Just i <- getFromInt alts+ = PApp fc (PRef fc [] (sUN "fromInteger")) (i : args)+ flattenFromInt fc f args = PApp fc f args++ getFromInt ((PApp _ (PRef _ _ n) [a]) : _) | n == sUN "fromInteger" = Just a+ getFromInt (_ : xs) = getFromInt xs+ getFromInt _ = Nothing++{-| Parses a function argument+@+Arg ::=+ ImplicitArg+ | ConstraintArg+ | SimpleExpr+ ;+@+-}+arg :: SyntaxInfo -> IdrisParser PArg+arg syn = implicitArg syn+ <|> constraintArg syn+ <|> do e <- simpleExpr syn+ return (pexp e)+ <?> "function argument"++{-| Parses an implicit function argument+@+ImplicitArg ::=+ '{' Name ('=' Expr)? '}'+ ;+@+-}+implicitArg :: SyntaxInfo -> IdrisParser PArg+implicitArg syn = do lchar '{'+ (n, nfc) <- name+ fc <- getFC+ v <- option (PRef nfc [nfc] n) (do lchar '='+ expr syn)+ lchar '}'+ return (pimp n v True)+ <?> "implicit function argument"++{-| Parses a constraint argument (for selecting a named type class instance)++> ConstraintArg ::=+> '@{' Expr '}'+> ;++-}+constraintArg :: SyntaxInfo -> IdrisParser PArg+constraintArg syn = do symbol "@{"+ e <- expr syn+ symbol "}"+ return (pconst e)+ <?> "constraint argument"++{-| Parses a quasiquote expression (for building reflected terms using the elaborator)++> Quasiquote ::= '`(' Expr ')'++-}+quasiquote :: SyntaxInfo -> IdrisParser PTerm+quasiquote syn = do startFC <- symbolFC "`("+ e <- expr syn { syn_in_quasiquote = (syn_in_quasiquote syn) + 1 ,+ inPattern = False }+ g <- optional $+ do fc <- symbolFC ":"+ ty <- expr syn { inPattern = False } -- don't allow antiquotes+ return (ty, fc)+ endFC <- symbolFC ")"+ mapM_ (uncurry highlightP) [(startFC, AnnKeyword), (endFC, AnnKeyword), (spanFC startFC endFC, AnnQuasiquote)]+ case g of+ Just (_, fc) -> highlightP fc AnnKeyword+ _ -> return ()+ return $ PQuasiquote e (fst <$> g)+ <?> "quasiquotation"++{-| Parses an unquoting inside a quasiquotation (for building reflected terms using the elaborator)++> Unquote ::= ',' Expr++-}+unquote :: SyntaxInfo -> IdrisParser PTerm+unquote syn = do guard (syn_in_quasiquote syn > 0)+ startFC <- symbolFC "~"+ e <- simpleExpr syn { syn_in_quasiquote = syn_in_quasiquote syn - 1 }+ endFC <- getFC+ highlightP startFC AnnKeyword+ highlightP (spanFC startFC endFC) AnnAntiquote+ return $ PUnquote e+ <?> "unquotation"++{-| Parses a quotation of a name (for using the elaborator to resolve boring details)++> NameQuote ::= '`{' Name '}'++-}+namequote :: SyntaxInfo -> IdrisParser PTerm+namequote syn = do (startFC, res) <-+ try (do fc <- symbolFC "`{{"+ return (fc, False)) <|>+ (do fc <- symbolFC "`{"+ return (fc, True))+ (n, nfc) <- fnName+ endFC <- if res then symbolFC "}" else symbolFC "}}"+ mapM_ (uncurry highlightP)+ [ (startFC, AnnKeyword)+ , (endFC, AnnKeyword)+ , (spanFC startFC endFC, AnnQuasiquote)+ ]+ return $ PQuoteName n res nfc+ <?> "quoted name"+++{-| Parses a record field setter expression+@+RecordType ::=+ 'record' '{' FieldTypeList '}';+@+@+FieldTypeList ::=+ FieldType+ | FieldType ',' FieldTypeList+ ;+@+@+FieldType ::=+ FnName '=' Expr+ ;+@+-}+recordType :: SyntaxInfo -> IdrisParser PTerm+recordType syn =+ do kw <- reservedFC "record"+ lchar '{'+ fgs <- fieldGetOrSet+ lchar '}'+ fc <- getFC+ rec <- optional (simpleExpr syn)+ highlightP kw AnnKeyword+ case fgs of+ Left fields ->+ case rec of+ Nothing ->+ return (PLam fc (sMN 0 "fldx") NoFC Placeholder+ (applyAll fc fields (PRef fc [] (sMN 0 "fldx"))))+ Just v -> return (applyAll fc fields v)+ Right fields ->+ case rec of+ Nothing ->+ return (PLam fc (sMN 0 "fldx") NoFC Placeholder+ (getAll fc (reverse fields)+ (PRef fc [] (sMN 0 "fldx"))))+ Just v -> return (getAll fc (reverse fields) v)++ <?> "record setting expression"+ where fieldSet :: IdrisParser ([Name], PTerm)+ fieldSet = do ns <- fieldGet+ lchar '='+ e <- expr syn+ return (ns, e)+ <?> "field setter"++ fieldGet :: IdrisParser [Name]+ fieldGet = sepBy1 (fst <$> fnName) (symbol "->")++ fieldGetOrSet :: IdrisParser (Either [([Name], PTerm)] [Name])+ fieldGetOrSet = try (do fs <- sepBy1 fieldSet (lchar ',')+ return (Left fs))+ <|> do f <- fieldGet+ return (Right f)++ applyAll :: FC -> [([Name], PTerm)] -> PTerm -> PTerm+ applyAll fc [] x = x+ applyAll fc ((ns, e) : es) x+ = applyAll fc es (doUpdate fc ns e x)++ doUpdate fc [n] e get+ = PApp fc (PRef fc [] (mkType n)) [pexp e, pexp get]+ doUpdate fc (n : ns) e get+ = PApp fc (PRef fc [] (mkType n))+ [pexp (doUpdate fc ns e (PApp fc (PRef fc [] n) [pexp get])),+ pexp get]++ getAll :: FC -> [Name] -> PTerm -> PTerm+ getAll fc [n] e = PApp fc (PRef fc [] n) [pexp e]+ getAll fc (n:ns) e = PApp fc (PRef fc [] n) [pexp (getAll fc ns e)]+++-- | Creates setters for record types on necessary functions+mkType :: Name -> Name+mkType (UN n) = sUN ("set_" ++ str n)+mkType (MN 0 n) = sMN 0 ("set_" ++ str n)+mkType (NS n s) = NS (mkType n) s++{- | Parses a type signature+@+TypeSig ::=+ ':' Expr+ ;+@+@+TypeExpr ::= ConstraintList? Expr;+@+ -}+typeExpr :: SyntaxInfo -> IdrisParser PTerm+typeExpr syn = do cs <- if implicitAllowed syn then constraintList syn else return []+ sc <- expr syn+ return (bindList (PPi constraint) cs sc)+ <?> "type signature"++{- | Parses a lambda expression+@+Lambda ::=+ '\\' TypeOptDeclList LambdaTail+ | '\\' SimpleExprList LambdaTail+ ;+@+@+SimpleExprList ::=+ SimpleExpr+ | SimpleExpr ',' SimpleExprList+ ;+@+@+LambdaTail ::=+ Impossible+ | '=>' Expr+@+-}+lambda :: SyntaxInfo -> IdrisParser PTerm+lambda syn = do lchar '\\' <?> "lambda expression"+ ((do xt <- try $ tyOptDeclList syn+ fc <- getFC+ sc <- lambdaTail+ return (bindList (PLam fc) xt sc))+ <|>+ (do ps <- sepBy (do fc <- getFC+ e <- simpleExpr (syn { inPattern = True })+ return (fc, e))+ (lchar ',')+ sc <- lambdaTail+ return (pmList (zip [0..] ps) sc)))+ <?> "lambda expression"+ where pmList :: [(Int, (FC, PTerm))] -> PTerm -> PTerm+ pmList [] sc = sc+ pmList ((i, (fc, x)) : xs) sc+ = PLam fc (sMN i "lamp") NoFC Placeholder+ (PCase fc (PRef fc [] (sMN i "lamp"))+ [(x, pmList xs sc)])+ lambdaTail :: IdrisParser PTerm+ lambdaTail = impossible <|> symbol "=>" *> expr syn++{- | Parses a term rewrite expression+@+RewriteTerm ::=+ 'rewrite' Expr ('==>' Expr)? 'in' Expr+ ;+@+-}+rewriteTerm :: SyntaxInfo -> IdrisParser PTerm+rewriteTerm syn = do kw <- reservedFC "rewrite"+ fc <- getFC+ prf <- expr syn+ giving <- optional (do symbol "==>"; expr' syn)+ kw' <- reservedFC "in"; sc <- expr syn+ highlightP kw AnnKeyword+ highlightP kw' AnnKeyword+ return (PRewrite fc+ (PApp fc (PRef fc [] (sUN "sym")) [pexp prf]) sc+ giving)+ <?> "term rewrite expression"++{- |Parses a let binding+@+Let ::=+ 'let' Name TypeSig'? '=' Expr 'in' Expr+| 'let' Expr' '=' Expr' 'in' Expr++TypeSig' ::=+ ':' Expr'+ ;+@+ -}+let_ :: SyntaxInfo -> IdrisParser PTerm+let_ syn = try (do kw <- reservedFC "let"+ ls <- indentedBlock (let_binding syn)+ kw' <- reservedFC "in"; sc <- expr syn+ highlightP kw AnnKeyword; highlightP kw' AnnKeyword+ return (buildLets ls sc))+ <?> "let binding"+ where buildLets [] sc = sc+ buildLets ((fc, PRef nfc _ n, ty, v, []) : ls) sc+ = PLet fc n nfc ty v (buildLets ls sc)+ buildLets ((fc, pat, ty, v, alts) : ls) sc+ = PCase fc v ((pat, buildLets ls sc) : alts)++let_binding syn = do fc <- getFC;+ pat <- expr' (syn { inPattern = True })+ ty <- option Placeholder (do lchar ':'; expr' syn)+ lchar '='+ v <- expr syn+ ts <- option [] (do lchar '|'+ sepBy1 (do_alt syn) (lchar '|'))+ return (fc,pat,ty,v,ts)++{- | Parses a conditional expression+@+If ::= 'if' Expr 'then' Expr 'else' Expr+@++-}+if_ :: SyntaxInfo -> IdrisParser PTerm+if_ syn = (do ifFC <- reservedFC "if"+ fc <- getFC+ c <- expr syn+ thenFC <- reservedFC "then"+ t <- expr syn+ elseFC <- reservedFC "else"+ f <- expr syn+ mapM_ (flip highlightP AnnKeyword) [ifFC, thenFC, elseFC]+ return (PIfThenElse fc c t f))+ <?> "conditional expression"+++{- | Parses a quote goal++@+QuoteGoal ::=+ 'quoteGoal' Name 'by' Expr 'in' Expr+ ;+@+ -}+quoteGoal :: SyntaxInfo -> IdrisParser PTerm+quoteGoal syn = do kw1 <- reservedFC "quoteGoal"; n <- fst <$> name;+ kw2 <- reservedFC "by"+ r <- expr syn+ kw3 <- reservedFC "in"+ fc <- getFC+ sc <- expr syn+ mapM_ (flip highlightP AnnKeyword) [kw1, kw2, kw3]+ return (PGoal fc r n sc)+ <?> "quote goal expression"++{- | Parses a dependent type signature++@+Pi ::= PiOpts Static? Pi'+@++@+Pi' ::=+ OpExpr ('->' Pi)?+ | '(' TypeDeclList ')' '->' Pi+ | '{' TypeDeclList '}' '->' Pi+ | '{' 'auto' TypeDeclList '}' '->' Pi+ | '{' 'default' SimpleExpr TypeDeclList '}' '->' Pi+ ;+@+ -}++bindsymbol opts st syn+ = do symbol "->"+ return (Exp opts st False)++explicitPi opts st syn+ = do xt <- try (lchar '(' *> typeDeclList syn <* lchar ')')+ binder <- bindsymbol opts st syn+ sc <- expr syn+ return (bindList (PPi binder) xt sc)++autoImplicit opts st syn+ = do kw <- reservedFC "auto"+ when (st == Static) $ fail "auto implicits can not be static"+ xt <- typeDeclList syn+ lchar '}'+ symbol "->"+ sc <- expr syn+ highlightP kw AnnKeyword+ return (bindList (PPi+ (TacImp [] Dynamic (PTactics [ProofSearch True True 100 Nothing [] []]))) xt sc)++defaultImplicit opts st syn = do+ kw <- reservedFC "default"+ when (st == Static) $ fail "default implicits can not be static"+ ist <- get+ script' <- simpleExpr syn+ let script = debindApp syn . desugar syn ist $ script'+ xt <- typeDeclList syn+ lchar '}'+ symbol "->"+ sc <- expr syn+ highlightP kw AnnKeyword+ return (bindList (PPi (TacImp [] Dynamic script)) xt sc)++normalImplicit opts st syn = do+ xt <- typeDeclList syn <* lchar '}'+ symbol "->"+ cs <- constraintList syn+ sc <- expr syn+ let (im,cl)+ = if implicitAllowed syn+ then (Imp opts st False (Just (Impl False True)),+ constraint)+ else (Imp opts st False (Just (Impl False False)),+ Imp opts st False (Just (Impl True False)))+ return (bindList (PPi im) xt+ (bindList (PPi cl) cs sc))++implicitPi opts st syn =+ autoImplicit opts st syn+ <|> defaultImplicit opts st syn+ <|> normalImplicit opts st syn++unboundPi opts st syn = do+ x <- opExpr syn+ (do binder <- bindsymbol opts st syn+ sc <- expr syn+ return (PPi binder (sUN "__pi_arg") NoFC x sc))+ <|> return x++pi :: SyntaxInfo -> IdrisParser PTerm+pi syn =+ do opts <- piOpts syn+ st <- static+ explicitPi opts st syn+ <|> try (do lchar '{'; implicitPi opts st syn)+ <|> unboundPi opts st syn+ <?> "dependent type signature"++{- | Parses Possible Options for Pi Expressions+@+ PiOpts ::= '.'?+@+-}+piOpts :: SyntaxInfo -> IdrisParser [ArgOpt]+piOpts syn | implicitAllowed syn =+ lchar '.' *> return [InaccessibleArg]+ <|> return []+piOpts syn = return []++{- | Parses a type constraint list++@+ConstraintList ::=+ '(' Expr_List ')' '=>'+ | Expr '=>'+ ;+@+-}+constraintList :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]+constraintList syn = try (constraintList1 syn)+ <|> return []++constraintList1 :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]+constraintList1 syn = try (do lchar '('+ tys <- sepBy1 nexpr (lchar ',')+ lchar ')'+ reservedOp "=>"+ return tys)+ <|> try (do t <- opExpr (disallowImp syn)+ reservedOp "=>"+ return [(defname, NoFC, t)])+ <?> "type constraint list"+ where nexpr = try (do (n, fc) <- name; lchar ':'+ e <- expr syn+ return (n, fc, e))+ <|> do e <- expr syn+ return (defname, NoFC, e)+ defname = sMN 0 "constraint"++{- | Parses a type declaration list+@+TypeDeclList ::=+ FunctionSignatureList+ | NameList TypeSig+ ;+@++@+FunctionSignatureList ::=+ Name TypeSig+ | Name TypeSig ',' FunctionSignatureList+ ;+@+-}+typeDeclList :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]+typeDeclList syn = try (sepBy1 (do (x, xfc) <- fnName+ lchar ':'+ t <- typeExpr (disallowImp syn)+ return (x, xfc, t))+ (lchar ','))+ <|> do ns <- sepBy1 name (lchar ',')+ lchar ':'+ t <- typeExpr (disallowImp syn)+ return (map (\(x, xfc) -> (x, xfc, t)) ns)+ <?> "type declaration list"++{- | Parses a type declaration list with optional parameters+@+TypeOptDeclList ::=+ NameOrPlaceholder TypeSig?+ | NameOrPlaceholder TypeSig? ',' TypeOptDeclList+ ;+@++@+NameOrPlaceHolder ::= Name | '_';+@+-}+tyOptDeclList :: SyntaxInfo -> IdrisParser [(Name, FC, PTerm)]+tyOptDeclList syn = sepBy1 (do (x, fc) <- nameOrPlaceholder+ t <- option Placeholder (do lchar ':'+ expr syn)+ return (x, fc, t))+ (lchar ',')+ <?> "type declaration list"+ where nameOrPlaceholder :: IdrisParser (Name, FC)+ nameOrPlaceholder = fnName+ <|> do symbol "_"+ return (sMN 0 "underscore", NoFC)+ <?> "name or placeholder"++{- | Parses a list literal expression e.g. [1,2,3] or a comprehension [ (x, y) | x <- xs , y <- ys ]+@+ListExpr ::=+ '[' ']'+ | '[' Expr '|' DoList ']'+ | '[' ExprList ']'+;+@+@+DoList ::=+ Do+ | Do ',' DoList+ ;+@+@+ExprList ::=+ Expr+ | Expr ',' ExprList+ ;+@+ -}+listExpr :: SyntaxInfo -> IdrisParser PTerm+listExpr syn = do (FC f (l, c) _) <- getFC+ lchar '['; fc <- getFC;+ (try . token $ do (char ']' <?> "end of list expression")+ (FC _ _ (l', c')) <- getFC+ return (mkNil (FC f (l, c) (l', c'))))+ <|> (do x <- expr syn <?> "expression"+ (do try (lchar '|') <?> "list comprehension"+ qs <- sepBy1 (do_ syn) (lchar ',')+ lchar ']'+ return (PDoBlock (map addGuard qs +++ [DoExp fc (PApp fc (PRef fc [] (sUN "return"))+ [pexp x])]))) <|>+ (do xs <- many (do (FC fn (sl, sc) _) <- getFC+ lchar ',' <?> "list element"+ let commaFC = FC fn (sl, sc) (sl, sc + 1)+ elt <- expr syn+ return (elt, commaFC))+ (FC fn (sl, sc) _) <- getFC+ lchar ']' <?> "end of list expression"+ let rbrackFC = FC fn (sl, sc) (sl, sc+1)+ return (mkList fc rbrackFC ((x, (FC f (l, c) (l, c+1))) : xs))))+ <?> "list expression"+ where+ mkNil :: FC -> PTerm+ mkNil fc = PRef fc [fc] (sUN "Nil")+ mkList :: FC -> FC -> [(PTerm, FC)] -> PTerm+ mkList errFC nilFC [] = PRef nilFC [nilFC] (sUN "Nil")+ mkList errFC nilFC ((x, fc) : xs) = PApp errFC (PRef fc [fc] (sUN "::")) [pexp x, pexp (mkList errFC nilFC xs)]+ addGuard :: PDo -> PDo+ addGuard (DoExp fc e) = DoExp fc (PApp fc (PRef fc [] (sUN "guard"))+ [pexp e])+ addGuard x = x++{- | Parses a do-block+@+Do' ::= Do KeepTerminator;+@++@+DoBlock ::=+ 'do' OpenBlock Do'+ CloseBlock+ ;+@+ -}+doBlock :: SyntaxInfo -> IdrisParser PTerm+doBlock syn+ = do kw <- reservedFC "do"+ ds <- indentedBlock1 (do_ syn)+ highlightP kw AnnKeyword+ return (PDoBlock ds)+ <?> "do block"++{- | Parses an expression inside a do block+@+Do ::=+ 'let' Name TypeSig'? '=' Expr+ | 'let' Expr' '=' Expr+ | Name '<-' Expr+ | Expr' '<-' Expr+ | Expr+ ;+@+-}+do_ :: SyntaxInfo -> IdrisParser PDo+do_ syn+ = try (do kw <- reservedFC "let"+ (i, ifc) <- name+ ty <- option Placeholder (do lchar ':'+ expr' syn)+ reservedOp "="+ fc <- getFC+ e <- expr syn+ highlightP kw AnnKeyword+ return (DoLet fc i ifc ty e))+ <|> try (do kw <- reservedFC "let"+ i <- expr' syn+ reservedOp "="+ fc <- getFC+ sc <- expr syn+ highlightP kw AnnKeyword+ return (DoLetP fc i sc))+ <|> try (do (i, ifc) <- name+ symbol "<-"+ fc <- getFC+ e <- expr syn;+ option (DoBind fc i ifc e)+ (do lchar '|'+ ts <- sepBy1 (do_alt syn) (lchar '|')+ return (DoBindP fc (PRef ifc [ifc] i) e ts)))+ <|> try (do i <- expr' syn+ symbol "<-"+ fc <- getFC+ e <- expr syn;+ option (DoBindP fc i e [])+ (do lchar '|'+ ts <- sepBy1 (do_alt syn) (lchar '|')+ return (DoBindP fc i e ts)))+ <|> do e <- expr syn+ fc <- getFC+ return (DoExp fc e)+ <?> "do block expression"++do_alt syn = do l <- expr' syn+ option (Placeholder, l)+ (do symbol "=>"+ r <- expr' syn+ return (l, r))++{- | Parses an expression in idiom brackets+@+Idiom ::= '[|' Expr '|]';+@+-}+idiom :: SyntaxInfo -> IdrisParser PTerm+idiom syn+ = do symbol "[|"+ fc <- getFC+ e <- expr syn+ symbol "|]"+ return (PIdiom fc e)+ <?> "expression in idiom brackets"++{- |Parses a constant or literal expression++@+Constant ::=+ 'Integer'+ | 'Int'+ | 'Char'+ | 'Double'+ | 'String'+ | 'Bits8'+ | 'Bits16'+ | 'Bits32'+ | 'Bits64'+ | Float_t+ | Natural_t+ | VerbatimString_t+ | String_t+ | Char_t+ ;+@+-}++constants :: [(String, Idris.Core.TT.Const)]+constants =+ [ ("Integer", AType (ATInt ITBig))+ , ("Int", AType (ATInt ITNative))+ , ("Char", AType (ATInt ITChar))+ , ("Double", AType ATFloat)+ , ("String", StrType)+ , ("prim__WorldType", WorldType)+ , ("prim__TheWorld", TheWorld)+ , ("Bits8", AType (ATInt (ITFixed IT8)))+ , ("Bits16", AType (ATInt (ITFixed IT16)))+ , ("Bits32", AType (ATInt (ITFixed IT32)))+ , ("Bits64", AType (ATInt (ITFixed IT64)))+ ]++-- | Parse a constant and its source span+constant :: IdrisParser (Idris.Core.TT.Const, FC)+constant = choice [ do fc <- reservedFC name; return (ty, fc)+ | (name, ty) <- constants+ ]+ <|> do (f, fc) <- try float; return (Fl f, fc)+ <|> do (i, fc) <- natural; return (BI i, fc)+ <|> do (s, fc) <- verbatimStringLiteral; return (Str s, fc)+ <|> do (s, fc) <- stringLiteral; return (Str s, fc)+ <|> do (c, fc) <- try charLiteral; return (Ch c, fc) --Currently ambigous with symbols+ <?> "constant or literal"++{- | Parses a verbatim multi-line string literal (triple-quoted)++@+VerbatimString_t ::=+ '\"\"\"' ~'\"\"\"' '\"\"\"'+;+@+ -}+verbatimStringLiteral :: MonadicParsing m => m (String, FC)+verbatimStringLiteral = token $ do (FC f start _) <- getFC+ try $ string "\"\"\""+ str <- manyTill anyChar $ try (string "\"\"\"")+ (FC _ _ end) <- getFC+ return (str, FC f start end)++{- | Parses a static modifier++@+Static ::=+ '[' static ']'+;+@+-}+static :: IdrisParser Static+static = do reserved "%static"; return Static+ <|> do reserved "[static]"+ fc <- getFC+ parserWarning fc Nothing (Msg "The use of [static] is deprecated, use %static instead.")+ return Static+ <|> return Dynamic+ <?> "static modifier"++{- | Parses a tactic script++@+Tactic ::= 'intro' NameList?+ | 'intros'+ | 'refine' Name Imp++ | 'mrefine' Name+ | 'rewrite' Expr+ | 'induction' Expr+ | 'equiv' Expr+ | 'let' Name ':' Expr' '=' Expr+ | 'let' Name '=' Expr+ | 'focus' Name+ | 'exact' Expr+ | 'applyTactic' Expr+ | 'reflect' Expr+ | 'fill' Expr+ | 'try' Tactic '|' Tactic+ | '{' TacticSeq '}'+ | 'compute'+ | 'trivial'+ | 'solve'+ | 'attack'+ | 'state'+ | 'term'+ | 'undo'+ | 'qed'+ | 'abandon'+ | ':' 'q'+ ;++Imp ::= '?' | '_';++TacticSeq ::=+ Tactic ';' Tactic+ | Tactic ';' TacticSeq+ ;+@+-}++-- | A specification of the arguments that tactics can take+data TacticArg = NameTArg -- ^ Names: n1, n2, n3, ... n+ | ExprTArg+ | AltsTArg+ | StringLitTArg++-- The FIXMEs are Issue #1766 in the issue tracker.+-- https://github.com/idris-lang/Idris-dev/issues/1766+-- | A list of available tactics and their argument requirements+tactics :: [([String], Maybe TacticArg, SyntaxInfo -> IdrisParser PTactic)]+tactics =+ [ (["intro"], Nothing, const $ -- FIXME syntax for intro (fresh name)+ do ns <- sepBy (spaced (fst <$> name)) (lchar ','); return $ Intro ns)+ , noArgs ["intros"] Intros+ , noArgs ["unfocus"] Unfocus+ , (["refine"], Just ExprTArg, const $+ do n <- spaced (fst <$> fnName)+ imps <- many imp+ return $ Refine n imps)+ , (["claim"], Nothing, \syn ->+ do n <- indentPropHolds gtProp *> (fst <$> name)+ goal <- indentPropHolds gtProp *> expr syn+ return $ Claim n goal)+ , (["mrefine"], Just ExprTArg, const $+ do n <- spaced (fst <$> fnName)+ return $ MatchRefine n)+ , expressionTactic ["rewrite"] Rewrite+ , expressionTactic ["case"] CaseTac+ , expressionTactic ["induction"] Induction+ , expressionTactic ["equiv"] Equiv+ , (["let"], Nothing, \syn -> -- FIXME syntax for let+ do n <- (indentPropHolds gtProp *> (fst <$> name))+ (do indentPropHolds gtProp *> lchar ':'+ ty <- indentPropHolds gtProp *> expr' syn+ indentPropHolds gtProp *> lchar '='+ t <- indentPropHolds gtProp *> expr syn+ i <- get+ return $ LetTacTy n (desugar syn i ty) (desugar syn i t))+ <|> (do indentPropHolds gtProp *> lchar '='+ t <- indentPropHolds gtProp *> expr syn+ i <- get+ return $ LetTac n (desugar syn i t)))++ , (["focus"], Just ExprTArg, const $+ do n <- spaced (fst <$> name)+ return $ Focus n)+ , expressionTactic ["exact"] Exact+ , expressionTactic ["applyTactic"] ApplyTactic+ , expressionTactic ["byReflection"] ByReflection+ , expressionTactic ["reflect"] Reflect+ , expressionTactic ["fill"] Fill+ , (["try"], Just AltsTArg, \syn ->+ do t <- spaced (tactic syn)+ lchar '|'+ t1 <- spaced (tactic syn)+ return $ Try t t1)+ , noArgs ["compute"] Compute+ , noArgs ["trivial"] Trivial+ , noArgs ["unify"] DoUnify+ , (["search"], Nothing, const $+ do depth <- option 10 $ fst <$> natural+ return (ProofSearch True True (fromInteger depth) Nothing [] []))+ , noArgs ["instance"] TCInstance+ , noArgs ["solve"] Solve+ , noArgs ["attack"] Attack+ , noArgs ["state", ":state"] ProofState+ , noArgs ["term", ":term"] ProofTerm+ , noArgs ["undo", ":undo"] Undo+ , noArgs ["qed", ":qed"] Qed+ , noArgs ["abandon", ":q"] Abandon+ , noArgs ["skip"] Skip+ , noArgs ["sourceLocation"] SourceFC+ , expressionTactic [":e", ":eval"] TEval+ , expressionTactic [":t", ":type"] TCheck+ , expressionTactic [":search"] TSearch+ , (["fail"], Just StringLitTArg, const $+ do msg <- fst <$> stringLiteral+ return $ TFail [Idris.Core.TT.TextPart msg])+ , ([":doc"], Just ExprTArg, const $+ do whiteSpace+ doc <- (Right . fst <$> constant) <|> (Left . fst <$> fnName)+ eof+ return (TDocStr doc))+ ]+ where+ expressionTactic names tactic = (names, Just ExprTArg, \syn ->+ do t <- spaced (expr syn)+ i <- get+ return $ tactic (desugar syn i t))+ noArgs names tactic = (names, Nothing, const (return tactic))+ spaced parser = indentPropHolds gtProp *> parser+ imp :: IdrisParser Bool+ imp = do lchar '?'; return False+ <|> do lchar '_'; return True+++tactic :: SyntaxInfo -> IdrisParser PTactic+tactic syn = choice [ do choice (map reserved names); parser syn+ | (names, _, parser) <- tactics ]+ <|> do lchar '{'+ t <- tactic syn;+ lchar ';';+ ts <- sepBy1 (tactic syn) (lchar ';')+ lchar '}'+ return $ TSeq t (mergeSeq ts)+ <|> ((lchar ':' >> empty) <?> "prover command")+ <?> "tactic"+ where+ mergeSeq :: [PTactic] -> PTactic+ mergeSeq [t] = t+ mergeSeq (t:ts) = TSeq t (mergeSeq ts)++-- | Parses a tactic as a whole+fullTactic :: SyntaxInfo -> IdrisParser PTactic+fullTactic syn = do t <- tactic syn+ eof+ return t
@@ -0,0 +1,701 @@+{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards, StandaloneDeriving #-}+#if !(MIN_VERSION_base(4,8,0))+{-# LANGUAGE OverlappingInstances #-}+#endif+module Idris.Parser.Helpers where++import Prelude hiding (pi)++import Text.Trifecta.Delta+import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err)+import Text.Parser.LookAhead+import Text.Parser.Expression+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Char as Chr+import qualified Text.Parser.Token.Highlight as Hi++import Idris.AbsSyntax++import Idris.Core.TT+import Idris.Core.Evaluate+import Idris.Delaborate (pprintErr)+import Idris.Docstrings+import Idris.Output (iWarn)++import qualified Util.Pretty as Pretty (text)++import Control.Applicative+import Control.Monad+import Control.Monad.State.Strict++import Data.Maybe+import qualified Data.List.Split as Spl+import Data.List+import Data.Monoid+import Data.Char+import qualified Data.Map as M+import qualified Data.HashSet as HS+import qualified Data.Text as T+import qualified Data.ByteString.UTF8 as UTF8++import System.FilePath++import Debug.Trace++-- | Idris parser with state used during parsing+type IdrisParser = StateT IState IdrisInnerParser++newtype IdrisInnerParser a = IdrisInnerParser { runInnerParser :: Parser a }+ deriving (Monad, Functor, MonadPlus, Applicative, Alternative, CharParsing, LookAheadParsing, DeltaParsing, MarkParsing Delta, Monoid, TokenParsing)++deriving instance Parsing IdrisInnerParser++#if MIN_VERSION_base(4,8,0)+instance {-# OVERLAPPING #-} TokenParsing IdrisParser where+#else+instance TokenParsing IdrisParser where+#endif+ someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()+ token p = do s <- get+ (FC fn (sl, sc) _) <- getFC --TODO: Update after fixing getFC+ -- See Issue #1594+ r <- p+ (FC fn _ (el, ec)) <- getFC+ whiteSpace+ put (s { lastTokenSpan = Just (FC fn (sl, sc) (el, ec)) })+ return r+-- | Generalized monadic parsing constraint type+type MonadicParsing m = (DeltaParsing m, LookAheadParsing m, TokenParsing m, Monad m)++class HasLastTokenSpan m where+ getLastTokenSpan :: m (Maybe FC)++instance HasLastTokenSpan IdrisParser where+ getLastTokenSpan = lastTokenSpan <$> get++-- | Helper to run Idris inner parser based stateT parsers+runparser :: StateT st IdrisInnerParser res -> st -> String -> String -> Result res+runparser p i inputname =+ parseString (runInnerParser (evalStateT p i))+ (Directed (UTF8.fromString inputname) 0 0 0 0)++highlightP :: FC -> OutputAnnotation -> IdrisParser ()+highlightP fc annot = do ist <- get+ put ist { idris_parserHighlights = (fc, annot) : idris_parserHighlights ist}++noDocCommentHere :: String -> IdrisParser ()+noDocCommentHere msg =+ optional (do fc <- getFC+ docComment+ ist <- get+ put ist { parserWarnings = (fc, Msg msg) : parserWarnings ist}) *>+ pure ()++clearParserWarnings :: Idris ()+clearParserWarnings = do ist <- getIState+ putIState ist { parserWarnings = [] }++reportParserWarnings :: Idris ()+reportParserWarnings = do ist <- getIState+ mapM_ (uncurry iWarn)+ (map (\ (fc, err) -> (fc, pprintErr ist err)) .+ reverse .+ nubBy (\(fc, err) (fc', err') ->+ FC' fc == FC' fc' && err == err') $+ parserWarnings ist)+ clearParserWarnings+++parserWarning :: FC -> Maybe Opt -> Err -> IdrisParser ()+parserWarning fc warnOpt warnErr = do+ ist <- get+ let cmdline = opt_cmdline (idris_options ist)+ unless (maybe False (`elem` cmdline) warnOpt) $+ put ist { parserWarnings = (fc, warnErr) : parserWarnings ist }++{- * Space, comments and literals (token/lexing like parsers) -}++-- | Consumes any simple whitespace (any character which satisfies Char.isSpace)+simpleWhiteSpace :: MonadicParsing m => m ()+simpleWhiteSpace = satisfy isSpace *> pure ()++-- | Checks if a charcter is end of line+isEol :: Char -> Bool+isEol '\n' = True+isEol _ = False++-- | A parser that succeeds at the end of the line+eol :: MonadicParsing m => m ()+eol = (satisfy isEol *> pure ()) <|> lookAhead eof <?> "end of line"++{- | Consumes a single-line comment++@+ SingleLineComment_t ::= '--' ~EOL_t* EOL_t ;+@+ -}+singleLineComment :: MonadicParsing m => m ()+singleLineComment = (string "--" *>+ many (satisfy (not . isEol)) *>+ eol *> pure ())+ <?> ""++{- | Consumes a multi-line comment++@+ MultiLineComment_t ::=+ '{ -- }'+ | '{ -' InCommentChars_t+ ;+@++@+ InCommentChars_t ::=+ '- }'+ | MultiLineComment_t InCommentChars_t+ | ~'- }'+ InCommentChars_t+ ;+@+-}+multiLineComment :: MonadicParsing m => m ()+multiLineComment = try (string "{-" *> (string "-}") *> pure ())+ <|> string "{-" *> inCommentChars+ <?> ""+ where inCommentChars :: MonadicParsing m => m ()+ inCommentChars = string "-}" *> pure ()+ <|> try (multiLineComment) *> inCommentChars+ <|> string "|||" *> many (satisfy (not . isEol)) *> eol *> inCommentChars+ <|> skipSome (noneOf startEnd) *> inCommentChars+ <|> oneOf startEnd *> inCommentChars+ <?> "end of comment"+ startEnd :: String+ startEnd = "{}-"++{-| Parses a documentation comment++@+ DocComment_t ::= '|||' ~EOL_t* EOL_t+ ;+@+ -}+docComment :: IdrisParser (Docstring (), [(Name, Docstring ())])+docComment = do dc <- pushIndent *> docCommentLine+ rest <- many (indented docCommentLine)+ args <- many $ do (name, first) <- indented argDocCommentLine+ rest <- many (indented docCommentLine)+ return (name, concat (intersperse "\n" (first:rest)))+ popIndent+ return (parseDocstring $ T.pack (concat (intersperse "\n" (dc:rest))),+ map (\(n, d) -> (n, parseDocstring (T.pack d))) args)++ where docCommentLine :: MonadicParsing m => m String+ docCommentLine = try (do string "|||"+ many (satisfy (==' '))+ contents <- option "" (do first <- satisfy (\c -> not (isEol c || c == '@'))+ res <- many (satisfy (not . isEol))+ return $ first:res)+ eol ; someSpace+ return contents)-- ++ concat rest))+ <?> ""++ argDocCommentLine = do string "|||"+ many (satisfy isSpace)+ char '@'+ many (satisfy isSpace)+ n <- fst <$> name+ many (satisfy isSpace)+ docs <- many (satisfy (not . isEol))+ eol ; someSpace+ return (n, docs)++-- | Parses some white space+whiteSpace :: MonadicParsing m => m ()+whiteSpace = Tok.whiteSpace++-- | Parses a string literal+stringLiteral :: (MonadicParsing m, HasLastTokenSpan m) => m (String, FC)+stringLiteral = do str <- Tok.stringLiteral+ fc <- getLastTokenSpan+ return (str, fromMaybe NoFC fc)++-- | Parses a char literal+charLiteral :: (MonadicParsing m, HasLastTokenSpan m) => m (Char, FC)+charLiteral = do ch <- Tok.charLiteral+ fc <- getLastTokenSpan+ return (ch, fromMaybe NoFC fc)++-- | Parses a natural number+natural :: (MonadicParsing m, HasLastTokenSpan m) => m (Integer, FC)+natural = do n <- Tok.natural+ fc <- getLastTokenSpan+ return (n, fromMaybe NoFC fc)++-- | Parses an integral number+integer :: MonadicParsing m => m Integer+integer = Tok.integer++-- | Parses a floating point number+float :: (MonadicParsing m, HasLastTokenSpan m) => m (Double, FC)+float = do f <- Tok.double+ fc <- getLastTokenSpan+ return (f, fromMaybe NoFC fc)++{- * Symbols, identifiers, names and operators -}+++-- | Idris Style for parsing identifiers/reserved keywords+idrisStyle :: MonadicParsing m => IdentifierStyle m+idrisStyle = IdentifierStyle _styleName _styleStart _styleLetter _styleReserved Hi.Identifier Hi.ReservedIdentifier+ where _styleName = "Idris"+ _styleStart = satisfy isAlpha <|> oneOf "_"+ _styleLetter = satisfy isAlphaNum <|> oneOf "_'."+ _styleReserved = HS.fromList ["let", "in", "data", "codata", "record", "corecord", "Type",+ "do", "dsl", "import", "impossible",+ "case", "of", "total", "partial", "mutual",+ "infix", "infixl", "infixr", "rewrite",+ "where", "with", "syntax", "proof", "postulate",+ "using", "namespace", "class", "instance",+ "interface", "implementation", "parameters",+ "public", "private", "export", "abstract", "implicit",+ "quoteGoal", "constructor",+ "if", "then", "else"]++char :: MonadicParsing m => Char -> m Char+char = Chr.char++string :: MonadicParsing m => String -> m String+string = Chr.string++-- | Parses a character as a token+lchar :: MonadicParsing m => Char -> m Char+lchar = token . char++-- | Parses a character as a token, returning the source span of the character+lcharFC :: MonadicParsing m => Char -> m FC+lcharFC ch = do (FC file (l, c) _) <- getFC+ _ <- token (char ch)+ return $ FC file (l, c) (l, c+1)++-- | Parses string as a token+symbol :: MonadicParsing m => String -> m String+symbol = Tok.symbol++symbolFC :: MonadicParsing m => String -> m FC+symbolFC str = do (FC file (l, c) _) <- getFC+ Tok.symbol str+ return $ FC file (l, c) (l, c + length str)++-- | Parses a reserved identifier+reserved :: MonadicParsing m => String -> m ()+reserved = Tok.reserve idrisStyle++-- | Parses a reserved identifier, computing its span. Assumes that+-- reserved identifiers never contain line breaks.+reservedFC :: MonadicParsing m => String -> m FC+reservedFC str = do (FC file (l, c) _) <- getFC+ Tok.reserve idrisStyle str+ return $ FC file (l, c) (l, c + length str)++-- | Parse a reserved identfier, highlighting its span as a keyword+reservedHL :: String -> IdrisParser ()+reservedHL str = reservedFC str >>= flip highlightP AnnKeyword++-- Taken from Parsec (c) Daan Leijen 1999-2001, (c) Paolo Martini 2007+-- | Parses a reserved operator+reservedOp :: MonadicParsing m => String -> m ()+reservedOp name = token $ try $+ do string name+ notFollowedBy (operatorLetter) <?> ("end of " ++ show name)++reservedOpFC :: MonadicParsing m => String -> m FC+reservedOpFC name = token $ try $ do (FC f (l, c) _) <- getFC+ string name+ notFollowedBy (operatorLetter) <?> ("end of " ++ show name)+ return (FC f (l, c) (l, c + length name))++-- | Parses an identifier as a token+identifier :: (MonadicParsing m) => m (String, FC)+identifier = try(do (i, fc) <-+ token $ do (FC f (l, c) _) <- getFC+ i <- Tok.ident idrisStyle+ return (i, FC f (l, c) (l, c + length i))+ when (i == "_") $ unexpected "wildcard"+ return (i, fc))++-- | Parses an identifier with possible namespace as a name+iName :: (MonadicParsing m, HasLastTokenSpan m) => [String] -> m (Name, FC)+iName bad = do (n, fc) <- maybeWithNS identifier False bad+ return (n, fc)+ <?> "name"++-- | Parses an string possibly prefixed by a namespace+maybeWithNS :: (MonadicParsing m, HasLastTokenSpan m) => m (String, FC) -> Bool -> [String] -> m (Name, FC)+maybeWithNS parser ascend bad = do+ fc <- getFC+ i <- option "" (lookAhead (fst <$> identifier))+ when (i `elem` bad) $ unexpected "reserved identifier"+ let transf = if ascend then id else reverse+ (x, xs, fc) <- choice (transf (parserNoNS parser : parsersNS parser i))+ return (mkName (x, xs), fc)+ where parserNoNS :: MonadicParsing m => m (String, FC) -> m (String, String, FC)+ parserNoNS parser = do startFC <- getFC+ (x, nameFC) <- parser+ return (x, "", spanFC startFC nameFC)+ parserNS :: MonadicParsing m => m (String, FC) -> String -> m (String, String, FC)+ parserNS parser ns = do startFC <- getFC+ xs <- string ns+ lchar '.'; (x, nameFC) <- parser+ return (x, xs, spanFC startFC nameFC)+ parsersNS :: MonadicParsing m => m (String, FC) -> String -> [m (String, String, FC)]+ parsersNS parser i = [try (parserNS parser ns) | ns <- (initsEndAt (=='.') i)]++-- | Parses a name+name :: IdrisParser (Name, FC)+name = (<?> "name") $ do+ keywords <- syntax_keywords <$> get+ aliases <- module_aliases <$> get+ (n, fc) <- iName keywords+ return (unalias aliases n, fc)+ where+ unalias :: M.Map [T.Text] [T.Text] -> Name -> Name+ unalias aliases (NS n ns) | Just ns' <- M.lookup ns aliases = NS n ns'+ unalias aliases name = name++{- | List of all initial segments in ascending order of a list. Every+such initial segment ends right before an element satisfying the given+condition.+-}+initsEndAt :: (a -> Bool) -> [a] -> [[a]]+initsEndAt p [] = []+initsEndAt p (x:xs) | p x = [] : x_inits_xs+ | otherwise = x_inits_xs+ where x_inits_xs = [x : cs | cs <- initsEndAt p xs]+++{- | Create a `Name' from a pair of strings representing a base name and its+ namespace.+-}+mkName :: (String, String) -> Name+mkName (n, "") = sUN n+mkName (n, ns) = sNS (sUN n) (reverse (parseNS ns))+ where parseNS x = case span (/= '.') x of+ (x, "") -> [x]+ (x, '.':y) -> x : parseNS y++opChars :: String+opChars = ":!#$%&*+./<=>?@\\^|-~"++operatorLetter :: MonadicParsing m => m Char+operatorLetter = oneOf opChars+++commentMarkers :: [String]+commentMarkers = [ "--", "|||" ]++invalidOperators :: [String]+invalidOperators = [":", "=>", "->", "<-", "=", "?=", "|", "**", "==>", "\\", "%", "~", "?", "!"]++-- | Parses an operator+operator :: MonadicParsing m => m String+operator = do op <- token . some $ operatorLetter+ when (op `elem` (invalidOperators ++ commentMarkers)) $+ fail $ op ++ " is not a valid operator"+ return op++-- | Parses an operator+operatorFC :: MonadicParsing m => m (String, FC)+operatorFC = do (op, fc) <- token $ do (FC f (l, c) _) <- getFC+ op <- some operatorLetter+ return (op, FC f (l, c) (l, c + length op))+ when (op `elem` (invalidOperators ++ commentMarkers)) $+ fail $ op ++ " is not a valid operator"+ return (op, fc)++{- * Position helpers -}+{- | Get filename from position (returns "(interactive)" when no source file is given) -}+fileName :: Delta -> String+fileName (Directed fn _ _ _ _) = UTF8.toString fn+fileName _ = "(interactive)"++{- | Get line number from position -}+lineNum :: Delta -> Int+lineNum (Lines l _ _ _) = fromIntegral l + 1+lineNum (Directed _ l _ _ _) = fromIntegral l + 1+lineNum _ = 0++{- | Get column number from position -}+columnNum :: Delta -> Int+columnNum pos = fromIntegral (column pos) + 1+++{- | Get file position as FC -}+getFC :: MonadicParsing m => m FC+getFC = do s <- position+ let (dir, file) = splitFileName (fileName s)+ let f = if dir == addTrailingPathSeparator "." then file else fileName s+ return $ FC f (lineNum s, columnNum s) (lineNum s, columnNum s) -- TODO: Change to actual spanning+ -- Issue #1594 on the Issue Tracker.+ -- https://github.com/idris-lang/Idris-dev/issues/1594+++{-* Syntax helpers-}+-- | Bind constraints to term+bindList :: (Name -> FC -> PTerm -> PTerm -> PTerm) -> [(Name, FC, PTerm)] -> PTerm -> PTerm+bindList b [] sc = sc+bindList b ((n, fc, t):bs) sc = b n fc t (bindList b bs sc)++{- | @commaSeparated p@ parses one or more occurences of `p`,+ separated by commas and optional whitespace. -}+commaSeparated :: MonadicParsing m => m a -> m [a]+commaSeparated p = p `sepBy1` (spaces >> char ',' >> spaces)++{- * Layout helpers -}++-- | Push indentation to stack+pushIndent :: IdrisParser ()+pushIndent = do pos <- position+ ist <- get+ put (ist { indent_stack = (fromIntegral (column pos) + 1) : indent_stack ist })++-- | Pops indentation from stack+popIndent :: IdrisParser ()+popIndent = do ist <- get+ case indent_stack ist of+ [] -> error "The impossible happened! Tried to pop an indentation level where none was pushed (underflow)."+ (x : xs) -> put (ist { indent_stack = xs })+++-- | Gets current indentation+indent :: IdrisParser Int+indent = liftM ((+1) . fromIntegral . column) position++-- | Gets last indentation+lastIndent :: IdrisParser Int+lastIndent = do ist <- get+ case indent_stack ist of+ (x : xs) -> return x+ _ -> return 1++-- | Applies parser in an indented position+indented :: IdrisParser a -> IdrisParser a+indented p = notEndBlock *> p <* keepTerminator++-- | Applies parser to get a block (which has possibly indented statements)+indentedBlock :: IdrisParser a -> IdrisParser [a]+indentedBlock p = do openBlock+ pushIndent+ res <- many (indented p)+ popIndent+ closeBlock+ return res++-- | Applies parser to get a block with at least one statement (which has possibly indented statements)+indentedBlock1 :: IdrisParser a -> IdrisParser [a]+indentedBlock1 p = do openBlock+ pushIndent+ res <- some (indented p)+ popIndent+ closeBlock+ return res++-- | Applies parser to get a block with exactly one (possibly indented) statement+indentedBlockS :: IdrisParser a -> IdrisParser a+indentedBlockS p = do openBlock+ pushIndent+ res <- indented p+ popIndent+ closeBlock+ return res+++-- | Checks if the following character matches provided parser+lookAheadMatches :: MonadicParsing m => m a -> m Bool+lookAheadMatches p = do match <- lookAhead (optional p)+ return $ isJust match++-- | Parses a start of block+openBlock :: IdrisParser ()+openBlock = do lchar '{'+ ist <- get+ put (ist { brace_stack = Nothing : brace_stack ist })+ <|> do ist <- get+ lvl' <- indent+ -- if we're not indented further, it's an empty block, so+ -- increment lvl to ensure we get to the end+ let lvl = case brace_stack ist of+ Just lvl_old : _ ->+ if lvl' <= lvl_old then lvl_old+1+ else lvl'+ [] -> if lvl' == 1 then 2 else lvl'+ _ -> lvl'+ put (ist { brace_stack = Just lvl : brace_stack ist })+ <?> "start of block"++-- | Parses an end of block+closeBlock :: IdrisParser ()+closeBlock = do ist <- get+ bs <- case brace_stack ist of+ [] -> eof >> return []+ Nothing : xs -> lchar '}' >> return xs <?> "end of block"+ Just lvl : xs -> (do i <- indent+ isParen <- lookAheadMatches (char ')')+ isIn <- lookAheadMatches (reserved "in")+ if i >= lvl && not (isParen || isIn)+ then fail "not end of block"+ else return xs)+ <|> (do notOpenBraces+ eof+ return [])+ put (ist { brace_stack = bs })++-- | Parses a terminator+terminator :: IdrisParser ()+terminator = do lchar ';'; popIndent+ <|> do c <- indent; l <- lastIndent+ if c <= l then popIndent else fail "not a terminator"+ <|> do isParen <- lookAheadMatches (oneOf ")}")+ if isParen then popIndent else fail "not a terminator"+ <|> lookAhead eof++-- | Parses and keeps a terminator+keepTerminator :: IdrisParser ()+keepTerminator = do lchar ';'; return ()+ <|> do c <- indent; l <- lastIndent+ unless (c <= l) $ fail "not a terminator"+ <|> do isParen <- lookAheadMatches (oneOf ")}|")+ isIn <- lookAheadMatches (reserved "in")+ unless (isIn || isParen) $ fail "not a terminator"+ <|> lookAhead eof++-- | Checks if application expression does not end+notEndApp :: IdrisParser ()+notEndApp = do c <- indent; l <- lastIndent+ when (c <= l) (fail "terminator")++-- | Checks that it is not end of block+notEndBlock :: IdrisParser ()+notEndBlock = do ist <- get+ case brace_stack ist of+ Just lvl : xs -> do i <- indent+ isParen <- lookAheadMatches (char ')')+ when (i < lvl || isParen) (fail "end of block")+ _ -> return ()++-- | Representation of an operation that can compare the current indentation with the last indentation, and an error message if it fails+data IndentProperty = IndentProperty (Int -> Int -> Bool) String++-- | Allows comparison of indent, and fails if property doesn't hold+indentPropHolds :: IndentProperty -> IdrisParser ()+indentPropHolds (IndentProperty op msg) = do+ li <- lastIndent+ i <- indent+ when (not $ op i li) $ fail ("Wrong indention: " ++ msg)++-- | Greater-than indent property+gtProp :: IndentProperty+gtProp = IndentProperty (>) "should be greater than context indentation"++-- | Greater-than or equal to indent property+gteProp :: IndentProperty+gteProp = IndentProperty (>=) "should be greater than or equal context indentation"++-- | Equal indent property+eqProp :: IndentProperty+eqProp = IndentProperty (==) "should be equal to context indentation"++-- | Less-than indent property+ltProp :: IndentProperty+ltProp = IndentProperty (<) "should be less than context indentation"++-- | Less-than or equal to indent property+lteProp :: IndentProperty+lteProp = IndentProperty (<=) "should be less than or equal to context indentation"+++-- | Checks that there are no braces that are not closed+notOpenBraces :: IdrisParser ()+notOpenBraces = do ist <- get+ when (hasNothing $ brace_stack ist) $ fail "end of input"+ where hasNothing :: [Maybe a] -> Bool+ hasNothing = any isNothing++{- | Parses an accessibilty modifier (e.g. public, private) -}+accessibility' :: IdrisParser Accessibility+accessibility'+ = do reserved "public";+ gotexp <- optional (reserved "export")+ case gotexp of+ Just _ -> return ()+ Nothing -> do+ ist <- get+ fc <- getFC+ put ist { parserWarnings =+ (fc, Msg "'public' is deprecated. Use 'public export' instead.")+ : parserWarnings ist }+ return Public+ <|> do reserved "abstract";+ ist <- get+ fc <- getFC+ put ist { parserWarnings =+ (fc, Msg "The 'abstract' keyword is deprecated. Use 'export' instead.")+ : parserWarnings ist }+ return Frozen+ <|> do reserved "export"; return Frozen+ <|> do reserved "private"; return Private+ <?> "accessibility modifier"++accessibility :: IdrisParser Accessibility+accessibility = do acc <- optional accessibility'+ case acc of+ Just a -> return a+ Nothing -> do ist <- get+ return (default_access ist)++-- | Adds accessibility option for function+addAcc :: Name -> Accessibility -> IdrisParser ()+addAcc n a = do i <- get+ put (i { hide_list = addDef n a (hide_list i) })++{- | Add accessbility option for data declarations+ (works for classes too - 'abstract' means the data/class is visible but members not) -}+accData :: Accessibility -> Name -> [Name] -> IdrisParser ()+accData Frozen n ns = do addAcc n Public -- so that it can be used in public definitions+ mapM_ (\n -> addAcc n Private) ns -- so that they are invisible+accData a n ns = do addAcc n a+ mapM_ (`addAcc` a) ns+++{- * Error reporting helpers -}+{- | Error message with possible fixes list -}+fixErrorMsg :: String -> [String] -> String+fixErrorMsg msg fixes = msg ++ ", possible fixes:\n" ++ (concat $ intersperse "\n\nor\n\n" fixes)++-- | Collect 'PClauses' with the same function name+collect :: [PDecl] -> [PDecl]+collect (c@(PClauses _ o _ _) : ds)+ = clauses (cname c) [] (c : ds)+ where clauses :: Maybe Name -> [PClause] -> [PDecl] -> [PDecl]+ clauses j@(Just n) acc (PClauses fc _ _ [PClause fc' n' l ws r w] : ds)+ | n == n' = clauses j (PClause fc' n' l ws r (collect w) : acc) ds+ clauses j@(Just n) acc (PClauses fc _ _ [PWith fc' n' l ws r pn w] : ds)+ | n == n' = clauses j (PWith fc' n' l ws r pn (collect w) : acc) ds+ clauses (Just n) acc xs = PClauses (fcOf c) o n (reverse acc) : collect xs+ clauses Nothing acc (x:xs) = collect xs+ clauses Nothing acc [] = []++ cname :: PDecl -> Maybe Name+ cname (PClauses fc _ _ [PClause _ n _ _ _ _]) = Just n+ cname (PClauses fc _ _ [PWith _ n _ _ _ _ _]) = Just n+ cname (PClauses fc _ _ [PClauseR _ _ _ _]) = Nothing+ cname (PClauses fc _ _ [PWithR _ _ _ _ _]) = Nothing+ fcOf :: PDecl -> FC+ fcOf (PClauses fc _ _ _) = fc+collect (PParams f ns ps : ds) = PParams f ns (collect ps) : collect ds+collect (PMutual f ms : ds) = PMutual f (collect ms) : collect ds+collect (PNamespace ns fc ps : ds) = PNamespace ns fc (collect ps) : collect ds+collect (PClass doc f s cs n nfc ps pdocs fds ds cn cd : ds')+ = PClass doc f s cs n nfc ps pdocs fds (collect ds) cn cd : collect ds'+collect (PInstance doc argDocs f s cs acc opts n nfc ps t en ds : ds')+ = PInstance doc argDocs f s cs acc opts n nfc ps t en (collect ds) : collect ds'+collect (d : ds) = d : collect ds+collect [] = []
@@ -0,0 +1,172 @@+{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}+module Idris.Parser.Ops where++import Prelude hiding (pi)++import Text.Trifecta.Delta+import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)+import Text.Parser.LookAhead+import Text.Parser.Expression+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Char as Chr+import qualified Text.Parser.Token.Highlight as Hi++import Idris.AbsSyntax+import Idris.Parser.Helpers++import Idris.Core.TT++import Control.Applicative+import Control.Monad+import Control.Monad.State.Strict++import Data.Maybe+import qualified Data.List.Split as Spl+import Data.List+import Data.Monoid+import Data.Char+import qualified Data.HashSet as HS+import qualified Data.Text as T+import qualified Data.ByteString.UTF8 as UTF8++import Debug.Trace++-- | Creates table for fixity declarations to build expression parser+-- using pre-build and user-defined operator/fixity declarations+table :: [FixDecl] -> OperatorTable IdrisParser PTerm+table fixes+ = [[prefix "-" (\fc x -> PApp fc (PRef fc [fc] (sUN "negate")) [pexp x])]] +++ toTable (reverse fixes) +++ [[backtick],+ [binary "$" (\fc x y -> flatten $ PApp fc x [pexp y]) AssocRight],+ [binary "=" (\fc x y -> PApp fc (PRef fc [fc] eqTy) [pexp x, pexp y]) AssocLeft],+ [nofixityoperator]]+ where+ flatten :: PTerm -> PTerm -- flatten application+ flatten (PApp fc (PApp _ f as) bs) = flatten (PApp fc f (as ++ bs))+ flatten t = t+++-- | Calculates table for fixity declarations+toTable :: [FixDecl] -> OperatorTable IdrisParser PTerm+toTable fs = map (map toBin)+ (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs)+ where toBin (Fix (PrefixN _) op) = prefix op+ (\fc x -> PApp fc (PRef fc [] (sUN op)) [pexp x])+ toBin (Fix f op)+ = binary op (\fc x y -> PApp fc (PRef fc [] (sUN op)) [pexp x,pexp y]) (assoc f)+ assoc (Infixl _) = AssocLeft+ assoc (Infixr _) = AssocRight+ assoc (InfixN _) = AssocNone++-- | Binary operator+binary :: String -> (FC -> PTerm -> PTerm -> PTerm) -> Assoc -> Operator IdrisParser PTerm+binary name f = Infix (do indentPropHolds gtProp+ fc <- reservedOpFC name+ indentPropHolds gtProp+ return (f fc))++-- | Prefix operator+prefix :: String -> (FC -> PTerm -> PTerm) -> Operator IdrisParser PTerm+prefix name f = Prefix (do reservedOp name+ fc <- getFC+ indentPropHolds gtProp+ return (f fc))++-- | Backtick operator+backtick :: Operator IdrisParser PTerm+backtick = Infix (do indentPropHolds gtProp+ lchar '`'; (n, fc) <- fnName+ lchar '`'+ indentPropHolds gtProp+ return (\x y -> PApp fc (PRef fc [fc] n) [pexp x, pexp y])) AssocNone++-- | Operator without fixity (throws an error)+nofixityoperator :: Operator IdrisParser PTerm+nofixityoperator = Infix (do indentPropHolds gtProp+ op <- try operator+ unexpected $ "Operator without known fixity: " ++ op) AssocNone+++{- | Parses an operator in function position i.e. enclosed by `()', with an+ optional namespace++@+ OperatorFront ::=+ '(' '=' ')'+ | (Identifier_t '.')? '(' Operator_t ')'+ ;+@++-}+operatorFront :: IdrisParser (Name, FC)+operatorFront = try (do (FC f (l, c) _) <- getFC+ op <- lchar '(' *> reservedOp "=" <* lchar ')'+ return (eqTy, FC f (l, c) (l, c+3)))+ <|> maybeWithNS (do (FC f (l, c) _) <- getFC+ op <- lchar '(' *> operator+ (FC _ _ (l', c')) <- getFC+ lchar ')'+ return (op, (FC f (l, c) (l', c' + 1)))) False []++{- | Parses a function (either normal name or operator)++@+ FnName ::= Name | OperatorFront;+@+-}+fnName :: IdrisParser (Name, FC)+fnName = try operatorFront <|> name <?> "function name"++{- | Parses a fixity declaration+@+Fixity ::=+ FixityType Natural_t OperatorList Terminator+ ;+@+-}+fixity :: IdrisParser PDecl+fixity = do pushIndent+ f <- fixityType; i <- fst <$> natural;+ ops <- sepBy1 operator (lchar ',')+ terminator+ let prec = fromInteger i+ istate <- get+ let infixes = idris_infixes istate+ let fs = map (Fix (f prec)) ops+ let redecls = map (alreadyDeclared infixes) fs+ let ill = filter (not . checkValidity) redecls+ if null ill+ then do put (istate { idris_infixes = nub $ sort (fs ++ infixes)+ , ibc_write = map IBCFix fs ++ ibc_write istate+ })+ fc <- getFC+ return (PFix fc (f prec) ops)+ else fail $ concatMap (\(f, (x:xs)) -> "Illegal redeclaration of fixity:\n\t\""+ ++ show f ++ "\" overrides \"" ++ show x ++ "\"") ill+ <?> "fixity declaration"+ where alreadyDeclared :: [FixDecl] -> FixDecl -> (FixDecl, [FixDecl])+ alreadyDeclared fs f = (f, filter ((extractName f ==) . extractName) fs)++ checkValidity :: (FixDecl, [FixDecl]) -> Bool+ checkValidity (f, fs) = all (== f) fs++ extractName :: FixDecl -> String+ extractName (Fix _ n) = n++{- | Parses a fixity declaration type (i.e. infix or prefix, associtavity)+@+ FixityType ::=+ 'infixl'+ | 'infixr'+ | 'infix'+ | 'prefix'+ ;+@+ -}+fixityType :: IdrisParser (Int -> Fixity)+fixityType = do reserved "infixl"; return Infixl+ <|> do reserved "infixr"; return Infixr+ <|> do reserved "infix"; return InfixN+ <|> do reserved "prefix"; return PrefixN+ <?> "fixity type"
@@ -48,13 +48,13 @@ then try' (elab (PRef (fileFC "prf") [] x)) (tryAll xs) True else tryAll xs- + holesOK hs ap@(App _ _ _) | (P _ n _, args) <- unApply ap = holeArgsOK hs n 0 args holesOK hs (App _ f a) = holesOK hs f && holesOK hs a holesOK hs (P _ n _) = not (n `elem` hs)- holesOK hs (Bind n b sc) = holesOK hs (binderTy b) && + holesOK hs (Bind n b sc) = holesOK hs (binderTy b) && holesOK hs sc holesOK hs _ = True @@ -85,8 +85,8 @@ then try' (elab (PRef (fileFC "prf") [] x)) (tryAll xs) True else tryAll xs- - tcArg env ty ++ tcArg env ty | (P _ n _, args) <- unApply (getRetTy (normalise (tt_ctxt ist) env ty)) = case lookupCtxtExact n (idris_classes ist) of Just _ -> True@@ -98,7 +98,7 @@ = holeArgsOK hs n 0 args holesOK hs (App _ f a) = holesOK hs f && holesOK hs a holesOK hs (P _ n _) = not (n `elem` hs)- holesOK hs (Bind n b sc) = holesOK hs (binderTy b) && + holesOK hs (Bind n b sc) = holesOK hs (binderTy b) && holesOK hs sc holesOK hs _ = True @@ -111,16 +111,16 @@ cantSolveGoal = do g <- goal env <- get_env lift $ tfail $- CantSolveGoal g (map (\(n,b) -> (n, binderTy b)) env) + CantSolveGoal g (map (\(n,b) -> (n, binderTy b)) env) -proofSearch :: Bool -> -- recursive search (False for 'refine') +proofSearch :: Bool -> -- recursive search (False for 'refine') Bool -> -- invoked from a tactic proof. If so, making -- new metavariables is meaningless, and there shoudl -- be an error reported instead. Bool -> -- ambiguity ok Bool -> -- defer on failure Int -> -- maximum depth- (PTerm -> ElabD ()) -> Maybe Name -> Name -> + (PTerm -> ElabD ()) -> Maybe Name -> Name -> [Name] -> [Name] -> IState -> ElabD ()@@ -131,7 +131,7 @@ tryAllFns all_imps where -- if nothing worked, make a new metavariable- tryAllFns [] | fromProver = cantSolveGoal + tryAllFns [] | fromProver = cantSolveGoal tryAllFns [] = do attack; defer [] nroot; solve tryAllFns (f : fs) = try' (tryFn f) (tryAllFns fs) True @@ -142,20 +142,20 @@ (match_apply (Var f) imps) True ps' <- get_probs -- when (length ps < length ps') $ fail "Can't apply constructor"- -- Make metavariables for new holes + -- Make metavariables for new holes hs' <- get_holes ptm <- get_term if fromProver then cantSolveGoal else do mapM_ (\ h -> do focus h- attack; defer [] nroot; solve) + attack; defer [] nroot; solve) (hs' \\ hs) -- (filter (\ (x, y) -> not x) (zip (map fst imps) args)) solve isImp (PImp p _ _ _ _) = (True, p) isImp arg = (True, priority arg) -- try to get all of them by unification-proofSearch rec fromProver ambigok deferonfail maxDepth elab fn nroot psnames hints ist +proofSearch rec fromProver ambigok deferonfail maxDepth elab fn nroot psnames hints ist = do compute ty <- goal hs <- get_holes@@ -172,7 +172,7 @@ (autoArg (sUN "auto")) else autoArg (sUN "auto") -- not enough info in the type yet where- findInferredTy (t : _) = elab (delab ist (toUN t)) + findInferredTy (t : _) = elab (delab ist (toUN t)) cantsolve (InternalMsg _) = True cantsolve (CantSolveGoal _ _) = True@@ -185,12 +185,12 @@ conArgsOK ty = let (f, as) = unApply ty in case f of- P _ n _ -> + P _ n _ -> let autohints = case lookupCtxtExact n (idris_autohints ist) of Nothing -> [] Just hs -> hs in case lookupCtxtExact n (idris_datatypes ist) of- Just t -> do rs <- mapM (conReady as) + Just t -> do rs <- mapM (conReady as) (autohints ++ con_names t) return (and rs) Nothing -> -- local variable, go for it@@ -199,7 +199,7 @@ _ -> typeNotSearchable ty conReady :: [Term] -> Name -> ElabD Bool- conReady as n + conReady as n = case lookupTyExact n (tt_ctxt ist) of Just ty -> do let (_, cs) = unApply (getRetTy ty) -- if any metavariables in 'as' correspond to@@ -223,7 +223,7 @@ inHS hs (P _ n _) = n `elem` hs isHS _ _ = False - toUN t@(P nt (MN i n) ty) + toUN t@(P nt (MN i n) ty) | ('_':xs) <- str n = t | otherwise = P nt (UN n) ty toUN (App s f a) = App s (toUN f) (toUN a)@@ -239,7 +239,7 @@ psRec :: Bool -> Int -> [Name] -> S.Set Type -> ElabD () psRec _ 0 locs tys | fromProver = cantSolveGoal psRec rec 0 locs tys = do attack; defer [] nroot; solve --fail "Maximum depth reached"- psRec False d locs tys = tryCons d locs tys hints + psRec False d locs tys = tryCons d locs tys hints psRec True d locs tys = do compute ty <- goal@@ -248,11 +248,11 @@ try' (try' (trivialHoles psnames [] elab ist) (resolveTC False False 20 ty nroot elab ist) True)- (try' (try' (resolveByCon (d - 1) locs tys') + (try' (try' (resolveByCon (d - 1) locs tys') (resolveByLocals (d - 1) locs tys') True) -- if all else fails, make a new metavariable- (if fromProver + (if fromProver then fail "cantSolveGoal" else do attack; defer [] nroot; solve) True) True @@ -269,18 +269,13 @@ = do t <- goal let (f, _) = unApply t case f of- P _ n _ -> + P _ n _ -> do let autohints = case lookupCtxtExact n (idris_autohints ist) of Nothing -> [] Just hs -> hs case lookupCtxtExact n (idris_datatypes ist) of Just t -> do let others = hints ++ con_names t ++ autohints- when (not fromProver && length (con_names t) > 1)- -- in interactive mode,- -- don't just guess (fine for 'auto',- -- since that's part of the point...)- $ checkConstructor ist others tryCons d locs tys (others ++ getFn d fn) Nothing -> typeNotSearchable t _ -> typeNotSearchable t@@ -292,26 +287,26 @@ tryLocals d locs tys env tryLocals d locs tys [] = fail "Locals failed"- tryLocals d locs tys ((x, t) : xs) + tryLocals d locs tys ((x, t) : xs) | x `elem` locs || x `notElem` psnames = tryLocals d locs tys xs- | otherwise = try' (tryLocal d (x : locs) tys x t) + | otherwise = try' (tryLocal d (x : locs) tys x t) (tryLocals d locs tys xs) True tryCons d locs tys [] = fail "Constructors failed"- tryCons d locs tys (c : cs) + tryCons d locs tys (c : cs) = try' (tryCon d locs tys c) (tryCons d locs tys cs) True - tryLocal d locs tys n t + tryLocal d locs tys n t = do let a = getPArity (delab ist (binderTy t)) tryLocalArg d locs tys n a tryLocalArg d locs tys n 0 = elab (PRef (fileFC "prf") [] n)- tryLocalArg d locs tys n i + tryLocalArg d locs tys n i = simple_app False (tryLocalArg d locs tys n (i - 1)) (psRec True d locs tys) "proof search local apply" -- Like type class resolution, but searching with constructors- tryCon d locs tys n = + tryCon d locs tys n = do ty <- goal let imps = case lookupCtxtExact n (idris_implicits ist) of Nothing -> []@@ -341,23 +336,6 @@ (Bind _ (Pi _ _ _) _) -> [TextPart "In particular, function types are not supported."] _ -> [] --- In interactive mode, only search for things if there is some --- index to help pick a relevant constructor-checkConstructor :: IState -> [Name] -> ElabD ()-checkConstructor ist [] = return ()-checkConstructor ist (n : ns) =- case lookupTyExact n (tt_ctxt ist) of- Just t -> if not (conIndexed t)- then fail "Overlapping constructor types"- else checkConstructor ist ns- where- conIndexed t = let (_, args) = unApply (getRetTy t) in- any conHead args- conHead t | (P _ n _, _) <- unApply t = case lookupDefExact n (tt_ctxt ist) of- Just _ -> True- _ -> False- | otherwise = False- -- | Resolve type classes. This will only pick up 'normal' instances, never -- named instances (which is enforced by 'findInstances'). resolveTC :: Bool -- ^ using default Int@@ -383,8 +361,10 @@ let (argsok, okholePos) = case tcArgsOK g topholes of Nothing -> (False, []) Just hs -> (True, hs)+ env <- get_env+ probs <- get_probs if not argsok -- && not mvok)- then lift $ tfail $ CantResolve True topg+ then lift $ tfail $ CantResolve True topg (probErr probs) else do ptm <- get_term ulog <- getUnifyLog@@ -397,7 +377,7 @@ _ -> [] traceWhen ulog ("Resolving class " ++ show g ++ "\nin" ++ show env ++ "\n" ++ show okholes) $- try' (trivialTCs okholes elab ist) + try' (trivialTCs okholes elab ist) (do addDefault t tc ttypes let stk = map fst (filter snd $ elab_stack ist) let insts = findInstances ist t@@ -431,8 +411,11 @@ _ -> Just rs tcDetArgsOK _ _ _ [] = Just [] + probErr [] = Msg ""+ probErr ((_,_,_,_,err,_,_) : _) = err+ isMeta :: [Name] -> Term -> Bool- isMeta ns (P _ n _) = n `elem` ns + isMeta ns (P _ n _) = n `elem` ns isMeta _ _ = False notHole hs (P _ n _, c)@@ -449,7 +432,7 @@ chaser (NS n _) = chaser n chaser _ = False - numclass = sNS (sUN "Num") ["Classes","Prelude"]+ numclass = sNS (sUN "Num") ["Interfaces","Prelude"] addDefault t num@(P _ nc _) [P Bound a _] | nc == numclass && defaultOn = do focus a@@ -462,12 +445,13 @@ boundVar (P Bound _ _) = True boundVar _ = False - blunderbuss t d stk [] = lift $ tfail $ CantResolve False topg+ blunderbuss t d stk [] = do ps <- get_probs+ lift $ tfail $ CantResolve False topg (probErr ps) blunderbuss t d stk (n:ns) | n /= fn -- && (n `elem` stk) = tryCatch (resolve n d) (\e -> case e of- CantResolve True _ -> lift $ tfail e+ CantResolve True _ _ -> lift $ tfail e _ -> blunderbuss t d stk ns) | otherwise = blunderbuss t d stk ns @@ -529,6 +513,5 @@ | otherwise = [] where accessible n = case lookupDefAccExact n False (tt_ctxt ist) of Just (_, Hidden) -> False+ Just (_, Private) -> False _ -> True--
@@ -124,7 +124,7 @@ [([], P Ref n ty, ptm')] ty ctxt setContext ctxt'- solveDeferred n+ solveDeferred emptyFC n case idris_outputmode i of IdeMode n h -> runIO . hPutStrLn h $ IdeMode.convSExp "return" (IdeMode.SymbolAtom "ok", "") n@@ -271,6 +271,21 @@ undoElab prf env st (h:hs) = do (prf', env', st') <- undoStep prf env st h return (prf', env', st', hs) +runWithInterrupt+ :: ElabState EState+ -> Idris a -- ^ run with SIGINT handler+ -> Idris b -- ^ run if mTry finished+ -> Idris b -- ^ run if mTry was interrupted+ -> Idris b+runWithInterrupt elabState mTry mSuccess mFailure = do+ ist <- getIState+ case idris_outputmode ist of+ RawOutput _ -> do+ success <- runInputT (proverSettings elabState) $+ handleInterrupt (return False) $+ withInterrupt (lift mTry >> return True)+ if success then mSuccess else mFailure+ IdeMode _ _ -> mTry >> mSuccess elabloop :: Name -> Bool -> String -> [String] -> ElabState EState -> [ElabShellHistory] -> Maybe History -> [(Name, Type, Term)] -> Idris (Term, [String]) elabloop fn d prompt prf e prev h env@@ -283,7 +298,7 @@ do case h of Just history -> putHistory history Nothing -> return ()- l <- getInputLine (prompt ++ "> ")+ l <- handleInterrupt (return $ Just "") $ withInterrupt $ getInputLine (prompt ++ "> ") h' <- getHistory return (l, Just h') IdeMode _ handle ->@@ -375,8 +390,9 @@ Right ok -> if done then do (tm, _) <- elabStep st get_term return (tm, prf')- else do ok- elabloop fn d prompt prf' st prev' h' env'+ else runWithInterrupt e ok+ (elabloop fn d prompt prf' st prev' h' env')+ (elabloop fn d prompt prf e prev h' env) where -- A bit of a hack: wrap the value up in a let binding, which will@@ -401,7 +417,7 @@ do case h of Just history -> putHistory history Nothing -> return ()- l <- getInputLine (prompt ++ "> ")+ l <- handleInterrupt (return $ Just "") $ withInterrupt $ getInputLine (prompt ++ "> ") h' <- getHistory return (l, Just h') IdeMode _ handle ->@@ -445,8 +461,9 @@ Right ok -> if done then do (tm, _) <- elabStep st get_term return (tm, prf')- else do ok- ploop fn d prompt prf' st h'+ else runWithInterrupt e ok+ (ploop fn d prompt prf' st h')+ (ploop fn d prompt prf e h') envCtxt env ctxt = foldl (\c (n, b) -> addTyDecl n Bound (binderTy b) c) ctxt env
@@ -8,10 +8,10 @@ import Idris.AbsSyntax import Idris.ASTUtils import Idris.Apropos (apropos, aproposModules)-import Idris.REPLParser-import Idris.ElabDecls+import Idris.REPL.Parser import Idris.Erasure import Idris.Error+import Idris.IBC import Idris.ErrReverse import Idris.Delaborate import Idris.Docstrings (Docstring, overview, renderDocstring, renderDocTerm)@@ -38,6 +38,7 @@ import Idris.REPL.Browse (namesInNS, namespacesInNS) +import Idris.ElabDecls import Idris.Elab.Type import Idris.Elab.Clause import Idris.Elab.Data@@ -121,13 +122,13 @@ (if colour && not isWindows then colourisePrompt theme str else str) ++ " "- x <- H.catch (getInputLine prompt)- (ctrlC (return Nothing))+ x <- H.catch (H.withInterrupt $ getInputLine prompt)+ (ctrlC (return $ Just "")) case x of Nothing -> do lift $ when (not quiet) (iputStrLn "Bye bye") return () Just input -> -- H.catch- do ms <- H.catch (lift $ processInput input orig mods efile)+ do ms <- H.catch (H.withInterrupt $ lift $ processInput input orig mods efile) (ctrlC (return (Just mods))) case ms of Just mods -> let efile' = fromMaybe efile (listToMaybe mods)@@ -690,9 +691,9 @@ watch :: IState -> [FilePath] -> Idris (Maybe [FilePath]) watch orig inputs = do- let inputSet = S.fromList inputs- let dirs = nub $ map takeDirectory inputs resp <- runIO $ do+ let dirs = nub $ map takeDirectory inputs+ inputSet <- fmap S.fromList $ mapM canonicalizePath inputs signal <- newEmptyMVar withManager $ \mgr -> do forM_ dirs $ \dir ->@@ -735,7 +736,7 @@ return (Just mod) Success (Right (ModImport f)) -> do clearErr- fmod <- loadModule f+ fmod <- loadModule f (IBC_REPL True) return (Just (inputs ++ maybe [] (:[]) fmod)) Success (Right Edit) -> do -- takeMVar stvar edit efile orig@@ -817,7 +818,7 @@ process fn (ChangeDirectory f) = do runIO $ setCurrentDirectory f return ()-process fn (ModImport f) = do fmod <- loadModule f+process fn (ModImport f) = do fmod <- loadModule f (IBC_REPL True) case fmod of Just pr -> isetPrompt pr Nothing -> iPrintError $ "Can't find import " ++ f@@ -901,8 +902,8 @@ fixClauses :: PDecl' t -> PDecl' t fixClauses (PClauses fc opts _ css@(clause:cs)) = PClauses fc opts (getClauseName clause) css- fixClauses (PInstance doc argDocs syn fc constraints cls nfc parms ty instName decls) =- PInstance doc argDocs syn fc constraints cls nfc parms ty instName (map fixClauses decls)+ fixClauses (PInstance doc argDocs syn fc constraints acc opts cls nfc parms ty instName decls) =+ PInstance doc argDocs syn fc constraints acc opts cls nfc parms ty instName (map fixClauses decls) fixClauses decl = decl process fn (Undefine names) = undefine names@@ -958,8 +959,8 @@ case lookupNames n ctxt of ts@(t:_) -> case lookup t (idris_metavars ist) of- Just (_, i, _, _) -> iRenderResult . fmap (fancifyAnnots ist True) $- showMetavarInfo ppo ist n i+ Just (_, i, _, _, _) -> iRenderResult . fmap (fancifyAnnots ist True) $+ showMetavarInfo ppo ist n i Nothing -> iPrintFunTypes [] n (map (\n -> (n, pprintDelabTy ist n)) ts) [] -> iPrintError $ "No such variable " ++ show n where@@ -1089,7 +1090,7 @@ when (not (null di)) $ iputStrLn (show di) let imps = lookupCtxt n (idris_implicits i) when (not (null imps)) $ iputStrLn (show imps)- let d = lookupDef n (tt_ctxt i)+ let d = lookupDefAcc n False (tt_ctxt i) when (not (null d)) $ iputStrLn $ "Definition: " ++ (show (head d)) let cg = lookupCtxtName n (idris_callgraph i) i <- getIState@@ -1138,7 +1139,7 @@ insertMetavar n = do i <- getIState let ms = idris_metavars i- putIState $ i { idris_metavars = (n, (Nothing, 0, [], False)) : ms }+ putIState $ i { idris_metavars = (n, (Nothing, 0, [], False, False)) : ms } process fn' (AddProof prf) = do fn <- do@@ -1191,8 +1192,9 @@ let metavars = mapMaybe (\n -> do c <- lookup n (idris_metavars ist); return (n, c)) ns n <- case metavars of [] -> ierror (Msg $ "Cannot find metavariable " ++ show n')- [(n, (_,_,_,False))] -> return n- [(_, (_,_,_,True))] -> ierror (Msg $ "Declarations not solvable using prover")+ [(n, (_,_,_,False,_))] -> return n+ [(_, (_,_,_,_,False))] -> ierror (Msg $ "Can't prove this hole as it depends on other holes")+ [(_, (_,_,_,True,_))] -> ierror (Msg $ "Declarations not solvable using prover") ns -> ierror (CantResolveAlts (map fst ns)) prover mode (lit fn) n -- recheck totality@@ -1238,12 +1240,15 @@ iPrintError $ "Invalid filename for compiler output \"" ++ f ++"\"" | otherwise = do opts <- getCmdLine let iface = Interface `elem` opts+ let mainname = sNS (sUN "main") ["Main"]+ m <- if iface then return Nothing else do (m', _) <- elabVal recinfo ERHS (PApp fc (PRef fc [] (sUN "run__IO"))- [pexp $ PRef fc [] (sNS (sUN "main") ["Main"])])+ [pexp $ PRef fc [] mainname]) return (Just m') ir <- compile codegen f m+ i <- getIState runIO $ generate codegen (fst (head (idris_imported i))) ir where fc = fileFC "main"@@ -1559,7 +1564,7 @@ logParser 1 ("MODULE TREE : " ++ show modTree) logParser 1 ("RELOAD: " ++ show ifiles) when (not (all ibc ifiles) || loadCode) $- tryLoad False (filter (not . ibc) ifiles)+ tryLoad False IBC_Building (filter (not . ibc) ifiles) -- return the files that need rechecking return (input, ifiles)) ninputs@@ -1570,7 +1575,8 @@ Nothing -> do putIState $!! ist { idris_tyinfodata = tidata } ibcfiles <- mapM findNewIBC (nub (concat (map snd ifiles)))- tryLoad True (mapMaybe id ibcfiles)+-- logLvl 0 $ "Loading from " ++ show ibcfiles+ tryLoad True (IBC_REPL True) (mapMaybe id ibcfiles) _ -> return () exports <- findExports @@ -1590,9 +1596,9 @@ iWarn emptyFC $ pprintErr i e return []) where -- load all files, stop if any fail- tryLoad :: Bool -> [IFileType] -> Idris ()- tryLoad keepstate [] = warnTotality >> return ()- tryLoad keepstate (f : fs)+ tryLoad :: Bool -> IBCPhase -> [IFileType] -> Idris ()+ tryLoad keepstate phase [] = warnTotality >> return ()+ tryLoad keepstate phase (f : fs) = do ist <- getIState let maxline = case toline of@@ -1605,7 +1611,7 @@ then Just l else Nothing _ -> Nothing- loadFromIFile True f maxline+ loadFromIFile True phase f maxline inew <- getIState -- FIXME: Save these in IBC to avoid this hack! Need to -- preserve it all from source inputs@@ -1615,15 +1621,16 @@ let tidata = idris_tyinfodata inew let patdefs = idris_patdefs inew ok <- noErrors- when ok $- -- The $!! here prevents a space leak on reloading.- -- This isn't a solution - but it's a temporary stopgap.- -- See issue #2386- do when (not keepstate) $ putIState $!! ist- ist <- getIState- putIState $!! ist { idris_tyinfodata = tidata,- idris_patdefs = patdefs }- tryLoad keepstate fs+ if ok then+ -- The $!! here prevents a space leak on reloading.+ -- This isn't a solution - but it's a temporary stopgap.+ -- See issue #2386+ do when (not keepstate) $ putIState $!! ist+ ist <- getIState+ putIState $!! ist { idris_tyinfodata = tidata,+ idris_patdefs = patdefs }+ tryLoad keepstate phase fs+ else warnTotality ibc (IBC _ _) = True ibc _ = False@@ -1727,13 +1734,12 @@ addPkgDir "base" mapM_ addPkgDir pkgdirs elabPrims- when (not (NoBuiltins `elem` opts)) $ do x <- loadModule "Builtins"+ when (not (NoBuiltins `elem` opts)) $ do x <- loadModule "Builtins" (IBC_REPL True) addAutoImport "Builtins" return ()- when (not (NoPrelude `elem` opts)) $ do x <- loadModule "Prelude"+ when (not (NoPrelude `elem` opts)) $ do x <- loadModule "Prelude" (IBC_REPL True) addAutoImport "Prelude" return ()- when (runrepl && not idesl) initScript nobanner <- getNoBanner@@ -1794,7 +1800,7 @@ when (runrepl && not idesl) $ do -- clearOrigPats startServer port orig mods- runInputT (replSettings (Just historyFile)) $ repl orig mods efile+ runInputT (replSettings (Just historyFile)) $ repl (force orig) mods efile let idesock = IdemodeSocket `elem` opts when (idesl) $ idemodeStart idesock orig inputs ok <- noErrors
@@ -8,7 +8,7 @@ import Data.Maybe (mapMaybe) import qualified Data.Text as T (unpack) -import Idris.Core.Evaluate (ctxtAlist, Accessibility(Hidden), lookupDefAccExact)+import Idris.Core.Evaluate (ctxtAlist, Accessibility(Private, Hidden), lookupDefAccExact) import Idris.Core.TT (Name(..)) import Idris.AbsSyntaxTree (Idris)@@ -41,4 +41,5 @@ accessible n = do ctxt <- getContext case lookupDefAccExact n False ctxt of Just (_, Hidden ) -> return False+ Just (_, Private ) -> return False _ -> return True
@@ -0,0 +1,526 @@++module Idris.REPL.Parser (parseCmd, help, allHelp, setOptions) where++import System.FilePath ((</>))+import System.Console.ANSI (Color(..))++import Idris.Colours+import Idris.AbsSyntax+import Idris.Core.TT+import Idris.Help+import qualified Idris.Parser as P++import Control.Applicative+import Control.Monad.State.Strict++import Text.Parser.Combinators+import Text.Parser.Char(anyChar,oneOf)+import Text.Trifecta(Result, parseString)+import Text.Trifecta.Delta++import Debug.Trace+import Data.List+import Data.List.Split(splitOn)+import Data.Char(isSpace, toLower)+import qualified Data.ByteString.UTF8 as UTF8++parseCmd :: IState -> String -> String -> Result (Either String Command)+parseCmd i inputname = P.runparser pCmd i inputname . trim+ where trim = f . f+ where f = reverse . dropWhile isSpace++type CommandTable = [ ( [String], CmdArg, String+ , String -> P.IdrisParser (Either String Command) ) ]++setOptions :: [(String, Opt)]+setOptions = [("errorcontext", ErrContext),+ ("showimplicits", ShowImpl),+ ("originalerrors", ShowOrigErr),+ ("autosolve", AutoSolve),+ ("nobanner", NoBanner),+ ("warnreach", WarnReach),+ ("evaltypes", EvalTypes),+ ("desugarnats", DesugarNats)]++help :: [([String], CmdArg, String)]+help = (["<expr>"], NoArg, "Evaluate an expression") :+ [ (map (':' :) names, args, text) | (names, args, text, _) <- parserCommandsForHelp ]++allHelp :: [([String], CmdArg, String)]+allHelp = [ (map (':' :) names, args, text)+ | (names, args, text, _) <- parserCommandsForHelp ++ parserCommands ]++parserCommandsForHelp :: CommandTable+parserCommandsForHelp =+ [ exprArgCmd ["t", "type"] Check "Check the type of an expression"+ , exprArgCmd ["core"] Core "View the core language representation of a term"+ , nameArgCmd ["miss", "missing"] Missing "Show missing clauses"+ , (["doc"], NameArg, "Show internal documentation", cmd_doc)+ , (["mkdoc"], NamespaceArg, "Generate IdrisDoc for namespace(s) and dependencies"+ , genArg "namespace" (many anyChar) MakeDoc)+ , (["apropos"], SeqArgs (OptionalArg PkgArgs) NameArg, " Search names, types, and documentation"+ , cmd_apropos)+ , (["s", "search"], SeqArgs (OptionalArg PkgArgs) ExprArg+ , " Search for values by type", cmd_search)+ , nameArgCmd ["wc", "whocalls"] WhoCalls "List the callers of some name"+ , nameArgCmd ["cw", "callswho"] CallsWho "List the callees of some name"+ , namespaceArgCmd ["browse"] Browse "List the contents of some namespace"+ , nameArgCmd ["total"] TotCheck "Check the totality of a name"+ , noArgCmd ["r", "reload"] Reload "Reload current file"+ , noArgCmd ["w", "watch"] Watch "Watch the current file for changes"+ , (["l", "load"], FileArg, "Load a new file"+ , strArg (\f -> Load f Nothing))+ , (["cd"], FileArg, "Change working directory"+ , strArg ChangeDirectory)+ , (["module"], ModuleArg, "Import an extra module", moduleArg ModImport) -- NOTE: dragons+ , noArgCmd ["e", "edit"] Edit "Edit current file using $EDITOR or $VISUAL"+ , noArgCmd ["m", "metavars"] Metavars "Show remaining proof obligations (metavariables or holes)"+ , (["p", "prove"], MetaVarArg, "Prove a metavariable"+ , nameArg (Prove False))+ , (["elab"], MetaVarArg, "Build a metavariable using the elaboration shell"+ , nameArg (Prove True))+ , (["a", "addproof"], NameArg, "Add proof to source file", cmd_addproof)+ , (["rmproof"], NameArg, "Remove proof from proof stack"+ , nameArg RmProof)+ , (["showproof"], NameArg, "Show proof"+ , nameArg ShowProof)+ , noArgCmd ["proofs"] Proofs "Show available proofs"+ , exprArgCmd ["x"] ExecVal "Execute IO actions resulting from an expression using the interpreter"+ , (["c", "compile"], FileArg, "Compile to an executable [codegen] <filename>", cmd_compile)+ , (["exec", "execute"], OptionalArg ExprArg, "Compile to an executable and run", cmd_execute)+ , (["dynamic"], FileArg, "Dynamically load a C library (similar to %dynamic)", cmd_dynamic)+ , (["dynamic"], NoArg, "List dynamically loaded C libraries", cmd_dynamic)+ , noArgCmd ["?", "h", "help"] Help "Display this help text"+ , optArgCmd ["set"] SetOpt $ "Set an option (" ++ optionsList ++ ")"+ , optArgCmd ["unset"] UnsetOpt "Unset an option"+ , (["color", "colour"], ColourArg+ , "Turn REPL colours on or off; set a specific colour"+ , cmd_colour)+ , (["consolewidth"], ConsoleWidthArg, "Set the width of the console", cmd_consolewidth)+ , (["printerdepth"], OptionalArg NumberArg, "Set the maximum pretty-printer depth (no arg for infinite)", cmd_printdepth)+ , noArgCmd ["q", "quit"] Quit "Exit the Idris system"+ , noArgCmd ["warranty"] Warranty "Displays warranty information"+ , (["let"], ManyArgs DeclArg+ , "Evaluate a declaration, such as a function definition, instance implementation, or fixity declaration"+ , cmd_let)+ , (["unlet", "undefine"], ManyArgs NameArg+ , "Remove the listed repl definitions, or all repl definitions if no names given"+ , cmd_unlet)+ , nameArgCmd ["printdef"] PrintDef "Show the definition of a function"+ , (["pp", "pprint"], (SeqArgs OptionArg (SeqArgs NumberArg NameArg))+ , "Pretty prints an Idris function in either LaTeX or HTML and for a specified width."+ , cmd_pprint)+ ]+ where optionsList = intercalate ", " $ map fst setOptions++parserCommands =+ [ noArgCmd ["u", "universes"] Universes "Display universe constraints"+ , noArgCmd ["errorhandlers"] ListErrorHandlers "List registered error handlers"++ , nameArgCmd ["d", "def"] Defn "Display a name's internal definitions"+ , nameArgCmd ["transinfo"] TransformInfo "Show relevant transformation rules for a name"+ , nameArgCmd ["di", "dbginfo"] DebugInfo "Show debugging information for a name"++ , exprArgCmd ["patt"] Pattelab "(Debugging) Elaborate pattern expression"+ , exprArgCmd ["spec"] Spec "?"+ , exprArgCmd ["whnf"] WHNF "(Debugging) Show weak head normal form of an expression"+ , exprArgCmd ["inline"] TestInline "?"+ , proofArgCmd ["cs", "casesplit"] CaseSplitAt+ ":cs <line> <name> splits the pattern variable on the line"+ , proofArgCmd ["apc", "addproofclause"] AddProofClauseFrom+ ":apc <line> <name> adds a pattern-matching proof clause to name on line"+ , proofArgCmd ["ac", "addclause"] AddClauseFrom+ ":ac <line> <name> adds a clause for the definition of the name on the line"+ , proofArgCmd ["am", "addmissing"] AddMissing+ ":am <line> <name> adds all missing pattern matches for the name on the line"+ , proofArgCmd ["mw", "makewith"] MakeWith+ ":mw <line> <name> adds a with clause for the definition of the name on the line"+ , proofArgCmd ["mc", "makecase"] MakeCase+ ":mc <line> <name> adds a case block for the definition of the metavariable on the line"+ , proofArgCmd ["ml", "makelemma"] MakeLemma "?"+ , (["log"], NumberArg, "Set logging verbosity level", cmd_log)+ , ( ["logcats"]+ , ManyArgs NameArg+ , "Set logging categories"+ , cmd_cats)+ , (["lto", "loadto"], SeqArgs NumberArg FileArg+ , "Load file up to line number", cmd_loadto)+ , (["ps", "proofsearch"], NoArg+ , ":ps <line> <name> <names> does proof search for name on line, with names as hints"+ , cmd_proofsearch)+ , (["ref", "refine"], NoArg+ , ":ref <line> <name> <name'> attempts to partially solve name on line, with name' as hint, introducing metavariables for arguments that aren't inferrable"+ , cmd_refine)+ , (["debugunify"], SeqArgs ExprArg ExprArg+ , "(Debugging) Try to unify two expressions", const $ do+ l <- P.simpleExpr defaultSyntax+ r <- P.simpleExpr defaultSyntax+ eof+ return (Right (DebugUnify l r))+ )+ ]++noArgCmd names command doc =+ (names, NoArg, doc, noArgs command)+nameArgCmd names command doc =+ (names, NameArg, doc, fnNameArg command)+namespaceArgCmd names command doc =+ (names, NamespaceArg, doc, namespaceArg command)+exprArgCmd names command doc =+ (names, ExprArg, doc, exprArg command)+metavarArgCmd names command doc =+ (names, MetaVarArg, doc, fnNameArg command)+optArgCmd names command doc =+ (names, OptionArg, doc, optArg command)+proofArgCmd names command doc =+ (names, NoArg, doc, proofArg command)++pCmd :: P.IdrisParser (Either String Command)+pCmd = choice [ do c <- cmd names; parser c+ | (names, _, _, parser) <- parserCommandsForHelp ++ parserCommands ]+ <|> unrecognized+ <|> nop+ <|> eval+ where nop = do eof; return (Right NOP)+ unrecognized = do+ P.lchar ':'+ cmd <- many anyChar+ let cmd' = takeWhile (/=' ') cmd+ return (Left $ "Unrecognized command: " ++ cmd')++cmd :: [String] -> P.IdrisParser String+cmd xs = try $ do+ P.lchar ':'+ docmd sorted_xs++ where docmd [] = fail "Could not parse command"+ docmd (x:xs) = try (P.reserved x >> return x) <|> docmd xs++ sorted_xs = sortBy (\x y -> compare (length y) (length x)) xs+++noArgs :: Command -> String -> P.IdrisParser (Either String Command)+noArgs cmd name = do+ let emptyArgs = do+ eof+ return (Right cmd)++ let failure = return (Left $ ":" ++ name ++ " takes no arguments")++ emptyArgs <|> failure++eval :: P.IdrisParser (Either String Command)+eval = do+ t <- P.fullExpr defaultSyntax+ return $ Right (Eval t)++exprArg :: (PTerm -> Command) -> String -> P.IdrisParser (Either String Command)+exprArg cmd name = do+ let noArg = do+ eof+ return $ Left ("Usage is :" ++ name ++ " <expression>")++ let justOperator = do+ (op, fc) <- P.operatorFC+ eof+ return $ Right $ cmd (PRef fc [] (sUN op))++ let properArg = do+ t <- P.fullExpr defaultSyntax+ return $ Right (cmd t)+ try noArg <|> try justOperator <|> properArg++++genArg :: String -> P.IdrisParser a -> (a -> Command)+ -> String -> P.IdrisParser (Either String Command)+genArg argName argParser cmd name = do+ let emptyArgs = do eof; failure+ oneArg = do arg <- argParser+ eof+ return (Right (cmd arg))+ try emptyArgs <|> oneArg <|> failure+ where+ failure = return $ Left ("Usage is :" ++ name ++ " <" ++ argName ++ ">")++nameArg, fnNameArg :: (Name -> Command) -> String -> P.IdrisParser (Either String Command)+nameArg = genArg "name" $ fst <$> P.name+fnNameArg = genArg "functionname" $ fst <$> P.fnName++strArg :: (String -> Command) -> String -> P.IdrisParser (Either String Command)+strArg = genArg "string" (many anyChar)++moduleArg :: (FilePath -> Command) -> String -> P.IdrisParser (Either String Command)+moduleArg = genArg "module" (fmap (toPath . fst) P.identifier)+ where+ toPath n = foldl1' (</>) $ splitOn "." n++namespaceArg :: ([String] -> Command) -> String -> P.IdrisParser (Either String Command)+namespaceArg = genArg "namespace" (fmap (toNS . fst) P.identifier)+ where+ toNS = splitOn "."++optArg :: (Opt -> Command) -> String -> P.IdrisParser (Either String Command)+optArg cmd name = do+ let emptyArgs = do+ eof+ return $ Left ("Usage is :" ++ name ++ " <option>")++ let oneArg = do+ o <- pOption+ P.whiteSpace+ eof+ return (Right (cmd o))++ let failure = return $ Left "Unrecognized setting"++ try emptyArgs <|> oneArg <|> failure++ where+ pOption :: P.IdrisParser Opt+ pOption = foldl (<|>) empty $ map (\(a, b) -> do discard (P.symbol a); return b) setOptions++proofArg :: (Bool -> Int -> Name -> Command) -> String -> P.IdrisParser (Either String Command)+proofArg cmd name = do+ upd <- option False $ do+ P.lchar '!'+ return True+ l <- fst <$> P.natural+ n <- fst <$> P.name;+ return (Right (cmd upd (fromInteger l) n))++cmd_doc :: String -> P.IdrisParser (Either String Command)+cmd_doc name = do+ let constant = do+ c <- fmap fst P.constant+ eof+ return $ Right (DocStr (Right c) FullDocs)++ let pType = do+ P.reserved "Type"+ eof+ return $ Right (DocStr (Left $ P.mkName ("Type", "")) FullDocs)++ let fnName = fnNameArg (\n -> DocStr (Left n) FullDocs) name++ try constant <|> pType <|> fnName++cmd_consolewidth :: String -> P.IdrisParser (Either String Command)+cmd_consolewidth name = do+ w <- pConsoleWidth+ return (Right (SetConsoleWidth w))++ where+ pConsoleWidth :: P.IdrisParser ConsoleWidth+ pConsoleWidth = do discard (P.symbol "auto"); return AutomaticWidth+ <|> do discard (P.symbol "infinite"); return InfinitelyWide+ <|> do n <- fmap (fromInteger . fst) P.natural+ return (ColsWide n)++cmd_printdepth :: String -> P.IdrisParser (Either String Command)+cmd_printdepth _ = do d <- optional (fmap (fromInteger . fst) P.natural)+ return (Right $ SetPrinterDepth d)++cmd_execute :: String -> P.IdrisParser (Either String Command)+cmd_execute name = do+ tm <- option maintm (P.fullExpr defaultSyntax)+ return (Right (Execute tm))+ where+ maintm = PRef (fileFC "(repl)") [] (sNS (sUN "main") ["Main"])+++cmd_dynamic :: String -> P.IdrisParser (Either String Command)+cmd_dynamic name = do+ let optArg = do l <- many anyChar+ if (l /= "")+ then return $ Right (DynamicLink l)+ else return $ Right ListDynamic++ let failure = return $ Left $ "Usage is :" ++ name ++ " [<library>]"++ try optArg <|> failure++cmd_pprint :: String -> P.IdrisParser (Either String Command)+cmd_pprint name = do+ fmt <- ppFormat+ P.whiteSpace+ n <- fmap (fromInteger . fst) P.natural+ P.whiteSpace+ t <- P.fullExpr defaultSyntax+ return (Right (PPrint fmt n t))++ where+ ppFormat :: P.IdrisParser OutputFmt+ ppFormat = (discard (P.symbol "html") >> return HTMLOutput)+ <|> (discard (P.symbol "latex") >> return LaTeXOutput)++++cmd_compile :: String -> P.IdrisParser (Either String Command)+cmd_compile name = do+ let defaultCodegen = Via "c"++ let codegenOption :: P.IdrisParser Codegen+ codegenOption = do+ let bytecodeCodegen = discard (P.symbol "bytecode") *> return Bytecode+ viaCodegen = do x <- fst <$> P.identifier+ return (Via (map toLower x))+ bytecodeCodegen <|> viaCodegen++ let hasOneArg = do+ i <- get+ f <- fst <$> P.identifier+ eof+ return $ Right (Compile defaultCodegen f)++ let hasTwoArgs = do+ i <- get+ codegen <- codegenOption+ f <- fst <$> P.identifier+ eof+ return $ Right (Compile codegen f)++ let failure = return $ Left $ "Usage is :" ++ name ++ " [<codegen>] <filename>"+ try hasTwoArgs <|> try hasOneArg <|> failure++cmd_addproof :: String -> P.IdrisParser (Either String Command)+cmd_addproof name = do+ n <- option Nothing $ do+ x <- fst <$> P.name+ return (Just x)+ eof+ return (Right (AddProof n))++cmd_log :: String -> P.IdrisParser (Either String Command)+cmd_log name = do+ i <- fmap (fromIntegral . fst) P.natural+ eof+ return (Right (LogLvl i))++cmd_cats :: String -> P.IdrisParser (Either String Command)+cmd_cats name = do+ cs <- sepBy pLogCats (P.whiteSpace)+ eof+ return $ Right $ LogCategory (concat cs)+ where+ badCat = do+ c <- fst <$> P.identifier+ fail $ "Category: " ++ c ++ " is not recognised."++ pLogCats :: P.IdrisParser [LogCat]+ pLogCats = try (P.symbol (strLogCat IParse) >> return parserCats)+ <|> try (P.symbol (strLogCat IElab) >> return elabCats)+ <|> try (P.symbol (strLogCat ICodeGen) >> return codegenCats)+ <|> try (P.symbol (strLogCat ICoverage) >> return [ICoverage])+ <|> try (P.symbol (strLogCat IIBC) >> return [IIBC])+ <|> try (P.symbol (strLogCat IErasure) >> return [IErasure])+ <|> badCat++cmd_let :: String -> P.IdrisParser (Either String Command)+cmd_let name = do+ defn <- concat <$> many (P.decl defaultSyntax)+ return (Right (NewDefn defn))++cmd_unlet :: String -> P.IdrisParser (Either String Command)+cmd_unlet name = (Right . Undefine) `fmap` many (fst <$> P.name)++cmd_loadto :: String -> P.IdrisParser (Either String Command)+cmd_loadto name = do+ toline <- fmap (fromInteger . fst) P.natural+ f <- many anyChar;+ return (Right (Load f (Just toline)))++cmd_colour :: String -> P.IdrisParser (Either String Command)+cmd_colour name = fmap Right pSetColourCmd++ where+ colours :: [(String, Maybe Color)]+ colours = [ ("black", Just Black)+ , ("red", Just Red)+ , ("green", Just Green)+ , ("yellow", Just Yellow)+ , ("blue", Just Blue)+ , ("magenta", Just Magenta)+ , ("cyan", Just Cyan)+ , ("white", Just White)+ , ("default", Nothing)+ ]++ pSetColourCmd :: P.IdrisParser Command+ pSetColourCmd = (do c <- pColourType+ let defaultColour = IdrisColour Nothing True False False False+ opts <- sepBy pColourMod (P.whiteSpace)+ let colour = foldr ($) defaultColour $ reverse opts+ return $ SetColour c colour)+ <|> try (P.symbol "on" >> return ColourOn)+ <|> try (P.symbol "off" >> return ColourOff)++ pColour :: P.IdrisParser (Maybe Color)+ pColour = doColour colours+ where doColour [] = fail "Unknown colour"+ doColour ((s, c):cs) = (try (P.symbol s) >> return c) <|> doColour cs++ pColourMod :: P.IdrisParser (IdrisColour -> IdrisColour)+ pColourMod = try (P.symbol "vivid" >> return doVivid)+ <|> try (P.symbol "dull" >> return doDull)+ <|> try (P.symbol "underline" >> return doUnderline)+ <|> try (P.symbol "nounderline" >> return doNoUnderline)+ <|> try (P.symbol "bold" >> return doBold)+ <|> try (P.symbol "nobold" >> return doNoBold)+ <|> try (P.symbol "italic" >> return doItalic)+ <|> try (P.symbol "noitalic" >> return doNoItalic)+ <|> try (pColour >>= return . doSetColour)+ where doVivid i = i { vivid = True }+ doDull i = i { vivid = False }+ doUnderline i = i { underline = True }+ doNoUnderline i = i { underline = False }+ doBold i = i { bold = True }+ doNoBold i = i { bold = False }+ doItalic i = i { italic = True }+ doNoItalic i = i { italic = False }+ doSetColour c i = i { colour = c }++ -- | Generate the colour type names using the default Show instance.+ colourTypes :: [(String, ColourType)]+ colourTypes = map (\x -> ((map toLower . reverse . drop 6 . reverse . show) x, x)) $+ enumFromTo minBound maxBound++ pColourType :: P.IdrisParser ColourType+ pColourType = doColourType colourTypes+ where doColourType [] = fail $ "Unknown colour category. Options: " +++ (concat . intersperse ", " . map fst) colourTypes+ doColourType ((s,ct):cts) = (try (P.symbol s) >> return ct) <|> doColourType cts++idChar = oneOf (['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ ['_'])++cmd_apropos :: String -> P.IdrisParser (Either String Command)+cmd_apropos = packageBasedCmd (some idChar) Apropos++packageBasedCmd :: P.IdrisParser a -> ([String] -> a -> Command)+ -> String -> P.IdrisParser (Either String Command)+packageBasedCmd valParser cmd name =+ try (do P.lchar '('+ pkgs <- sepBy (some idChar) (P.lchar ',')+ P.lchar ')'+ val <- valParser+ return (Right (cmd pkgs val)))+ <|> do val <- valParser+ return (Right (cmd [] val))++cmd_search :: String -> P.IdrisParser (Either String Command)+cmd_search = packageBasedCmd+ (P.typeExpr (defaultSyntax { implicitAllowed = True })) Search++cmd_proofsearch :: String -> P.IdrisParser (Either String Command)+cmd_proofsearch name = do+ upd <- option False (do P.lchar '!'; return True)+ l <- fmap (fromInteger . fst) P.natural; n <- fst <$> P.name+ hints <- many (fst <$> P.fnName)+ return (Right (DoProofSearch upd True l n hints))++cmd_refine :: String -> P.IdrisParser (Either String Command)+cmd_refine name = do+ upd <- option False (do P.lchar '!'; return True)+ l <- fmap (fromInteger . fst) P.natural; n <- fst <$> P.name+ hint <- fst <$> P.fnName+ return (Right (DoProofSearch upd False l n [hint]))
@@ -1,526 +0,0 @@--module Idris.REPLParser (parseCmd, help, allHelp, setOptions) where--import System.FilePath ((</>))-import System.Console.ANSI (Color(..))--import Idris.Colours-import Idris.AbsSyntax-import Idris.Core.TT-import Idris.Help-import qualified Idris.Parser as P--import Control.Applicative-import Control.Monad.State.Strict--import Text.Parser.Combinators-import Text.Parser.Char(anyChar,oneOf)-import Text.Trifecta(Result, parseString)-import Text.Trifecta.Delta--import Debug.Trace-import Data.List-import Data.List.Split(splitOn)-import Data.Char(isSpace, toLower)-import qualified Data.ByteString.UTF8 as UTF8--parseCmd :: IState -> String -> String -> Result (Either String Command)-parseCmd i inputname = P.runparser pCmd i inputname . trim- where trim = f . f- where f = reverse . dropWhile isSpace--type CommandTable = [ ( [String], CmdArg, String- , String -> P.IdrisParser (Either String Command) ) ]--setOptions :: [(String, Opt)]-setOptions = [("errorcontext", ErrContext),- ("showimplicits", ShowImpl),- ("originalerrors", ShowOrigErr),- ("autosolve", AutoSolve),- ("nobanner", NoBanner),- ("warnreach", WarnReach),- ("evaltypes", EvalTypes),- ("desugarnats", DesugarNats)]--help :: [([String], CmdArg, String)]-help = (["<expr>"], NoArg, "Evaluate an expression") :- [ (map (':' :) names, args, text) | (names, args, text, _) <- parserCommandsForHelp ]--allHelp :: [([String], CmdArg, String)]-allHelp = [ (map (':' :) names, args, text)- | (names, args, text, _) <- parserCommandsForHelp ++ parserCommands ]--parserCommandsForHelp :: CommandTable-parserCommandsForHelp =- [ exprArgCmd ["t", "type"] Check "Check the type of an expression"- , exprArgCmd ["core"] Core "View the core language representation of a term"- , nameArgCmd ["miss", "missing"] Missing "Show missing clauses"- , (["doc"], NameArg, "Show internal documentation", cmd_doc)- , (["mkdoc"], NamespaceArg, "Generate IdrisDoc for namespace(s) and dependencies"- , genArg "namespace" (many anyChar) MakeDoc)- , (["apropos"], SeqArgs (OptionalArg PkgArgs) NameArg, " Search names, types, and documentation"- , cmd_apropos)- , (["s", "search"], SeqArgs (OptionalArg PkgArgs) ExprArg- , " Search for values by type", cmd_search)- , nameArgCmd ["wc", "whocalls"] WhoCalls "List the callers of some name"- , nameArgCmd ["cw", "callswho"] CallsWho "List the callees of some name"- , namespaceArgCmd ["browse"] Browse "List the contents of some namespace"- , nameArgCmd ["total"] TotCheck "Check the totality of a name"- , noArgCmd ["r", "reload"] Reload "Reload current file"- , noArgCmd ["w", "watch"] Watch "Watch the current file for changes"- , (["l", "load"], FileArg, "Load a new file"- , strArg (\f -> Load f Nothing))- , (["cd"], FileArg, "Change working directory"- , strArg ChangeDirectory)- , (["module"], ModuleArg, "Import an extra module", moduleArg ModImport) -- NOTE: dragons- , noArgCmd ["e", "edit"] Edit "Edit current file using $EDITOR or $VISUAL"- , noArgCmd ["m", "metavars"] Metavars "Show remaining proof obligations (metavariables or holes)"- , (["p", "prove"], MetaVarArg, "Prove a metavariable"- , nameArg (Prove False))- , (["elab"], MetaVarArg, "Build a metavariable using the elaboration shell"- , nameArg (Prove True))- , (["a", "addproof"], NameArg, "Add proof to source file", cmd_addproof)- , (["rmproof"], NameArg, "Remove proof from proof stack"- , nameArg RmProof)- , (["showproof"], NameArg, "Show proof"- , nameArg ShowProof)- , noArgCmd ["proofs"] Proofs "Show available proofs"- , exprArgCmd ["x"] ExecVal "Execute IO actions resulting from an expression using the interpreter"- , (["c", "compile"], FileArg, "Compile to an executable [codegen] <filename>", cmd_compile)- , (["exec", "execute"], OptionalArg ExprArg, "Compile to an executable and run", cmd_execute)- , (["dynamic"], FileArg, "Dynamically load a C library (similar to %dynamic)", cmd_dynamic)- , (["dynamic"], NoArg, "List dynamically loaded C libraries", cmd_dynamic)- , noArgCmd ["?", "h", "help"] Help "Display this help text"- , optArgCmd ["set"] SetOpt $ "Set an option (" ++ optionsList ++ ")"- , optArgCmd ["unset"] UnsetOpt "Unset an option"- , (["color", "colour"], ColourArg- , "Turn REPL colours on or off; set a specific colour"- , cmd_colour)- , (["consolewidth"], ConsoleWidthArg, "Set the width of the console", cmd_consolewidth)- , (["printerdepth"], OptionalArg NumberArg, "Set the maximum pretty-printer depth (no arg for infinite)", cmd_printdepth)- , noArgCmd ["q", "quit"] Quit "Exit the Idris system"- , noArgCmd ["warranty"] Warranty "Displays warranty information"- , (["let"], ManyArgs DeclArg- , "Evaluate a declaration, such as a function definition, instance implementation, or fixity declaration"- , cmd_let)- , (["unlet", "undefine"], ManyArgs NameArg- , "Remove the listed repl definitions, or all repl definitions if no names given"- , cmd_unlet)- , nameArgCmd ["printdef"] PrintDef "Show the definition of a function"- , (["pp", "pprint"], (SeqArgs OptionArg (SeqArgs NumberArg NameArg))- , "Pretty prints an Idris function in either LaTeX or HTML and for a specified width."- , cmd_pprint)- ]- where optionsList = intercalate ", " $ map fst setOptions--parserCommands =- [ noArgCmd ["u", "universes"] Universes "Display universe constraints"- , noArgCmd ["errorhandlers"] ListErrorHandlers "List registered error handlers"-- , nameArgCmd ["d", "def"] Defn "Display a name's internal definitions"- , nameArgCmd ["transinfo"] TransformInfo "Show relevant transformation rules for a name"- , nameArgCmd ["di", "dbginfo"] DebugInfo "Show debugging information for a name"-- , exprArgCmd ["patt"] Pattelab "(Debugging) Elaborate pattern expression"- , exprArgCmd ["spec"] Spec "?"- , exprArgCmd ["whnf"] WHNF "(Debugging) Show weak head normal form of an expression"- , exprArgCmd ["inline"] TestInline "?"- , proofArgCmd ["cs", "casesplit"] CaseSplitAt- ":cs <line> <name> splits the pattern variable on the line"- , proofArgCmd ["apc", "addproofclause"] AddProofClauseFrom- ":apc <line> <name> adds a pattern-matching proof clause to name on line"- , proofArgCmd ["ac", "addclause"] AddClauseFrom- ":ac <line> <name> adds a clause for the definition of the name on the line"- , proofArgCmd ["am", "addmissing"] AddMissing- ":am <line> <name> adds all missing pattern matches for the name on the line"- , proofArgCmd ["mw", "makewith"] MakeWith- ":mw <line> <name> adds a with clause for the definition of the name on the line"- , proofArgCmd ["mc", "makecase"] MakeCase- ":mc <line> <name> adds a case block for the definition of the metavariable on the line"- , proofArgCmd ["ml", "makelemma"] MakeLemma "?"- , (["log"], NumberArg, "Set logging verbosity level", cmd_log)- , ( ["logcats"]- , ManyArgs NameArg- , "Set logging categories"- , cmd_cats)- , (["lto", "loadto"], SeqArgs NumberArg FileArg- , "Load file up to line number", cmd_loadto)- , (["ps", "proofsearch"], NoArg- , ":ps <line> <name> <names> does proof search for name on line, with names as hints"- , cmd_proofsearch)- , (["ref", "refine"], NoArg- , ":ref <line> <name> <name'> attempts to partially solve name on line, with name' as hint, introducing metavariables for arguments that aren't inferrable"- , cmd_refine)- , (["debugunify"], SeqArgs ExprArg ExprArg- , "(Debugging) Try to unify two expressions", const $ do- l <- P.simpleExpr defaultSyntax- r <- P.simpleExpr defaultSyntax- eof- return (Right (DebugUnify l r))- )- ]--noArgCmd names command doc =- (names, NoArg, doc, noArgs command)-nameArgCmd names command doc =- (names, NameArg, doc, fnNameArg command)-namespaceArgCmd names command doc =- (names, NamespaceArg, doc, namespaceArg command)-exprArgCmd names command doc =- (names, ExprArg, doc, exprArg command)-metavarArgCmd names command doc =- (names, MetaVarArg, doc, fnNameArg command)-optArgCmd names command doc =- (names, OptionArg, doc, optArg command)-proofArgCmd names command doc =- (names, NoArg, doc, proofArg command)--pCmd :: P.IdrisParser (Either String Command)-pCmd = choice [ do c <- cmd names; parser c- | (names, _, _, parser) <- parserCommandsForHelp ++ parserCommands ]- <|> unrecognized- <|> nop- <|> eval- where nop = do eof; return (Right NOP)- unrecognized = do- P.lchar ':'- cmd <- many anyChar- let cmd' = takeWhile (/=' ') cmd- return (Left $ "Unrecognized command: " ++ cmd')--cmd :: [String] -> P.IdrisParser String-cmd xs = try $ do- P.lchar ':'- docmd sorted_xs-- where docmd [] = fail "Could not parse command"- docmd (x:xs) = try (P.reserved x >> return x) <|> docmd xs-- sorted_xs = sortBy (\x y -> compare (length y) (length x)) xs---noArgs :: Command -> String -> P.IdrisParser (Either String Command)-noArgs cmd name = do- let emptyArgs = do- eof- return (Right cmd)-- let failure = return (Left $ ":" ++ name ++ " takes no arguments")-- emptyArgs <|> failure--eval :: P.IdrisParser (Either String Command)-eval = do- t <- P.fullExpr defaultSyntax- return $ Right (Eval t)--exprArg :: (PTerm -> Command) -> String -> P.IdrisParser (Either String Command)-exprArg cmd name = do- let noArg = do- eof- return $ Left ("Usage is :" ++ name ++ " <expression>")-- let justOperator = do- (op, fc) <- P.operatorFC- eof- return $ Right $ cmd (PRef fc [] (sUN op))-- let properArg = do- t <- P.fullExpr defaultSyntax- return $ Right (cmd t)- try noArg <|> try justOperator <|> properArg----genArg :: String -> P.IdrisParser a -> (a -> Command)- -> String -> P.IdrisParser (Either String Command)-genArg argName argParser cmd name = do- let emptyArgs = do eof; failure- oneArg = do arg <- argParser- eof- return (Right (cmd arg))- try emptyArgs <|> oneArg <|> failure- where- failure = return $ Left ("Usage is :" ++ name ++ " <" ++ argName ++ ">")--nameArg, fnNameArg :: (Name -> Command) -> String -> P.IdrisParser (Either String Command)-nameArg = genArg "name" $ fst <$> P.name-fnNameArg = genArg "functionname" $ fst <$> P.fnName--strArg :: (String -> Command) -> String -> P.IdrisParser (Either String Command)-strArg = genArg "string" (many anyChar)--moduleArg :: (FilePath -> Command) -> String -> P.IdrisParser (Either String Command)-moduleArg = genArg "module" (fmap (toPath . fst) P.identifier)- where- toPath n = foldl1' (</>) $ splitOn "." n--namespaceArg :: ([String] -> Command) -> String -> P.IdrisParser (Either String Command)-namespaceArg = genArg "namespace" (fmap (toNS . fst) P.identifier)- where- toNS = splitOn "."--optArg :: (Opt -> Command) -> String -> P.IdrisParser (Either String Command)-optArg cmd name = do- let emptyArgs = do- eof- return $ Left ("Usage is :" ++ name ++ " <option>")-- let oneArg = do- o <- pOption- P.whiteSpace- eof- return (Right (cmd o))-- let failure = return $ Left "Unrecognized setting"-- try emptyArgs <|> oneArg <|> failure-- where- pOption :: P.IdrisParser Opt- pOption = foldl (<|>) empty $ map (\(a, b) -> do discard (P.symbol a); return b) setOptions--proofArg :: (Bool -> Int -> Name -> Command) -> String -> P.IdrisParser (Either String Command)-proofArg cmd name = do- upd <- option False $ do- P.lchar '!'- return True- l <- fst <$> P.natural- n <- fst <$> P.name;- return (Right (cmd upd (fromInteger l) n))--cmd_doc :: String -> P.IdrisParser (Either String Command)-cmd_doc name = do- let constant = do- c <- fmap fst P.constant- eof- return $ Right (DocStr (Right c) FullDocs)-- let pType = do- P.reserved "Type"- eof- return $ Right (DocStr (Left $ P.mkName ("Type", "")) FullDocs)-- let fnName = fnNameArg (\n -> DocStr (Left n) FullDocs) name-- try constant <|> pType <|> fnName--cmd_consolewidth :: String -> P.IdrisParser (Either String Command)-cmd_consolewidth name = do- w <- pConsoleWidth- return (Right (SetConsoleWidth w))-- where- pConsoleWidth :: P.IdrisParser ConsoleWidth- pConsoleWidth = do discard (P.symbol "auto"); return AutomaticWidth- <|> do discard (P.symbol "infinite"); return InfinitelyWide- <|> do n <- fmap (fromInteger . fst) P.natural- return (ColsWide n)--cmd_printdepth :: String -> P.IdrisParser (Either String Command)-cmd_printdepth _ = do d <- optional (fmap (fromInteger . fst) P.natural)- return (Right $ SetPrinterDepth d)--cmd_execute :: String -> P.IdrisParser (Either String Command)-cmd_execute name = do- tm <- option maintm (P.fullExpr defaultSyntax)- return (Right (Execute tm))- where- maintm = PRef (fileFC "(repl)") [] (sNS (sUN "main") ["Main"])---cmd_dynamic :: String -> P.IdrisParser (Either String Command)-cmd_dynamic name = do- let optArg = do l <- many anyChar- if (l /= "")- then return $ Right (DynamicLink l)- else return $ Right ListDynamic-- let failure = return $ Left $ "Usage is :" ++ name ++ " [<library>]"-- try optArg <|> failure--cmd_pprint :: String -> P.IdrisParser (Either String Command)-cmd_pprint name = do- fmt <- ppFormat- P.whiteSpace- n <- fmap (fromInteger . fst) P.natural- P.whiteSpace- t <- P.fullExpr defaultSyntax- return (Right (PPrint fmt n t))-- where- ppFormat :: P.IdrisParser OutputFmt- ppFormat = (discard (P.symbol "html") >> return HTMLOutput)- <|> (discard (P.symbol "latex") >> return LaTeXOutput)----cmd_compile :: String -> P.IdrisParser (Either String Command)-cmd_compile name = do- let defaultCodegen = Via "c"-- let codegenOption :: P.IdrisParser Codegen- codegenOption = do- let bytecodeCodegen = discard (P.symbol "bytecode") *> return Bytecode- viaCodegen = do x <- fst <$> P.identifier- return (Via (map toLower x))- bytecodeCodegen <|> viaCodegen-- let hasOneArg = do- i <- get- f <- fst <$> P.identifier- eof- return $ Right (Compile defaultCodegen f)-- let hasTwoArgs = do- i <- get- codegen <- codegenOption- f <- fst <$> P.identifier- eof- return $ Right (Compile codegen f)-- let failure = return $ Left $ "Usage is :" ++ name ++ " [<codegen>] <filename>"- try hasTwoArgs <|> try hasOneArg <|> failure--cmd_addproof :: String -> P.IdrisParser (Either String Command)-cmd_addproof name = do- n <- option Nothing $ do- x <- fst <$> P.name- return (Just x)- eof- return (Right (AddProof n))--cmd_log :: String -> P.IdrisParser (Either String Command)-cmd_log name = do- i <- fmap (fromIntegral . fst) P.natural- eof- return (Right (LogLvl i))--cmd_cats :: String -> P.IdrisParser (Either String Command)-cmd_cats name = do- cs <- sepBy pLogCats (P.whiteSpace)- eof- return $ Right $ LogCategory (concat cs)- where- badCat = do- c <- fst <$> P.identifier- fail $ "Category: " ++ c ++ " is not recognised."-- pLogCats :: P.IdrisParser [LogCat]- pLogCats = try (P.symbol (strLogCat IParse) >> return parserCats)- <|> try (P.symbol (strLogCat IElab) >> return elabCats)- <|> try (P.symbol (strLogCat ICodeGen) >> return codegenCats)- <|> try (P.symbol (strLogCat ICoverage) >> return [ICoverage])- <|> try (P.symbol (strLogCat IIBC) >> return [IIBC])- <|> try (P.symbol (strLogCat IErasure) >> return [IErasure])- <|> badCat--cmd_let :: String -> P.IdrisParser (Either String Command)-cmd_let name = do- defn <- concat <$> many (P.decl defaultSyntax)- return (Right (NewDefn defn))--cmd_unlet :: String -> P.IdrisParser (Either String Command)-cmd_unlet name = (Right . Undefine) `fmap` many (fst <$> P.name)--cmd_loadto :: String -> P.IdrisParser (Either String Command)-cmd_loadto name = do- toline <- fmap (fromInteger . fst) P.natural- f <- many anyChar;- return (Right (Load f (Just toline)))--cmd_colour :: String -> P.IdrisParser (Either String Command)-cmd_colour name = fmap Right pSetColourCmd-- where- colours :: [(String, Maybe Color)]- colours = [ ("black", Just Black)- , ("red", Just Red)- , ("green", Just Green)- , ("yellow", Just Yellow)- , ("blue", Just Blue)- , ("magenta", Just Magenta)- , ("cyan", Just Cyan)- , ("white", Just White)- , ("default", Nothing)- ]-- pSetColourCmd :: P.IdrisParser Command- pSetColourCmd = (do c <- pColourType- let defaultColour = IdrisColour Nothing True False False False- opts <- sepBy pColourMod (P.whiteSpace)- let colour = foldr ($) defaultColour $ reverse opts- return $ SetColour c colour)- <|> try (P.symbol "on" >> return ColourOn)- <|> try (P.symbol "off" >> return ColourOff)-- pColour :: P.IdrisParser (Maybe Color)- pColour = doColour colours- where doColour [] = fail "Unknown colour"- doColour ((s, c):cs) = (try (P.symbol s) >> return c) <|> doColour cs-- pColourMod :: P.IdrisParser (IdrisColour -> IdrisColour)- pColourMod = try (P.symbol "vivid" >> return doVivid)- <|> try (P.symbol "dull" >> return doDull)- <|> try (P.symbol "underline" >> return doUnderline)- <|> try (P.symbol "nounderline" >> return doNoUnderline)- <|> try (P.symbol "bold" >> return doBold)- <|> try (P.symbol "nobold" >> return doNoBold)- <|> try (P.symbol "italic" >> return doItalic)- <|> try (P.symbol "noitalic" >> return doNoItalic)- <|> try (pColour >>= return . doSetColour)- where doVivid i = i { vivid = True }- doDull i = i { vivid = False }- doUnderline i = i { underline = True }- doNoUnderline i = i { underline = False }- doBold i = i { bold = True }- doNoBold i = i { bold = False }- doItalic i = i { italic = True }- doNoItalic i = i { italic = False }- doSetColour c i = i { colour = c }-- -- | Generate the colour type names using the default Show instance.- colourTypes :: [(String, ColourType)]- colourTypes = map (\x -> ((map toLower . reverse . drop 6 . reverse . show) x, x)) $- enumFromTo minBound maxBound-- pColourType :: P.IdrisParser ColourType- pColourType = doColourType colourTypes- where doColourType [] = fail $ "Unknown colour category. Options: " ++- (concat . intersperse ", " . map fst) colourTypes- doColourType ((s,ct):cts) = (try (P.symbol s) >> return ct) <|> doColourType cts--idChar = oneOf (['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ ['_'])--cmd_apropos :: String -> P.IdrisParser (Either String Command)-cmd_apropos = packageBasedCmd (some idChar) Apropos--packageBasedCmd :: P.IdrisParser a -> ([String] -> a -> Command)- -> String -> P.IdrisParser (Either String Command)-packageBasedCmd valParser cmd name =- try (do P.lchar '('- pkgs <- sepBy (some idChar) (P.lchar ',')- P.lchar ')'- val <- valParser- return (Right (cmd pkgs val)))- <|> do val <- valParser- return (Right (cmd [] val))--cmd_search :: String -> P.IdrisParser (Either String Command)-cmd_search = packageBasedCmd- (P.typeExpr (defaultSyntax { implicitAllowed = True })) Search--cmd_proofsearch :: String -> P.IdrisParser (Either String Command)-cmd_proofsearch name = do- upd <- option False (do P.lchar '!'; return True)- l <- fmap (fromInteger . fst) P.natural; n <- fst <$> P.name- hints <- many (fst <$> P.fnName)- return (Right (DoProofSearch upd True l n hints))--cmd_refine :: String -> P.IdrisParser (Either String Command)-cmd_refine name = do- upd <- option False (do P.lchar '!'; return True)- l <- fmap (fromInteger . fst) P.natural; n <- fst <$> P.name- hint <- fst <$> P.fnName- return (Right (DoProofSearch upd False l n [hint]))
@@ -364,10 +364,10 @@ reifyArithTy x = fail ("Couldn't reify reflected ArithTy: " ++ show x) reifyNativeTy :: Term -> ElabD NativeTy-reifyNativeTy (P _ n _) | n == reflm "IT8" = return IT8-reifyNativeTy (P _ n _) | n == reflm "IT8" = return IT8-reifyNativeTy (P _ n _) | n == reflm "IT8" = return IT8-reifyNativeTy (P _ n _) | n == reflm "IT8" = return IT8+reifyNativeTy (P _ n _) | n == reflm "IT8" = return IT8+reifyNativeTy (P _ n _) | n == reflm "IT16" = return IT16+reifyNativeTy (P _ n _) | n == reflm "IT32" = return IT32+reifyNativeTy (P _ n _) | n == reflm "IT64" = return IT64 reifyNativeTy x = fail $ "Couldn't reify reflected NativeTy " ++ show x reifyIntTy :: Term -> ElabD IntTy@@ -896,7 +896,8 @@ , reflect t2 , reflect t3 ]-reflectErr (CantResolve _ t) = raw_apply (Var $ reflErrName "CantResolve") [reflect t]+reflectErr (CantResolve _ t more) + = raw_apply (Var $ reflErrName "CantResolve") [reflect t, reflectErr more] reflectErr (InvalidTCArg n t) = raw_apply (Var $ reflErrName "InvalidTCArg") [reflectName n, reflect t] reflectErr (CantResolveAlts ss) = raw_apply (Var $ reflErrName "CantResolveAlts")
@@ -5,11 +5,11 @@ module Pkg.PParser where import Text.Trifecta hiding (span, charLiteral, natural, symbol, char, string, whiteSpace)-+import qualified Text.PrettyPrint.ANSI.Leijen as PP import Idris.Core.TT import Idris.REPL import Idris.AbsSyntaxTree-import Idris.ParseHelpers hiding (stringLiteral)+import Idris.Parser.Helpers hiding (stringLiteral) import Idris.CmdOptions import Control.Monad.State.Strict@@ -51,7 +51,7 @@ parseDesc fp = do p <- readFile fp case runparser pPkg defaultPkg fp p of- Failure err -> fail (show err)+ Failure err -> fail (show $ PP.plain err) Success x -> return x pPkg :: PParser PkgDesc
@@ -142,7 +142,7 @@ setCurrentDirectory pkgDir let run l = runExceptT . execStateT l load [] = return ()- load (f:fs) = do loadModule f; load fs+ load (f:fs) = do loadModule f IBC_Building; load fs loader = do idrisMain opts; addImportDir (sourcedir pkgdesc); load fs idrisInstance <- run loader idrisInit setCurrentDirectory cd
@@ -1,8 +1,6 @@ {-# LANGUAGE CPP #-} module Util.ScreenSize(getScreenWidth) where -import Debug.Trace- #ifndef CURSES getScreenWidth :: IO Int@@ -11,11 +9,16 @@ #else import UI.HSCurses.Curses+import System.IO (hIsTerminalDevice, stdout) getScreenWidth :: IO Int-getScreenWidth = do initScr- refresh- size <- scrSize- endWin- return (snd size)+getScreenWidth = do term <- hIsTerminalDevice stdout+ if term+ then do+ initScr+ refresh+ size <- scrSize+ endWin+ return (snd size)+ else return 80 #endif
@@ -2,7 +2,6 @@ module Util.System(tempfile,withTempdir,rmFile,catchIO, isWindows, writeSource, writeSourceText, readSource, setupBundledCC, isATTY) where- -- System helper functions. import Control.Exception as CE@@ -31,9 +30,6 @@ catchIO :: IO a -> (IOError -> IO a) -> IO a catchIO = CE.catch--throwIO :: IOError -> IO a-throwIO = CE.throw isWindows :: Bool isWindows = os `elem` ["win32", "mingw32", "cygwin32"]
@@ -1,4 +1,4 @@-resolver: lts-3.16+resolver: lts-4.2 packages: - '.' flags:@@ -11,3 +11,6 @@ - cheapskate-0.1.0.4 - hscurses-1.4.2.0 - libffi-0.1+nix:+ enable: false+ shell-file: stack-shell.nix
@@ -1,24 +1,34 @@-.PHONY: test test_java test_js time update diff distclean $(TESTS)+.PHONY: test test_js time update diff distclean $(TESTS) TESTS = $(sort $(patsubst %/,%.test,$(wildcard */))) test: $(TESTS) -%.test:- @perl ./runtest.pl $(patsubst %.test,%,$@) -test_js:- @perl ./runtest.pl without sugar004 reg029 reg052 io001 dsl002 io003 effects001 effects002 basic007 basic011 ffi006 --codegen node+info: runtest+ @./runtest all -update:- /usr/bin/env perl ./runtest.pl all -u+%.test: runtest+ @./runtest $(patsubst %.test,%,$@) -q -diff:- /usr/bin/env perl ./runtest.pl all -d+test_js: runtest+ @./runtest without sugar004 reg029 reg052 io001 dsl002 io003 effects001 effects002 basic007 basic011 ffi006 ffi007 primitives005 opts --codegen node -time:- /usr/bin/env perl ./runtest.pl all -t+update: runtest+ @./runtest all -u +diff: runtest+ @./runtest all -d++time: runtest+ @./runtest all -t+ distclean:- rm -f *~- rm -f */output+ @rm runtest+ @rm -f *~+ @rm -f */output+++runtest:+ @ghc --make runtest.hs+ @rm runtest.o runtest.hi
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris $@ reg005.idr -o reg005-idris $@ basic001a.idr -o basic001a+${IDRIS:-idris} $@ reg005.idr -o reg005+${IDRIS:-idris} $@ basic001a.idr -o basic001a ./reg005 ./basic001a rm -f reg005 basic001a *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ --nocolour --consolewidth 80 test006.idr -o test006+${IDRIS:-idris} $@ --nocolour test006.idr -o test006 ./test006 rm -f test006 test006.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test027.idr -o test027+${IDRIS:-idris} $@ test027.idr -o test027 ./test027 rm -f test027 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test016.idr -o test016+${IDRIS:-idris} $@ test016.idr -o test016 ./test016 rm -f test016 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test019.lidr -o test019+${IDRIS:-idris} $@ test019.lidr -o test019 ./test019 rm -f test019 *.ibc
@@ -1,6 +1,6 @@ #!/usr/bin/env bash -idris --consolewidth 80 $@ test020.idr -o test020-idris --consolewidth 80 $@ test020a.idr --check --nocolor+${IDRIS:-idris} $@ test020.idr -o test020+${IDRIS:-idris} $@ test020a.idr --check --nocolor ./test020 rm -f test020 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ -o test033 test033.idr+${IDRIS:-idris} $@ -o test033 test033.idr ./test033 rm -f *.ibc test033
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test036.idr -o test036+${IDRIS:-idris} $@ test036.idr -o test036 ./test036 rm -f test036 *.ibc
@@ -1,4 +1,5 @@ module A +public export num : Nat num = 0
@@ -1,4 +1,5 @@ module B.C +public export num : Nat num = 1
@@ -1,8 +1,8 @@ #!/usr/bin/env bash -idris --consolewidth 80 $@ Main.idr --nocolour --check && echo MAIN-PASS-idris --consolewidth 80 $@ Faulty.idr --nocolour --check && echo FAULTY-PASS-idris --consolewidth 80 $@ Multiple.idr --nocolour --check && echo MULTIPLE-PASS+${IDRIS:-idris} $@ Main.idr --nocolour --check && echo MAIN-PASS+${IDRIS:-idris} $@ Faulty.idr --nocolour --check && echo FAULTY-PASS+${IDRIS:-idris} $@ Multiple.idr --nocolour --check && echo MULTIPLE-PASS rm -f *.ibc B/*.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ basic011.idr -p contrib -o basic011+${IDRIS:-idris} $@ basic011.idr -p contrib -o basic011 ./basic011 rm -f basic011 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ basic012.idr -o basic012+${IDRIS:-idris} $@ basic012.idr -o basic012 ./basic012 rm -f basic012 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ basic013.idr -o basic013+${IDRIS:-idris} $@ basic013.idr -o basic013 ./basic013 rm -f basic013 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ basic014.idr --check+${IDRIS:-idris} $@ basic014.idr --check rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ basic015.idr -o basic015+${IDRIS:-idris} $@ basic015.idr -o basic015 ./basic015 rm -f basic015 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ CycleA.idr --consolewidth 80 --nocolour --check+${IDRIS:-idris} $@ CycleA.idr --nocolour --check rm -f *.ibc
@@ -0,0 +1,25 @@+%auto_implicits off++data Vect : Nat -> Type -> Type where+ Nil : {a : _} -> Vect Z a+ (::) : {a, k : _} -> a -> Vect k a -> Vect (S k) a++data Elem : {a, n : _} -> a -> Vect n a -> Type where+ Here : {x, xs : _} -> Elem x (x :: xs)+ There : {x, y, xs : _} -> Elem x xs -> Elem x (y :: xs)++using (xs : Vect _ _)+ data Elem2 : {a, n : _} -> a -> Vect n a -> Type where+ Here2 : {x : _} -> Elem2 x (x :: xs)+ There2 : {x, y : _} -> Elem2 x xs -> Elem2 x (y :: xs)++append : {n, m, a : _} -> Vect n a -> Vect m a -> Vect (n + m) a+append [] ys = ys+append (x :: xs) ys = x :: append xs ys++%auto_implicits on++append2 : Vect n a -> Vect m a -> Vect (n + m) a+append2 [] ys = ys+append2 (x :: xs) ys = x :: append2 xs ys+
@@ -0,0 +1,15 @@+%auto_implicits off++data Vect : Nat -> Type -> Type where+ Nil : {a : _} -> Vect Z a+ (::) : {a, k : _} -> a -> Vect k a -> Vect (S k) a++data Elem : {a, n : _} -> a -> Vect n a -> Type where+ Here : {x, xs : _} -> Elem x (x :: xs)+ There : {x, y, xs : _} -> Elem x xs -> Elem x (y :: xs)++append : Vect n a -> Vect m a -> Vect (n + m) a+append [] ys = ys+append (x :: xs) ys = x :: append xs ys++
@@ -0,0 +1,3 @@+basic017a.idr:11:8:When checking type of Main.append:+When checking an application of Main.Vect:+ No such variable n
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ basic017.idr --check --nocolor+${IDRIS:-idris} $@ basic017a.idr --check --nocolor+rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ bignum001.idr -o bignum001+${IDRIS:-idris} $@ bignum001.idr -o bignum001 ./bignum001 rm -f bignum001 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ bignum002.idr -o bignum002+${IDRIS:-idris} $@ bignum002.idr -o bignum002 ./bignum002 rm -f bignum002 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --quiet --nocolour --consolewidth 70 ClassName.idr < input+${IDRIS:-idris} $@ --quiet --nocolour --consolewidth 70 ClassName.idr < input rm -f bounded001 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ corecords001.idr -o corecords001+${IDRIS:-idris} $@ corecords001.idr -o corecords001 ./corecords001 rm -f corecords001 corecords001.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ corecords002.idr -o corecords002+${IDRIS:-idris} $@ corecords002.idr -o corecords002 ./corecords002 rm -f corecords002 corecords002.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --quiet --nocolor delab001.idr < input+${IDRIS:-idris} $@ --quiet --nocolor delab001.idr < input rm -f *.ibc
@@ -6,7 +6,7 @@ Dec0 = Dec Dec1 : {A : Type} -> (P : A -> Type) -> Type-Dec1 {A} P = (a : A) -> Dec0 (P a) +Dec1 {A} P = (a : A) -> Dec0 (P a) Unique : Type -> Type Unique t = (p : t) -> (q : t) -> p = q@@ -53,8 +53,8 @@ filterTag : {A : Type} -> {P : A -> Type} -> Dec1 P ->- Vect n A -> - Sigma Nat (\ m => Vect m (Sigma A P))+ Vect n A ->+ DPair Nat (\ m => Vect m (DPair A P)) filterTag d1P Nil = (_ ** Nil) filterTag d1P (a :: as) with (filterTag d1P as) | (_ ** tail) with (d1P a)@@ -66,7 +66,7 @@ {P : A -> Type} -> Finite A -> Dec1 P ->- (n : Nat ** Vect n (Sigma A P))+ (n : Nat ** Vect n (DPair A P)) toVect fA d1P = filterTag d1P (toVect fA) sigmaUniqueLemma1 : {A : Type} ->@@ -74,16 +74,14 @@ Unique1 {t0 = A} P -> (a : A) -> (p : P a) ->- (ss : Vect n (Sigma A P)) ->- Elem a (map getWitness ss) -> + (ss : Vect n (DPair A P)) ->+ Elem a (map fst ss) -> Elem (a ** p) ss toVectComplete : {A : Type} -> {P : A -> Type} ->- (fA : Finite A) -> - (d1P : Dec1 P) -> + (fA : Finite A) ->+ (d1P : Dec1 P) -> Unique1 {t0 = A} P ->- (s : Sigma A P) -> - Elem s (getProof (toVect fA d1P))--+ (s : DPair A P) ->+ Elem s (snd (toVect fA d1P))
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ disambig002.idr --check+${IDRIS:-idris} $@ disambig002.idr --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet --nocolor --consolewidth 80 docs001.idr < input+${IDRIS:-idris} --quiet --nocolor docs001.idr < input rm *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 --nobanner --nocolor --quiet docs002.idr < input+${IDRIS:-idris} --nobanner --nocolor --quiet docs002.idr < input rm *.ibc
@@ -5,7 +5,7 @@ f -- a parameterised type Methods:- map : Functor f => (m : a -> b) -> f a -> f b+ map : Functor f => (func : a -> b) -> f a -> f b Apply a function across everything of type 'a' in a parameterised type
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 --quiet --nocolor docs003.idr < input+${IDRIS:-idris} --quiet --nocolor docs003.idr < input rm *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test001.idr -o test001+${IDRIS:-idris} $@ test001.idr -o test001 ./test001 rm -f test001 test001.ibc
@@ -45,7 +45,7 @@ index_next = Pop total- interp : Env G -> [static] (e : Expr G t) -> interpTy t+ interp : Env G -> %static (e : Expr G t) -> interpTy t interp env (Var i) = lookup i env interp env (Val x) = x interp env (Lam sc) = \x => interp (x :: env) sc
@@ -3,6 +3,8 @@ import public Data.Vect import public Data.Fin +%access public export+ -- IO operations which read a resource data Reader : Type -> Type where MkReader : IO a -> Reader a@@ -122,7 +124,7 @@ ioret : a -> IO a ioret = return - interp : Env gam -> [static] (e : Res gam gam' t) ->+ interp : Env gam -> %static (e : Res gam gam' t) -> (Env gam' -> interpTy t -> IO u) -> IO u interp env (Let val scope) k
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test014.idr -o test014+${IDRIS:-idris} $@ test014.idr -o test014 ./test014 rm -f test014 Resimp.ibc test014.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --nocolour --check DSLPi.idr -e test1 -e test2+${IDRIS:-idris} $@ --nocolour --check DSLPi.idr -e test1 -e test2 rm -f *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris $@ Door0.idr --check-idris $@ Door1.idr --check-idris $@ Door2.idr --check+${IDRIS:-idris} $@ Door0.idr --check+${IDRIS:-idris} $@ Door1.idr --check+${IDRIS:-idris} $@ Door2.idr --check rm -f *.ibc
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris -p effects $@ test021.idr -o test021-idris -p effects $@ test021a.idr -o test021a+${IDRIS:-idris} -p effects $@ test021.idr -o test021+${IDRIS:-idris} -p effects $@ test021a.idr -o test021a ./test021 ./test021a rm -f test021 test021a *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris -p effects $@ test025.idr -o test025+${IDRIS:-idris} -p effects $@ test025.idr -o test025 ./test025 rm -f test025 *.ibc
@@ -3,9 +3,7 @@ import Data.Fin import Data.Vect -implementation Uninhabited (Elem x []) where- uninhabited Here impossible-+export shrink : (xs : Vect (S n) a) -> Elem x xs -> Vect n a shrink (x :: ys) Here = ys shrink (y :: []) (There p) = absurd p
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ hangman.idr --consolewidth 80 --nocolour -p effects -o hangman+${IDRIS:-idris} $@ hangman.idr --nocolour -p effects -o hangman ./hangman < input rm -f hangman *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ effects004.idr -o effects004 -p effects+${IDRIS:-idris} $@ effects004.idr -o effects004 -p effects ./effects004 < input rm -f effects004 *.ibc
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris $@ defaultLogger.idr -o default -p effects+${IDRIS:-idris} $@ defaultLogger.idr -o default -p effects ./default-idris $@ categoryLogger.idr -o category -p effects+${IDRIS:-idris} $@ categoryLogger.idr -o category -p effects ./category rm -f default category *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ test002.idr --check --noprelude --consolewidth 70+${IDRIS:-idris} $@ test002.idr --check --noprelude --consolewidth 70 rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test031.idr -o test031+${IDRIS:-idris} $@ test031.idr -o test031 ./test031 rm -f test031 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ ErrorReflection.idr --nocolour --check+${IDRIS:-idris} $@ ErrorReflection.idr --nocolour --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ FunErrTest.idr --nocolour --check+${IDRIS:-idris} $@ FunErrTest.idr --nocolour --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ --check --nocolour error005.idr+${IDRIS:-idris} $@ --check --nocolour error005.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet --nocolour test022.idr --exec main+${IDRIS:-idris} --quiet --nocolour test022.idr --exec main rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 --quiet test023.idr -o test023+${IDRIS:-idris} --quiet test023.idr -o test023 rm -f test023 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet --nocolour test024.idr --exec main < input+${IDRIS:-idris} --quiet --nocolour test024.idr --exec main < input rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet --nocolour --check test026.idr+${IDRIS:-idris} --quiet --nocolour --check test026.idr rm -f *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash -idris $@ Postulate.idr -o postulate+${IDRIS:-idris} $@ Postulate.idr -o postulate ./postulate rm -f postulate *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris $@ ffi006.idr --interface -o ffi006.o+${IDRIS:-idris} $@ ffi006.idr --interface -o ffi006.o ${CC:=cc} ffi006.c ffi006.o `idris --include` `idris --link` -o ffi006 ./ffi006 rm -f ffi006 *.ibc *.o *.h
@@ -0,0 +1,8 @@+8+5+Before calling callback+In an Idris callback+After calling callback+00000377+I'm dynamic 3+6
@@ -0,0 +1,30 @@+#include <stdio.h>++typedef int (*callback)(int);+typedef int (*cb2)(char *);++void test_ffi(callback cb)+{+ printf("%d\n", cb(3));+}++void test_ffi2(cb2 cb)+{+ printf("%d\n", cb("hello"));+}++void test_ffi3(void (*cb)(void))+{+ printf("Before calling callback\n");+ cb();+ printf("After calling callback\n");+}++int dynamic_fn(int i) {+ printf("I'm dynamic %d\n", i);+ return i*2;+}++callback test_ffi6(void) {+ return &dynamic_fn;+}
@@ -0,0 +1,11 @@+#include <stdint.h>+typedef int (*callback)(int);++int32_t testvar = 887;++void test_ffi(int (*cb)(int));++void test_ffi2(int (*cb)(char*));+void test_ffi3(void (*cb)(void));++callback test_ffi6(void);
@@ -0,0 +1,49 @@+module Main++%include c "ffi007.h"++getInt : Int -> Int+getInt _ = 8++test : IO ()+test = foreign FFI_C "test_ffi" (CFnPtr (Int -> Int) -> IO ()) (MkCFnPtr getInt)++strLen : String -> Int+strLen s = cast $ length s++test2 : IO ()+test2 = foreign FFI_C "test_ffi2" (CFnPtr (String -> Int) -> IO ()) (MkCFnPtr strLen)++-- Do IO+printIt : () -> ()+printIt _ = unsafePerformIO $ do+ putStrLn "In an Idris callback"++test3 : IO ()+test3 = foreign FFI_C "test_ffi3" (CFnPtr (() -> ()) -> IO ()) (MkCFnPtr printIt)++test4 : IO Ptr+test4 = foreign FFI_C "%wrapper" (CFnPtr (() -> ()) -> IO Ptr) (MkCFnPtr printIt)++test5 : IO Ptr+test5 = foreign FFI_C "&testvar" (IO Ptr)++test6 : IO Ptr+test6 = foreign FFI_C "test_ffi6" (IO Ptr)++test7 : Ptr -> Int -> IO Int+test7 fnptr i = foreign FFI_C "%dynamic" (Ptr -> Int -> IO Int) fnptr i++main : IO ()+main = do+ test+ test2+ test3+ ptr <- test4+ tv <- test5+ val <- prim_peek32 tv 0+ printLn val+ fptr <- test6+ i <- test7 fptr 3+ printLn i+ return ()
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ ffi007.idr -o ffi007 --cg-opt "ffi007.c"+./ffi007+rm -f ffi007 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ folding001.idr -o folding001+${IDRIS:-idris} $@ folding001.idr -o folding001 ./folding001 rm -f folding001 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash # Tests that no documentation is built for empty and/or private-only namespaces-idris --mkdoc test_empty.ipkg+${IDRIS:-idris} --mkdoc test_empty.ipkg rm -rf *.ibc *_doc
@@ -1,5 +1,6 @@ module TestFunctions ||| Test function+public export test : () test = ()
@@ -1,5 +1,5 @@ #!/usr/bin/env bash # Tests that documentation is generated for functions-idris --mkdoc test_functions.ipkg+${IDRIS:-idris} --mkdoc test_functions.ipkg [ -d test_functions_doc ] && echo "Functions are documented" rm -rf *.ibc *_doc
@@ -1,6 +1,7 @@ module TestDatatypes ||| This is another test+public export data Test : Type where ||| Test constructor ATest : Test
@@ -1,5 +1,5 @@ #!/usr/bin/env bash # Tests that documentation is generated for data types-idris --mkdoc test_datatypes.ipkg+${IDRIS:-idris} --mkdoc test_datatypes.ipkg [ -d test_datatypes_doc ] && echo "Data types are documented" rm -rf *.ibc *_doc
@@ -3,6 +3,7 @@ ||| This is a test ||| ||| @ a Test arg+public export interface Test a where ||| Test function test : a -> Int
@@ -1,5 +1,5 @@ #!/usr/bin/env bash # Tests that documentation is generated for typeclasses-idris --mkdoc test_typeclasses.ipkg+${IDRIS:-idris} --mkdoc test_typeclasses.ipkg [ -d test_typeclasses_doc ] && echo "Typeclasses are documented" rm -rf *.ibc *_doc
@@ -1,4 +1,5 @@ module TestTracing +public export test : Bool test = True
@@ -1,6 +1,6 @@ #!/usr/bin/env bash # Tests that references to other namespaces are traced-idris --mkdoc test_tracing.ipkg+${IDRIS:-idris} --mkdoc test_tracing.ipkg [ -f test_tracing_doc/docs/TestTracing.html ] && echo "TestTracing: Check" [ -f test_tracing_doc/docs/Prelude.Bool.html ] && echo "Prelude.Bool: Check" rm -rf *.ibc *_doc
@@ -1,6 +1,6 @@ module A.fully.Qualified.NAME ||| This is another test-data Test : Type where+public export data Test : Type where ||| Test constructor ATest : Test
@@ -1,5 +1,6 @@ module B ||| Test function+public export test : () test = ()
@@ -1,8 +1,8 @@ #!/usr/bin/env bash # Tests that documentation properly is merged with existent.-idris --mkdoc package_a.ipkg+${IDRIS:-idris} --mkdoc package_a.ipkg [ -f test_merge_doc/IdrisDoc ] && echo "IdrisDoc file written"-idris --mkdoc package_b.ipkg+${IDRIS:-idris} --mkdoc package_b.ipkg ls -1p test_merge_doc/docs if grep -q "href\\=\"docs/A.fully.Qualified.NAME\\.html\"" test_merge_doc/index.html; then echo A.fully.Qualified.NAME is in the index
@@ -1,6 +1,6 @@ #!/usr/bin/env bash # Tests that documentation only is written when safe mkdir do_not_delete_doc-idris --mkdoc package.ipkg > nowhere+${IDRIS:-idris} --mkdoc package.ipkg > nowhere echo Exit status \(expects 1\): $? rm -rf do_not_delete_doc *.ibc nowhere
@@ -1,5 +1,5 @@ module Abstract -abstract+export frozen : () frozen = ()
@@ -1,5 +1,5 @@ module Visible -public+public export visible : () visible = ()
@@ -1,6 +1,6 @@ #!/usr/bin/env bash # Tests that documentation is generated for both public and abstract members.-idris --mkdoc visibility.ipkg+${IDRIS:-idris} --mkdoc visibility.ipkg [ -f visibility_doc/docs/Abstract.html ] && echo "Abstract members are documented" [ -f visibility_doc/docs/Visible.html ] && echo "Public members are documented" rm -rf *.ibc *_doc
@@ -23,6 +23,8 @@ module Test import Data.Complex +%access public export+ myplus : Nat -> Nat -> Nat myplus Z j = j myplus (S k) j = S (myplus k j)
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --nocolour --quiet Test.idr < input+${IDRIS:-idris} $@ --nocolour --quiet Test.idr < input rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet test032.idr < input+${IDRIS:-idris} --quiet test032.idr < input rm -f *.ibc
@@ -5,6 +5,6 @@ Vect (n + m) a Nat Nat-S n+(S n) String ()
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet interactive002.idr < input+${IDRIS:-idris} --quiet interactive002.idr < input rm -f *.ibc
@@ -2,4 +2,4 @@ x :: app xs ys [] f x y :: vzipWith f xs ys-?word_length_rhs_3 :: word_length xs+0 :: word_length xs
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet interactive003.idr < input+${IDRIS:-idris} --quiet interactive003.idr < input rm -f *.ibc
@@ -1,2 +1,2 @@ plus ?foo_rhs2 ?foo_rhs3-append k m ?append_rhs2 ?append_rhs3+(append k m ?append_rhs2 ?append_rhs3)
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet interactive004.idr < input+${IDRIS:-idris} --quiet interactive004.idr < input rm -f *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris --nocolour --quiet interactive005.idr --consolewidth 70 < input+${IDRIS:-idris} --nocolour --quiet interactive005.idr --consolewidth 70 < input rm -f *.ibc rm -f hello.bytecode rm -f hello
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet --port 5000 interactive006.idr < input+${IDRIS:-idris} --quiet --port 5000 interactive006.idr < input rm -f *.ibc
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-idris -p contrib --nobanner --nocolor < input+${IDRIS:-idris} -p contrib --nobanner --nocolor < input
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-idris --nobanner --nocolor < input+${IDRIS:-idris} --nobanner --nocolor < input
@@ -1,1 +1,1 @@-IsSetCons pf prfRec+(IsSetCons pf prfRec)
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet interactive009.idr < input+${IDRIS:-idris} --quiet interactive009.idr < input rm -f *.ibc
@@ -1,12 +1,12 @@ Prelude.List.(++) : List a -> List a -> List a Prelude.Strings.(++) : String -> String -> String-a is not an implicit argument of Prelude.Classes./+a is not an implicit argument of Prelude.Interfaces./ Usage is :doc <functionname> Usage is :wc <functionname> Usage is :printdef <functionname>-pat {ty504} : Type u. pat {__class505} : Prelude.Classes.Fractional {ty504}. Prelude.Classes./ {ty504} {__class505}+pat {ty504} : Type u. pat {__class505} : Prelude.Interfaces.Fractional {ty504}. Prelude.Interfaces./ {ty504} {__class505} - : pty {ty504} : Type u. pty {__class505} : Prelude.Classes.Fractional {ty504}. {ty504} -> {ty504} -> {ty504}+ : pty {ty504} : Type u. pty {__class505} : Prelude.Interfaces.Fractional {ty504}. {ty504} -> {ty504} -> {ty504} (input):1:1: error: expected: ":", dependent type signature, end of input
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-idris --quiet --nobanner --nocolor --consolewidth 80 < input+${IDRIS:-idris} --quiet --nobanner --nocolor < input
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --quiet interactive011.idr < input+${IDRIS:-idris} --quiet interactive011.idr < input rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 70 --quiet interactive012.idr < input+${IDRIS:-idris} --nocolour --consolewidth 70 --quiet interactive012.idr < input rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test004.idr -o test004+${IDRIS:-idris} $@ test004.idr -o test004 ./test004 rm -f test004 test004.ibc testfile
@@ -17,7 +17,7 @@ closeFile h } main : IO ()-main = do { Right h <- openFile "testfile" Write+main = do { Right h <- openFile "testfile" WriteTruncate fPutStr h "Hello!\nWorld!\n...\n3\n4\nLast line\n" closeFile h putStrLn "Reading testfile"
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test008.idr -o test008+${IDRIS:-idris} $@ test008.idr -o test008 ./test008 rm -f test008 test008.ibc
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris $@ test018.idr -p contrib -o test018-idris $@ test018a.idr -p contrib -o test018a+${IDRIS:-idris} $@ test018.idr -p contrib -o test018+${IDRIS:-idris} $@ test018a.idr -p contrib -o test018a ./test018 #./test018a rm -f test018 test018a *.ibc
@@ -2,12 +2,12 @@ Test some string primitives while we're at it -> st : String+> export st : String > st = "abcdefg" Literate main program -> main : IO ()+> export main : IO () > main = do { putStrLn (show (strHead st)) > putStrLn (show (strIndex st 3)) > putStrLn (strCons 'z' st)
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ test003a.lidr --check-idris --consolewidth 80 $@ test003.lidr -o test003+${IDRIS:-idris} $@ test003a.lidr --check+${IDRIS:-idris} $@ test003.lidr -o test003 ./test003 rm -f test003 test003.ibc Lit.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --check --nocolour --consolewidth 70 Finite.idr+${IDRIS:-idris} $@ --check --nocolour --consolewidth 70 Finite.idr rm -f *.ibc
@@ -2,6 +2,10 @@ ||| Idris's reflected elaboration. Requires handling type class ||| resolution and implicit arguments - some of the same features as ||| the Idris elaborator itself.+|||+||| Since this test was put together, Agda has adopted an Idris-style+||| elaborator reflection mechanism. The module name is preserved for+||| historical interest. module AgdaStyleReflection @@ -11,6 +15,7 @@ %default total + ||| Function arguments as provided at the application site record Arg a where constructor MkArg@@ -20,6 +25,10 @@ implementation Functor Arg where map f (MkArg plic x) = MkArg plic (f x) +implementation Show a => Show (Arg a) where+ showPrec d (MkArg plic x) = showCon d "MkArg" $ showArg plic ++ showArg x++ ||| Reflected terms, in the tradition of Agda's reflection library data Term = Var Nat (List (Arg Term))@@ -37,6 +46,41 @@ unApply' (RApp f x) xs = unApply' f (x::xs) unApply' notApp xs = (notApp, xs) ++implementation Quotable Plicity Raw where+ quotedTy = `(Plicity)+ quote Explicit = `(Explicit)+ quote Implicit = `(Implicit)+ quote Constraint = `(Constraint)++implementation (Quotable a Raw) => Quotable (Arg a) Raw where+ quotedTy = `(Arg ~(quotedTy {a=a}))+ quote (MkArg plicity argValue) =+ `(MkArg {a=~(quotedTy {a=a})} ~(quote plicity) ~(quote argValue))+++implementation Quotable Term Raw where+ quotedTy = `(Term)+ quote (Var k xs) = `(AgdaStyleReflection.Var ~(quote k) ~(assert_total $ quote xs))+ quote (Ctor n xs) = `(AgdaStyleReflection.Ctor ~(quote n) ~(assert_total $ quote xs))+ quote (TyCtor n xs) = `(AgdaStyleReflection.TyCtor ~(quote n) ~(assert_total $ quote xs))+ quote (Def n xs) = `(Def ~(quote n) ~(assert_total $ quote xs))+ quote (Lam x) = `(AgdaStyleReflection.Lam ~(quote x))+ quote (Pi x y) = `(AgdaStyleReflection.Pi ~(quote x) ~(quote y))+ quote (Constant c) = `(Constant ~(quote c))+ quote Ty = `(Ty)+++partial implementation Show Term where+ showPrec d (Var k xs) = showCon d "Var" $ showArg k ++ showArg xs+ showPrec d (Ctor n xs) = showCon d "Ctor" $ showArg n ++ showArg xs+ showPrec d (TyCtor n xs) = showCon d "TyCtor" $ showArg n ++ showArg xs+ showPrec d (Def n xs) = showCon d "Def" $ showArg n ++ showArg xs+ showPrec d (Lam x) = showCon d "Lam" $ showArg x+ showPrec d (Pi x y) = showCon d "Pi" $ showArg x ++ showArg y+ showPrec d (Constant c) = showCon d "Constant" $ showArg c+ showPrec d Ty = "Ty"+ ||| Quote a reflected Idris term to a Term in some induced local context covering quoteTerm' : List TTName -> Raw -> Elab Term@@ -183,18 +227,41 @@ spliceTerm : Term -> Elab () spliceTerm = spliceTerm' [] -||| Lift an Agda-style tactic into an Idris-style tactic+syntax "splice" [tm] = %runElab (spliceTerm tm)+ covering-quoteGoalImpl : (Term -> Term) -> Elab ()-quoteGoalImpl f = do compute- g <- goalType >>= quoteTerm- spliceTerm (f g)+quoteGoalImpl : TTName -> Elab ()+quoteGoalImpl f =+ do g <- goalType >>= quoteTerm+ fill (RApp (Var f) (quote g))+ solve -syntax "quoteGoal" {x} "in" [expr] = %runElab (quoteGoalImpl (\x => expr))+syntax "quoteGoal" {g} "in" [e] =+ let f = \g : Term => e in %runElab (quoteGoalImpl `{f}) -syntax "tactic" [expr] = %runElab (quoteGoalImpl expr) +-- Note: this definition would seem to be the right thing, but it's not:+-- syntax "tactic" [tac] = quoteGoal g in splice tac g+-- This is because it would make+-- tactic foo+-- expand to+-- let f = \g : Term => %runElab (spliceTerm (tac g))+-- in %runElab (quoteGoalImpl `{f})+-- which confuses the meta-level at which the body of the lambda should be+-- run. It must be sequenced into the same monadic action as quoting the goal,+-- yielding the following implementation: +covering+tacticImpl : (tac : Term -> Term) -> Elab ()+tacticImpl tac = do g <- goalType >>= quoteTerm+ AgdaStyleReflection.spliceTerm (tac g)++syntax "tactic" [tacticCode] =+ %runElab (tacticImpl tacticCode)++++ @@ -231,12 +298,30 @@ trivial : (goal : Term) -> Term trivial = perhaps . trivial' -foo : (Nat, (), Nat, Either (() -> ()) Void)-foo = quoteGoal x in trivial x+-- DOESN'T WORK because reflection operations are not pure - they have+-- side effects in the elaborator! Also due to metalevel confusion in+-- underlying syntax+--foo : (Nat, (), Either Void Nat, Nat -> ())+--foo = quoteGoal g in splice (trivial g) ++-- WORKS because "tactic" takes care of the sequencing of operations bar : (Nat, (), Either Void Nat, Nat -> ()) bar = tactic trivial +someTerm : Term+someTerm = quoteGoal g in g++ok : AgdaStyleReflection.someTerm = TyCtor (NS (UN "Term") ["AgdaStyleReflection"]) []+ok = Refl++-- assert_total needed due to partial Show implementations+stringly : String -> String+stringly = quoteGoal g in \x => assert_total $ show g++ok2 : stringly "fnord" = "Pi (Constant StrType) (Constant StrType)"+ok2 = Refl+ -- When checking right hand side of baz: -- PROOF SEARCH FAILURE is not defined. baz : (Nat, Void)@@ -245,3 +330,4 @@ -- Local Variables: -- idris-load-packages: ("pruviloj") -- End:+
@@ -208,7 +208,7 @@ -- Now we put this hole variable into our sigma constructor -- prior to elaboration, so it doesn't disappear too soon- fill `(MkSigma ~(Var tH) ~(Var tmH) : Sigma Ty (Tm []))+ fill `(MkDPair ~(Var tH) ~(Var tmH) : DPair Ty (Tm [])) solve focus tmH mkTerm [] tm@@ -287,18 +287,17 @@ apply `(UnitCon {env=~(Var envH)}) [] solve- testElab : Sigma Ty (Tm [])+ testElab : DPair Ty (Tm []) testElab = %runElab (elaborateSTLC (App (Lam "x" UnitCon) UnitCon)) - testElab2 : Sigma Ty (Tm [])+ testElab2 : DPair Ty (Tm []) testElab2 = %runElab (elaborateSTLC (App (Lam "x" (Var 0)) UnitCon)) -- Doesn't work! :-)- testElab3 : Sigma Ty (Tm [])+ testElab3 : DPair Ty (Tm []) testElab3 = %runElab (elaborateSTLC (App (Lam "x" (App (Var 0) (Var 0))) (Lam "x" (App (Var 0) (Var 0))))) -- Error is: -- Tacs.idr line 247 col 14: -- When elaborating right hand side of testElab3: -- Unifying ty and Tacs.STLC.ARR ty t would lead to infinite value-
@@ -1,9 +1,9 @@ Tacs.idr:298:15: When checking right hand side of testElab3 with expected type- Sigma Ty (Tm [])+ DPair Ty (Tm []) Unifying ty and ARR ty t would lead to infinite value-AgdaStyleReflection.idr:243:5:+AgdaStyleReflection.idr:328:5: When checking right hand side of baz with expected type (Nat, Void)
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris $@ -p pruviloj --nocolour --check --consolewidth 70 Tacs.idr-idris $@ -p pruviloj --nocolour --check --consolewidth 70 AgdaStyleReflection.idr+${IDRIS:-idris} $@ -p pruviloj --nocolour --check --consolewidth 70 Tacs.idr+${IDRIS:-idris} $@ -p pruviloj --nocolour --check --consolewidth 70 AgdaStyleReflection.idr # Disabled due to excess memory consumption # idris $@ -p pruviloj --nocolour --check --consolewidth 70 Deriving.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ -p pruviloj --nocolour --check --consolewidth 70 meta004.idr+${IDRIS:-idris} $@ -p pruviloj --nocolour --check --consolewidth 70 meta004.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --build test.ipkg+${IDRIS:-idris} $@ --build test.ipkg rm -f *.ibc
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris $@ test005.idr -o test005+${IDRIS:-idris} $@ test005.idr -o test005 ./test005-idris $@ substring.idr -o substring+${IDRIS:-idris} $@ substring.idr -o substring ./substring < input rm -f test005 substring *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris $@ -o test038 test038.idr --nocolour+${IDRIS:-idris} $@ -o test038 test038.idr --nocolour ./test038 rm -f test038 *.ibc
@@ -0,0 +1,2 @@+04030201+000000000000FFFF
@@ -0,0 +1,24 @@+module Main++%include C "memory.h"++-- use calloc to ensure zeroed out memory+malloc : Int -> IO Ptr+malloc size = foreign FFI_C "calloc" (Int -> Int -> IO Ptr) size 1++free : Ptr -> IO ()+free ptr = foreign FFI_C "free" (Ptr -> IO ()) ptr++main : IO ()+main = do+ p <- malloc 1000+ prim_poke16 p 0 0xffff+ prim_poke8 p 8 1+ prim_poke8 p 9 2+ prim_poke8 p 10 3+ prim_poke8 p 11 4+ a <- prim_peek32 p 8+ b <- prim_peek64 p 0+ printLn a+ printLn b+ free p
@@ -0,0 +1,5 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ -o p005 primitives005.idr --nocolour+./p005+rm -f p005 *.ibc+
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ test029.idr --consolewidth 80 --nocolour --check test029+${IDRIS:-idris} $@ test029.idr --nocolour --check test029 rm -f *.ibc
@@ -2,6 +2,7 @@ import Decidable.Equality +%access public export %default total using (xs : List a, ys : List a, G : List (List a))@@ -43,7 +44,7 @@ let (yl ** (yr, yprf)) = expr_r ey in appRExpr _ _ xr yr xprf yprf where- appRExpr : (xs', ys' : List a) -> + appRExpr : (xs', ys' : List a) -> {G : List (List a)} -> {xs, ys : List a} -> RExpr G xs -> RExpr G ys -> (xs' = xs) -> (ys' = ys) -> (ws' ** (RExpr G ws', xs' ++ ys' = ws'))@@ -205,6 +206,4 @@ -- prover. syntax AssocProof [ty] = quoteGoal x by reflectEq ty [] in- getJust (prove (getProof x)) ItIsJust--+ getJust (prove (snd x)) ItIsJust
@@ -1,8 +1,8 @@-Reflect.idr:173:21-26:+Reflect.idr:174:21-26: This style of tactic proof is deprecated. See %runElab for the replacement.-Reflect.idr:182:21-26:+Reflect.idr:183:21-26: This style of tactic proof is deprecated. See %runElab for the replacement.-Reflect.idr:190:15-20:+Reflect.idr:191:15-20: This style of tactic proof is deprecated. See %runElab for the replacement. test030a.idr:12:26-14:1: When checking right hand side of testReflect1 with expected type@@ -12,7 +12,7 @@ Type mismatch between IsJust (Just x1) (Type of ItIsJust) and- IsJust (prove (getProof x)) (Expected type)+ IsJust (prove (snd x)) (Expected type) Specifically: Type mismatch between
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ test030.idr --check --nocolour-idris --consolewidth 80 $@ test030a.idr --check --nocolour+${IDRIS:-idris} $@ test030.idr --check --nocolour+${IDRIS:-idris} $@ test030a.idr --check --nocolour rm -f *.ibc
@@ -10,4 +10,3 @@ testReflect1 : (xs, ys : List a) -> ((xs ++ (x :: ys ++ xs)) = ((xs ++ [x]) ++ (ys ++ xs))) testReflect1 {a} xs ys = AssocProof a-
@@ -1,5 +1,7 @@ module Parity +%access public export+ data Parity : Nat -> Type where Even : {n : Nat} -> Parity (n + n) Odd : {n : Nat} -> Parity (S (n + n))
@@ -1,6 +1,6 @@-Parity.idr:15:18-23:+Parity.idr:17:18-23: This style of tactic proof is deprecated. See %runElab for the replacement.-Parity.idr:22:18-23:+Parity.idr:24:18-23: This style of tactic proof is deprecated. See %runElab for the replacement. test015.idr:88:15-20: This style of tactic proof is deprecated. See %runElab for the replacement.
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test015.idr --nocolour --consolewidth 80 -o test015+${IDRIS:-idris} $@ test015.idr --nocolour -o test015 ./test015 rm -f test015 Parity.ibc test015.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --check $@ test035.idr+${IDRIS:-idris} --check $@ test035.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --check $@ DefaultArgSubstitutionSuccess.idr+${IDRIS:-idris} --check $@ DefaultArgSubstitutionSuccess.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --check $@ DefaultArgSubstitutionSyntax.idr+${IDRIS:-idris} --check $@ DefaultArgSubstitutionSyntax.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 --check $@ DefaultArgUnknownName.idr+${IDRIS:-idris} --nocolour --check $@ DefaultArgUnknownName.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 --check $@ ClaimAndUnfocus.idr+${IDRIS:-idris} --nocolour --check $@ ClaimAndUnfocus.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --consolewidth 70 --quiet proof009.idr < input+${IDRIS:-idris} $@ --consolewidth 70 --quiet proof009.idr < input rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ proof010.idr -o proof010+${IDRIS:-idris} $@ proof010.idr -o proof010 ./proof010 rm -f proof010 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --check proofsearch001.idr+${IDRIS:-idris} $@ --check proofsearch001.idr rm -f *.ibc
@@ -3,7 +3,7 @@ import System.Concurrency.Raw import public Data.List -- public, to get proof search machinery -%access public+%access public export -- Process IDs are parameterised by their interface. A request of type -- 'iface t' will get a response of type 't'
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --check proofsearch002.idr+${IDRIS:-idris} $@ --check proofsearch002.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --check proofsearch003.idr +${IDRIS:-idris} --check proofsearch003.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ -p pruviloj --check --nocolour --consolewidth 70 pruviloj001.idr+${IDRIS:-idris} $@ -p pruviloj --check --nocolour --consolewidth 70 pruviloj001.idr rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ QuasiquoteBasics.idr -o quasiquote001+${IDRIS:-idris} $@ QuasiquoteBasics.idr -o quasiquote001 ./quasiquote001 rm -f quasiquote001 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ GoalQQuote.idr -o quasiquote002+${IDRIS:-idris} $@ GoalQQuote.idr -o quasiquote002 ./quasiquote002 rm -f quasiquote002 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ --check NoInfer.idr+${IDRIS:-idris} $@ --check NoInfer.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ --check --nocolour Quasiquote004.idr+${IDRIS:-idris} $@ --check --nocolour Quasiquote004.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --check --nocolour Quasiquote005.idr+${IDRIS:-idris} $@ --check --nocolour Quasiquote005.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --check --nocolour --quiet --consolewidth 70 quasiquote006.idr+${IDRIS:-idris} $@ --check --nocolour --quiet --consolewidth 70 quasiquote006.idr rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test011.idr -o test011+${IDRIS:-idris} $@ test011.idr -o test011 ./test011 rm -f test011 test011.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ record002.idr -o record002+${IDRIS:-idris} $@ record002.idr -o record002 ./record002 rm -f record002 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ records003.idr -o records003+${IDRIS:-idris} $@ records003.idr -o records003 ./records003 rm -f records003 *.ibc
@@ -37,7 +37,7 @@ ** ((a ** believe_me Oh) ::- (fst (getProof (filterTagP p as (believe_me Oh)))),+ (fst (snd (filterTagP p as (believe_me Oh)))), Oh ) )@@ -95,7 +95,7 @@ using (A : Type, B : A->Type, C : Type) foo2 : ((x:A) -> B x -> C) -> ((x:A ** B x) -> C)- foo2 f p = f (getWitness p) (getProof p)+ foo2 f p = f (fst p) (snd p) m_add : Maybe (Either Bool Int) -> Maybe (Either Bool Int) ->@@ -144,7 +144,7 @@ X t = (c : Nat ** So (c < 5)) column : X t -> Nat-column = getWitness+column = fst data Action = Left | Ahead | Right @@ -161,31 +161,31 @@ isSubsetOf {univ} a b = (c : univ) -> (member c a) -> (member c b) interface Set univ => HasPower univ where- Powerset : (a : univ) -> - Sigma univ (\Pa => (c : univ) ->+ Powerset : (a : univ) ->+ DPair univ (\Pa => (c : univ) -> (isSubsetOf c a) -> member c Pa) powerset : HasPower univ => univ -> univ-powerset {univ} a = getWitness (Powerset a)+powerset {univ} a = fst (Powerset a) mapFilter : (alpha -> beta) ->- (alpha -> Bool) -> - Vect n alpha -> + (alpha -> Bool) ->+ Vect n alpha -> (n : Nat ** Vect n beta) mapFilter f p Nil = (_ ** Nil) mapFilter f p (a :: as) with (p a)- | True = (_ ** (f a) :: (getProof (mapFilter f p as)))+ | True = (_ ** (f a) :: (snd (mapFilter f p as))) | False = mapFilter f p as hVectEx1 : HVect [String, List Nat, Nat, (Nat, Nat)] hVectEx1 = ["Hello",[1,2,3],42,(0,10)]- + vecfoo : HVect [String, List Nat, Nat, (Nat, Nat)] vecfoo = put (S (S Z)) hVectEx1 foom : Monad m => Int -> m Int-foom = pure - +foom = pure+ bar : IO () bar = case foom 5 of Nothing => print 42@@ -193,7 +193,7 @@ Max : (Nat -> Type) -> Type Max p = (Nat , (k : Nat) -> p k -> Nat)- + maxEquiv : Max p -> (n1 : Nat) -> p n1 -> Nat maxEquiv a n1 pr1 = snd a n1 pr1 @@ -207,4 +207,3 @@ kappa : Kappa (rho r) -> Kappa (rho r) kappa {r} k = k' where -- k' : Kappa (rho r) k' = k-
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris reg001.idr --check+${IDRIS:-idris} reg001.idr --check rm -rf reg001.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris reg012.idr -o reg012+${IDRIS:-idris} reg012.idr -o reg012 ./reg012 rm -f reg012 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris --consolewidth 80 --check reg003.idr-idris --consolewidth 80 --check reg003a.idr+${IDRIS:-idris} --check reg003.idr+${IDRIS:-idris} --check reg003a.idr rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg004.idr -o reg004+${IDRIS:-idris} $@ reg004.idr -o reg004 ./reg004 rm -f reg004 *.ibc
@@ -0,0 +1,3 @@+hey+you+[(), ()]
@@ -0,0 +1,9 @@+module UPIO++foo : List (IO ())+foo = [putStrLn "hey", putStrLn "you"]++namespace Main+ main : IO ()+ main = let stuff = map unsafePerformIO foo in putStrLn (show stuff)+
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ reg005.idr -o reg005+./reg005+rm -f reg005 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ reg006.idr --check+${IDRIS:-idris} $@ reg006.idr --check rm -f *.ibc
@@ -1,5 +1,5 @@ > module A -> n : Nat+> public export n : Nat > n = ?lala
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 --nocolour --check $@ reg007.lidr+${IDRIS:-idris} --nocolour --check $@ reg007.lidr rm -f *.ibc
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ reg010.idr --check --nocolour+${IDRIS:-idris} $@ reg010.idr --check --nocolour
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg013.idr -o reg013+${IDRIS:-idris} $@ reg013.idr -o reg013 ./reg013 rm -f reg013 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg016.idr -o reg016+${IDRIS:-idris} $@ reg016.idr -o reg016 ./reg016 rm -f reg016 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ --nocolour --consolewidth 80 reg017.idr -o reg017+${IDRIS:-idris} $@ --nocolour reg017.idr -o reg017 ./reg017 rm -f reg017 *.ibc
@@ -4,6 +4,8 @@ conat.loopForever is possibly not total due to: conat.minusCoNat reg018b.idr:8:1: A.showB is possibly not total due to recursive path A.showB+reg018b.idr:11:1:+A.B implementation of Prelude.Show.Show is possibly not total due to: A.showB reg018c.idr:21:1: CodataTest.inf is possibly not total due to: with block in CodataTest.inf reg018d.idr:8:1:
@@ -8,7 +8,7 @@ showB (I x) = "I" ++ showB x showB (Z x) = "Z" ++ showB x -implementation Show B where show = showB+Show B where show = showB os : B os = Z os
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ reg018a.idr --check-idris --consolewidth 80 $@ reg018b.idr --check-idris --consolewidth 80 $@ reg018c.idr --check-idris --consolewidth 80 $@ reg018d.idr --check+${IDRIS:-idris} $@ reg018a.idr --check+${IDRIS:-idris} $@ reg018b.idr --check+${IDRIS:-idris} $@ reg018c.idr --check+${IDRIS:-idris} $@ reg018d.idr --check rm *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg020.idr -o reg020+${IDRIS:-idris} $@ reg020.idr -o reg020 ./reg020 rm -f reg020 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 $@ reg023.idr --check+${IDRIS:-idris} --nocolour $@ reg023.idr --check rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg024.idr -o reg024+${IDRIS:-idris} $@ reg024.idr -o reg024 ./reg024 rm -f reg024 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg025.idr -o reg025+${IDRIS:-idris} $@ reg025.idr -o reg025 ./reg025 rm -f reg025 *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ reg027.idr -o reg027+${IDRIS:-idris} $@ reg027.idr -o reg027 ./reg027-idris --consolewidth 80 $@ reg027a.idr --check+${IDRIS:-idris} $@ reg027a.idr --check rm -f reg027 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ reg028.idr --check-idris --consolewidth 80 $@ reg028a.idr --check+${IDRIS:-idris} $@ reg028.idr --check+${IDRIS:-idris} $@ reg028a.idr --check rm -f *.ibc
@@ -1,6 +1,6 @@ #!/usr/bin/env bash -idris $@ reg029.idr -o reg029+${IDRIS:-idris} $@ reg029.idr -o reg029 unset IDRIS_REG029_NONEXISTENT_VAR export IDRIS_REG029_EXISTENT_VAR='exists!' @@ -12,6 +12,6 @@ javac -cp reg029:. Reg029Wrapper.java java -cp reg029:. Reg029Wrapper fi-idris $@ reg029.idr --execute+${IDRIS:-idris} $@ reg029.idr --execute rm -f reg029 *.ibc *.class
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg031.idr -o reg031+${IDRIS:-idris} $@ reg031.idr -o reg031 ./reg031 rm -f *.ibc reg031
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ test028.idr -o test028+${IDRIS:-idris} $@ test028.idr -o test028 ./test028 rm -f test028 test028.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 --check reg034.idr+${IDRIS:-idris} --nocolour --check reg034.idr rm -f reg034 *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 --check reg035.idr-idris --nocolour --consolewidth 80 --check reg035a.lidr-idris --nocolour --consolewidth 80 --check reg035b.idr+${IDRIS:-idris} --nocolour --check reg035.idr+${IDRIS:-idris} --nocolour --check reg035a.lidr+${IDRIS:-idris} --nocolour --check reg035b.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --check reg036.idr+${IDRIS:-idris} --check reg036.idr rm -f reg036 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --check reg037.idr+${IDRIS:-idris} --check reg037.idr rm -f reg037 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --check reg038.idr+${IDRIS:-idris} --check reg038.idr rm -f *.ibc
@@ -1,6 +1,6 @@ #!/usr/bin/env bash -idris --warnreach reg040.idr -o reg040+${IDRIS:-idris} --warnreach reg040.idr -o reg040 ./reg040 rm -f reg040 *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris $@ --quiet ott.idr -e example-idris $@ showu.idr -o reg040+${IDRIS:-idris} $@ --quiet ott.idr -e example+${IDRIS:-idris} $@ showu.idr -o reg040 ./reg040 rm -f reg040 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg042 -o reg042 --warnreach+${IDRIS:-idris} $@ reg042 -o reg042 --warnreach ./reg042 rm -f reg042 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 reg044.idr --check+${IDRIS:-idris} --nocolour reg044.idr --check rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg045.idr -o reg045+${IDRIS:-idris} $@ reg045.idr -o reg045 ./reg045 rm -f reg045 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg046.idr --check+${IDRIS:-idris} $@ reg046.idr --check rm -f reg046 *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg047.idr --check --nobuiltins-idris $@ reg047a.idr --check+${IDRIS:-idris} $@ reg047.idr --check --nobuiltins+${IDRIS:-idris} $@ reg047a.idr --check rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg048.idr -p contrib -o reg048+${IDRIS:-idris} $@ reg048.idr -p contrib -o reg048 ./reg048 rm -f reg048 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 --nocolour --check $@ reg049.idr+${IDRIS:-idris} --nocolour --check $@ reg049.idr rm -f *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris --nocolour --check $@ working.idr-idris --nocolour --check $@ badbangop.idr-idris --nocolour --check $@ baddoublebang.idr+${IDRIS:-idris} --nocolour --check $@ working.idr+${IDRIS:-idris} --nocolour --check $@ badbangop.idr+${IDRIS:-idris} --nocolour --check $@ baddoublebang.idr rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg051.idr --check+${IDRIS:-idris} $@ reg051.idr --check rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ -o reg052 reg052.idr+${IDRIS:-idris} $@ -o reg052 reg052.idr ./reg052 rm -f reg052 *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ --check four.idr +${IDRIS:-idris} $@ --check four.idr rm -f *.ibc
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 $@ reg054.idr --check+${IDRIS:-idris} --nocolour $@ reg054.idr --check
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris --nocolour --consolewidth 80 $@ reg055.idr --check-idris --nocolour --consolewidth 80 $@ reg055a.idr --check+${IDRIS:-idris} --nocolour $@ reg055.idr --check+${IDRIS:-idris} --nocolour $@ reg055a.idr --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris --consolewidth 80 $@ reg056.idr -o reg056+${IDRIS:-idris} $@ reg056.idr -o reg056 rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg057.idr --check+${IDRIS:-idris} $@ reg057.idr --check rm -f *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-idris $@ implicits.idr --check-idris $@ implicits2.idr --check+${IDRIS:-idris} $@ implicits.idr --check+${IDRIS:-idris} $@ implicits2.idr --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg059.idr --check+${IDRIS:-idris} $@ reg059.idr --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg060.idr --check+${IDRIS:-idris} $@ reg060.idr --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ Capture.idr --check+${IDRIS:-idris} $@ Capture.idr --check rm -f *.ibc
@@ -1,4 +1,4 @@ #!/usr/bin/env bash-idris $@ reg062.idr --check --nocolour-idris $@ reg062.lidr --check --nocolour+${IDRIS:-idris} $@ reg062.idr --check --nocolour+${IDRIS:-idris} $@ reg062.lidr --check --nocolour rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ Cmp.idr --check --nocolour --quiet+${IDRIS:-idris} $@ Cmp.idr --check --nocolour --quiet rm *.ibc
@@ -1,9 +1,8 @@-sigmaEq2 : {A : Type} -> - {P : A -> Type} -> - {s1: Sigma A P} -> - {s2: Sigma A P} ->- getWitness s1 = getWitness s2 ->- getProof s1 = getProof s2 ->+sigmaEq2 : {A : Type} ->+ {P : A -> Type} ->+ {s1: DPair A P} ->+ {s2: DPair A P} ->+ fst s1 = fst s2 ->+ snd s1 = snd s2 -> s1 = s2 sigmaEq2 {A} {P} {s1 = (x ** prf)} {s2 = (x ** prf)} Refl Refl = Refl-
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg064.idr --check+${IDRIS:-idris} $@ reg064.idr --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg065.idr --check+${IDRIS:-idris} $@ reg065.idr --check rm -f *.ibc
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-idris $@ reg066.idr --check --nocolor+${IDRIS:-idris} $@ reg066.idr --check --nocolor rm -f *.ibc
@@ -1,5 +1,5 @@ #!/usr/bin/env bash rm -f *.ibc reg067-idris $@ reg067.idr -o reg067 --warnreach+${IDRIS:-idris} $@ reg067.idr -o reg067 --warnreach ./reg067 rm -f *.ibc reg067
@@ -0,0 +1,7 @@+reg068.idr:1:6:+Main.nat has a name which may be implicitly bound.+This is likely to lead to problems!+reg068.idr:2:6:Main.ze has a name which may be implicitly bound.+This is likely to lead to problems!+reg068.idr:2:6:When checking constructor Main.ze:+Type level variable nat is not Main.nat
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff