1{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,
2 TypeSynonymInstances, PatternGuards #-}
4module Idris.AbsSyntaxTree where
7import Idris.Core.Evaluate
8import Idris.Core.Elaborate hiding (Tactic(..))
9import Idris.Core.Typecheck
10import Idris.Docstrings
12import IRTS.CodegenCommon
14import Util.DynamicLinker
20import System.Console.Haskeline
23import Control.Monad.Trans.State.Strict
24import Control.Monad.Trans.Error
26import Data.List hiding (group)
28import qualified Data.Map as M
29import qualified Data.Text as T
30import qualified Data.Map as M
32import qualified Data.Set as S
33import Data.Word (Word)
34import Data.Maybe (fromMaybe)
38import Text.PrettyPrint.Annotated.Leijen
40-- Data to pass to recursively called elaborators; e.g. for where blocks,
41-- paramaterised declarations, etc.
43data ElabInfo = EInfo { params :: [(Name, PTerm)],
44 inblock :: Ctxt [Name], -- names in the block, and their params
45 liftname :: Name -> Name,
46 namespace :: Maybe [String] }
48toplevel = EInfo [] emptyContext id Nothing
50eInfoNames :: ElabInfo -> [Name]
51eInfoNames info = map fst (params info) ++ M.keys (inblock info)
53data IOption = IOption { opt_logLevel :: Int,
55 opt_typeintype :: Bool,
57 opt_showimp :: Bool, -- ^^ show implicits
58 opt_errContext :: Bool,
63 opt_codegen :: Codegen,
64 opt_outputTy :: OutputType,
65 opt_ibcsubdir :: FilePath,
66 opt_importdirs :: [FilePath],
70 opt_cmdline :: [Opt], -- remember whole command line
72 opt_autoSolve :: Bool -- ^ automatically apply "solve" tactic in prover
76defaultOpts = IOption { opt_logLevel = 0
77 , opt_typecase = False
78 , opt_typeintype = False
81 , opt_errContext = False
84 , opt_nobanner = False
87 , opt_outputTy = Executable
95 , opt_autoSolve = True
98data PPOption = PPOption {
99 ppopt_impl :: Bool -- ^^ whether to show implicits
102-- | Pretty printing options with default verbosity.
103defaultPPOption :: PPOption
104defaultPPOption = PPOption { ppopt_impl = False }
106-- | Pretty printing options with the most verbosity.
107verbosePPOption :: PPOption
108verbosePPOption = PPOption { ppopt_impl = True }
110-- | Get pretty printing options from the big options record.
111ppOption :: IOption -> PPOption
112ppOption opt = PPOption {
113 ppopt_impl = opt_showimp opt
116-- | Get pretty printing options from an idris state record.
117ppOptionIst :: IState -> PPOption
118ppOptionIst = ppOption . idris_options
120data LanguageExt = TypeProviders | ErrorReflection deriving (Show, Eq, Read, Ord)
122-- | The output mode in use
123data OutputMode = RawOutput | IdeSlave Integer deriving Show
125-- | How wide is the console?
126data ConsoleWidth = InfinitelyWide -- ^ Have pretty-printer assume that lines should not be broken
127 | ColsWide Int -- ^ Manually specified - must be positive
128 | AutomaticWidth -- ^ Attempt to determine width, or 80 otherwise
130-- | The global state used in the Idris monad
131data IState = IState {
132 tt_ctxt :: Context, -- ^ All the currently defined names and their terms
133 idris_constraints :: [(UConstraint, FC)],
134 -- ^ A list of universe constraints and their corresponding source locations
135 idris_infixes :: [FixDecl], -- ^ Currently defined infix operators
136 idris_implicits :: Ctxt [PArg],
137 idris_statics :: Ctxt [Bool],
138 idris_classes :: Ctxt ClassInfo,
139 idris_dsls :: Ctxt DSL,
140 idris_optimisation :: Ctxt OptInfo,
141 idris_datatypes :: Ctxt TypeInfo,
142 idris_namehints :: Ctxt [Name],
143 idris_patdefs :: Ctxt ([([Name], Term, Term)], [PTerm]), -- not exported
144 -- ^ list of lhs/rhs, and a list of missing clauses
145 idris_flags :: Ctxt [FnOpt],
146 idris_callgraph :: Ctxt CGInfo, -- name, args used in each pos
147 idris_calledgraph :: Ctxt [Name],
148 idris_docstrings :: Ctxt (Docstring, [(Name, Docstring)]),
149 idris_tyinfodata :: Ctxt TIData,
150 idris_totcheck :: [(FC, Name)], -- names to check totality on
151 idris_defertotcheck :: [(FC, Name)], -- names to check at the end
152 idris_totcheckfail :: [(FC, String)],
153 idris_options :: IOption,
155 idris_lineapps :: [((FilePath, Int), PTerm)],
156 -- ^ Full application LHS on source line
157 idris_metavars :: [(Name, (Maybe Name, Int, Bool))], -- ^ The currently defined but not proven metavariables
158 idris_coercions :: [Name],
159 idris_transforms :: [(Term, Term)],
160 idris_errRev :: [(Term, Term)],
161 syntax_rules :: [Syntax],
162 syntax_keywords :: [String],
163 imported :: [FilePath], -- ^ The imported modules
164 idris_scprims :: [(Name, (Int, PrimFn))],
165 idris_objs :: [(Codegen, FilePath)],
166 idris_libs :: [(Codegen, String)],
167 idris_cgflags :: [(Codegen, String)],
168 idris_hdrs :: [(Codegen, String)],
169 idris_imported :: [FilePath], -- ^ Imported ibc file names
170 proof_list :: [(Name, [String])],
172 parserWarnings :: [(FC, Err)],
173 lastParse :: Maybe Name,
174 indent_stack :: [Int],
175 brace_stack :: [Maybe Int],
176 lastTokenSpan :: Maybe FC, -- ^ What was the span of the latest token parsed?
177 idris_parsedSpan :: Maybe FC,
178 hide_list :: [(Name, Maybe Accessibility)],
179 default_access :: Accessibility,
180 default_total :: Bool,
181 ibc_write :: [IBCWrite],
182 compiled_so :: Maybe String,
183 idris_dynamic_libs :: [DynamicLib],
184 idris_language_extensions :: [LanguageExt],
185 idris_outputmode :: OutputMode,
186 idris_colourRepl :: Bool,
187 idris_colourTheme :: ColourTheme,
188 idris_outh :: Handle,
189 idris_errorhandlers :: [Name], -- ^ Global error handlers
190 idris_nameIdx :: (Int, Ctxt (Int, Name)),
191 idris_function_errorhandlers :: Ctxt (M.Map Name (S.Set Name)), -- ^ Specific error handlers
192 module_aliases :: M.Map [T.Text] [T.Text],
193 idris_consolewidth :: ConsoleWidth, -- ^ How many chars wide is the console?
194 idris_postulates :: S.Set Name,
195 idris_whocalls :: Maybe (M.Map Name [Name]),
196 idris_callswho :: Maybe (M.Map Name [Name])
199data SizeChange = Smaller | Same | Bigger | Unknown
202deriving instance Binary SizeChange
203deriving instance NFData SizeChange
206type SCGEntry = (Name, [Maybe (Int, SizeChange)])
207type UsageReason = (Name, Int) -- fn_name, its_arg_number
209data CGInfo = CGInfo { argsdef :: [Name],
210 calls :: [(Name, [[Name]])],
213 usedpos :: [(Int, [UsageReason])] }
216deriving instance Binary CGInfo
217deriving instance NFData CGInfo
220primDefs = [sUN "unsafePerformPrimIO",
221 sUN "mkLazyForeignPrim",
225-- information that needs writing for the current module's .ibc file
226data IBCWrite = IBCFix FixDecl
230 | IBCInstance Bool Name Name
238 | IBCObj Codegen FilePath
239 | IBCLib Codegen String
240 | IBCCGFlag Codegen String
242 | IBCHeader Codegen String
243 | IBCAccess Name Accessibility
244 | IBCMetaInformation Name MetaInformation
245 | IBCTotal Name Totality
246 | IBCFlags Name [FnOpt]
247 | IBCTrans (Term, Term)
248 | IBCErrRev (Term, Term)
252 | IBCDef Name -- i.e. main context
253 | IBCNameHint (Name, Name)
254 | IBCLineApp FilePath Int PTerm
255 | IBCErrorHandler Name
256 | IBCFunctionErrorHandler Name Name Name
258 | IBCTotCheckErr FC String
262-- | The initial state for the compiler
264idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext
265 emptyContext emptyContext emptyContext emptyContext
266 emptyContext emptyContext emptyContext emptyContext
267 emptyContext emptyContext
268 [] [] [] defaultOpts 6 [] [] [] [] [] [] [] [] [] [] [] [] []
269 [] [] Nothing [] Nothing [] [] Nothing Nothing [] Hidden False [] Nothing [] [] RawOutput
270 True defaultTheme stdout [] (0, emptyContext) emptyContext M.empty
271 AutomaticWidth S.empty Nothing Nothing
273-- | The monad for the main REPL - reading and processing files and updating
274-- global state (hence the IO inner monad).
275--type Idris = WriterT [Either String (IO ())] (State IState a))
276type Idris = StateT IState (ErrorT Err IO)
278-- Commands in the REPL
293 | DocStr (Either Name Const)
296 | Load FilePath (Maybe Int) -- up to maximum line number
297 | ChangeDirectory FilePath
300 | Compile Codegen String
305 | AddProof (Maybe Name)
316 | DynamicLink FilePath
321 | CaseSplitAt Bool Int Name
322 | AddClauseFrom Bool Int Name
323 | AddProofClauseFrom Bool Int Name
324 | AddMissing Bool Int Name
325 | MakeWith Bool Int Name
326 | MakeLemma Bool Int Name
327 | DoProofSearch Bool Bool Int Name [Name]
328 -- ^ the first bool is whether to update,
329 -- the second is whether to search recursively (i.e. for the arguments)
333 | SetColour ColourType IdrisColour
337 | SetConsoleWidth ConsoleWidth
341 | MakeDoc String -- IdrisDoc
344data Opt = Filename String
354 | NoBuiltins -- only for the really primitive stuff!
375 | PkgMkDoc String -- IdrisDoc
382 | OutputTy OutputType
383 | Extension LanguageExt
384 | InterpretScript String
386 | TargetTriple String
391 | AutoWidth -- ^ Automatically adjust terminal width
392 | AutoSolve -- ^ Automatically issue "solve" tactic in interactive prover
395-- Parsed declarations
397data Fixity = Infixl { prec :: Int }
398 | Infixr { prec :: Int }
399 | InfixN { prec :: Int }
400 | PrefixN { prec :: Int }
403deriving instance Binary Fixity
404deriving instance NFData Fixity
407instance Show Fixity where
408 show (Infixl i) = "infixl " ++ show i
409 show (Infixr i) = "infixr " ++ show i
410 show (InfixN i) = "infix " ++ show i
411 show (PrefixN i) = "prefix " ++ show i
413data FixDecl = Fix Fixity String
416instance Show FixDecl where
417 show (Fix f s) = show f ++ " " ++ s
420deriving instance Binary FixDecl
421deriving instance NFData FixDecl
424instance Ord FixDecl where
425 compare (Fix x _) (Fix y _) = compare (prec x) (prec y)
428data Static = Static | Dynamic
431deriving instance Binary Static
432deriving instance NFData Static
435-- Mark bindings with their explicitness, and laziness
436data Plicity = Imp { pargopts :: [ArgOpt],
439 | Exp { pargopts :: [ArgOpt],
441 pparam :: Bool } -- this is a param (rather than index)
442 | Constraint { pargopts :: [ArgOpt],
444 | TacImp { pargopts :: [ArgOpt],
450deriving instance Binary Plicity
451deriving instance NFData Plicity
454impl = Imp [] Dynamic False
455expl = Exp [] Dynamic False
456expl_param = Exp [] Dynamic True
457constraint = Constraint [] Dynamic
458tacimpl t = TacImp [] Dynamic t
460data FnOpt = Inlinable -- always evaluate when simplifying
461 | TotalFn | PartialFn | CoveringFn
462 | Coinductive | AssertTotal
463 | Dictionary -- type class dictionary, eval only when
464 -- a function argument, and further evaluation resutls
465 | Implicit -- implicit coercion
466 | CExport String -- export, with a C name
467 | ErrorHandler -- ^^ an error handler for use with the ErrorReflection extension
468 | ErrorReverse -- ^^ attempt to reverse normalise before showing in error
469 | Reflection -- a reflecting function, compile-time only
470 | Specialise [(Name, Maybe Int)] -- specialise it, freeze these names
473deriving instance Binary FnOpt
474deriving instance NFData FnOpt
479inlinable :: FnOpts -> Bool
480inlinable = elem Inlinable
482dictionary :: FnOpts -> Bool
483dictionary = elem Dictionary
486-- | Data declaration options
487data DataOpt = Codata -- Set if the the data-type is coinductive
488 | DefaultEliminator -- Set if an eliminator should be generated for data type
492type DataOpts = [DataOpt]
494-- | Type provider - what to provide
495data ProvideWhat = ProvTerm -- ^ only allow providing terms
496 | ProvPostulate -- ^ only allow postulates
497 | ProvAny -- ^ either is ok
500-- | Top-level declarations such as compiler directives, definitions,
501-- datatypes and typeclasses.
503 = PFix FC Fixity [String] -- ^ Fixity declaration
504 | PTy Docstring [(Name, Docstring)] SyntaxInfo FC FnOpts Name t -- ^ Type declaration
505 | PPostulate Docstring SyntaxInfo FC FnOpts Name t -- ^ Postulate
506 | PClauses FC FnOpts Name [PClause' t] -- ^ Pattern clause
507 | PCAF FC Name t -- ^ Top level constant
508 | PData Docstring [(Name, Docstring)] SyntaxInfo FC DataOpts (PData' t) -- ^ Data declaration.
509 | PParams FC [(Name, t)] [PDecl' t] -- ^ Params block
510 | PNamespace String [PDecl' t] -- ^ New namespace
511 | PRecord Docstring SyntaxInfo FC Name t DataOpts Docstring Name t -- ^ Record declaration
512 | PClass Docstring SyntaxInfo FC
515 [(Name, t)] -- parameters
516 [(Name, Docstring)] -- parameter docstrings
517 [PDecl' t] -- declarations
518 -- ^ Type class: arguments are documentation, syntax info, source location, constraints,
519 -- class name, parameters, method declarations
520 | PInstance SyntaxInfo FC [t] -- constraints
523 t -- full instance type
524 (Maybe Name) -- explicit name
526 -- ^ Instance declaration: arguments are syntax info, source location, constraints,
527 -- class name, parameters, full instance type, optional explicit name, and definitions
528 | PDSL Name (DSL' t) -- ^ DSL declaration
529 | PSyntax FC Syntax -- ^ Syntax definition
530 | PMutual FC [PDecl' t] -- ^ Mutual block
531 | PDirective (Idris ()) -- ^ Compiler directive. The parser inserts the corresponding action in the Idris monad.
532 | PProvider SyntaxInfo FC ProvideWhat Name t t -- ^ Type provider. The first t is the type, the second is the term
533 | PTransform FC Bool t t -- ^ Source-to-source transformation rule. If
534 -- bool is True, lhs and rhs must be convertible
537deriving instance Binary PDecl'
538deriving instance NFData PDecl'
541-- For elaborator state
542type ElabD a = Elab' [PDecl] a
544-- | One clause of a top-level definition. Term arguments to constructors are:
546-- 1. The whole application (missing for PClauseR and PWithR because they're within a "with" clause)
548-- 2. The list of extra 'with' patterns
550-- 3. The right-hand side
552-- 4. The where block (PDecl' t)
554data PClause' t = PClause FC Name t [t] t [PDecl' t] -- ^ A normal top-level definition.
555 | PWith FC Name t [t] t [PDecl' t]
556 | PClauseR FC [t] t [PDecl' t]
557 | PWithR FC [t] t [PDecl' t]
560deriving instance Binary PClause'
561deriving instance NFData PClause'
565data PData' t = PDatadecl { d_name :: Name, -- ^ The name of the datatype
566 d_tcon :: t, -- ^ Type constructor
567 d_cons :: [(Docstring, [(Name, Docstring)], Name, t, FC, [Name])] -- ^ Constructors
569 -- ^ Data declaration
570 | PLaterdecl { d_name :: Name, d_tcon :: t }
571 -- ^ "Placeholder" for data whose constructors are defined later
574deriving instance Binary PData'
575deriving instance NFData PData'
578-- Handy to get a free function for applying PTerm -> PTerm functions
579-- across a program, by deriving Functor
581type PDecl = PDecl' PTerm
582type PData = PData' PTerm
583type PClause = PClause' PTerm
585-- get all the names declared in a decl
587declared :: PDecl -> [Name]
588declared (PFix _ _ _) = []
589declared (PTy _ _ _ _ _ n t) = [n]
590declared (PPostulate _ _ _ _ n t) = [n]
591declared (PClauses _ _ n _) = [] -- not a declaration
592declared (PCAF _ n _) = [n]
593declared (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
594 where fstt (_, _, a, _, _, _) = a
595declared (PData _ _ _ _ _ (PLaterdecl n _)) = [n]
596declared (PParams _ _ ds) = concatMap declared ds
597declared (PNamespace _ ds) = concatMap declared ds
598declared (PRecord _ _ _ n _ _ _ c _) = [n, c]
599declared (PClass _ _ _ _ n _ _ ms) = n : concatMap declared ms
600declared (PInstance _ _ _ _ _ _ _ _) = []
601declared (PDSL n _) = [n]
602declared (PSyntax _ _) = []
603declared (PMutual _ ds) = concatMap declared ds
604declared (PDirective _) = []
606-- get the names declared, not counting nested parameter blocks
607tldeclared :: PDecl -> [Name]
608tldeclared (PFix _ _ _) = []
609tldeclared (PTy _ _ _ _ _ n t) = [n]
610tldeclared (PPostulate _ _ _ _ n t) = [n]
611tldeclared (PClauses _ _ n _) = [] -- not a declaration
612tldeclared (PRecord _ _ _ n _ _ _ c _) = [n, c]
613tldeclared (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
614 where fstt (_, _, a, _, _, _) = a
615tldeclared (PParams _ _ ds) = []
616tldeclared (PMutual _ ds) = concatMap tldeclared ds
617tldeclared (PNamespace _ ds) = concatMap tldeclared ds
618tldeclared (PClass _ _ _ _ n _ _ ms) = concatMap tldeclared ms
619tldeclared (PInstance _ _ _ _ _ _ _ _) = []
622defined :: PDecl -> [Name]
623defined (PFix _ _ _) = []
624defined (PTy _ _ _ _ _ n t) = []
625defined (PPostulate _ _ _ _ n t) = []
626defined (PClauses _ _ n _) = [n] -- not a declaration
627defined (PCAF _ n _) = [n]
628defined (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
629 where fstt (_, _, a, _, _, _) = a
630defined (PData _ _ _ _ _ (PLaterdecl n _)) = []
631defined (PParams _ _ ds) = concatMap defined ds
632defined (PNamespace _ ds) = concatMap defined ds
633defined (PRecord _ _ _ n _ _ _ c _) = [n, c]
634defined (PClass _ _ _ _ n _ _ ms) = n : concatMap defined ms
635defined (PInstance _ _ _ _ _ _ _ _) = []
636defined (PDSL n _) = [n]
637defined (PSyntax _ _) = []
638defined (PMutual _ ds) = concatMap defined ds
639defined (PDirective _) = []
642updateN :: [(Name, Name)] -> Name -> Name
643updateN ns n | Just n' <- lookup n ns = n'
646updateNs :: [(Name, Name)] -> PTerm -> PTerm
648updateNs ns t = mapPT updateRef t
649 where updateRef (PRef fc f) = PRef fc (updateN ns f)
652-- updateDNs :: [(Name, Name)] -> PDecl -> PDecl
654-- updateDNs ns (PTy s f n t) | Just n' <- lookup n ns = PTy s f n' t
655-- updateDNs ns (PClauses f n c) | Just n' <- lookup n ns = PClauses f n' (map updateCNs c)
656-- where updateCNs ns (PClause n l ts r ds)
657-- = PClause (updateN ns n) (fmap (updateNs ns) l)
658-- (map (fmap (updateNs ns)) ts)
659-- (fmap (updateNs ns) r)
660-- (map (updateDNs ns) ds)
663data PunInfo = IsType | IsTerm | TypeOrTerm deriving (Eq, Show)
665-- | High level language terms
666data PTerm = PQuote Raw
668 | PInferRef FC Name -- ^ A name to be defined later
670 | PLam Name PTerm PTerm
671 | PPi Plicity Name PTerm PTerm -- ^ (n : t1) -> t2
672 | PLet Name PTerm PTerm PTerm
673 | PTyped PTerm PTerm -- ^ Term with explicit type
674 | PApp FC PTerm [PArg] -- ^ e.g. IO (), List Char, length x
675 | PAppBind FC PTerm [PArg] -- ^ implicitly bound application
676 | PMatchApp FC Name -- ^ Make an application by type matching
677 | PCase FC PTerm [(PTerm, PTerm)]
678 | PTrue FC PunInfo -- ^ Unit type..?
682 | PEq FC PTerm PTerm -- ^ Equality type: A = B
683 | PRewrite FC PTerm PTerm (Maybe PTerm)
684 | PPair FC PunInfo PTerm PTerm
685 | PDPair FC PunInfo PTerm PTerm PTerm
686 | PAlternative Bool [PTerm] -- True if only one may work
687 | PHidden PTerm -- ^ Irrelevant or hidden pattern
688 | PType -- ^ 'Type' type
689 | PGoal FC PTerm Name PTerm
690 | PConstant Const -- ^ Builtin types
696 | PProof [PTactic] -- ^ Proof script
697 | PTactics [PTactic] -- ^ As PProof, but no auto solving
698 | PElabError Err -- ^ Error to report on elaboration
699 | PImpossible -- ^ Special case for declaring when an LHS can't typecheck
700 | PCoerced PTerm -- ^ To mark a coerced argument, so as not to coerce twice
701 | PDisamb [[T.Text]] PTerm -- ^ Preferences for explicit namespaces
702 | PUnifyLog PTerm -- ^ dump a trace of unifications when building term
703 | PNoImplicits PTerm -- ^ never run implicit converions on the term
708deriving instance Binary PTerm
709deriving instance NFData PTerm
712mapPT :: (PTerm -> PTerm) -> PTerm -> PTerm
713mapPT f t = f (mpt t) where
714 mpt (PLam n t s) = PLam n (mapPT f t) (mapPT f s)
715 mpt (PPi p n t s) = PPi p n (mapPT f t) (mapPT f s)
716 mpt (PLet n ty v s) = PLet n (mapPT f ty) (mapPT f v) (mapPT f s)
717 mpt (PRewrite fc t s g) = PRewrite fc (mapPT f t) (mapPT f s)
719 mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)
720 mpt (PAppBind fc t as) = PAppBind fc (mapPT f t) (map (fmap (mapPT f)) as)
721 mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)
722 mpt (PEq fc l r) = PEq fc (mapPT f l) (mapPT f r)
723 mpt (PTyped l r) = PTyped (mapPT f l) (mapPT f r)
724 mpt (PPair fc p l r) = PPair fc p (mapPT f l) (mapPT f r)
725 mpt (PDPair fc p l t r) = PDPair fc p (mapPT f l) (mapPT f t) (mapPT f r)
726 mpt (PAlternative a as) = PAlternative a (map (mapPT f) as)
727 mpt (PHidden t) = PHidden (mapPT f t)
728 mpt (PDoBlock ds) = PDoBlock (map (fmap (mapPT f)) ds)
729 mpt (PProof ts) = PProof (map (fmap (mapPT f)) ts)
730 mpt (PTactics ts) = PTactics (map (fmap (mapPT f)) ts)
731 mpt (PUnifyLog tm) = PUnifyLog (mapPT f tm)
732 mpt (PDisamb ns tm) = PDisamb ns (mapPT f tm)
733 mpt (PNoImplicits tm) = PNoImplicits (mapPT f tm)
734 mpt (PGoal fc r n sc) = PGoal fc (mapPT f r) n (mapPT f sc)
738data PTactic' t = Intro [Name] | Intros | Focus Name
739 | Refine Name [Bool] | Rewrite t | DoUnify
743 | LetTac Name t | LetTacTy Name t t
744 | Exact t | Compute | Trivial | TCInstance
745 | ProofSearch Bool Bool Int (Maybe Name) [Name]
746 -- ^ the bool is whether to search recursively
749 | ProofState | ProofTerm | Undo
750 | Try (PTactic' t) (PTactic' t)
751 | TSeq (PTactic' t) (PTactic' t)
752 | ApplyTactic t -- see Language.Reflection module
756 | GoalType String (PTactic' t)
760 deriving (Show, Eq, Functor)
762deriving instance Binary PTactic'
763deriving instance NFData PTactic'
765instance Sized a => Sized (PTactic' a) where
766 size (Intro nms) = 1 + size nms
768 size (Focus nm) = 1 + size nm
769 size (Refine nm bs) = 1 + size nm + length bs
770 size (Rewrite t) = 1 + size t
771 size (Induction t) = 1 + size t
772 size (LetTac nm t) = 1 + size nm + size t
773 size (Exact t) = 1 + size t
781 size (Try l r) = 1 + size l + size r
782 size (TSeq l r) = 1 + size l + size r
783 size (ApplyTactic t) = 1 + size t
784 size (Reflect t) = 1 + size t
785 size (Fill t) = 1 + size t
789type PTactic = PTactic' PTerm
791data PDo' t = DoExp FC t
793 | DoBindP FC t t [(t,t)]
796 deriving (Eq, Functor)
798deriving instance Binary PDo'
799deriving instance NFData PDo'
802instance Sized a => Sized (PDo' a) where
803 size (DoExp fc t) = 1 + size fc + size t
804 size (DoBind fc nm t) = 1 + size fc + size nm + size t
805 size (DoBindP fc l r alts) = 1 + size fc + size l + size r + size alts
806 size (DoLet fc nm l r) = 1 + size fc + size nm + size l + size r
807 size (DoLetP fc l r) = 1 + size fc + size l + size r
811-- The priority gives a hint as to elaboration order. Best to elaborate
812-- things early which will help give a more concrete type to other
813-- variables, e.g. a before (interpTy a).
815data PArg' t = PImp { priority :: Int,
816 machine_inf :: Bool, -- true if the machine inferred it
818 pname :: Name, getTm :: t }
819 | PExp { priority :: Int,
823 | PConstraint { priority :: Int,
827 | PTacImplicit { priority :: Int,
832 deriving (Show, Eq, Functor)
834data ArgOpt = HideDisplay | InaccessibleArg
837instance Sized a => Sized (PArg' a) where
838 size (PImp p _ l nm trm) = 1 + size nm + size trm
839 size (PExp p l nm trm) = 1 + size nm + size trm
840 size (PConstraint p l nm trm) = 1 + size nm +size nm + size trm
841 size (PTacImplicit p l nm scr trm) = 1 + size nm + size scr + size trm
844deriving instance Binary PArg'
845deriving instance NFData PArg'
848pimp n t mach = PImp 1 mach [] n t
849pexp t = PExp 1 [] (sMN 0 "arg") t
850pconst t = PConstraint 1 [] (sMN 0 "carg") t
851ptacimp n s t = PTacImplicit 2 [] n s t
853type PArg = PArg' PTerm
857data ClassInfo = CI { instanceName :: Name,
858 class_methods :: [(Name, (FnOpts, PTerm))],
859 class_defaults :: [(Name, (Name, PDecl))], -- method name -> default impl
860 class_default_superclasses :: [PDecl],
861 class_params :: [Name],
862 class_instances :: [Name] }
865deriving instance Binary ClassInfo
866deriving instance NFData ClassInfo
869-- Type inference data
871data TIData = TIPartial -- ^ a function with a partially defined type
872 | TISolution [Term] -- ^ possible solutions to a metavariable in a type
875data OptInfo = Optimise { inaccessible :: [(Int,Name)], -- includes names for error reporting
879deriving instance Binary OptInfo
880deriving instance NFData OptInfo
884data TypeInfo = TI { con_names :: [Name],
886 data_opts :: DataOpts,
888 mutual_types :: [Name] }
891deriving instance Binary TypeInfo
892deriving instance NFData TypeInfo
895-- Syntactic sugar info
897data DSL' t = DSL { dsl_bind :: t,
902 index_first :: Maybe t,
903 index_next :: Maybe t,
904 dsl_lambda :: Maybe t,
907 deriving (Show, Functor)
909deriving instance Binary DSL'
910deriving instance NFData DSL'
915data SynContext = PatternSyntax | TermSyntax | AnySyntax
918deriving instance Binary SynContext
919deriving instance NFData SynContext
922data Syntax = Rule [SSymbol] PTerm SynContext
925deriving instance Binary Syntax
926deriving instance NFData Syntax
929data SSymbol = Keyword Name
936deriving instance Binary SSymbol
937deriving instance NFData SSymbol
940initDSL = DSL (PRef f (sUN ">>="))
941 (PRef f (sUN "return"))
943 (PRef f (sUN "pure"))
949 where f = fileFC "(builtin)"
951data Using = UImplicit Name PTerm
952 | UConstraint Name [Name]
955deriving instance Binary Using
956deriving instance NFData Using
959data SyntaxInfo = Syn { using :: [Using],
960 syn_params :: [(Name, PTerm)],
961 syn_namespace :: [String],
963 decoration :: Name -> Name,
965 implicitAllowed :: Bool,
966 maxline :: Maybe Int,
971deriving instance NFData SyntaxInfo
972deriving instance Binary SyntaxInfo
975defaultSyntax = Syn [] [] [] [] id False False Nothing 0 initDSL
977expandNS :: SyntaxInfo -> Name -> Name
978expandNS syn n@(NS _ _) = n
979expandNS syn n = case syn_namespace syn of
984-- For inferring types of things
988inferTy = sMN 0 "__Infer"
989inferCon = sMN 0 "__infer"
990inferDecl = PDatadecl inferTy
992 [(emptyDocstring, [], inferCon, PPi impl (sMN 0 "iType") PType (
993 PPi expl (sMN 0 "ival") (PRef bi (sMN 0 "iType"))
994 (PRef bi inferTy)), bi, [])]
997infTerm t = PApp bi (PRef bi inferCon) [pimp (sMN 0 "iType") Placeholder True, pexp t]
998infP = P (TCon 6 0) inferTy (TType (UVal 0))
1000getInferTerm, getInferType :: Term -> Term
1001getInferTerm (Bind n b sc) = Bind n b $ getInferTerm sc
1002getInferTerm (App (App _ _) tm) = tm
1003getInferTerm tm = tm -- error ("getInferTerm " ++ show tm)
1005getInferType (Bind n b sc) = Bind n (toTy b) $ getInferType sc
1006 where toTy (Lam t) = Pi t
1007 toTy (PVar t) = PVTy t
1009getInferType (App (App _ ty) _) = ty
1013-- Handy primitives: Unit, False, Pair, MkPair, =, mkForeign, Elim type class
1015primNames = [unitTy, unitCon,
1016 falseTy, pairTy, pairCon,
1017 eqTy, eqCon, inferTy, inferCon]
1019unitDoc = parseDocstring . T.pack $ "The canonical single-element type, also known as the trivially true proposition."
1020unitTy = sMN 0 "__Unit"
1021unitCon = sMN 0 "__II"
1022unitDecl = PDatadecl unitTy PType
1023 [(parseDocstring . T.pack $ "The trivial constructor for `()`. ", [], unitCon, PRef bi unitTy, bi, [])]
1024unitOpts = [DefaultEliminator]
1026falseDoc = parseDocstring . T.pack $
1027 "The empty type, also known as the trivially false proposition." ++
1029 "Use `FalseElim` or `absurd` to prove anything if you have a variable " ++
1030 "of type `_|_` in scope."
1031falseTy = sMN 0 "__False"
1032falseDecl = PDatadecl falseTy PType []
1035pairDoc = parseDocstring . T.pack $ "The non-dependent pair type, also known as conjunction."
1036pairTy = sMN 0 "__Pair"
1037pairCon = sMN 0 "__MkPair"
1038pairDecl = PDatadecl pairTy (piBind [(n "A", PType), (n "B", PType)] PType)
1039 [(pairConDoc, pairConParamDoc,
1040 pairCon, PPi impl (n "A") PType (
1041 PPi impl (n "B") PType (
1042 PPi expl (n "a") (PRef bi (n "A")) (
1043 PPi expl (n "b") (PRef bi (n "B"))
1044 (PApp bi (PRef bi pairTy) [pexp (PRef bi (n "A")),
1045 pexp (PRef bi (n "B"))])))), bi, [])]
1047 pairConDoc = parseDocstring . T.pack $ "A pair of elements"
1048 pairConParamDoc = [(n "a", parseDocstring . T.pack $ "the left element of the pair"),
1049 (n "b", parseDocstring . T.pack $ "the right element of the pair")]
1051pairParamDoc = [(n "A", parseDocstring . T.pack $ "the type of the left elements in the pair"),
1052 (n "B", parseDocstring . T.pack $ "the type of the left elements in the pair")]
1057eqDoc = parseDocstring . T.pack $
1058 "The propositional equality type. A proof that `x` = `y`." ++
1060 "To use such a proof, pattern-match on it, and the two equal things will " ++
1061 "then need to be the _same_ pattern." ++
1063 "**Note**: Idris's equality type is _heterogeneous_, which means that it " ++
1064 "is possible to state equalities between values of potentially different " ++
1065 "types. This is sometimes referred to in the literature as \"John Major\" " ++
1068 "Thus, if Idris can't infer the type of one side of the equality, then " ++
1069 "you may need to annotate it. See the function `the`."
1071eqDecl = PDatadecl eqTy (piBind [(n "A", PType), (n "B", PType),
1072 (n "x", PRef bi (n "A")), (n "y", PRef bi (n "B"))]
1074 [(reflDoc, reflParamDoc,
1075 eqCon, PPi impl (n "A") PType (
1076 PPi impl (n "x") (PRef bi (n "A"))
1077 (PApp bi (PRef bi eqTy) [pimp (n "A") Placeholder False,
1078 pimp (n "B") Placeholder False,
1079 pexp (PRef bi (n "x")),
1080 pexp (PRef bi (n "x"))])), bi, [])]
1082 reflDoc = parseDocstring . T.pack $
1083 "A proof that `x` in fact equals `x`. To construct this, you must have already " ++
1084 "shown that both sides are in fact equal."
1085 reflParamDoc = [(n "A", parseDocstring . T.pack $ "the type at which the equality is proven"),
1086 (n "x", parseDocstring . T.pack $ "the element shown to be equal to itself.")]
1088eqParamDoc = [(n "A", parseDocstring . T.pack $ "the type of the left side of the equality"),
1089 (n "B", parseDocstring . T.pack $ "the type of the right side of the equality")
1095elimName = sUN "__Elim"
1096elimMethElimTy = sUN "__elimTy"
1097elimMethElim = sUN "elim"
1098elimDecl = PClass (parseDocstring . T.pack $ "Type class for eliminators") defaultSyntax bi [] elimName [(sUN "scrutineeType", PType)] []
1099 [PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElimTy PType,
1100 PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElim (PRef bi elimMethElimTy)]
1102-- Defined in builtins.idr
1103sigmaTy = sUN "Exists"
1104existsCon = sUN "Ex_intro"
1106piBind :: [(Name, PTerm)] -> PTerm -> PTerm
1107piBind = piBindp expl
1109piBindp :: Plicity -> [(Name, PTerm)] -> PTerm -> PTerm
1111piBindp p ((n, ty):ns) t = PPi p n ty (piBindp p ns t)
1114-- Pretty-printing declarations and terms
1116-- These "show" instances render to an absurdly wide screen because inserted line breaks
1117-- could interfere with interactive editing, which calls "show".
1119instance Show PTerm where
1120 showsPrec _ tm = (displayS . renderPretty 1.0 10000000 . prettyImp defaultPPOption) tm
1122instance Show PDecl where
1123 showsPrec _ d = (displayS . renderPretty 1.0 10000000 . showDeclImp defaultPPOption) d
1125instance Show PClause where
1126 showsPrec _ c = (displayS . renderPretty 1.0 10000000 . showCImp verbosePPOption) c
1128instance Show PData where
1129 showsPrec _ d = (displayS . renderPretty 1.0 10000000 . showDImp defaultPPOption) d
1131instance Pretty PTerm OutputAnnotation where
1132 pretty = prettyImp defaultPPOption
1134-- | Colourise annotations according to an Idris state. It ignores the names
1135-- in the annotation, as there's no good way to show extended information on a
1137consoleDecorate :: IState -> OutputAnnotation -> String -> String
1138consoleDecorate ist _ | not (idris_colourRepl ist) = id
1139consoleDecorate ist (AnnConst c) = let theme = idris_colourTheme ist
1141 then colouriseType theme
1142 else colouriseData theme
1143consoleDecorate ist (AnnData _ _) = colouriseData (idris_colourTheme ist)
1144consoleDecorate ist (AnnType _ _) = colouriseType (idris_colourTheme ist)
1145consoleDecorate ist (AnnBoundName _ True) = colouriseImplicit (idris_colourTheme ist)
1146consoleDecorate ist (AnnBoundName _ False) = colouriseBound (idris_colourTheme ist)
1147consoleDecorate ist AnnKeyword = colouriseKeyword (idris_colourTheme ist)
1148consoleDecorate ist (AnnName n _ _ _) = let ctxt = tt_ctxt ist
1149 theme = idris_colourTheme ist
1151 _ | isDConName n ctxt -> colouriseData theme
1152 _ | isFnName n ctxt -> colouriseFun theme
1153 _ | isTConName n ctxt -> colouriseType theme
1154 _ | otherwise -> id -- don't colourise unknown names
1155consoleDecorate ist (AnnFC _) = id
1156consoleDecorate ist (AnnTextFmt fmt) = Idris.Colours.colourise (colour fmt)
1157 where colour BoldText = IdrisColour Nothing True False True False
1158 colour UnderlineText = IdrisColour Nothing True True False False
1159 colour ItalicText = IdrisColour Nothing True False False True
1161-- | Pretty-print a high-level closed Idris term with no information about precedence/associativity
1162prettyImp :: PPOption -- ^^ pretty printing options
1163 -> PTerm -- ^^ the term to pretty-print
1164 -> Doc OutputAnnotation
1165prettyImp impl = pprintPTerm impl [] [] []
1167-- | Do the right thing for rendering a term in an IState
1168prettyIst :: IState -> PTerm -> Doc OutputAnnotation
1169prettyIst ist = pprintPTerm (ppOptionIst ist) [] [] (idris_infixes ist)
1171-- | Pretty-print a high-level Idris term in some bindings context with infix info
1172pprintPTerm :: PPOption -- ^^ pretty printing options
1173 -> [(Name, Bool)] -- ^^ the currently-bound names and whether they are implicit
1174 -> [Name] -- ^^ names to always show in pi, even if not used
1175 -> [FixDecl] -- ^^ Fixity declarations
1176 -> PTerm -- ^^ the term to pretty-print
1177 -> Doc OutputAnnotation
1178pprintPTerm ppo bnd docArgs infixes = prettySe 10 bnd
1180 prettySe :: Int -> [(Name, Bool)] -> PTerm -> Doc OutputAnnotation
1181 prettySe p bnd (PQuote r) =
1182 text "![" <> pretty r <> text "]"
1183 prettySe p bnd (PPatvar fc n) = pretty n
1185 | Just str <- slist p bnd e = str
1186 | Just n <- snat p e = annotate (AnnData "Nat" "") (text (show n))
1187 prettySe p bnd (PRef fc n) = prettyName (ppopt_impl ppo) bnd n
1188 prettySe p bnd (PLam n ty sc) =
1189 bracket p 2 . group . align . hang 2 $
1190 text "\\" <> bindingOf n False <+> text "=>" <$>
1191 prettySe 10 ((n, False):bnd) sc
1192 prettySe p bnd (PLet n ty v sc) =
1194 kwd "let" <+> bindingOf n False <+> text "=" </>
1195 prettySe 10 bnd v <+> kwd "in" </>
1196 prettySe 10 ((n, False):bnd) sc
1197 prettySe p bnd (PPi (Exp l s _) n ty sc)
1198 | n `elem` allNamesIn sc || ppopt_impl ppo || n `elem` docArgs =
1199 bracket p 2 . group $
1200 enclose lparen rparen (group . align $ bindingOf n False <+> colon <+> prettySe 10 bnd ty) <+>
1201 st <> text "->" <$> prettySe 10 ((n, False):bnd) sc
1203 bracket p 2 . group $
1204 group (prettySe 1 bnd ty <+> st) <> text "->" <$> group (prettySe 10 ((n, False):bnd) sc)
1208 Static -> text "[static]" <> space
1210 prettySe p bnd (PPi (Imp l s _) n ty sc)
1213 lbrace <> bindingOf n True <+> colon <+> prettySe 10 bnd ty <> rbrace <+>
1214 st <> text "->" </> prettySe 10 ((n, True):bnd) sc
1215 | otherwise = prettySe 10 ((n, True):bnd) sc
1219 Static -> text "[static]" <> space
1221 prettySe p bnd (PPi (Constraint _ _) n ty sc) =
1223 prettySe 10 bnd ty <+> text "=>" </> prettySe 10 ((n, True):bnd) sc
1224 prettySe p bnd (PPi (TacImp _ _ s) n ty sc) =
1226 lbrace <> kwd "tacimp" <+> pretty n <+> colon <+> prettySe 10 bnd ty <>
1227 rbrace <+> text "->" </> prettySe 10 ((n, True):bnd) sc
1228 prettySe p bnd (PApp _ (PRef _ f) args) -- normal names, no explicit args
1229 | UN nm <- basename f
1230 , not (ppopt_impl ppo) && null (getExps args) =
1231 if isAlpha (thead nm)
1232 then prettyName (ppopt_impl ppo) bnd f
1233 else enclose lparen rparen $ prettyName (ppopt_impl ppo) bnd f
1234 prettySe p bnd (PAppBind _ (PRef _ f) [])
1235 | not (ppopt_impl ppo) = text "!" <> prettyName (ppopt_impl ppo) bnd f
1236 prettySe p bnd (PApp _ (PRef _ op) args) -- infix operators
1237 | UN nm <- basename op
1239 (not (ppopt_impl ppo)) && (not $ isAlpha (thead nm)) =
1240 case getExps args of
1241 [] -> enclose lparen rparen opName
1242 [x] -> group (enclose lparen rparen opName <$> group (prettySe 0 bnd x))
1243 [l,r] -> let precedence = fromMaybe 20 (fmap prec f)
1244 in bracket p precedence $ inFix l r
1245 (l:r:rest) -> bracket p 1 $
1246 enclose lparen rparen (inFix l r) <+>
1247 align (group (vsep (map (prettyArgSe bnd) rest)))
1248 where opName = prettyName (ppopt_impl ppo) bnd op
1249 f = getFixity (opStr op)
1251 Nothing -> prettySe (-1) bnd l
1252 Just (Infixl p') -> prettySe p' bnd l
1253 Just f' -> prettySe (prec f'-1) bnd l
1255 Nothing -> prettySe (-1) bnd r
1256 Just (Infixr p') -> prettySe p' bnd r
1257 Just f' -> prettySe (prec f'-1) bnd r
1258 inFix l r = align . group $
1259 (left l <+> opName) <$> group (right r)
1260 prettySe p bnd (PApp _ hd@(PRef fc f) [tm]) -- symbols, like 'foo
1261 | PConstant (Idris.Core.TT.Str str) <- getTm tm,
1262 f == sUN "Symbol_" = annotate (AnnType ("'" ++ str) ("The symbol " ++ str)) $
1263 char '\'' <> prettySe 10 bnd (PRef fc (sUN str))
1264 prettySe p bnd (PApp _ f as) = -- Normal prefix applications
1265 let args = getExps as
1266 fp = prettySe 1 bnd f
1268 bracket p 1 . group $
1272 else fp <+> align (vsep (map (prettyArgS bnd) as))
1275 else fp <+> align (vsep (map (prettyArgSe bnd) args))
1276 prettySe p bnd (PCase _ scr opts) =
1277 kwd "case" <+> prettySe 10 bnd scr <+> kwd "of" <> prettyBody
1279 prettyBody = foldr (<>) empty $ intersperse (text "|") $ map sc opts
1281 sc (l, r) = nest nestingSize $ prettySe 10 bnd l <+> text "=>" <+> prettySe 10 bnd r
1282 prettySe p bnd (PHidden tm) = text "." <> prettySe 0 bnd tm
1283 prettySe p bnd (PRefl _ _) = annName eqCon $ text "refl"
1284 prettySe p bnd (PResolveTC _) = text "resolvetc"
1285 prettySe p bnd (PTrue _ IsType) = annName unitTy $ text "()"
1286 prettySe p bnd (PTrue _ IsTerm) = annName unitCon $ text "()"
1287 prettySe p bnd (PTrue _ TypeOrTerm) = text "()"
1288 prettySe p bnd (PFalse _) = annName falseTy $ text "_|_"
1289 prettySe p bnd (PEq _ l r) =
1290 bracket p 2 . align . group $
1291 prettySe 10 bnd l <+> eq <$> group (prettySe 10 bnd r)
1292 where eq = annName eqTy (text "=")
1293 prettySe p bnd (PRewrite _ l r _) =
1295 text "rewrite" <+> prettySe 10 bnd l <+> text "in" <+> prettySe 10 bnd r
1296 prettySe p bnd (PTyped l r) =
1297 lparen <> prettySe 10 bnd l <+> colon <+> prettySe 10 bnd r <> rparen
1298 prettySe p bnd pair@(PPair _ pun _ _) -- flatten tuples to the right, like parser
1299 | Just elts <- pairElts pair = enclose (ann lparen) (ann rparen) .
1300 align . group . vsep . punctuate (ann comma) $
1301 map (prettySe 10 bnd) elts
1302 where ann = case pun of
1304 IsType -> annName pairTy
1305 IsTerm -> annName pairCon
1306 prettySe p bnd (PDPair _ TypeOrTerm l t r) =
1307 lparen <> prettySe 10 bnd l <+> text "**" <+> prettySe 10 bnd r <> rparen
1308 prettySe p bnd (PDPair _ IsType (PRef _ n) t r) =
1309 annName sigmaTy lparen <>
1310 bindingOf n False <+>
1311 annName sigmaTy (text "**") <+>
1312 prettySe 10 ((n, False):bnd) r <>
1313 annName sigmaTy rparen
1314 prettySe p bnd (PDPair _ IsType l t r) =
1315 annName sigmaTy lparen <>
1316 prettySe 10 bnd l <+>
1317 annName sigmaTy (text "**") <+>
1318 prettySe 10 bnd r <>
1319 annName sigmaTy rparen
1320 prettySe p bnd (PDPair _ IsTerm l t r) =
1321 annName existsCon lparen <>
1322 prettySe 10 bnd l <+>
1323 annName existsCon (text "**") <+>
1324 prettySe 10 bnd r <>
1325 annName existsCon rparen
1326 prettySe p bnd (PAlternative a as) =
1327 lparen <> text "|" <> prettyAs <> text "|" <> rparen
1330 foldr (\l -> \r -> l <+> text "," <+> r) empty $ map (prettySe 10 bnd) as
1331 prettySe p bnd PType = annotate (AnnType "Type" "The type of types") $ text "Type"
1332 prettySe p bnd (PConstant c) = annotate (AnnConst c) (text (show c))
1333 -- XXX: add pretty for tactics
1334 prettySe p bnd (PProof ts) =
1335 text "proof" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1336 prettySe p bnd (PTactics ts) =
1337 text "tactics" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1338 prettySe p bnd (PMetavar n) = text "?" <> pretty n
1339 prettySe p bnd (PReturn f) = kwd "return"
1340 prettySe p bnd PImpossible = kwd "impossible"
1341 prettySe p bnd Placeholder = text "_"
1342 prettySe p bnd (PDoBlock _) = text "do block pretty not implemented"
1343 prettySe p bnd (PCoerced t) = prettySe p bnd t
1344 prettySe p bnd (PElabError s) = pretty s
1346 prettySe p bnd _ = text "test"
1348 prettyArgS bnd (PImp _ _ _ n tm) = prettyArgSi bnd (n, tm)
1349 prettyArgS bnd (PExp _ _ _ tm) = prettyArgSe bnd tm
1350 prettyArgS bnd (PConstraint _ _ _ tm) = prettyArgSc bnd tm
1351 prettyArgS bnd (PTacImplicit _ _ n _ tm) = prettyArgSti bnd (n, tm)
1353 prettyArgSe bnd arg = prettySe 0 bnd arg
1354 prettyArgSi bnd (n, val) = lbrace <> pretty n <+> text "=" <+> prettySe 10 bnd val <> rbrace
1355 prettyArgSc bnd val = lbrace <> lbrace <> prettySe 10 bnd val <> rbrace <> rbrace
1356 prettyArgSti bnd (n, val) = lbrace <> kwd "auto" <+> pretty n <+> text "=" <+> prettySe 10 bnd val <> rbrace
1358 annName :: Name -> Doc OutputAnnotation -> Doc OutputAnnotation
1359 annName n = annotate (AnnName n Nothing Nothing Nothing)
1361 opStr :: Name -> String
1362 opStr (NS n _) = opStr n
1363 opStr (UN n) = T.unpack n
1365 basename :: Name -> Name
1366 basename (NS n _) = basename n
1369 slist' p bnd (PApp _ (PRef _ nil) _)
1370 | not (ppopt_impl ppo) && nsroot nil == sUN "Nil" = Just []
1371 slist' p bnd (PRef _ nil)
1372 | not (ppopt_impl ppo) && nsroot nil == sUN "Nil" = Just []
1373 slist' p bnd (PApp _ (PRef _ cons) args)
1374 | nsroot cons == sUN "::",
1375 (PExp {getTm=tl}):(PExp {getTm=hd}):imps <- reverse args,
1377 Just tl' <- slist' p bnd tl
1380 isImp (PImp {}) = True
1382 slist' _ _ tm = Nothing
1384 slist p bnd e | Just es <- slist' p bnd e = Just $
1385 case es of [] -> annotate (AnnData "" "") $ text "[]"
1386 [x] -> enclose left right . group $
1388 xs -> (enclose left right .
1389 align . group . vsep .
1391 map (prettySe p bnd)) xs
1392 where left = (annotate (AnnData "" "") (text "["))
1393 right = (annotate (AnnData "" "") (text "]"))
1394 comma = (annotate (AnnData "" "") (text ","))
1395 slist _ _ _ = Nothing
1397 pairElts :: PTerm -> Maybe [PTerm]
1398 pairElts (PPair _ _ x y) | Just elts <- pairElts y = Just (x:elts)
1399 | otherwise = Just [x, y]
1400 pairElts _ = Nothing
1402 natns = "Prelude.Nat."
1405 | show z == (natns++"Z") || show z == "Z" = Just 0
1406 snat p (PApp _ s [PExp {getTm=n}])
1407 | show s == (natns++"S") || show s == "S",
1412 bracket outer inner doc
1413 | inner > outer = lparen <> doc <> rparen
1416 kwd = annotate AnnKeyword . text
1418 fixities :: M.Map String Fixity
1419 fixities = M.fromList [(s, f) | (Fix f s) <- infixes]
1421 getFixity :: String -> Maybe Fixity
1422 getFixity = flip M.lookup fixities
1424-- | Pretty-printer helper for the binding site of a name
1425bindingOf :: Name -- ^^ the bound name
1426 -> Bool -- ^^ whether the name is implicit
1427 -> Doc OutputAnnotation
1428bindingOf n imp = annotate (AnnBoundName n imp) (text (show n))
1430-- | Pretty-printer helper for names that attaches the correct annotations
1431prettyName :: Bool -- ^^ whether to show namespaces
1432 -> [(Name, Bool)] -- ^^ the current bound variables and whether they are implicit
1433 -> Name -- ^^ the name to pprint
1434 -> Doc OutputAnnotation
1435prettyName showNS bnd n | Just imp <- lookup n bnd = annotate (AnnBoundName n imp) (text (strName n))
1436 | otherwise = annotate (AnnName n Nothing Nothing Nothing) (text (strName n))
1437 where strName (UN n) = T.unpack n
1438 strName (NS n ns) | showNS = (concatMap (++ ".") . map T.unpack . reverse) ns ++ strName n
1439 | otherwise = strName n
1440 strName n | n == falseTy = "_|_"
1441 strName (MN i s) = T.unpack s
1442 strName other = show other
1445showCImp :: PPOption -> PClause -> Doc OutputAnnotation
1446showCImp ppo (PClause _ n l ws r w)
1447 = prettyImp ppo l <+> showWs ws <+> text "=" <+> prettyImp ppo r
1448 <+> text "where" <+> text (show w)
1451 showWs (x : xs) = text "|" <+> prettyImp ppo x <+> showWs xs
1452showCImp ppo (PWith _ n l ws r w)
1453 = prettyImp ppo l <+> showWs ws <+> text "with" <+> prettyImp ppo r
1454 <+> braces (text (show w))
1457 showWs (x : xs) = text "|" <+> prettyImp ppo x <+> showWs xs
1460showDImp :: PPOption -> PData -> Doc OutputAnnotation
1461showDImp ppo (PDatadecl n ty cons)
1462 = text "data" <+> text (show n) <+> colon <+> prettyImp ppo ty <+> text "where" <$>
1463 (indent 2 $ vsep (map (\ (_, _, n, t, _, _) -> pipe <+> prettyName False [] n <+> colon <+> prettyImp ppo t) cons))
1465showDecls :: PPOption -> [PDecl] -> Doc OutputAnnotation
1466showDecls o ds = vsep (map (showDeclImp o) ds)
1468showDeclImp _ (PFix _ f ops) = text (show f) <+> cat (punctuate (text ",") (map text ops))
1469showDeclImp o (PTy _ _ _ _ _ n t) = text "tydecl" <+> text (showCG n) <+> colon <+> prettyImp o t
1470showDeclImp o (PClauses _ _ n cs) = text "pat" <+> text (showCG n) <+> text "\t" <+>
1471 indent 2 (vsep (map (showCImp o) cs))
1472showDeclImp o (PData _ _ _ _ _ d) = showDImp o { ppopt_impl = True } d
1473showDeclImp o (PParams _ ns ps) = text "params" <+> braces (text (show ns) <> line <> showDecls o ps <> line)
1474showDeclImp o (PNamespace n ps) = text "namespace" <+> text n <> braces (line <> showDecls o ps <> line)
1475showDeclImp _ (PSyntax _ syn) = text "syntax" <+> text (show syn)
1476showDeclImp o (PClass _ _ _ cs n ps _ ds)
1477 = text "class" <+> text (show cs) <+> text (show n) <+> text (show ps) <> line <> showDecls o ds
1478showDeclImp o (PInstance _ _ cs n _ t _ ds)
1479 = text "instance" <+> text (show cs) <+> text (show n) <+> prettyImp o t <> line <> showDecls o ds
1480showDeclImp _ _ = text "..."
1481-- showDeclImp (PImport o) = "import " ++ o
1483instance Show (Doc OutputAnnotation) where
1484 show = flip (displayS . renderCompact) ""
1486getImps :: [PArg] -> [(Name, PTerm)]
1488getImps (PImp _ _ _ n tm : xs) = (n, tm) : getImps xs
1489getImps (_ : xs) = getImps xs
1491getExps :: [PArg] -> [PTerm]
1493getExps (PExp _ _ _ tm : xs) = tm : getExps xs
1494getExps (_ : xs) = getExps xs
1496getConsts :: [PArg] -> [PTerm]
1498getConsts (PConstraint _ _ _ tm : xs) = tm : getConsts xs
1499getConsts (_ : xs) = getConsts xs
1501getAll :: [PArg] -> [PTerm]
1506showName :: Maybe IState -- ^^ the Idris state, for information about names and colours
1507 -> [(Name, Bool)] -- ^^ the bound variables and whether they're implicit
1508 -> PPOption -- ^^ pretty printing options
1509 -> Bool -- ^^ whether to colourise
1510 -> Name -- ^^ the term to show
1512showName ist bnd ppo colour n = case ist of
1513 Just i -> if colour then colourise n (idris_colourTheme i) else showbasic n
1514 Nothing -> showbasic n
1515 where name = if ppopt_impl ppo then show n else showbasic n
1516 showbasic n@(UN _) = showCG n
1517 showbasic (MN _ s) = str s
1518 showbasic (NS n s) = showSep "." (map str (reverse s)) ++ "." ++ showbasic n
1519 showbasic (SN s) = show s
1521 colourise n t = let ctxt' = fmap tt_ctxt ist in
1524 Just ctxt | Just impl <- lookup n bnd -> if impl then colouriseImplicit t name
1525 else colouriseBound t name
1526 | isDConName n ctxt -> colouriseData t name
1527 | isFnName n ctxt -> colouriseFun t name
1528 | isTConName n ctxt -> colouriseType t name
1529 -- The assumption is that if a name is not bound and does not exist in the
1530 -- global context, then we're somewhere in which implicit info has been lost
1531 -- (like error messages). Thus, unknown vars are colourised as implicits.
1532 | otherwise -> colouriseImplicit t name
1534showTm :: IState -- ^^ the Idris state, for information about identifiers and colours
1535 -> PTerm -- ^^ the term to show
1537showTm ist = displayDecorated (consoleDecorate ist) .
1538 renderPretty 0.8 100000 .
1539 prettyImp (ppOptionIst ist)
1541-- | Show a term with implicits, no colours
1542showTmImpls :: PTerm -> String
1543showTmImpls = flip (displayS . renderCompact . prettyImp verbosePPOption) ""
1547instance Sized PTerm where
1548 size (PQuote rawTerm) = size rawTerm
1549 size (PRef fc name) = size name
1550 size (PLam name ty bdy) = 1 + size ty + size bdy
1551 size (PPi plicity name ty bdy) = 1 + size ty + size bdy
1552 size (PLet name ty def bdy) = 1 + size ty + size def + size bdy
1553 size (PTyped trm ty) = 1 + size trm + size ty
1554 size (PApp fc name args) = 1 + size args
1555 size (PAppBind fc name args) = 1 + size args
1556 size (PCase fc trm bdy) = 1 + size trm + size bdy
1557 size (PTrue fc _) = 1
1558 size (PFalse fc) = 1
1559 size (PRefl fc _) = 1
1560 size (PResolveTC fc) = 1
1561 size (PEq fc left right) = 1 + size left + size right
1562 size (PRewrite fc left right _) = 1 + size left + size right
1563 size (PPair fc _ left right) = 1 + size left + size right
1564 size (PDPair fs _ left ty right) = 1 + size left + size ty + size right
1565 size (PAlternative a alts) = 1 + size alts
1566 size (PHidden hidden) = size hidden
1567 size (PUnifyLog tm) = size tm
1568 size (PDisamb _ tm) = size tm
1569 size (PNoImplicits tm) = size tm
1571 size (PConstant const) = 1 + size const
1572 size Placeholder = 1
1573 size (PDoBlock dos) = 1 + size dos
1574 size (PIdiom fc term) = 1 + size term
1575 size (PReturn fc) = 1
1576 size (PMetavar name) = 1
1577 size (PProof tactics) = size tactics
1578 size (PElabError err) = size err
1579 size PImpossible = 1
1581getPArity :: PTerm -> Int
1582getPArity (PPi _ _ _ sc) = 1 + getPArity sc
1585-- Return all names, free or globally bound, in the given term.
1587allNamesIn :: PTerm -> [Name]
1588allNamesIn tm = nub $ ni [] tm
1589 where -- TODO THINK added niTacImp, but is it right?
1591 | not (n `elem` env) = [n]
1592 ni env (PPatvar _ n) = [n]
1593 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1594 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1595 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1596 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1597 ni env (PPi p n ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
1598 ni env (PHidden tm) = ni env tm
1599 ni env (PEq _ l r) = ni env l ++ ni env r
1600 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1601 ni env (PTyped l r) = ni env l ++ ni env r
1602 ni env (PPair _ _ l r) = ni env l ++ ni env r
1603 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1604 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1605 ni env (PAlternative a ls) = concatMap (ni env) ls
1606 ni env (PUnifyLog tm) = ni env tm
1607 ni env (PDisamb _ tm) = ni env tm
1608 ni env (PNoImplicits tm) = ni env tm
1611 niTacImp env (TacImp _ _ scr) = ni env scr
1614-- Return all names defined in binders in the given term
1615boundNamesIn :: PTerm -> [Name]
1616boundNamesIn tm = nub $ ni tm
1617 where -- TODO THINK Added niTacImp, but is it right?
1618 ni (PApp _ f as) = ni f ++ concatMap (ni) (map getTm as)
1619 ni (PAppBind _ f as) = ni f ++ concatMap (ni) (map getTm as)
1620 ni (PCase _ c os) = ni c ++ concatMap (ni) (map snd os)
1621 ni (PLam n ty sc) = n : (ni ty ++ ni sc)
1622 ni (PLet n ty val sc) = n : (ni ty ++ ni val ++ ni sc)
1623 ni (PPi p n ty sc) = niTacImp p ++ (n : (ni ty ++ ni sc))
1624 ni (PEq _ l r) = ni l ++ ni r
1625 ni (PRewrite _ l r _) = ni l ++ ni r
1626 ni (PTyped l r) = ni l ++ ni r
1627 ni (PPair _ _ l r) = ni l ++ ni r
1628 ni (PDPair _ _ (PRef _ n) t r) = ni t ++ ni r
1629 ni (PDPair _ _ l t r) = ni l ++ ni t ++ ni r
1630 ni (PAlternative a as) = concatMap (ni) as
1631 ni (PHidden tm) = ni tm
1632 ni (PUnifyLog tm) = ni tm
1633 ni (PDisamb _ tm) = ni tm
1634 ni (PNoImplicits tm) = ni tm
1637 niTacImp (TacImp _ _ scr) = ni scr
1640-- Return names which are free in the given term.
1641namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name]
1642namesIn uvars ist tm = nub $ ni [] tm
1645 | not (n `elem` env)
1646 = case lookupTy n (tt_ctxt ist) of
1648 _ -> if n `elem` (map fst uvars) then [n] else []
1649 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1650 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1651 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1652 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1653 ni env (PPi p n ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
1654 ni env (PEq _ l r) = ni env l ++ ni env r
1655 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1656 ni env (PTyped l r) = ni env l ++ ni env r
1657 ni env (PPair _ _ l r) = ni env l ++ ni env r
1658 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1659 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1660 ni env (PAlternative a as) = concatMap (ni env) as
1661 ni env (PHidden tm) = ni env tm
1662 ni env (PUnifyLog tm) = ni env tm
1663 ni env (PDisamb _ tm) = ni env tm
1664 ni env (PNoImplicits tm) = ni env tm
1667 niTacImp env (TacImp _ _ scr) = ni env scr
1670-- Return which of the given names are used in the given term.
1672usedNamesIn :: [Name] -> IState -> PTerm -> [Name]
1673usedNamesIn vars ist tm = nub $ ni [] tm
1674 where -- TODO THINK added niTacImp, but is it right?
1676 | n `elem` vars && not (n `elem` env)
1677 = case lookupDefExact n (tt_ctxt ist) of
1680 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1681 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1682 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1683 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1684 ni env (PPi p n ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
1685 ni env (PEq _ l r) = ni env l ++ ni env r
1686 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1687 ni env (PTyped l r) = ni env l ++ ni env r
1688 ni env (PPair _ _ l r) = ni env l ++ ni env r
1689 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1690 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1691 ni env (PAlternative a as) = concatMap (ni env) as
1692 ni env (PHidden tm) = ni env tm
1693 ni env (PUnifyLog tm) = ni env tm
1694 ni env (PDisamb _ tm) = ni env tm
1695 ni env (PNoImplicits tm) = ni env tm
1698 niTacImp env (TacImp _ _ scr) = ni env scr
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list