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 LanguageExt = TypeProviders | ErrorReflection deriving (Show, Eq, Read, Ord)
100-- | The output mode in use
101data OutputMode = RawOutput | IdeSlave Integer deriving Show
103-- | How wide is the console?
104data ConsoleWidth = InfinitelyWide -- ^ Have pretty-printer assume that lines should not be broken
105 | ColsWide Int -- ^ Manually specified - must be positive
106 | AutomaticWidth -- ^ Attempt to determine width, or 80 otherwise
108-- | The global state used in the Idris monad
109data IState = IState {
110 tt_ctxt :: Context, -- ^ All the currently defined names and their terms
111 idris_constraints :: [(UConstraint, FC)],
112 -- ^ A list of universe constraints and their corresponding source locations
113 idris_infixes :: [FixDecl], -- ^ Currently defined infix operators
114 idris_implicits :: Ctxt [PArg],
115 idris_statics :: Ctxt [Bool],
116 idris_classes :: Ctxt ClassInfo,
117 idris_dsls :: Ctxt DSL,
118 idris_optimisation :: Ctxt OptInfo,
119 idris_datatypes :: Ctxt TypeInfo,
120 idris_namehints :: Ctxt [Name],
121 idris_patdefs :: Ctxt ([([Name], Term, Term)], [PTerm]), -- not exported
122 -- ^ list of lhs/rhs, and a list of missing clauses
123 idris_flags :: Ctxt [FnOpt],
124 idris_callgraph :: Ctxt CGInfo, -- name, args used in each pos
125 idris_calledgraph :: Ctxt [Name],
126 idris_docstrings :: Ctxt (Docstring, [(Name, Docstring)]),
127 idris_tyinfodata :: Ctxt TIData,
128 idris_totcheck :: [(FC, Name)], -- names to check totality on
129 idris_defertotcheck :: [(FC, Name)], -- names to check at the end
130 idris_options :: IOption,
132 idris_lineapps :: [((FilePath, Int), PTerm)],
133 -- ^ Full application LHS on source line
134 idris_metavars :: [(Name, (Maybe Name, Int, Bool))], -- ^ The currently defined but not proven metavariables
135 idris_coercions :: [Name],
136 idris_transforms :: [(Term, Term)],
137 idris_errRev :: [(Term, Term)],
138 syntax_rules :: [Syntax],
139 syntax_keywords :: [String],
140 imported :: [FilePath], -- ^ The imported modules
141 idris_scprims :: [(Name, (Int, PrimFn))],
142 idris_objs :: [(Codegen, FilePath)],
143 idris_libs :: [(Codegen, String)],
144 idris_cgflags :: [(Codegen, String)],
145 idris_hdrs :: [(Codegen, String)],
146 idris_imported :: [FilePath], -- ^ Imported ibc file names
147 proof_list :: [(Name, [String])],
149 parserWarnings :: [(FC, Err)],
150 lastParse :: Maybe Name,
151 indent_stack :: [Int],
152 brace_stack :: [Maybe Int],
153 lastTokenSpan :: Maybe FC, -- ^ What was the span of the latest token parsed?
154 hide_list :: [(Name, Maybe Accessibility)],
155 default_access :: Accessibility,
156 default_total :: Bool,
157 ibc_write :: [IBCWrite],
158 compiled_so :: Maybe String,
159 idris_dynamic_libs :: [DynamicLib],
160 idris_language_extensions :: [LanguageExt],
161 idris_outputmode :: OutputMode,
162 idris_colourRepl :: Bool,
163 idris_colourTheme :: ColourTheme,
164 idris_outh :: Handle,
165 idris_errorhandlers :: [Name], -- ^ Global error handlers
166 idris_nameIdx :: (Int, Ctxt (Int, Name)),
167 idris_function_errorhandlers :: Ctxt (M.Map Name (S.Set Name)), -- ^ Specific error handlers
168 module_aliases :: M.Map [T.Text] [T.Text],
169 idris_consolewidth :: ConsoleWidth, -- ^ How many chars wide is the console?
170 idris_postulates :: S.Set Name,
171 idris_whocalls :: Maybe (M.Map Name [Name]),
172 idris_callswho :: Maybe (M.Map Name [Name])
175data SizeChange = Smaller | Same | Bigger | Unknown
178deriving instance Binary SizeChange
179deriving instance NFData SizeChange
182type SCGEntry = (Name, [Maybe (Int, SizeChange)])
183type UsageReason = (Name, Int) -- fn_name, its_arg_number
185data CGInfo = CGInfo { argsdef :: [Name],
186 calls :: [(Name, [[Name]])],
189 usedpos :: [(Int, [UsageReason])] }
192deriving instance Binary CGInfo
193deriving instance NFData CGInfo
196primDefs = [sUN "unsafePerformPrimIO",
197 sUN "mkLazyForeignPrim",
201-- information that needs writing for the current module's .ibc file
202data IBCWrite = IBCFix FixDecl
206 | IBCInstance Bool Name Name
214 | IBCObj Codegen FilePath
215 | IBCLib Codegen String
216 | IBCCGFlag Codegen String
218 | IBCHeader Codegen String
219 | IBCAccess Name Accessibility
220 | IBCMetaInformation Name MetaInformation
221 | IBCTotal Name Totality
222 | IBCFlags Name [FnOpt]
223 | IBCTrans (Term, Term)
224 | IBCErrRev (Term, Term)
228 | IBCDef Name -- i.e. main context
229 | IBCNameHint (Name, Name)
230 | IBCLineApp FilePath Int PTerm
231 | IBCErrorHandler Name
232 | IBCFunctionErrorHandler Name Name Name
236-- | The initial state for the compiler
238idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext
239 emptyContext emptyContext emptyContext emptyContext
240 emptyContext emptyContext emptyContext emptyContext
241 emptyContext emptyContext
242 [] [] defaultOpts 6 [] [] [] [] [] [] [] [] [] [] [] [] []
243 [] [] Nothing [] Nothing [] [] Nothing [] Hidden False [] Nothing [] [] RawOutput
244 True defaultTheme stdout [] (0, emptyContext) emptyContext M.empty
245 AutomaticWidth S.empty Nothing Nothing
247-- | The monad for the main REPL - reading and processing files and updating
248-- global state (hence the IO inner monad).
249--type Idris = WriterT [Either String (IO ())] (State IState a))
250type Idris = StateT IState (ErrorT Err IO)
252-- Commands in the REPL
271 | ChangeDirectory FilePath
274 | Compile Codegen String
279 | AddProof (Maybe Name)
290 | DynamicLink FilePath
295 | CaseSplitAt Bool Int Name
296 | AddClauseFrom Bool Int Name
297 | AddProofClauseFrom Bool Int Name
298 | AddMissing Bool Int Name
299 | MakeWith Bool Int Name
300 | DoProofSearch Bool -- ^ update
301 Bool -- ^ recursive (i.e. do arguments too)
306 | SetColour ColourType IdrisColour
310 | SetConsoleWidth ConsoleWidth
314 | MakeDoc String -- IdrisDoc
317data Opt = Filename String
327 | NoBuiltins -- only for the really primitive stuff!
348 | PkgMkDoc String -- IdrisDoc
355 | OutputTy OutputType
356 | Extension LanguageExt
357 | InterpretScript String
359 | TargetTriple String
364 | AutoWidth -- ^ Automatically adjust terminal width
365 | AutoSolve -- ^ Automatically issue "solve" tactic in interactive prover
368-- Parsed declarations
370data Fixity = Infixl { prec :: Int }
371 | Infixr { prec :: Int }
372 | InfixN { prec :: Int }
373 | PrefixN { prec :: Int }
376deriving instance Binary Fixity
377deriving instance NFData Fixity
380instance Show Fixity where
381 show (Infixl i) = "infixl " ++ show i
382 show (Infixr i) = "infixr " ++ show i
383 show (InfixN i) = "infix " ++ show i
384 show (PrefixN i) = "prefix " ++ show i
386data FixDecl = Fix Fixity String
389instance Show FixDecl where
390 show (Fix f s) = show f ++ " " ++ s
393deriving instance Binary FixDecl
394deriving instance NFData FixDecl
397instance Ord FixDecl where
398 compare (Fix x _) (Fix y _) = compare (prec x) (prec y)
401data Static = Static | Dynamic
404deriving instance Binary Static
405deriving instance NFData Static
408-- Mark bindings with their explicitness, and laziness
409data Plicity = Imp { pargopts :: [ArgOpt],
412 | Exp { pargopts :: [ArgOpt],
414 pparam :: Bool } -- this is a param (rather than index)
415 | Constraint { pargopts :: [ArgOpt],
417 | TacImp { pargopts :: [ArgOpt],
423deriving instance Binary Plicity
424deriving instance NFData Plicity
427impl = Imp [] Dynamic False
428expl = Exp [] Dynamic False
429expl_param = Exp [] Dynamic True
430constraint = Constraint [] Dynamic
431tacimpl t = TacImp [] Dynamic t
433data FnOpt = Inlinable -- always evaluate when simplifying
434 | TotalFn | PartialFn | CoveringFn
435 | Coinductive | AssertTotal
436 | Dictionary -- type class dictionary, eval only when
437 -- a function argument, and further evaluation resutls
438 | Implicit -- implicit coercion
439 | CExport String -- export, with a C name
440 | ErrorHandler -- ^^ an error handler for use with the ErrorReflection extension
441 | ErrorReverse -- ^^ attempt to reverse normalise before showing in error
442 | Reflection -- a reflecting function, compile-time only
443 | Specialise [(Name, Maybe Int)] -- specialise it, freeze these names
446deriving instance Binary FnOpt
447deriving instance NFData FnOpt
452inlinable :: FnOpts -> Bool
453inlinable = elem Inlinable
455dictionary :: FnOpts -> Bool
456dictionary = elem Dictionary
459-- | Data declaration options
460data DataOpt = Codata -- Set if the the data-type is coinductive
461 | DefaultEliminator -- Set if an eliminator should be generated for data type
465type DataOpts = [DataOpt]
467-- | Type provider - what to provide
468data ProvideWhat = ProvTerm -- ^ only allow providing terms
469 | ProvPostulate -- ^ only allow postulates
470 | ProvAny -- ^ either is ok
473-- | Top-level declarations such as compiler directives, definitions,
474-- datatypes and typeclasses.
476 = PFix FC Fixity [String] -- ^ Fixity declaration
477 | PTy Docstring [(Name, Docstring)] SyntaxInfo FC FnOpts Name t -- ^ Type declaration
478 | PPostulate Docstring SyntaxInfo FC FnOpts Name t -- ^ Postulate
479 | PClauses FC FnOpts Name [PClause' t] -- ^ Pattern clause
480 | PCAF FC Name t -- ^ Top level constant
481 | PData Docstring [(Name, Docstring)] SyntaxInfo FC DataOpts (PData' t) -- ^ Data declaration.
482 | PParams FC [(Name, t)] [PDecl' t] -- ^ Params block
483 | PNamespace String [PDecl' t] -- ^ New namespace
484 | PRecord Docstring SyntaxInfo FC Name t DataOpts Docstring Name t -- ^ Record declaration
485 | PClass Docstring SyntaxInfo FC
488 [(Name, t)] -- parameters
489 [(Name, Docstring)] -- parameter docstrings
490 [PDecl' t] -- declarations
491 -- ^ Type class: arguments are documentation, syntax info, source location, constraints,
492 -- class name, parameters, method declarations
493 | PInstance SyntaxInfo FC [t] -- constraints
496 t -- full instance type
497 (Maybe Name) -- explicit name
499 -- ^ Instance declaration: arguments are syntax info, source location, constraints,
500 -- class name, parameters, full instance type, optional explicit name, and definitions
501 | PDSL Name (DSL' t) -- ^ DSL declaration
502 | PSyntax FC Syntax -- ^ Syntax definition
503 | PMutual FC [PDecl' t] -- ^ Mutual block
504 | PDirective (Idris ()) -- ^ Compiler directive. The parser inserts the corresponding action in the Idris monad.
505 | PProvider SyntaxInfo FC ProvideWhat Name t t -- ^ Type provider. The first t is the type, the second is the term
506 | PTransform FC Bool t t -- ^ Source-to-source transformation rule. If
507 -- bool is True, lhs and rhs must be convertible
510deriving instance Binary PDecl'
511deriving instance NFData PDecl'
514-- For elaborator state
515type ElabD a = Elab' [PDecl] a
517-- | One clause of a top-level definition. Term arguments to constructors are:
519-- 1. The whole application (missing for PClauseR and PWithR because they're within a "with" clause)
521-- 2. The list of extra 'with' patterns
523-- 3. The right-hand side
525-- 4. The where block (PDecl' t)
527data PClause' t = PClause FC Name t [t] t [PDecl' t] -- ^ A normal top-level definition.
528 | PWith FC Name t [t] t [PDecl' t]
529 | PClauseR FC [t] t [PDecl' t]
530 | PWithR FC [t] t [PDecl' t]
533deriving instance Binary PClause'
534deriving instance NFData PClause'
538data PData' t = PDatadecl { d_name :: Name, -- ^ The name of the datatype
539 d_tcon :: t, -- ^ Type constructor
540 d_cons :: [(Docstring, [(Name, Docstring)], Name, t, FC, [Name])] -- ^ Constructors
542 -- ^ Data declaration
543 | PLaterdecl { d_name :: Name, d_tcon :: t }
544 -- ^ "Placeholder" for data whose constructors are defined later
547deriving instance Binary PData'
548deriving instance NFData PData'
551-- Handy to get a free function for applying PTerm -> PTerm functions
552-- across a program, by deriving Functor
554type PDecl = PDecl' PTerm
555type PData = PData' PTerm
556type PClause = PClause' PTerm
558-- get all the names declared in a decl
560declared :: PDecl -> [Name]
561declared (PFix _ _ _) = []
562declared (PTy _ _ _ _ _ n t) = [n]
563declared (PPostulate _ _ _ _ n t) = [n]
564declared (PClauses _ _ n _) = [] -- not a declaration
565declared (PCAF _ n _) = [n]
566declared (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
567 where fstt (_, _, a, _, _, _) = a
568declared (PData _ _ _ _ _ (PLaterdecl n _)) = [n]
569declared (PParams _ _ ds) = concatMap declared ds
570declared (PNamespace _ ds) = concatMap declared ds
571declared (PRecord _ _ _ n _ _ _ c _) = [n, c]
572declared (PClass _ _ _ _ n _ _ ms) = n : concatMap declared ms
573declared (PInstance _ _ _ _ _ _ _ _) = []
574declared (PDSL n _) = [n]
575declared (PSyntax _ _) = []
576declared (PMutual _ ds) = concatMap declared ds
577declared (PDirective _) = []
579-- get the names declared, not counting nested parameter blocks
580tldeclared :: PDecl -> [Name]
581tldeclared (PFix _ _ _) = []
582tldeclared (PTy _ _ _ _ _ n t) = [n]
583tldeclared (PPostulate _ _ _ _ n t) = [n]
584tldeclared (PClauses _ _ n _) = [] -- not a declaration
585tldeclared (PRecord _ _ _ n _ _ _ c _) = [n, c]
586tldeclared (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
587 where fstt (_, _, a, _, _, _) = a
588tldeclared (PParams _ _ ds) = []
589tldeclared (PMutual _ ds) = concatMap tldeclared ds
590tldeclared (PNamespace _ ds) = concatMap tldeclared ds
591tldeclared (PClass _ _ _ _ n _ _ ms) = concatMap tldeclared ms
592tldeclared (PInstance _ _ _ _ _ _ _ _) = []
595defined :: PDecl -> [Name]
596defined (PFix _ _ _) = []
597defined (PTy _ _ _ _ _ n t) = []
598defined (PPostulate _ _ _ _ n t) = []
599defined (PClauses _ _ n _) = [n] -- not a declaration
600defined (PCAF _ n _) = [n]
601defined (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
602 where fstt (_, _, a, _, _, _) = a
603defined (PData _ _ _ _ _ (PLaterdecl n _)) = []
604defined (PParams _ _ ds) = concatMap defined ds
605defined (PNamespace _ ds) = concatMap defined ds
606defined (PRecord _ _ _ n _ _ _ c _) = [n, c]
607defined (PClass _ _ _ _ n _ _ ms) = n : concatMap defined ms
608defined (PInstance _ _ _ _ _ _ _ _) = []
609defined (PDSL n _) = [n]
610defined (PSyntax _ _) = []
611defined (PMutual _ ds) = concatMap defined ds
612defined (PDirective _) = []
615updateN :: [(Name, Name)] -> Name -> Name
616updateN ns n | Just n' <- lookup n ns = n'
619updateNs :: [(Name, Name)] -> PTerm -> PTerm
621updateNs ns t = mapPT updateRef t
622 where updateRef (PRef fc f) = PRef fc (updateN ns f)
625-- updateDNs :: [(Name, Name)] -> PDecl -> PDecl
627-- updateDNs ns (PTy s f n t) | Just n' <- lookup n ns = PTy s f n' t
628-- updateDNs ns (PClauses f n c) | Just n' <- lookup n ns = PClauses f n' (map updateCNs c)
629-- where updateCNs ns (PClause n l ts r ds)
630-- = PClause (updateN ns n) (fmap (updateNs ns) l)
631-- (map (fmap (updateNs ns)) ts)
632-- (fmap (updateNs ns) r)
633-- (map (updateDNs ns) ds)
636data PunInfo = IsType | IsTerm | TypeOrTerm deriving (Eq, Show)
638-- | High level language terms
639data PTerm = PQuote Raw
641 | PInferRef FC Name -- ^ A name to be defined later
643 | PLam Name PTerm PTerm
644 | PPi Plicity Name PTerm PTerm -- ^ (n : t1) -> t2
645 | PLet Name PTerm PTerm PTerm
646 | PTyped PTerm PTerm -- ^ Term with explicit type
647 | PApp FC PTerm [PArg] -- ^ e.g. IO (), List Char, length x
648 | PAppBind FC PTerm [PArg] -- ^ implicitly bound application
649 | PMatchApp FC Name -- ^ Make an application by type matching
650 | PCase FC PTerm [(PTerm, PTerm)]
651 | PTrue FC PunInfo -- ^ Unit type..?
655 | PEq FC PTerm PTerm -- ^ Equality type: A = B
656 | PRewrite FC PTerm PTerm (Maybe PTerm)
657 | PPair FC PunInfo PTerm PTerm
658 | PDPair FC PunInfo PTerm PTerm PTerm
659 | PAlternative Bool [PTerm] -- True if only one may work
660 | PHidden PTerm -- ^ Irrelevant or hidden pattern
661 | PType -- ^ 'Type' type
662 | PGoal FC PTerm Name PTerm
663 | PConstant Const -- ^ Builtin types
669 | PProof [PTactic] -- ^ Proof script
670 | PTactics [PTactic] -- ^ As PProof, but no auto solving
671 | PElabError Err -- ^ Error to report on elaboration
672 | PImpossible -- ^ Special case for declaring when an LHS can't typecheck
673 | PCoerced PTerm -- ^ To mark a coerced argument, so as not to coerce twice
674 | PDisamb [[T.Text]] PTerm -- ^ Preferences for explicit namespaces
675 | PUnifyLog PTerm -- ^ dump a trace of unifications when building term
676 | PNoImplicits PTerm -- ^ never run implicit converions on the term
681deriving instance Binary PTerm
682deriving instance NFData PTerm
685mapPT :: (PTerm -> PTerm) -> PTerm -> PTerm
686mapPT f t = f (mpt t) where
687 mpt (PLam n t s) = PLam n (mapPT f t) (mapPT f s)
688 mpt (PPi p n t s) = PPi p n (mapPT f t) (mapPT f s)
689 mpt (PLet n ty v s) = PLet n (mapPT f ty) (mapPT f v) (mapPT f s)
690 mpt (PRewrite fc t s g) = PRewrite fc (mapPT f t) (mapPT f s)
692 mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)
693 mpt (PAppBind fc t as) = PAppBind fc (mapPT f t) (map (fmap (mapPT f)) as)
694 mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)
695 mpt (PEq fc l r) = PEq fc (mapPT f l) (mapPT f r)
696 mpt (PTyped l r) = PTyped (mapPT f l) (mapPT f r)
697 mpt (PPair fc p l r) = PPair fc p (mapPT f l) (mapPT f r)
698 mpt (PDPair fc p l t r) = PDPair fc p (mapPT f l) (mapPT f t) (mapPT f r)
699 mpt (PAlternative a as) = PAlternative a (map (mapPT f) as)
700 mpt (PHidden t) = PHidden (mapPT f t)
701 mpt (PDoBlock ds) = PDoBlock (map (fmap (mapPT f)) ds)
702 mpt (PProof ts) = PProof (map (fmap (mapPT f)) ts)
703 mpt (PTactics ts) = PTactics (map (fmap (mapPT f)) ts)
704 mpt (PUnifyLog tm) = PUnifyLog (mapPT f tm)
705 mpt (PDisamb ns tm) = PDisamb ns (mapPT f tm)
706 mpt (PNoImplicits tm) = PNoImplicits (mapPT f tm)
707 mpt (PGoal fc r n sc) = PGoal fc (mapPT f r) n (mapPT f sc)
711data PTactic' t = Intro [Name] | Intros | Focus Name
712 | Refine Name [Bool] | Rewrite t | DoUnify
716 | LetTac Name t | LetTacTy Name t t
717 | Exact t | Compute | Trivial | TCInstance
718 | ProofSearch Bool -- ^ recursive
722 | ProofState | ProofTerm | Undo
723 | Try (PTactic' t) (PTactic' t)
724 | TSeq (PTactic' t) (PTactic' t)
725 | ApplyTactic t -- see Language.Reflection module
729 | GoalType String (PTactic' t)
733 deriving (Show, Eq, Functor)
735deriving instance Binary PTactic'
736deriving instance NFData PTactic'
738instance Sized a => Sized (PTactic' a) where
739 size (Intro nms) = 1 + size nms
741 size (Focus nm) = 1 + size nm
742 size (Refine nm bs) = 1 + size nm + length bs
743 size (Rewrite t) = 1 + size t
744 size (Induction t) = 1 + size t
745 size (LetTac nm t) = 1 + size nm + size t
746 size (Exact t) = 1 + size t
754 size (Try l r) = 1 + size l + size r
755 size (TSeq l r) = 1 + size l + size r
756 size (ApplyTactic t) = 1 + size t
757 size (Reflect t) = 1 + size t
758 size (Fill t) = 1 + size t
762type PTactic = PTactic' PTerm
764data PDo' t = DoExp FC t
766 | DoBindP FC t t [(t,t)]
769 deriving (Eq, Functor)
771deriving instance Binary PDo'
772deriving instance NFData PDo'
775instance Sized a => Sized (PDo' a) where
776 size (DoExp fc t) = 1 + size fc + size t
777 size (DoBind fc nm t) = 1 + size fc + size nm + size t
778 size (DoBindP fc l r alts) = 1 + size fc + size l + size r + size alts
779 size (DoLet fc nm l r) = 1 + size fc + size nm + size l + size r
780 size (DoLetP fc l r) = 1 + size fc + size l + size r
784-- The priority gives a hint as to elaboration order. Best to elaborate
785-- things early which will help give a more concrete type to other
786-- variables, e.g. a before (interpTy a).
788data PArg' t = PImp { priority :: Int,
789 machine_inf :: Bool, -- true if the machine inferred it
791 pname :: Name, getTm :: t }
792 | PExp { priority :: Int,
796 | PConstraint { priority :: Int,
800 | PTacImplicit { priority :: Int,
805 deriving (Show, Eq, Functor)
807data ArgOpt = HideDisplay | InaccessibleArg
810instance Sized a => Sized (PArg' a) where
811 size (PImp p _ l nm trm) = 1 + size nm + size trm
812 size (PExp p l nm trm) = 1 + size nm + size trm
813 size (PConstraint p l nm trm) = 1 + size nm +size nm + size trm
814 size (PTacImplicit p l nm scr trm) = 1 + size nm + size scr + size trm
817deriving instance Binary PArg'
818deriving instance NFData PArg'
821pimp n t mach = PImp 1 mach [] n t
822pexp t = PExp 1 [] (sMN 0 "arg") t
823pconst t = PConstraint 1 [] (sMN 0 "carg") t
824ptacimp n s t = PTacImplicit 2 [] n s t
826type PArg = PArg' PTerm
830data ClassInfo = CI { instanceName :: Name,
831 class_methods :: [(Name, (FnOpts, PTerm))],
832 class_defaults :: [(Name, (Name, PDecl))], -- method name -> default impl
833 class_default_superclasses :: [PDecl],
834 class_params :: [Name],
835 class_instances :: [Name] }
838deriving instance Binary ClassInfo
839deriving instance NFData ClassInfo
842-- Type inference data
844data TIData = TIPartial -- ^ a function with a partially defined type
845 | TISolution [Term] -- ^ possible solutions to a metavariable in a type
848data OptInfo = Optimise { inaccessible :: [(Int,Name)], -- includes names for error reporting
852deriving instance Binary OptInfo
853deriving instance NFData OptInfo
857data TypeInfo = TI { con_names :: [Name],
859 data_opts :: DataOpts,
863deriving instance Binary TypeInfo
864deriving instance NFData TypeInfo
867-- Syntactic sugar info
869data DSL' t = DSL { dsl_bind :: t,
874 index_first :: Maybe t,
875 index_next :: Maybe t,
876 dsl_lambda :: Maybe t,
879 deriving (Show, Functor)
881deriving instance Binary DSL'
882deriving instance NFData DSL'
887data SynContext = PatternSyntax | TermSyntax | AnySyntax
890deriving instance Binary SynContext
891deriving instance NFData SynContext
894data Syntax = Rule [SSymbol] PTerm SynContext
897deriving instance Binary Syntax
898deriving instance NFData Syntax
901data SSymbol = Keyword Name
908deriving instance Binary SSymbol
909deriving instance NFData SSymbol
912initDSL = DSL (PRef f (sUN ">>="))
913 (PRef f (sUN "return"))
915 (PRef f (sUN "pure"))
921 where f = fileFC "(builtin)"
923data Using = UImplicit Name PTerm
924 | UConstraint Name [Name]
927deriving instance Binary Using
928deriving instance NFData Using
931data SyntaxInfo = Syn { using :: [Using],
932 syn_params :: [(Name, PTerm)],
933 syn_namespace :: [String],
935 decoration :: Name -> Name,
937 implicitAllowed :: Bool,
941deriving instance NFData SyntaxInfo
942deriving instance Binary SyntaxInfo
945defaultSyntax = Syn [] [] [] [] id False False initDSL
947expandNS :: SyntaxInfo -> Name -> Name
948expandNS syn n@(NS _ _) = n
949expandNS syn n = case syn_namespace syn of
954-- For inferring types of things
958inferTy = sMN 0 "__Infer"
959inferCon = sMN 0 "__infer"
960inferDecl = PDatadecl inferTy
962 [(emptyDocstring, [], inferCon, PPi impl (sMN 0 "iType") PType (
963 PPi expl (sMN 0 "ival") (PRef bi (sMN 0 "iType"))
964 (PRef bi inferTy)), bi, [])]
967infTerm t = PApp bi (PRef bi inferCon) [pimp (sMN 0 "iType") Placeholder True, pexp t]
968infP = P (TCon 6 0) inferTy (TType (UVal 0))
970getInferTerm, getInferType :: Term -> Term
971getInferTerm (Bind n b sc) = Bind n b $ getInferTerm sc
972getInferTerm (App (App _ _) tm) = tm
973getInferTerm tm = tm -- error ("getInferTerm " ++ show tm)
975getInferType (Bind n b sc) = Bind n (toTy b) $ getInferType sc
976 where toTy (Lam t) = Pi t
977 toTy (PVar t) = PVTy t
979getInferType (App (App _ ty) _) = ty
983-- Handy primitives: Unit, False, Pair, MkPair, =, mkForeign, Elim type class
985primNames = [unitTy, unitCon,
986 falseTy, pairTy, pairCon,
987 eqTy, eqCon, inferTy, inferCon]
989unitDoc = parseDocstring . T.pack $ "The canonical single-element type, also known as the trivially true proposition."
990unitTy = sMN 0 "__Unit"
991unitCon = sMN 0 "__II"
992unitDecl = PDatadecl unitTy PType
993 [(parseDocstring . T.pack $ "The trivial constructor for `()`. ", [], unitCon, PRef bi unitTy, bi, [])]
994unitOpts = [DefaultEliminator]
996falseDoc = parseDocstring . T.pack $
997 "The empty type, also known as the trivially false proposition." ++
999 "Use `FalseElim` or `absurd` to prove anything if you have a variable " ++
1000 "of type `_|_` in scope."
1001falseTy = sMN 0 "__False"
1002falseDecl = PDatadecl falseTy PType []
1005pairDoc = parseDocstring . T.pack $ "The non-dependent pair type, also known as conjunction."
1006pairTy = sMN 0 "__Pair"
1007pairCon = sMN 0 "__MkPair"
1008pairDecl = PDatadecl pairTy (piBind [(n "A", PType), (n "B", PType)] PType)
1009 [(pairConDoc, pairConParamDoc,
1010 pairCon, PPi impl (n "A") PType (
1011 PPi impl (n "B") PType (
1012 PPi expl (n "a") (PRef bi (n "A")) (
1013 PPi expl (n "b") (PRef bi (n "B"))
1014 (PApp bi (PRef bi pairTy) [pexp (PRef bi (n "A")),
1015 pexp (PRef bi (n "B"))])))), bi, [])]
1017 pairConDoc = parseDocstring . T.pack $ "A pair of elements"
1018 pairConParamDoc = [(n "a", parseDocstring . T.pack $ "the left element of the pair"),
1019 (n "b", parseDocstring . T.pack $ "the right element of the pair")]
1021pairParamDoc = [(n "A", parseDocstring . T.pack $ "the type of the left elements in the pair"),
1022 (n "B", parseDocstring . T.pack $ "the type of the left elements in the pair")]
1027eqDoc = parseDocstring . T.pack $
1028 "The propositional equality type. A proof that `x` = `y`." ++
1030 "To use such a proof, pattern-match on it, and the two equal things will " ++
1031 "then need to be the _same_ pattern." ++
1033 "**Note**: Idris's equality type is _heterogeneous_, which means that it " ++
1034 "is possible to state equalities between values of potentially different " ++
1035 "types. This is sometimes referred to in the literature as \"John Major\" " ++
1038 "Thus, if Idris can't infer the type of one side of the equality, then " ++
1039 "you may need to annotate it. See the function `the`."
1041eqDecl = PDatadecl eqTy (piBind [(n "A", PType), (n "B", PType),
1042 (n "x", PRef bi (n "A")), (n "y", PRef bi (n "B"))]
1044 [(reflDoc, reflParamDoc,
1045 eqCon, PPi impl (n "A") PType (
1046 PPi impl (n "x") (PRef bi (n "A"))
1047 (PApp bi (PRef bi eqTy) [pimp (n "A") Placeholder False,
1048 pimp (n "B") Placeholder False,
1049 pexp (PRef bi (n "x")),
1050 pexp (PRef bi (n "x"))])), bi, [])]
1052 reflDoc = parseDocstring . T.pack $
1053 "A proof that `x` in fact equals `x`. To construct this, you must have already " ++
1054 "shown that both sides are in fact equal."
1055 reflParamDoc = [(n "A", parseDocstring . T.pack $ "the type at which the equality is proven"),
1056 (n "x", parseDocstring . T.pack $ "the element shown to be equal to itself.")]
1058eqParamDoc = [(n "A", parseDocstring . T.pack $ "the type of the left side of the equality"),
1059 (n "B", parseDocstring . T.pack $ "the type of the right side of the equality")
1065elimName = sUN "__Elim"
1066elimMethElimTy = sUN "__elimTy"
1067elimMethElim = sUN "elim"
1068elimDecl = PClass (parseDocstring . T.pack $ "Type class for eliminators") defaultSyntax bi [] elimName [(sUN "scrutineeType", PType)] []
1069 [PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElimTy PType,
1070 PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElim (PRef bi elimMethElimTy)]
1072-- Defined in builtins.idr
1073sigmaTy = sUN "Exists"
1074existsCon = sUN "Ex_intro"
1076piBind :: [(Name, PTerm)] -> PTerm -> PTerm
1077piBind = piBindp expl
1079piBindp :: Plicity -> [(Name, PTerm)] -> PTerm -> PTerm
1081piBindp p ((n, ty):ns) t = PPi p n ty (piBindp p ns t)
1084-- Pretty-printing declarations and terms
1086-- These "show" instances render to an absurdly wide screen because inserted line breaks
1087-- could interfere with interactive editing, which calls "show".
1089instance Show PTerm where
1090 showsPrec _ tm = (displayS . renderPretty 1.0 10000000 . prettyImp False) tm
1092instance Show PDecl where
1093 showsPrec _ d = (displayS . renderPretty 1.0 10000000 . showDeclImp False) d
1095instance Show PClause where
1096 showsPrec _ c = (displayS . renderPretty 1.0 10000000 . showCImp True) c
1098instance Show PData where
1099 showsPrec _ d = (displayS . renderPretty 1.0 10000000 . showDImp False) d
1101instance Pretty PTerm OutputAnnotation where
1102 pretty = prettyImp False
1104-- | Colourise annotations according to an Idris state. It ignores the names
1105-- in the annotation, as there's no good way to show extended information on a
1107consoleDecorate :: IState -> OutputAnnotation -> String -> String
1108consoleDecorate ist _ | not (idris_colourRepl ist) = id
1109consoleDecorate ist AnnConstData = let theme = idris_colourTheme ist
1110 in colouriseData theme
1111consoleDecorate ist AnnConstType = let theme = idris_colourTheme ist
1112 in colouriseType theme
1113consoleDecorate ist (AnnBoundName _ True) = colouriseImplicit (idris_colourTheme ist)
1114consoleDecorate ist (AnnBoundName _ False) = colouriseBound (idris_colourTheme ist)
1115consoleDecorate ist AnnKeyword = colouriseKeyword (idris_colourTheme ist)
1116consoleDecorate ist (AnnName n _ _ _) = let ctxt = tt_ctxt ist
1117 theme = idris_colourTheme ist
1119 _ | isDConName n ctxt -> colouriseData theme
1120 _ | isFnName n ctxt -> colouriseFun theme
1121 _ | isTConName n ctxt -> colouriseType theme
1122 _ | otherwise -> id -- don't colourise unknown names
1123consoleDecorate ist (AnnFC _) = id
1124consoleDecorate ist (AnnTextFmt fmt) = Idris.Colours.colourise (colour fmt)
1125 where colour BoldText = IdrisColour Nothing True False True False
1126 colour UnderlineText = IdrisColour Nothing True True False False
1127 colour ItalicText = IdrisColour Nothing True False False True
1129-- | Pretty-print a high-level closed Idris term with no information about precedence/associativity
1130prettyImp :: Bool -- ^^ whether to show implicits
1131 -> PTerm -- ^^ the term to pretty-print
1132 -> Doc OutputAnnotation
1133prettyImp impl = pprintPTerm impl [] [] []
1135-- | Do the right thing for rendering a term in an IState
1136prettyIst :: IState -> PTerm -> Doc OutputAnnotation
1137prettyIst ist = pprintPTerm (opt_showimp (idris_options ist)) [] [] (idris_infixes ist)
1139-- | Pretty-print a high-level Idris term in some bindings context with infix info
1140pprintPTerm :: Bool -- ^^ whether to show implicits
1141 -> [(Name, Bool)] -- ^^ the currently-bound names and whether they are implicit
1142 -> [Name] -- ^^ names to always show in pi, even if not used
1143 -> [FixDecl] -- ^^ Fixity declarations
1144 -> PTerm -- ^^ the term to pretty-print
1145 -> Doc OutputAnnotation
1146pprintPTerm impl bnd docArgs infixes = prettySe 10 bnd
1148 prettySe :: Int -> [(Name, Bool)] -> PTerm -> Doc OutputAnnotation
1149 prettySe p bnd (PQuote r) =
1150 text "![" <> pretty r <> text "]"
1151 prettySe p bnd (PPatvar fc n) = pretty n
1153 | Just str <- slist p bnd e = str
1154 | Just n <- snat p e = annotate AnnConstData (text (show n))
1155 prettySe p bnd (PRef fc n) = prettyName impl bnd n
1156 prettySe p bnd (PLam n ty sc) =
1157 bracket p 2 . group . align . hang 2 $
1158 text "\\" <> bindingOf n False <+> text "=>" <$>
1159 prettySe 10 ((n, False):bnd) sc
1160 prettySe p bnd (PLet n ty v sc) =
1162 kwd "let" <+> bindingOf n False <+> text "=" </>
1163 prettySe 10 bnd v <+> kwd "in" </>
1164 prettySe 10 ((n, False):bnd) sc
1165 prettySe p bnd (PPi (Exp l s _) n ty sc)
1166 | n `elem` allNamesIn sc || impl || n `elem` docArgs =
1167 bracket p 2 . group $
1168 enclose lparen rparen (group . align $ bindingOf n False <+> colon <+> prettySe 10 bnd ty) <+>
1169 st <> text "->" <$> prettySe 10 ((n, False):bnd) sc
1171 bracket p 2 . group $
1172 group (prettySe 0 bnd ty <+> st) <> text "->" <$> group (prettySe 10 ((n, False):bnd) sc)
1176 Static -> text "[static]" <> space
1178 prettySe p bnd (PPi (Imp l s _) n ty sc)
1181 lbrace <> bindingOf n True <+> colon <+> prettySe 10 bnd ty <> rbrace <+>
1182 st <> text "->" </> prettySe 10 ((n, True):bnd) sc
1183 | otherwise = prettySe 10 ((n, True):bnd) sc
1187 Static -> text "[static]" <> space
1189 prettySe p bnd (PPi (Constraint _ _) n ty sc) =
1191 prettySe 10 bnd ty <+> text "=>" </> prettySe 10 ((n, True):bnd) sc
1192 prettySe p bnd (PPi (TacImp _ _ s) n ty sc) =
1194 lbrace <> kwd "tacimp" <+> pretty n <+> colon <+> prettySe 10 bnd ty <>
1195 rbrace <+> text "->" </> prettySe 10 ((n, True):bnd) sc
1196 prettySe p bnd (PApp _ (PRef _ f) args) -- normal names, no explicit args
1197 | UN nm <- basename f
1198 , not impl && null (getExps args) = if isAlpha (thead nm)
1199 then prettyName impl bnd f
1200 else enclose lparen rparen $
1201 prettyName impl bnd f
1202 prettySe p bnd (PAppBind _ (PRef _ f) [])
1203 | not impl = text "!" <> prettyName impl bnd f
1204 prettySe p bnd (PApp _ (PRef _ op) args)
1205 | UN nm <- basename op
1207 (not impl) && (not $ isAlpha (thead nm)) =
1208 case getExps args of
1209 [] -> enclose lparen rparen opName
1210 [x] -> group (enclose lparen rparen opName <$> group (prettySe 0 bnd x))
1211 [l,r] -> let precedence = fromMaybe 20 (fmap prec f)
1212 in bracket p precedence $ inFix l r
1213 (l:r:rest) -> bracket p 1 $
1214 enclose lparen rparen (inFix l r) <+>
1215 align (group (vsep (map (prettyArgSe bnd) rest)))
1216 where opName = prettyName impl bnd op
1217 f = getFixity (opStr op)
1219 Nothing -> prettySe (-1) bnd l
1220 Just (Infixl p') -> prettySe p' bnd l
1221 Just f' -> prettySe (prec f'-1) bnd l
1223 Nothing -> prettySe (-1) bnd r
1224 Just (Infixr p') -> prettySe p' bnd r
1225 Just f' -> prettySe (prec f'-1) bnd r
1226 inFix l r = align . group $
1227 (left l <+> opName) <$> group (right r)
1228 prettySe p bnd (PApp _ hd@(PRef fc f) [tm])
1229 | PConstant (Idris.Core.TT.Str str) <- getTm tm,
1230 f == sUN "Symbol_" = char '\'' <> prettySe 10 bnd (PRef fc (sUN str))
1231 prettySe p bnd (PApp _ f as) =
1232 let args = getExps as
1233 fp = prettySe 1 bnd f
1235 bracket p 1 . group $
1239 else fp <+> align (vsep (map (prettyArgS bnd) as))
1242 else fp <+> align (vsep (map (prettyArgSe bnd) args))
1243 prettySe p bnd (PCase _ scr opts) =
1244 kwd "case" <+> prettySe 10 bnd scr <+> kwd "of" <> prettyBody
1246 prettyBody = foldr (<>) empty $ intersperse (text "|") $ map sc opts
1248 sc (l, r) = nest nestingSize $ prettySe 10 bnd l <+> text "=>" <+> prettySe 10 bnd r
1249 prettySe p bnd (PHidden tm) = text "." <> prettySe 0 bnd tm
1250 prettySe p bnd (PRefl _ _) = annName eqCon $ text "refl"
1251 prettySe p bnd (PResolveTC _) = text "resolvetc"
1252 prettySe p bnd (PTrue _ IsType) = annName unitTy $ text "()"
1253 prettySe p bnd (PTrue _ IsTerm) = annName unitCon $ text "()"
1254 prettySe p bnd (PTrue _ TypeOrTerm) = text "()"
1255 prettySe p bnd (PFalse _) = annName falseTy $ text "_|_"
1256 prettySe p bnd (PEq _ l r) =
1257 bracket p 2 . align . group $
1258 prettySe 10 bnd l <+> eq <$> group (prettySe 10 bnd r)
1259 where eq = annName eqTy (text "=")
1260 prettySe p bnd (PRewrite _ l r _) =
1262 text "rewrite" <+> prettySe 10 bnd l <+> text "in" <+> prettySe 10 bnd r
1263 prettySe p bnd (PTyped l r) =
1264 lparen <> prettySe 10 bnd l <+> colon <+> prettySe 10 bnd r <> rparen
1265 prettySe p bnd pair@(PPair _ pun _ _) -- flatten tuples to the right, like parser
1266 | Just elts <- pairElts pair = enclose (ann lparen) (ann rparen) .
1267 align . group . vsep . punctuate (ann comma) $
1268 map (prettySe 10 bnd) elts
1269 where ann = case pun of
1271 IsType -> annName pairTy
1272 IsTerm -> annName pairCon
1273 prettySe p bnd (PDPair _ TypeOrTerm l t r) =
1274 lparen <> prettySe 10 bnd l <+> text "**" <+> prettySe 10 bnd r <> rparen
1275 prettySe p bnd (PDPair _ IsType (PRef _ n) t r) =
1276 annName sigmaTy lparen <>
1277 bindingOf n False <+>
1278 annName sigmaTy (text "**") <+>
1279 prettySe 10 ((n, False):bnd) r <>
1280 annName sigmaTy rparen
1281 prettySe p bnd (PDPair _ IsType l t r) =
1282 annName sigmaTy lparen <>
1283 prettySe 10 bnd l <+>
1284 annName sigmaTy (text "**") <+>
1285 prettySe 10 bnd r <>
1286 annName sigmaTy rparen
1287 prettySe p bnd (PDPair _ IsTerm l t r) =
1288 annName existsCon lparen <>
1289 prettySe 10 bnd l <+>
1290 annName existsCon (text "**") <+>
1291 prettySe 10 bnd r <>
1292 annName existsCon rparen
1293 prettySe p bnd (PAlternative a as) =
1294 lparen <> text "|" <> prettyAs <> text "|" <> rparen
1297 foldr (\l -> \r -> l <+> text "," <+> r) empty $ map (prettySe 10 bnd) as
1298 prettySe p bnd PType = annotate AnnConstType $ text "Type"
1299 prettySe p bnd (PConstant c) = annotate (annot c) (text (show c))
1300 where annot (AType _) = AnnConstType
1301 annot StrType = AnnConstType
1302 annot PtrType = AnnConstType
1303 annot VoidType = AnnConstType
1304 annot _ = AnnConstData
1305 -- XXX: add pretty for tactics
1306 prettySe p bnd (PProof ts) =
1307 text "proof" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1308 prettySe p bnd (PTactics ts) =
1309 text "tactics" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1310 prettySe p bnd (PMetavar n) = text "?" <> pretty n
1311 prettySe p bnd (PReturn f) = kwd "return"
1312 prettySe p bnd PImpossible = kwd "impossible"
1313 prettySe p bnd Placeholder = text "_"
1314 prettySe p bnd (PDoBlock _) = text "do block pretty not implemented"
1315 prettySe p bnd (PElabError s) = pretty s
1317 prettySe p bnd _ = text "test"
1319 prettyArgS bnd (PImp _ _ _ n tm) = prettyArgSi bnd (n, tm)
1320 prettyArgS bnd (PExp _ _ _ tm) = prettyArgSe bnd tm
1321 prettyArgS bnd (PConstraint _ _ _ tm) = prettyArgSc bnd tm
1322 prettyArgS bnd (PTacImplicit _ _ n _ tm) = prettyArgSti bnd (n, tm)
1324 prettyArgSe bnd arg = prettySe 0 bnd arg
1325 prettyArgSi bnd (n, val) = lbrace <> pretty n <+> text "=" <+> prettySe 10 bnd val <> rbrace
1326 prettyArgSc bnd val = lbrace <> lbrace <> prettySe 10 bnd val <> rbrace <> rbrace
1327 prettyArgSti bnd (n, val) = lbrace <> kwd "auto" <+> pretty n <+> text "=" <+> prettySe 10 bnd val <> rbrace
1329 annName :: Name -> Doc OutputAnnotation -> Doc OutputAnnotation
1330 annName n = annotate (AnnName n Nothing Nothing Nothing)
1332 opStr :: Name -> String
1333 opStr (NS n _) = opStr n
1334 opStr (UN n) = T.unpack n
1336 basename :: Name -> Name
1337 basename (NS n _) = basename n
1340 slist' p bnd (PApp _ (PRef _ nil) _)
1341 | not impl && nsroot nil == sUN "Nil" = Just []
1342 slist' p bnd (PRef _ nil)
1343 | not impl && nsroot nil == sUN "Nil" = Just []
1344 slist' p bnd (PApp _ (PRef _ cons) args)
1345 | nsroot cons == sUN "::",
1346 (PExp {getTm=tl}):(PExp {getTm=hd}):imps <- reverse args,
1348 Just tl' <- slist' p bnd tl
1351 isImp (PImp {}) = True
1353 slist' _ _ tm = Nothing
1355 slist p bnd e | Just es <- slist' p bnd e = Just $
1356 case es of [] -> annotate AnnConstData $ text "[]"
1357 [x] -> enclose left right . group $
1359 xs -> (enclose left right .
1360 align . group . vsep .
1362 map (prettySe p bnd)) xs
1363 where left = (annotate AnnConstData (text "["))
1364 right = (annotate AnnConstData (text "]"))
1365 comma = (annotate AnnConstData (text ","))
1366 slist _ _ _ = Nothing
1368 pairElts :: PTerm -> Maybe [PTerm]
1369 pairElts (PPair _ _ x y) | Just elts <- pairElts y = Just (x:elts)
1370 | otherwise = Just [x, y]
1371 pairElts _ = Nothing
1373 natns = "Prelude.Nat."
1376 | show z == (natns++"Z") || show z == "Z" = Just 0
1377 snat p (PApp _ s [PExp {getTm=n}])
1378 | show s == (natns++"S") || show s == "S",
1383 bracket outer inner doc
1384 | inner > outer = lparen <> doc <> rparen
1387 kwd = annotate AnnKeyword . text
1389 fixities :: M.Map String Fixity
1390 fixities = M.fromList [(s, f) | (Fix f s) <- infixes]
1392 getFixity :: String -> Maybe Fixity
1393 getFixity = flip M.lookup fixities
1395-- | Pretty-printer helper for the binding site of a name
1396bindingOf :: Name -- ^^ the bound name
1397 -> Bool -- ^^ whether the name is implicit
1398 -> Doc OutputAnnotation
1399bindingOf n imp = annotate (AnnBoundName n imp) (text (show n))
1401-- | Pretty-printer helper for names that attaches the correct annotations
1402prettyName :: Bool -- ^^ whether to show namespaces
1403 -> [(Name, Bool)] -- ^^ the current bound variables and whether they are implicit
1404 -> Name -- ^^ the name to pprint
1405 -> Doc OutputAnnotation
1406prettyName showNS bnd n | Just imp <- lookup n bnd = annotate (AnnBoundName n imp) (text (strName n))
1407 | otherwise = annotate (AnnName n Nothing Nothing Nothing) (text (strName n))
1408 where strName (UN n) = T.unpack n
1409 strName (NS n ns) | showNS = (concatMap (++ ".") . map T.unpack . reverse) ns ++ strName n
1410 | otherwise = strName n
1411 strName n | n == falseTy = "_|_"
1412 strName (MN i s) = T.unpack s
1413 strName other = show other
1416showCImp :: Bool -> PClause -> Doc OutputAnnotation
1417showCImp impl (PClause _ n l ws r w)
1418 = prettyImp impl l <+> showWs ws <+> text "=" <+> prettyImp impl r
1419 <+> text "where" <+> text (show w)
1422 showWs (x : xs) = text "|" <+> prettyImp impl x <+> showWs xs
1423showCImp impl (PWith _ n l ws r w)
1424 = prettyImp impl l <+> showWs ws <+> text "with" <+> prettyImp impl r
1425 <+> braces (text (show w))
1428 showWs (x : xs) = text "|" <+> prettyImp impl x <+> showWs xs
1431showDImp :: Bool -> PData -> Doc OutputAnnotation
1432showDImp impl (PDatadecl n ty cons)
1433 = text "data" <+> text (show n) <+> colon <+> prettyImp impl ty <+> text "where" <$>
1434 (indent 2 $ vsep (map (\ (_, _, n, t, _, _) -> pipe <+> prettyName False [] n <+> colon <+> prettyImp impl t) cons))
1436showDecls :: Bool -> [PDecl] -> Doc OutputAnnotation
1437showDecls i ds = vsep (map (showDeclImp i) ds)
1439showDeclImp _ (PFix _ f ops) = text (show f) <+> cat (punctuate (text ",") (map text ops))
1440showDeclImp i (PTy _ _ _ _ _ n t) = text "tydecl" <+> text (showCG n) <+> colon <+> prettyImp i t
1441showDeclImp i (PClauses _ _ n cs) = text "pat" <+> text (showCG n) <+> text "\t" <+>
1442 indent 2 (vsep (map (showCImp i) cs))
1443showDeclImp _ (PData _ _ _ _ _ d) = showDImp True d
1444showDeclImp i (PParams _ ns ps) = text "params" <+> braces (text (show ns) <> line <> showDecls i ps <> line)
1445showDeclImp i (PNamespace n ps) = text "namespace" <+> text n <> braces (line <> showDecls i ps <> line)
1446showDeclImp _ (PSyntax _ syn) = text "syntax" <+> text (show syn)
1447showDeclImp i (PClass _ _ _ cs n ps _ ds)
1448 = text "class" <+> text (show cs) <+> text (show n) <+> text (show ps) <> line <> showDecls i ds
1449showDeclImp i (PInstance _ _ cs n _ t _ ds)
1450 = text "instance" <+> text (show cs) <+> text (show n) <+> prettyImp i t <> line <> showDecls i ds
1451showDeclImp _ _ = text "..."
1452-- showDeclImp (PImport i) = "import " ++ i
1454instance Show (Doc OutputAnnotation) where
1455 show = flip (displayS . renderCompact) ""
1457getImps :: [PArg] -> [(Name, PTerm)]
1459getImps (PImp _ _ _ n tm : xs) = (n, tm) : getImps xs
1460getImps (_ : xs) = getImps xs
1462getExps :: [PArg] -> [PTerm]
1464getExps (PExp _ _ _ tm : xs) = tm : getExps xs
1465getExps (_ : xs) = getExps xs
1467getConsts :: [PArg] -> [PTerm]
1469getConsts (PConstraint _ _ _ tm : xs) = tm : getConsts xs
1470getConsts (_ : xs) = getConsts xs
1472getAll :: [PArg] -> [PTerm]
1477showName :: Maybe IState -- ^^ the Idris state, for information about names and colours
1478 -> [(Name, Bool)] -- ^^ the bound variables and whether they're implicit
1479 -> Bool -- ^^ whether to show implicits
1480 -> Bool -- ^^ whether to colourise
1481 -> Name -- ^^ the term to show
1483showName ist bnd impl colour n = case ist of
1484 Just i -> if colour then colourise n (idris_colourTheme i) else showbasic n
1485 Nothing -> showbasic n
1486 where name = if impl then show n else showbasic n
1487 showbasic n@(UN _) = showCG n
1488 showbasic (MN _ s) = str s
1489 showbasic (NS n s) = showSep "." (map str (reverse s)) ++ "." ++ showbasic n
1490 showbasic (SN s) = show s
1492 colourise n t = let ctxt' = fmap tt_ctxt ist in
1495 Just ctxt | Just impl <- lookup n bnd -> if impl then colouriseImplicit t name
1496 else colouriseBound t name
1497 | isDConName n ctxt -> colouriseData t name
1498 | isFnName n ctxt -> colouriseFun t name
1499 | isTConName n ctxt -> colouriseType t name
1500 -- The assumption is that if a name is not bound and does not exist in the
1501 -- global context, then we're somewhere in which implicit info has been lost
1502 -- (like error messages). Thus, unknown vars are colourised as implicits.
1503 | otherwise -> colouriseImplicit t name
1505showTm :: IState -- ^^ the Idris state, for information about identifiers and colours
1506 -> PTerm -- ^^ the term to show
1508showTm ist = displayDecorated (consoleDecorate ist) .
1509 renderPretty 0.8 100000 .
1510 prettyImp (opt_showimp (idris_options ist))
1512-- | Show a term with implicits, no colours
1513showTmImpls :: PTerm -> String
1514showTmImpls = flip (displayS . renderCompact . prettyImp True) ""
1517instance Sized PTerm where
1518 size (PQuote rawTerm) = size rawTerm
1519 size (PRef fc name) = size name
1520 size (PLam name ty bdy) = 1 + size ty + size bdy
1521 size (PPi plicity name ty bdy) = 1 + size ty + size bdy
1522 size (PLet name ty def bdy) = 1 + size ty + size def + size bdy
1523 size (PTyped trm ty) = 1 + size trm + size ty
1524 size (PApp fc name args) = 1 + size args
1525 size (PAppBind fc name args) = 1 + size args
1526 size (PCase fc trm bdy) = 1 + size trm + size bdy
1527 size (PTrue fc _) = 1
1528 size (PFalse fc) = 1
1529 size (PRefl fc _) = 1
1530 size (PResolveTC fc) = 1
1531 size (PEq fc left right) = 1 + size left + size right
1532 size (PRewrite fc left right _) = 1 + size left + size right
1533 size (PPair fc _ left right) = 1 + size left + size right
1534 size (PDPair fs _ left ty right) = 1 + size left + size ty + size right
1535 size (PAlternative a alts) = 1 + size alts
1536 size (PHidden hidden) = size hidden
1537 size (PUnifyLog tm) = size tm
1538 size (PDisamb _ tm) = size tm
1539 size (PNoImplicits tm) = size tm
1541 size (PConstant const) = 1 + size const
1542 size Placeholder = 1
1543 size (PDoBlock dos) = 1 + size dos
1544 size (PIdiom fc term) = 1 + size term
1545 size (PReturn fc) = 1
1546 size (PMetavar name) = 1
1547 size (PProof tactics) = size tactics
1548 size (PElabError err) = size err
1549 size PImpossible = 1
1551getPArity :: PTerm -> Int
1552getPArity (PPi _ _ _ sc) = 1 + getPArity sc
1555-- Return all names, free or globally bound, in the given term.
1557allNamesIn :: PTerm -> [Name]
1558allNamesIn tm = nub $ ni [] tm
1559 where -- TODO THINK added niTacImp, but is it right?
1561 | not (n `elem` env) = [n]
1562 ni env (PPatvar _ n) = [n]
1563 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1564 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1565 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1566 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1567 ni env (PPi p n ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
1568 ni env (PHidden tm) = ni env tm
1569 ni env (PEq _ l r) = ni env l ++ ni env r
1570 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1571 ni env (PTyped l r) = ni env l ++ ni env r
1572 ni env (PPair _ _ l r) = ni env l ++ ni env r
1573 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1574 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1575 ni env (PAlternative a ls) = concatMap (ni env) ls
1576 ni env (PUnifyLog tm) = ni env tm
1577 ni env (PDisamb _ tm) = ni env tm
1578 ni env (PNoImplicits tm) = ni env tm
1581 niTacImp env (TacImp _ _ scr) = ni env scr
1584-- Return all names defined in binders in the given term
1585boundNamesIn :: PTerm -> [Name]
1586boundNamesIn tm = nub $ ni tm
1587 where -- TODO THINK Added niTacImp, but is it right?
1588 ni (PApp _ f as) = ni f ++ concatMap (ni) (map getTm as)
1589 ni (PAppBind _ f as) = ni f ++ concatMap (ni) (map getTm as)
1590 ni (PCase _ c os) = ni c ++ concatMap (ni) (map snd os)
1591 ni (PLam n ty sc) = n : (ni ty ++ ni sc)
1592 ni (PLet n ty val sc) = n : (ni ty ++ ni val ++ ni sc)
1593 ni (PPi p n ty sc) = niTacImp p ++ (n : (ni ty ++ ni sc))
1594 ni (PEq _ l r) = ni l ++ ni r
1595 ni (PRewrite _ l r _) = ni l ++ ni r
1596 ni (PTyped l r) = ni l ++ ni r
1597 ni (PPair _ _ l r) = ni l ++ ni r
1598 ni (PDPair _ _ (PRef _ n) t r) = ni t ++ ni r
1599 ni (PDPair _ _ l t r) = ni l ++ ni t ++ ni r
1600 ni (PAlternative a as) = concatMap (ni) as
1601 ni (PHidden tm) = ni tm
1602 ni (PUnifyLog tm) = ni tm
1603 ni (PDisamb _ tm) = ni tm
1604 ni (PNoImplicits tm) = ni tm
1607 niTacImp (TacImp _ _ scr) = ni scr
1610-- Return names which are free in the given term.
1611namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name]
1612namesIn uvars ist tm = nub $ ni [] tm
1615 | not (n `elem` env)
1616 = case lookupTy n (tt_ctxt ist) of
1618 _ -> if n `elem` (map fst uvars) then [n] else []
1619 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1620 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1621 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1622 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1623 ni env (PPi p n ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
1624 ni env (PEq _ l r) = ni env l ++ ni env r
1625 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1626 ni env (PTyped l r) = ni env l ++ ni env r
1627 ni env (PPair _ _ l r) = ni env l ++ ni env r
1628 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1629 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1630 ni env (PAlternative a as) = concatMap (ni env) as
1631 ni env (PHidden tm) = ni env tm
1632 ni env (PUnifyLog tm) = ni env tm
1633 ni env (PDisamb _ tm) = ni env tm
1634 ni env (PNoImplicits tm) = ni env tm
1637 niTacImp env (TacImp _ _ scr) = ni env scr
1640-- Return which of the given names are used in the given term.
1642usedNamesIn :: [Name] -> IState -> PTerm -> [Name]
1643usedNamesIn vars ist tm = nub $ ni [] tm
1644 where -- TODO THINK added niTacImp, but is it right?
1646 | n `elem` vars && not (n `elem` env)
1647 = case lookupDefExact n (tt_ctxt ist) of
1650 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1651 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1652 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1653 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1654 ni env (PPi p n ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
1655 ni env (PEq _ l r) = ni env l ++ ni env r
1656 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1657 ni env (PTyped l r) = ni env l ++ ni env r
1658 ni env (PPair _ _ l r) = ni env l ++ ni env r
1659 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1660 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1661 ni env (PAlternative a as) = concatMap (ni env) as
1662 ni env (PHidden tm) = ni env tm
1663 ni env (PUnifyLog tm) = ni env tm
1664 ni env (PDisamb _ tm) = ni env tm
1665 ni env (PNoImplicits tm) = ni env tm
1668 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