on master help sign in
Merge branch 'color-repl' of https://github.com/david-christiansen/Idris-dev into david-christiansen-color-repl
commitf1c3c7556790b64b6a26d55ed03e2d9444a74780 authorEdwin Brady <ecb10@st-andrews.ac.uk> dateWed 4 Sep 2013, 17:01 (13 years ago) parenta063bfabd70f22
11 files changed+267−158
CHANGELOG+1 idris.cabal+2−2 src/Core/Evaluate.hs+12−3 src/Idris/AbsSyntax.hs+10−2 src/Idris/AbsSyntaxTree.hs+145−102 src/Idris/Colours.hs+32 src/Idris/Coverage.hs+2−2 src/Idris/Delaborate.hs+10−10 src/Idris/ElabDecls.hs+25−25 src/Idris/REPL.hs+27−12 src/Main.hs+1
CHANGELOG+1
@@ -6,6 +6,7 @@ New in 0.9.10:
66* Add 'quoteGoal x by p in e' which makes x equal to p applied to the goal
77 in the scope e
88* At the REPL, "it" now refers to the previous expression
9+* Semantic colouring at the REPL. Turn this off with --nocolour.
910
1011Internal changes
1112
idris.cabal+2−2
@@ -250,7 +250,7 @@ Executable idris
250250 Core.ShellParser, Core.Unify, Core.Elaborate,
251251 Core.CaseTree, Core.Constraints,
252252
253− Idris.AbsSyntax, Idris.AbsSyntaxTree,
253+ Idris.AbsSyntax, Idris.AbsSyntaxTree, Idris.Colours,
254254 Idris.Parser, Idris.Help, Idris.IdeSlave, Idris.REPL,
255255 Idris.REPLParser, Idris.ElabDecls, Idris.Error,
256256 Idris.Delaborate, Idris.Primitives, Idris.Imports,
@@ -278,7 +278,7 @@ Executable idris
278278 containers, process, transformers, filepath,
279279 directory, binary, bytestring, text, pretty,
280280 language-java>=0.2.2, libffi,
281− vector, vector-binary-instances
281+ vector, vector-binary-instances, ansi-terminal
282282
283283 Extensions: MultiParamTypeClasses, FunctionalDependencies,
284284 FlexibleInstances, TemplateHaskell
src/Core/Evaluate.hs+12−3
@@ -9,7 +9,7 @@ module Core.Evaluate(normalise, normaliseTrace, normaliseC, normaliseAll,
99 addToCtxt, setAccess, setTotal, addCtxtDef, addTyDecl,
1010 addDatatype, addCasedef, simplifyCasedef, addOperator,
1111 lookupNames, lookupTy, lookupP, lookupDef, lookupVal,
12− lookupTotal, lookupTyEnv, isConName, isFnName,
12+ lookupTotal, lookupTyEnv, isDConName, isTConName, isConName, isFnName,
1313 Value(..), Quote(..), evalState, initEval) where
1414
1515import Debug.Trace
@@ -748,13 +748,22 @@ lookupTy n ctxt
748748 (CaseOp _ ty _ _ _) -> return ty
749749
750750isConName :: Name -> Context -> Bool
751−isConName n ctxt
751+isConName n ctxt = isTConName n ctxt || isDConName n ctxt
752+
753+isTConName :: Name -> Context -> Bool
754+isTConName n ctxt
752755 = or $ do def <- lookupCtxt n (definitions ctxt)
753756 case tfst def of
754− (TyDecl (DCon _ _) _) -> return True
755757 (TyDecl (TCon _ _) _) -> return True
756758 _ -> return False
757759
760+isDConName :: Name -> Context -> Bool
761+isDConName n ctxt
762+ = or $ do def <- lookupCtxt n (definitions ctxt)
763+ case tfst def of
764+ (TyDecl (DCon _ _) _) -> return True
765+ _ -> return False
766+
758767isFnName :: Name -> Context -> Bool
759768isFnName n ctxt
760769 = or $ do def <- lookupCtxt n (definitions ctxt)
src/Idris/AbsSyntax.hs+10−2
@@ -481,6 +481,14 @@ allImportDirs :: IState -> Idris [FilePath]
481481allImportDirs i = do let optdirs = opt_importdirs (idris_options i)
482482 return ("." : reverse optdirs)
483483
484+colourise :: Idris Bool
485+colourise = do i <- getIState
486+ return $ idris_colourRepl i
487+
488+setColourise :: Bool -> Idris ()
489+setColourise b = do i <- getIState
490+ putIState $ i { idris_colourRepl = b }
491+
484492impShow :: Idris Bool
485493impShow = do i <- getIState
486494 return (opt_showimp (idris_options i))
@@ -1170,7 +1178,7 @@ mkPApp fc a f as = let rest = drop a as in
11701178-- FIXME: It's possible that this really has to happen after elaboration
11711179
11721180findStatics :: IState -> PTerm -> (PTerm, [Bool])
1173−findStatics ist tm = trace (showImp True tm) $
1181+findStatics ist tm = trace (showImp Nothing True False tm) $
11741182 let (ns, ss) = fs tm in
11751183 runState (pos ns ss tm) []
11761184 where fs (PPi p n t sc)
@@ -1201,7 +1209,7 @@ dumpDecls [] = ""
12011209dumpDecls (d:ds) = dumpDecl d ++ "\n" ++ dumpDecls ds
12021210
12031211dumpDecl (PFix _ f ops) = show f ++ " " ++ showSep ", " ops
1204−dumpDecl (PTy _ _ _ _ n t) = "tydecl " ++ show n ++ " : " ++ showImp True t
1212+dumpDecl (PTy _ _ _ _ n t) = "tydecl " ++ show n ++ " : " ++ showImp Nothing True False t
12051213dumpDecl (PClauses _ _ n cs) = "pat " ++ show n ++ "\t" ++ showSep "\n\t" (map (showCImp True) cs)
12061214dumpDecl (PData _ _ _ _ d) = showDImp True d
12071215dumpDecl (PParams _ ns ps) = "params {" ++ show ns ++ "\n" ++ dumpDecls ps ++ "}\n"
src/Idris/AbsSyntaxTree.hs+145−102
@@ -12,10 +12,13 @@ import IRTS.CodegenCommon
1212import Util.Pretty
1313import Util.DynamicLinker
1414
15+import Idris.Colours
16+
1517import Paths_idris
1618
1719import System.Console.Haskeline
1820
21+
1922import Control.Monad.Trans.State.Strict
2023
2124import Data.List
@@ -28,7 +31,7 @@ data IOption = IOption { opt_logLevel :: Int,
2831 opt_typecase :: Bool,
2932 opt_typeintype :: Bool,
3033 opt_coverage :: Bool,
31− opt_showimp :: Bool,
34+ opt_showimp :: Bool, -- ^^ show implicits
3235 opt_errContext :: Bool,
3336 opt_repl :: Bool,
3437 opt_verbose :: Bool,
@@ -117,7 +120,8 @@ data IState = IState {
117120 compiled_so :: Maybe String,
118121 idris_dynamic_libs :: [DynamicLib],
119122 idris_language_extensions :: [LanguageExt],
120− idris_outputmode :: OutputMode
123+ idris_outputmode :: OutputMode,
124+ idris_colourRepl :: Bool
121125 }
122126
123127data SizeChange = Smaller | Same | Bigger | Unknown
@@ -174,6 +178,7 @@ idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext
174178 emptyContext emptyContext emptyContext emptyContext
175179 [] "" defaultOpts 6 [] [] [] [] [] [] [] [] [] []
176180 [] Nothing Nothing [] [] [] Hidden False [] Nothing [] [] RawOutput
181+ True
177182
178183-- | The monad for the main REPL - reading and processing files and updating
179184-- global state (hence the IO inner monad).
@@ -232,6 +237,7 @@ data Opt = Filename String
232237 | Ver
233238 | Usage
234239 | Quiet
240+ | ColourREPL Bool
235241 | Ideslave
236242 | ShowLibs
237243 | ShowLibdir
@@ -245,8 +251,8 @@ data Opt = Filename String
245251 | DefaultTotal
246252 | DefaultPartial
247253 | WarnPartial
248− | NoCoverage
249− | ErrContext
254+ | NoCoverage
255+ | ErrContext
250256 | ShowImpl
251257 | Verbose
252258 | IBCSubDir String
@@ -789,7 +795,7 @@ expandNS syn n = case syn_namespace syn of
789795--- Pretty printing declarations and terms
790796
791797instance Show PTerm where
792− show tm = showImp False tm
798+ show tm = showImp Nothing False False tm
793799
794800instance Pretty PTerm where
795801 pretty = prettyImp False
@@ -804,8 +810,8 @@ instance Show PData where
804810 show d = showDImp False d
805811
806812showDeclImp _ (PFix _ f ops) = show f ++ " " ++ showSep ", " ops
807−showDeclImp t (PTy _ _ _ _ n ty) = show n ++ " : " ++ showImp t ty
808−showDeclImp t (PPostulate _ _ _ _ n ty) = show n ++ " : " ++ showImp t ty
813+showDeclImp t (PTy _ _ _ _ n ty) = show n ++ " : " ++ showImp Nothing t False ty
814+showDeclImp t (PPostulate _ _ _ _ n ty) = show n ++ " : " ++ showImp Nothing t False ty
809815showDeclImp _ (PClauses _ _ n c) = showSep "\n" (map show c)
810816showDeclImp _ (PData _ _ _ _ d) = show d
811817showDeclImp _ (PParams f ns ps) = "parameters " ++ show ns ++ "\n" ++
@@ -814,24 +820,24 @@ showDeclImp _ (PParams f ns ps) = "parameters " ++ show ns ++ "\n" ++
814820
815821showCImp :: Bool -> PClause -> String
816822showCImp impl (PClause _ n l ws r w)
817− = showImp impl l ++ showWs ws ++ " = " ++ showImp impl r
823+ = showImp Nothing impl False l ++ showWs ws ++ " = " ++ showImp Nothing impl False r
818824 ++ " where " ++ show w
819825 where
820826 showWs [] = ""
821− showWs (x : xs) = " | " ++ showImp impl x ++ showWs xs
827+ showWs (x : xs) = " | " ++ showImp Nothing impl False x ++ showWs xs
822828showCImp impl (PWith _ n l ws r w)
823− = showImp impl l ++ showWs ws ++ " with " ++ showImp impl r
829+ = showImp Nothing impl False l ++ showWs ws ++ " with " ++ showImp Nothing impl False r
824830 ++ " { " ++ show w ++ " } "
825831 where
826832 showWs [] = ""
827− showWs (x : xs) = " | " ++ showImp impl x ++ showWs xs
833+ showWs (x : xs) = " | " ++ showImp Nothing impl False x ++ showWs xs
828834
829835
830836showDImp :: Bool -> PData -> String
831837showDImp impl (PDatadecl n ty cons)
832− = "data " ++ show n ++ " : " ++ showImp impl ty ++ " where\n\t"
838+ = "data " ++ show n ++ " : " ++ showImp Nothing impl False ty ++ " where\n\t"
833839 ++ showSep "\n\t| "
834− (map (\ (_, n, t, _) -> show n ++ " : " ++ showImp impl t) cons)
840+ (map (\ (_, n, t, _) -> show n ++ " : " ++ showImp Nothing impl False t) cons)
835841
836842getImps :: [PArg] -> [(Name, PTerm)]
837843getImps [] = []
@@ -851,7 +857,10 @@ getConsts (_ : xs) = getConsts xs
851857getAll :: [PArg] -> [PTerm]
852858getAll = map getTm
853859
854−prettyImp :: Bool -> PTerm -> Doc
860+-- | Pretty-print a high-level Idris term
861+prettyImp :: Bool -- ^^ whether to show implicits
862+ -> PTerm -- ^^ the term to pretty-print
863+ -> Doc
855864prettyImp impl = prettySe 10
856865 where
857866 prettySe p (PQuote r) =
@@ -1037,108 +1046,142 @@ prettyImp impl = prettySe 10
10371046 bracket outer inner doc
10381047 | inner > outer = lparen <> doc <> rparen
10391048 | otherwise = doc
1040−
1041−showImp :: Bool -> PTerm -> String
1042−showImp impl tm = se 10 tm where
1043− se p (PQuote r) = "![" ++ show r ++ "]"
1044− se p (PPatvar fc n) = if impl then show n ++ "[p]" else show n
1045− se p (PInferRef fc n) = "!" ++ show n -- ++ "[" ++ show fc ++ "]"
1046− se p (PRef fc n) = if impl then show n -- ++ "[" ++ show fc ++ "]"
1047− else showbasic n
1048− where showbasic n@(UN _) = show n
1049− showbasic (MN _ s) = s
1050− showbasic (NS n s) = showSep "." (reverse s) ++ "." ++ showbasic n
1051− se p (PLam n ty sc) = bracket p 2 $ "\\ " ++ show n ++
1052− (if impl then " : " ++ se 10 ty else "") ++ " => "
1053− ++ se 10 sc
1054− se p (PLet n ty v sc) = bracket p 2 $ "let " ++ show n ++ " = " ++ se 10 v ++
1055− " in " ++ se 10 sc
1056− se p (PPi (Exp l s _) n ty sc)
1049+
1050+-- | Show Idris name
1051+showName :: Maybe IState -- ^^ the Idris state, for information about names
1052+ -> [(Name, Bool)] -- ^^ the bound variables and whether they're implicit
1053+ -> Bool -- ^^ whether to show implicits
1054+ -> Bool -- ^^ whether to colourise
1055+ -> Name -- ^^ the term to show
1056+ -> String
1057+showName ist bnd impl colour n = if colour then colourise n else showbasic n
1058+ where name = if impl then show n else showbasic n
1059+ showbasic n@(UN _) = show n
1060+ showbasic (MN _ s) = s
1061+ showbasic (NS n s) = showSep "." (reverse s) ++ "." ++ showbasic n
1062+ fst3 (x, _, _) = x
1063+ colourise n = let ctxt' = fmap tt_ctxt ist in
1064+ case ctxt' of
1065+ Nothing -> name
1066+ Just ctxt | Just impl <- lookup n bnd -> if impl then colouriseImplicit name
1067+ else colouriseBound name
1068+ | isDConName n ctxt -> colouriseData name
1069+ | isFnName n ctxt -> colouriseFun name
1070+ | isTConName n ctxt -> colouriseType name
1071+ | otherwise -> name
1072+
1073+-- | Show Idris term
1074+showImp :: Maybe IState -- ^^ the Idris state, for information about identifiers
1075+ -> Bool -- ^^ whether to show implicits
1076+ -> Bool -- ^^ whether to colourise
1077+ -> PTerm -- ^^ the term to show
1078+ -> String
1079+showImp ist impl colour tm = se 10 [] tm where
1080+ perhapsColourise :: (String -> String) -> String -> String
1081+ perhapsColourise col str = if colour then col str else str
1082+
1083+ se :: Int -> [(Name, Bool)] -> PTerm -> String
1084+ se p bnd (PQuote r) = "![" ++ show r ++ "]"
1085+ se p bnd (PPatvar fc n) = if impl then show n ++ "[p]" else show n
1086+ se p bnd (PInferRef fc n) = "!" ++ show n -- ++ "[" ++ show fc ++ "]"
1087+ se p bnd (PRef fc n) = showName ist bnd impl colour n
1088+ se p bnd (PLam n ty sc) = bracket p 2 $ "\\ " ++ perhapsColourise colouriseBound (show n) ++
1089+ (if impl then " : " ++ se 10 bnd ty else "") ++ " => "
1090+ ++ se 10 ((n, False):bnd) sc
1091+ se p bnd (PLet n ty v sc) = bracket p 2 $ "let " ++ perhapsColourise colouriseBound (show n) ++
1092+ " = " ++ se 10 bnd v ++
1093+ " in " ++ se 10 ((n, False):bnd) sc
1094+ se p bnd (PPi (Exp l s _) n ty sc)
10571095 | n `elem` allNamesIn sc || impl
10581096 = bracket p 2 $
1059− (if l then "|(" else "(") ++
1060− show n ++ " : " ++ se 10 ty ++
1097+ (if l then "|(" else "(") ++
1098+ perhapsColourise colouriseBound (show n) ++ " : " ++ se 10 bnd ty ++
10611099 ") " ++ st ++
1062− "-> " ++ se 10 sc
1063− | otherwise = bracket p 2 $ se 0 ty ++ " " ++ st ++ "-> " ++ se 10 sc
1100+ "-> " ++ se 10 ((n, False):bnd) sc
1101+ | otherwise = bracket p 2 $ se 0 bnd ty ++ " " ++ st ++ "-> " ++ se 10 bnd sc
10641102 where st = case s of
10651103 Static -> "[static] "
10661104 _ -> ""
1067− se p (PPi (Imp l s _) n ty sc)
1068− | impl = bracket p 2 $ (if l then "|{" else "{") ++
1069− show n ++ " : " ++ se 10 ty ++
1070− "} " ++ st ++ "-> " ++ se 10 sc
1071− | otherwise = se 10 sc
1105+ se p bnd (PPi (Imp l s _) n ty sc)
1106+ | impl = bracket p 2 $ (if l then "|{" else "{") ++
1107+ perhapsColourise colouriseBound (show n) ++ " : " ++ se 10 bnd ty ++
1108+ "} " ++ st ++ "-> " ++ se 10 ((n, True):bnd) sc
1109+ | otherwise = se 10 ((n, True):bnd) sc
10721110 where st = case s of
10731111 Static -> "[static] "
10741112 _ -> ""
1075− se p (PPi (Constraint _ _ _) n ty sc)
1076− = bracket p 2 $ se 10 ty ++ " => " ++ se 10 sc
1077− se p (PPi (TacImp _ _ s _) n ty sc)
1078− = bracket p 2 $ "{tacimp " ++ show n ++ " : " ++ se 10 ty ++ "} -> " ++ se 10 sc
1079− se p e
1080− | Just str <- slist p e = str
1081− | Just num <- snat p e = show num
1082− se p (PMatchApp _ f) = "match " ++ show f
1083− se p (PApp _ (PRef _ f) [])
1084− | not impl = show f
1085− se p (PApp _ (PRef _ op@(UN (f:_))) args)
1113+ se p bnd (PPi (Constraint _ _ _) n ty sc)
1114+ = bracket p 2 $ se 10 bnd ty ++ " => " ++ se 10 bnd sc
1115+ se p bnd (PPi (TacImp _ _ s _) n ty sc)
1116+ = bracket p 2 $
1117+ "{tacimp " ++ (perhapsColourise colouriseBound (show n)) ++ " : " ++ se 10 bnd ty ++ "} -> " ++
1118+ se 10 ((n, False):bnd) sc
1119+ se p bnd e
1120+ | Just str <- slist p bnd e = str
1121+ | Just num <- snat p e = perhapsColourise colouriseData (show num)
1122+ se p bnd (PMatchApp _ f) = "match " ++ show f
1123+ se p bnd (PApp _ hd@(PRef _ f) [])
1124+ | not impl = se p bnd hd
1125+ se p bnd (PApp _ op@(PRef _ (UN (f:_))) args)
10861126 | length (getExps args) == 2 && not impl && not (isAlpha f)
10871127 = let [l, r] = getExps args in
1088− bracket p 1 $ se 1 l ++ " " ++ show op ++ " " ++ se 0 r
1089− se p (PApp _ f as)
1128+ bracket p 1 $ se 1 bnd l ++ " " ++ se p bnd op ++ " " ++ se 0 bnd r
1129+ se p bnd (PApp _ f as)
10901130 = let args = getExps as in
1091− bracket p 1 $ se 1 f ++ if impl then concatMap sArg as
1092− else concatMap seArg args
1093− se p (PCase _ scr opts) = "case " ++ se 10 scr ++ " of " ++ showSep " | " (map sc opts)
1094− where sc (l, r) = se 10 l ++ " => " ++ se 10 r
1095− se p (PHidden tm) = "." ++ se 0 tm
1096− se p (PRefl _ t)
1097− | not impl = "refl"
1098− | otherwise = "refl {" ++ se 10 t ++ "}"
1099− se p (PResolveTC _) = "resolvetc"
1100− se p (PTrue _) = "()"
1101− se p (PFalse _) = "_|_"
1102− se p (PEq _ l r) = bracket p 2 $ se 10 l ++ " = " ++ se 10 r
1103− se p (PRewrite _ l r _) = bracket p 2 $ "rewrite " ++ se 10 l ++ " in " ++ se 10 r
1104− se p (PTyped l r) = "(" ++ se 10 l ++ " : " ++ se 10 r ++ ")"
1105− se p (PPair _ l r) = "(" ++ se 10 l ++ ", " ++ se 10 r ++ ")"
1106− se p (PDPair _ l t r) = "(" ++ se 10 l ++ " ** " ++ se 10 r ++ ")"
1107− se p (PAlternative a as) = "(|" ++ showSep " , " (map (se 10) as) ++ "|)"
1108− se p PType = "Type"
1109− se p (PConstant c) = show c
1110− se p (PProof ts) = "proof { " ++ show ts ++ "}"
1111− se p (PTactics ts) = "tactics { " ++ show ts ++ "}"
1112− se p (PMetavar n) = "?" ++ show n
1113− se p (PReturn f) = "return"
1114− se p PImpossible = "impossible"
1115− se p Placeholder = "_"
1116− se p (PDoBlock _) = "do block show not implemented"
1117− se p (PElabError s) = show s
1118− se p (PCoerced t) = se p t
1119− se p (PUnifyLog t) = "%unifyLog " ++ se p t
1120− se p (PGoal f t n sc) = "quoteGoal " ++ show n ++ " by " ++ se 10 t ++
1121− " in " ++ se 10 sc
1122−-- se p x = "Not implemented"
1123−
1124− slist' p (PApp _ (PRef _ nil) _)
1131+ bracket p 1 $ se 1 bnd f ++ if impl then concatMap (sArg bnd) as
1132+ else concatMap (seArg bnd) args
1133+ se p bnd (PCase _ scr opts) = "case " ++ se 10 bnd scr ++ " of " ++ showSep " | " (map sc opts)
1134+ where sc (l, r) = se 10 bnd l ++ " => " ++ se 10 bnd r
1135+ se p bnd (PHidden tm) = "." ++ se 0 bnd tm
1136+ se p bnd (PRefl _ t)
1137+ | not impl = perhapsColourise colouriseData "refl"
1138+ | otherwise = perhapsColourise colouriseData $ "refl {" ++ se 10 bnd t ++ "}"
1139+ se p bnd (PResolveTC _) = "resolvetc"
1140+ se p bnd (PTrue _) = perhapsColourise colouriseType "()"
1141+ se p bnd (PFalse _) = perhapsColourise colouriseType "_|_"
1142+ se p bnd (PEq _ l r) = bracket p 2 $ se 10 bnd l ++ perhapsColourise colouriseType " = " ++ se 10 bnd r
1143+ se p bnd (PRewrite _ l r _) = bracket p 2 $ "rewrite " ++ se 10 bnd l ++ " in " ++ se 10 bnd r
1144+ se p bnd (PTyped l r) = "(" ++ se 10 bnd l ++ " : " ++ se 10 bnd r ++ ")"
1145+ se p bnd (PPair _ l r) = "(" ++ se 10 bnd l ++ ", " ++ se 10 bnd r ++ ")"
1146+ se p bnd (PDPair _ l t r) = "(" ++ se 10 bnd l ++ " ** " ++ se 10 bnd r ++ ")"
1147+ se p bnd (PAlternative a as) = "(|" ++ showSep " , " (map (se 10 bnd) as) ++ "|)"
1148+ se p bnd PType = perhapsColourise colouriseType "Type"
1149+ se p bnd (PConstant c) = perhapsColourise (cfun c) (show c)
1150+ where cfun (AType _) = colouriseType
1151+ cfun StrType = colouriseType
1152+ cfun PtrType = colouriseType
1153+ cfun VoidType = colouriseType
1154+ cfun _ = colouriseData
1155+ se p bnd (PProof ts) = "proof { " ++ show ts ++ "}"
1156+ se p bnd (PTactics ts) = "tactics { " ++ show ts ++ "}"
1157+ se p bnd (PMetavar n) = "?" ++ show n
1158+ se p bnd (PReturn f) = "return"
1159+ se p bnd PImpossible = "impossible"
1160+ se p bnd Placeholder = "_"
1161+ se p bnd (PDoBlock _) = "do block show not implemented"
1162+ se p bnd (PElabError s) = show s
1163+ se p bnd (PCoerced t) = se p bnd t
1164+ se p bnd (PUnifyLog t) = "%unifyLog " ++ se p bnd t
1165+-- se p bnd x = "Not implemented"
1166+
1167+ slist' p bnd (PApp _ (PRef _ nil) _)
11251168 | nsroot nil == UN "Nil" = Just []
1126− slist' p (PApp _ (PRef _ cons) args)
1169+ slist' p bnd (PApp _ (PRef _ cons) args)
11271170 | nsroot cons == UN "::",
11281171 (PExp {getTm=tl}):(PExp {getTm=hd}):imps <- reverse args,
11291172 all isImp imps,
1130− Just tl' <- slist' p tl
1173+ Just tl' <- slist' p bnd tl
11311174 = Just (hd:tl')
11321175 where
11331176 isImp (PImp {}) = True
11341177 isImp _ = False
1135− slist' _ _ = Nothing
1178+ slist' _ _ _ = Nothing
11361179
1137− slist p e | Just es <- slist' p e = Just $
1180+ slist p bnd e | Just es <- slist' p bnd e = Just $
11381181 case es of [] -> "[]"
1139− [x] -> "[" ++ se p x ++ "]"
1140− xs -> "[" ++ intercalate "," (map (se p) xs) ++ "]"
1141− slist _ _ = Nothing
1182+ [x] -> "[" ++ se p bnd x ++ "]"
1183+ xs -> "[" ++ intercalate "," (map (se p bnd ) xs) ++ "]"
1184+ slist _ _ _ = Nothing
11421185
11431186 -- since Prelude is always imported, S & Z are unqualified iff they're the
11441187 -- Nat ones.
@@ -1152,15 +1195,15 @@ showImp impl tm = se 10 tm where
11521195
11531196 natns = "Prelude.Nat."
11541197
1155− sArg (PImp _ _ n tm _) = siArg (n, tm)
1156− sArg (PExp _ _ tm _) = seArg tm
1157− sArg (PConstraint _ _ tm _) = scArg tm
1158− sArg (PTacImplicit _ _ n _ tm _) = stiArg (n, tm)
1198+ sArg bnd (PImp _ _ n tm _) = siArg bnd (n, tm)
1199+ sArg bnd (PExp _ _ tm _) = seArg bnd tm
1200+ sArg bnd (PConstraint _ _ tm _) = scArg bnd tm
1201+ sArg bnd (PTacImplicit _ _ n _ tm _) = stiArg bnd (n, tm)
11591202
1160− seArg arg = " " ++ se 0 arg
1161− siArg (n, val) = " {" ++ show n ++ " = " ++ se 10 val ++ "}"
1162− scArg val = " {{" ++ se 10 val ++ "}}"
1163− stiArg (n, val) = " {auto " ++ show n ++ " = " ++ se 10 val ++ "}"
1203+ seArg bnd arg = " " ++ se 0 bnd arg
1204+ siArg bnd (n, val) = " {" ++ show n ++ " = " ++ se 10 bnd val ++ "}"
1205+ scArg bnd val = " {{" ++ se 10 bnd val ++ "}}"
1206+ stiArg bnd (n, val) = " {auto " ++ show n ++ " = " ++ se 10 bnd val ++ "}"
11641207
11651208 bracket outer inner str | inner > outer = "(" ++ str ++ ")"
11661209 | otherwise = str
src/Idris/Colours.hsnew file+32
@@ -0,0 +1,32 @@
1+module Idris.Colours where
2+
3+import System.Console.ANSI
4+
5+-- Set the colour of a string using POSIX escape codes
6+colourise :: Color -> ColorIntensity -> String -> String
7+colourise c i str = let sgr = [SetColor Foreground i c]
8+ in setSGRCode sgr ++ str ++ setSGRCode [Reset]
9+
10+colouriseKwd :: String -> String
11+colouriseKwd kwd = setSGRCode [SetUnderlining SingleUnderline
12+ , SetConsoleIntensity BoldIntensity
13+ , SetColor Foreground Vivid Black
14+ ] ++ kwd ++ setSGRCode [Reset]
15+
16+colouriseBound :: String -> String
17+colouriseBound = colourise Magenta Vivid
18+
19+colouriseImplicit :: String -> String
20+colouriseImplicit str = let sgr = [ SetColor Foreground Vivid Magenta
21+ , SetUnderlining SingleUnderline
22+ ]
23+ in setSGRCode sgr ++ str ++ setSGRCode [Reset]
24+
25+colouriseFun :: String -> String
26+colouriseFun = colourise Green Vivid
27+
28+colouriseType :: String -> String
29+colouriseType = colourise Blue Vivid
30+
31+colouriseData :: String -> String
32+colouriseData = colourise Red Vivid
src/Idris/Coverage.hs+2−2
@@ -50,7 +50,7 @@ genClauses fc n xs given
5050 logLvl 5 $ show (map length argss) ++ "\n" ++ show (map length all_args)
5151 logLvl 10 $ show argss ++ "\n" ++ show all_args
5252 logLvl 10 $ "Original: \n" ++
53− showSep "\n" (map (\t -> showImp True (delab' i t True)) xs)
53+ showSep "\n" (map (\t -> showImp Nothing True False (delab' i t True)) xs)
5454 -- add an infinite supply of explicit arguments to update the possible
5555 -- cases for (the return type may be variadic, or function type, sp
5656 -- there may be more case splitting that the idris_implicits record
@@ -62,7 +62,7 @@ genClauses fc n xs given
6262 logLvl 2 $ show (length tryclauses) ++ " initially to check"
6363 let new = filter (noMatch i) (mnub i tryclauses)
6464 logLvl 1 $ show (length new) ++ " clauses to check for impossibility"
65− logLvl 5 $ "New clauses: \n" ++ showSep "\n" (map (showImp True) new)
65+ logLvl 5 $ "New clauses: \n" ++ showSep "\n" (map (showImp Nothing True False) new)
6666-- ++ " from:\n" ++ showSep "\n" (map (showImp True) tryclauses)
6767 return new
6868-- return (map (\t -> PClause n t [] PImpossible []) new)
src/Idris/Delaborate.hs+10−10
@@ -100,33 +100,33 @@ pshow i (InternalMsg s) = "INTERNAL ERROR: " ++ show s ++
100100 "Please consider reporting at " ++ bugaddr
101101pshow i (CantUnify _ x y e sc s)
102102 = let imps = opt_showimp (idris_options i) in
103− "Can't unify " ++ showImp imps (delab i x)
104− ++ " with " ++ showImp imps (delab i y) ++
105−-- " (" ++ showEnvDbg [] x ++ " and " ++ showEnvDbg [] y ++ ") " ++
103+ "Can't unify " ++ showImp Nothing imps False (delab i x)
104+ ++ " with " ++ showImp Nothing imps False (delab i y) ++
105+-- " (" ++ show x ++ " and " ++ show y ++ ") " ++
106106 case e of
107107 Msg "" -> ""
108108 _ -> "\n\nSpecifically:\n\t" ++ pshow i e ++
109109 if (opt_errContext (idris_options i)) then showSc i sc else ""
110110pshow i (CantConvert x y env)
111111 = let imps = opt_showimp (idris_options i) in
112− "Can't convert " ++ showImp imps (delab i x) ++ " with "
113− ++ showImp imps (delab i y) ++
112+ "Can't convert " ++ showImp Nothing imps False (delab i x) ++ " with "
113+ ++ showImp Nothing imps False (delab i y) ++
114114 if (opt_errContext (idris_options i)) then showSc i env else ""
115115pshow i (UnifyScope n out tm env)
116116 = let imps = opt_showimp (idris_options i) in
117117 "Can't unify " ++ show n ++ " with "
118− ++ showImp imps (delab i tm) ++ " as " ++ show out ++
118+ ++ showImp Nothing imps False (delab i tm) ++ " as " ++ show out ++
119119 " is not in scope" ++
120120 if (opt_errContext (idris_options i)) then showSc i env else ""
121121pshow i (CantInferType t)
122122 = "Can't infer type for " ++ t
123123pshow i (NonFunctionType f ty)
124124 = let imps = opt_showimp (idris_options i) in
125− showImp imps (delab i f) ++ " does not have a function type ("
126− ++ showImp imps (delab i ty) ++ ")"
125+ showImp Nothing imps False (delab i f) ++ " does not have a function type ("
126+ ++ showImp Nothing imps False (delab i ty) ++ ")"
127127pshow i (CantIntroduce ty)
128128 = let imps = opt_showimp (idris_options i) in
129− "Can't use lambda here: type is " ++ showImp imps (delab i ty)
129+ "Can't use lambda here: type is " ++ showImp Nothing imps False (delab i ty)
130130pshow i (InfiniteUnify x tm env)
131131 = "Unifying " ++ showbasic x ++ " and " ++ show (delab i tm) ++
132132 " would lead to infinite value" ++
@@ -138,7 +138,7 @@ pshow i (CantResolve c) = "Can't resolve type class " ++ show (delab i c)
138138pshow i (CantResolveAlts as) = "Can't disambiguate name: " ++ showSep ", " as
139139pshow i (NoTypeDecl n) = "No type declaration for " ++ show n
140140pshow i (NoSuchVariable n) = "No such variable " ++ show n
141−pshow i (IncompleteTerm t) = "Incomplete term " ++ showImp True (delab i t)
141+pshow i (IncompleteTerm t) = "Incomplete term " ++ showImp Nothing True False (delab i t)
142142pshow i UniverseError = "Universe inconsistency"
143143pshow i ProgramLineComment = "Program line next to comment"
144144pshow i (Inaccessible n) = show n ++ " is not an accessible pattern variable"
src/Idris/ElabDecls.hs+25−25
@@ -51,11 +51,11 @@ elabType info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty_in
5151 do checkUndefined fc n
5252 ctxt <- getContext
5353 i <- getIState
54− logLvl 3 $ show n ++ " pre-type " ++ showImp True ty'
54+ logLvl 3 $ show n ++ " pre-type " ++ showImp Nothing True False ty'
5555 ty' <- addUsingConstraints syn fc ty'
5656 ty' <- implicit syn n ty'
5757 let ty = addImpl i ty'
58− logLvl 2 $ show n ++ " type " ++ showImp True ty
58+ logLvl 2 $ show n ++ " type " ++ showImp Nothing True False ty
5959 ((tyT, defer, is), log) <- tclift $ elaborate ctxt n (TType (UVal 0)) []
6060 (erun fc (build i info False n ty))
6161 ds <- checkDef fc defer
@@ -482,7 +482,7 @@ elabCon info syn tn codata (doc, n, t_in, fc)
482482 i <- getIState
483483 t_in <- implicit syn n (if codata then mkLazy t_in else t_in)
484484 let t = addImpl i t_in
485− logLvl 2 $ show fc ++ ":Constructor " ++ show n ++ " : " ++ showImp True t
485+ logLvl 2 $ show fc ++ ":Constructor " ++ show n ++ " : " ++ showImp Nothing True False t
486486 ((t', defer, is), log) <- tclift $ elaborate ctxt n (TType (UVal 0)) []
487487 (erun fc (build i info False n t))
488488 logLvl 2 $ "Rechecking " ++ show t'
@@ -589,9 +589,9 @@ elabClauses info fc opts n_in cs = let n = liftname info n_in in
589589 missing' <- filterM (checkPossible info fc True n) missing
590590 let clhs = map getLHS pdef
591591 logLvl 2 $ "Must be unreachable:\n" ++
592− showSep "\n" (map (showImp True) missing') ++
592+ showSep "\n" (map (showImp Nothing True False) missing') ++
593593 "\nAgainst: " ++
594− showSep "\n" (map (\t -> showImp True (delab ist t)) (map getLHS pdef))
594+ showSep "\n" (map (\t -> showImp Nothing True False (delab ist t)) (map getLHS pdef))
595595 -- filter out anything in missing' which is
596596 -- matched by any of clhs. This might happen since
597597 -- unification may force a variable to take a
@@ -713,7 +713,7 @@ elabVal info aspat tm_in
713713 = do ctxt <- getContext
714714 i <- getIState
715715 let tm = addImpl i tm_in
716− logLvl 10 (showImp True tm)
716+ logLvl 10 (showImp Nothing True False tm)
717717 -- try:
718718 -- * ordinary elaboration
719719 -- * elaboration as a Type
@@ -778,7 +778,7 @@ elabClause info tcgen (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
778778 _ -> []
779779 let params = getParamsInType i [] fn_is fn_ty
780780 let lhs = addImplPat i (propagateParams params (stripLinear i lhs_in))
781− logLvl 5 ("LHS: " ++ show fc ++ " " ++ showImp True lhs)
781+ logLvl 5 ("LHS: " ++ show fc ++ " " ++ showImp Nothing True False lhs)
782782 logLvl 4 ("Fixed parameters: " ++ show params ++ " from " ++ show (fn_ty, fn_is))
783783 ((lhs', dlhs, []), _) <-
784784 tclift $ elaborate ctxt (MN 0 "patLHS") infP []
@@ -808,10 +808,10 @@ elabClause info tcgen (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
808808 mapM_ (elabDecl' EAll info) wbefore
809809 -- Now build the RHS, using the type of the LHS as the goal.
810810 i <- getIState -- new implicits from where block
811− logLvl 5 (showImp True (expandParams decorate newargs defs (defs \\ decls) rhs_in))
811+ logLvl 5 (showImp Nothing True False (expandParams decorate newargs defs (defs \\ decls) rhs_in))
812812 let rhs = addImplBoundInf i (map fst newargs) (defs \\ decls)
813813 (expandParams decorate newargs defs (defs \\ decls) rhs_in)
814− logLvl 2 $ "RHS: " ++ showImp True rhs
814+ logLvl 2 $ "RHS: " ++ showImp Nothing True False rhs
815815 ctxt <- getContext -- new context with where block added
816816 logLvl 5 "STARTING CHECK"
817817 ((rhs', defer, is), _) <-
@@ -913,7 +913,7 @@ elabClause info tcgen (_, PWith fc fname lhs_in withs wval_in withblock)
913913 -- pattern bindings
914914 i <- getIState
915915 let lhs = addImplPat i lhs_in
916− logLvl 5 ("LHS: " ++ showImp True lhs)
916+ logLvl 5 ("LHS: " ++ showImp Nothing True False lhs)
917917 ((lhs', dlhs, []), _) <-
918918 tclift $ elaborate ctxt (MN 0 "patLHS") infP []
919919 (erun fc (buildTC i info True tcgen fname (infTerm lhs)))
@@ -925,7 +925,7 @@ elabClause info tcgen (_, PWith fc fname lhs_in withs wval_in withblock)
925925 logLvl 5 ("Checked " ++ show clhs)
926926 let bargs = getPBtys lhs_tm
927927 let wval = addImplBound i (map fst bargs) wval_in
928− logLvl 5 ("Checking " ++ showImp True wval)
928+ logLvl 5 ("Checking " ++ showImp Nothing True False wval)
929929 -- Elaborate wval in this context
930930 ((wval', defer, is), _) <-
931931 tclift $ elaborate ctxt (MN 0 "withRHS")
@@ -982,7 +982,7 @@ elabClause info tcgen (_, PWith fc fname lhs_in withs wval_in withblock)
982982 (map (pexp . (PRef fc) . fst) bargs_pre ++
983983 pexp wval :
984984 (map (pexp . (PRef fc) . fst) bargs_post))
985− logLvl 5 ("New RHS " ++ showImp True rhs)
985+ logLvl 5 ("New RHS " ++ showImp Nothing True False rhs)
986986 ctxt <- getContext -- New context with block added
987987 i <- getIState
988988 ((rhs', defer, is), _) <-
@@ -1011,8 +1011,8 @@ elabClause info tcgen (_, PWith fc fname lhs_in withs wval_in withblock)
10111011 mkAux wname toplhs ns ns' (PClause fc n tm_in (w:ws) rhs wheres)
10121012 = do i <- getIState
10131013 let tm = addImplPat i tm_in
1014− logLvl 2 ("Matching " ++ showImp True tm ++ " against " ++
1015− showImp True toplhs)
1014+ logLvl 2 ("Matching " ++ showImp Nothing True False tm ++ " against " ++
1015+ showImp Nothing True False toplhs)
10161016 case matchClause i toplhs tm of
10171017 Left f -> fail $ show fc ++ ":with clause does not match top level"
10181018 Right mvars ->
@@ -1022,8 +1022,8 @@ elabClause info tcgen (_, PWith fc fname lhs_in withs wval_in withblock)
10221022 mkAux wname toplhs ns ns' (PWith fc n tm_in (w:ws) wval withs)
10231023 = do i <- getIState
10241024 let tm = addImplPat i tm_in
1025− logLvl 2 ("Matching " ++ showImp True tm ++ " against " ++
1026− showImp True toplhs)
1025+ logLvl 2 ("Matching " ++ showImp Nothing True False tm ++ " against " ++
1026+ showImp Nothing True False toplhs)
10271027 withs' <- mapM (mkAuxC wname toplhs ns ns') withs
10281028 case matchClause i toplhs tm of
10291029 Left _ -> fail $ show fc ++ "with clause does not match top level"
@@ -1120,7 +1120,7 @@ elabClass info syn doc fc constraints tn ps ds
11201120 getMName (PTy _ _ _ _ n _) = nsroot n
11211121 tdecl allmeths (PTy doc syn _ o n t)
11221122 = do t' <- implicit' syn allmeths n t
1123− logLvl 5 $ "Method " ++ show n ++ " : " ++ showImp True t'
1123+ logLvl 5 $ "Method " ++ show n ++ " : " ++ showImp Nothing True False t'
11241124 return ( (n, (toExp (map fst ps) Exp t')),
11251125 (n, (doc, o, (toExp (map fst ps) Imp t'))),
11261126 (n, (syn, o, t) ) )
@@ -1154,8 +1154,8 @@ elabClass info syn doc fc constraints tn ps ds
11541154 let lhs = PApp fc (PRef fc cfn) [pconst capp]
11551155 let rhs = PResolveTC (FC "HACK" 0)
11561156 let ty = PPi constraint (MN 0 "pc") c con
1157− iLOG (showImp True ty)
1158− iLOG (showImp True lhs ++ " = " ++ showImp True rhs)
1157+ iLOG (showImp Nothing True False ty)
1158+ iLOG (showImp Nothing True False lhs ++ " = " ++ showImp Nothing True False rhs)
11591159 i <- getIState
11601160 let conn = case con of
11611161 PRef _ n -> n
@@ -1179,9 +1179,9 @@ elabClass info syn doc fc constraints tn ps ds
11791179 let anames = map (\x -> MN x "arg") [0..]
11801180 let lhs = PApp fc (PRef fc m) (pconst capp : lhsArgs margs anames)
11811181 let rhs = PApp fc (getMeth mnames all m) (rhsArgs margs anames)
1182− iLOG (showImp True ty)
1182+ iLOG (showImp Nothing True False ty)
11831183 iLOG (show (m, ty', capp, margs))
1184− iLOG (showImp True lhs ++ " = " ++ showImp True rhs)
1184+ iLOG (showImp Nothing True False lhs ++ " = " ++ showImp Nothing True False rhs)
11851185 return [PTy doc syn fc o m ty',
11861186 PClauses fc [Inlinable] m [PClause fc m lhs [] rhs []]]
11871187
@@ -1522,8 +1522,8 @@ elabCaseBlock info d@(PClauses f o n ps)
15221522
15231523checkInferred :: FC -> PTerm -> PTerm -> Idris ()
15241524checkInferred fc inf user =
1525− do logLvl 6 $ "Checked to\n" ++ showImp True inf ++ "\n\nFROM\n\n" ++
1526− showImp True user
1525+ do logLvl 6 $ "Checked to\n" ++ showImp Nothing True False inf ++ "\n\nFROM\n\n" ++
1526+ showImp Nothing True False user
15271527 logLvl 10 $ "Checking match"
15281528 i <- getIState
15291529 tclift $ case matchClause' True i user inf of
@@ -1540,8 +1540,8 @@ checkInferred fc inf user =
15401540inferredDiff :: FC -> PTerm -> PTerm -> Idris Bool
15411541inferredDiff fc inf user =
15421542 do i <- getIState
1543− logLvl 6 $ "Checked to\n" ++ showImp True inf ++ "\n" ++
1544− showImp True user
1543+ logLvl 6 $ "Checked to\n" ++ showImp Nothing True False inf ++ "\n" ++
1544+ showImp Nothing True False user
15451545 tclift $ case matchClause' True i user inf of
15461546 Right vs -> return False
15471547 Left (x, y) -> return True
src/Idris/REPL.hs+27−12
@@ -304,8 +304,9 @@ process fn (Eval t)
304304 logLvl 3 $ "Raw: " ++ show (tm', ty')
305305 logLvl 10 $ "Debug: " ++ showEnvDbg [] tm'
306306 imp <- impShow
307− iResult (showImp imp (delab ist tm') ++ " : " ++
308− showImp imp (delab ist ty'))
307+ c <- colourise
308+ iResult (showImp (Just ist) imp c (delab ist tm') ++ " : " ++
309+ showImp (Just ist) imp c (delab ist ty'))
309310process fn (ExecVal t)
310311 = do ctxt <- getContext
311312 ist <- getIState
@@ -314,15 +315,17 @@ process fn (ExecVal t)
314315 let ty' = normaliseAll ctxt [] ty
315316 res <- execute tm
316317 imp <- impShow
317− iResult (showImp imp (delab ist res) ++ " : " ++
318− showImp imp (delab ist ty'))
318+ c <- colourise
319+ iResult (showImp (Just ist) imp c (delab ist res) ++ " : " ++
320+ showImp (Just ist) imp c (delab ist ty'))
319321process fn (Check (PRef _ n))
320322 = do ctxt <- getContext
321323 ist <- getIState
322324 imp <- impShow
325+ c <- colourise
323326 case lookupNames n ctxt of
324− ts@(_:_) -> do mapM_ (\n -> iputStrLn $ show n ++ " : " ++
325− showImp imp (delabTy ist n)) ts
327+ ts@(_:_) -> do mapM_ (\n -> iputStrLn $ showName (Just ist) [] False c n ++ " : " ++
328+ showImp (Just ist) imp c (delabTy ist n)) ts
326329 iResult ""
327330 [] -> iFail $ "No such variable " ++ show n
328331process fn (Check t)
@@ -330,11 +333,12 @@ process fn (Check t)
330333 ctxt <- getContext
331334 ist <- getIState
332335 imp <- impShow
336+ c <- colourise
333337 let ty' = normaliseC ctxt [] ty
334338 case tm of
335339 TType _ -> iResult ("Type : Type 1")
336− _ -> iResult (showImp imp (delab ist tm) ++ " : " ++
337− showImp imp (delab ist ty))
340+ _ -> iResult (showImp (Just ist) imp c (delab ist tm) ++ " : " ++
341+ showImp (Just ist) imp c (delab ist ty))
338342
339343process fn (DocStr n) = do i <- getIState
340344 case lookupCtxtName n (idris_docstrings i) of
@@ -364,8 +368,9 @@ process fn (Defn n) = do i <- getIState
364368 [t] -> iputStrLn (showTotal t i)
365369 _ -> return ()
366370 where printCase i (_, lhs, rhs)
367− = do iputStrLn (showImp True (delab i lhs) ++ " = " ++
368− showImp True (delab i rhs))
371+ = do c <- colourise
372+ iputStrLn (showImp (Just i) True c (delab i lhs) ++ " = " ++
373+ showImp (Just i) True c (delab i rhs))
369374process fn (TotCheck n) = do i <- getIState
370375 case lookupTotal n (tt_ctxt i) of
371376 [t] -> iResult (showTotal t i)
@@ -502,10 +507,11 @@ process fn (Pattelab t)
502507
503508process fn (Missing n)
504509 = do i <- getIState
510+ c <- colourise
505511 case lookupCtxt n (idris_patdefs i) of
506512 [] -> return ()
507513 [(_, tms)] ->
508− iResult (showSep "\n" (map (showImp True) tms))
514+ iResult (showSep "\n" (map (showImp (Just i) True c) tms))
509515 _ -> iFail $ "Ambiguous name"
510516process fn (DynamicLink l) = do i <- getIState
511517 let lib = trim l
@@ -553,7 +559,7 @@ dumpInstance n = do i <- getIState
553559 ctxt <- getContext
554560 imp <- impShow
555561 case lookupTy n ctxt of
556− ts -> mapM_ (\t -> iputStrLn $ showImp imp (delab i t)) ts
562+ ts -> mapM_ (\t -> iputStrLn $ showImp Nothing imp False (delab i t)) ts
557563
558564showTotal t@(Partial (Other ns)) i
559565 = show t ++ "\n\t" ++ showSep "\n\t" (map (showTotalN i) ns)
@@ -627,6 +633,10 @@ parseArgs ("-O0":ns) = OptLevel 0 : parseArgs ns
627633parseArgs ("-O":n:ns) = OptLevel (read n) : parseArgs ns
628634parseArgs ("--target":n:ns) = TargetTriple n : parseArgs ns
629635parseArgs ("--cpu":n:ns) = TargetCPU n : parseArgs ns
636+parseArgs ("--colour":ns) = ColourREPL True : parseArgs ns
637+parseArgs ("--color":ns) = ColourREPL True : parseArgs ns
638+parseArgs ("--nocolour":ns) = ColourREPL False : parseArgs ns
639+parseArgs ("--nocolor":ns) = ColourREPL False : parseArgs ns
630640parseArgs (n:ns) = Filename n : (parseArgs ns)
631641
632642helphead =
@@ -740,6 +750,7 @@ idrisMain opts =
740750 [expr] -> return (Just expr)
741751 when (DefaultTotal `elem` opts) $ do i <- getIState
742752 putIState (i { default_total = True })
753+ setColourise $ not quiet && last (True : opt getColour opts)
743754 mapM_ addLangExt (opt getLanguageExt opts)
744755 setREPL runrepl
745756 setQuiet (quiet || isJust script)
@@ -876,6 +887,10 @@ getOptLevel :: Opt -> Maybe Int
876887getOptLevel (OptLevel x) = Just x
877888getOptLevel _ = Nothing
878889
890+getColour :: Opt -> Maybe Bool
891+getColour (ColourREPL b) = Just b
892+getColour _ = Nothing
893+
879894opt :: (Opt -> Maybe a) -> [Opt] -> [a]
880895opt = mapMaybe
881896
src/Main.hs+1
@@ -80,6 +80,7 @@ usagemsg = "Idris version " ++ ver ++ "\n" ++
8080 "Usage: idris [input file] [options]\n" ++
8181 "Options:\n" ++
8282 "\t--quiet Quiet mode (for editors)\n" ++
83+ "\t--[no]colour Control REPL colour highlighting" ++
8384 "\t--check Type check only\n" ++
8485 "\t-o [file] Specify output filename\n" ++
8586 "\t-i [dir] Add directory to the list of import paths\n" ++