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)
37import Text.PrettyPrint.Annotated.Leijen
39data IOption = IOption { opt_logLevel :: Int,
41 opt_typeintype :: Bool,
43 opt_showimp :: Bool, -- ^^ show implicits
44 opt_errContext :: Bool,
49 opt_codegen :: Codegen,
50 opt_outputTy :: OutputType,
51 opt_ibcsubdir :: FilePath,
52 opt_importdirs :: [FilePath],
56 opt_cmdline :: [Opt], -- remember whole command line
58 opt_autoSolve :: Bool -- ^ automatically apply "solve" tactic in prover
62defaultOpts = IOption { opt_logLevel = 0
63 , opt_typecase = False
64 , opt_typeintype = False
67 , opt_errContext = False
70 , opt_nobanner = False
73 , opt_outputTy = Executable
81 , opt_autoSolve = True
84data LanguageExt = TypeProviders | ErrorReflection deriving (Show, Eq, Read, Ord)
86-- | The output mode in use
87data OutputMode = RawOutput | IdeSlave Integer deriving Show
89-- | How wide is the console?
90data ConsoleWidth = InfinitelyWide -- ^ Have pretty-printer assume that lines should not be broken
91 | ColsWide Int -- ^ Manually specified - must be positive
92 | AutomaticWidth -- ^ Attempt to determine width, or 80 otherwise
94-- TODO: Add 'module data' to IState, which can be saved out and reloaded quickly (i.e
95-- without typechecking).
96-- This will include all the functions and data declarations, plus fixity declarations
99-- | The global state used in the Idris monad
100data IState = IState {
101 tt_ctxt :: Context, -- ^ All the currently defined names and their terms
102 idris_constraints :: [(UConstraint, FC)],
103 -- ^ A list of universe constraints and their corresponding source locations
104 idris_infixes :: [FixDecl], -- ^ Currently defined infix operators
105 idris_implicits :: Ctxt [PArg],
106 idris_statics :: Ctxt [Bool],
107 idris_classes :: Ctxt ClassInfo,
108 idris_dsls :: Ctxt DSL,
109 idris_optimisation :: Ctxt OptInfo,
110 idris_datatypes :: Ctxt TypeInfo,
111 idris_namehints :: Ctxt [Name],
112 idris_patdefs :: Ctxt ([([Name], Term, Term)], [PTerm]), -- not exported
113 -- ^ list of lhs/rhs, and a list of missing clauses
114 idris_flags :: Ctxt [FnOpt],
115 idris_callgraph :: Ctxt CGInfo, -- name, args used in each pos
116 idris_calledgraph :: Ctxt [Name],
117 idris_docstrings :: Ctxt (Docstring, [(Name, Docstring)]),
118 idris_tyinfodata :: Ctxt TIData,
119 idris_totcheck :: [(FC, Name)], -- names to check totality on
120 idris_defertotcheck :: [(FC, Name)], -- names to check at the end
121 idris_options :: IOption,
123 idris_lineapps :: [((FilePath, Int), PTerm)],
124 -- ^ Full application LHS on source line
125 idris_metavars :: [(Name, (Maybe Name, Int, Bool))], -- ^ The currently defined but not proven metavariables
126 idris_coercions :: [Name],
127 idris_transforms :: [(Term, Term)],
128 idris_errRev :: [(Term, Term)],
129 syntax_rules :: [Syntax],
130 syntax_keywords :: [String],
131 imported :: [FilePath], -- ^ The imported modules
132 idris_scprims :: [(Name, (Int, PrimFn))],
133 idris_objs :: [(Codegen, FilePath)],
134 idris_libs :: [(Codegen, String)],
135 idris_cgflags :: [(Codegen, String)],
136 idris_hdrs :: [(Codegen, String)],
137 proof_list :: [(Name, [String])],
139 parserWarnings :: [(FC, Err)],
140 lastParse :: Maybe Name,
141 indent_stack :: [Int],
142 brace_stack :: [Maybe Int],
143 lastTokenSpan :: Maybe FC, -- ^ What was the span of the latest token parsed?
144 hide_list :: [(Name, Maybe Accessibility)],
145 default_access :: Accessibility,
146 default_total :: Bool,
147 ibc_write :: [IBCWrite],
148 compiled_so :: Maybe String,
149 idris_dynamic_libs :: [DynamicLib],
150 idris_language_extensions :: [LanguageExt],
151 idris_outputmode :: OutputMode,
152 idris_colourRepl :: Bool,
153 idris_colourTheme :: ColourTheme,
154 idris_outh :: Handle,
155 idris_errorhandlers :: [Name], -- ^ Global error handlers
156 idris_nameIdx :: (Int, Ctxt (Int, Name)),
157 idris_function_errorhandlers :: Ctxt (M.Map Name (S.Set Name)), -- ^ Specific error handlers
158 module_aliases :: M.Map [T.Text] [T.Text],
159 idris_consolewidth :: ConsoleWidth -- ^ How many chars wide is the console?
162data SizeChange = Smaller | Same | Bigger | Unknown
165deriving instance Binary SizeChange
166deriving instance NFData SizeChange
169type SCGEntry = (Name, [Maybe (Int, SizeChange)])
171data CGInfo = CGInfo { argsdef :: [Name],
172 calls :: [(Name, [[Name]])],
178deriving instance Binary CGInfo
179deriving instance NFData CGInfo
182primDefs = [sUN "unsafePerformPrimIO",
183 sUN "mkLazyForeignPrim",
187-- information that needs writing for the current module's .ibc file
188data IBCWrite = IBCFix FixDecl
192 | IBCInstance Bool Name Name
200 | IBCObj Codegen FilePath
201 | IBCLib Codegen String
202 | IBCCGFlag Codegen String
204 | IBCHeader Codegen String
205 | IBCAccess Name Accessibility
206 | IBCMetaInformation Name MetaInformation
207 | IBCTotal Name Totality
208 | IBCFlags Name [FnOpt]
209 | IBCTrans (Term, Term)
210 | IBCErrRev (Term, Term)
214 | IBCDef Name -- i.e. main context
215 | IBCNameHint (Name, Name)
216 | IBCLineApp FilePath Int PTerm
217 | IBCErrorHandler Name
218 | IBCFunctionErrorHandler Name Name Name
221-- | The initial state for the compiler
223idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext
224 emptyContext emptyContext emptyContext emptyContext
225 emptyContext emptyContext emptyContext emptyContext
226 emptyContext emptyContext
227 [] [] defaultOpts 6 [] [] [] [] [] [] [] [] [] [] [] [] []
228 [] Nothing [] Nothing [] [] Nothing [] Hidden False [] Nothing [] [] RawOutput
229 True defaultTheme stdout [] (0, emptyContext) emptyContext M.empty
232-- | The monad for the main REPL - reading and processing files and updating
233-- global state (hence the IO inner monad).
234--type Idris = WriterT [Either String (IO ())] (State IState a))
235type Idris = StateT IState (ErrorT Err IO)
237-- Commands in the REPL
256 | ChangeDirectory FilePath
259 | Compile Codegen String
264 | AddProof (Maybe Name)
276 | DynamicLink FilePath
281 | CaseSplitAt Bool Int Name
282 | AddClauseFrom Bool Int Name
283 | AddProofClauseFrom Bool Int Name
284 | AddMissing Bool Int Name
285 | MakeWith Bool Int Name
286 | DoProofSearch Bool Int Name [Name]
290 | SetColour ColourType IdrisColour
294 | SetConsoleWidth ConsoleWidth
297data Opt = Filename String
309 | NoBuiltins -- only for the really primitive stuff!
335 | OutputTy OutputType
336 | Extension LanguageExt
337 | InterpretScript String
338 | TargetTriple String
343 | AutoWidth -- ^ Automatically adjust terminal width
344 | AutoSolve -- ^ Automatically issue "solve" tactic in interactive prover
347-- Parsed declarations
349data Fixity = Infixl { prec :: Int }
350 | Infixr { prec :: Int }
351 | InfixN { prec :: Int }
352 | PrefixN { prec :: Int }
355deriving instance Binary Fixity
356deriving instance NFData Fixity
359instance Show Fixity where
360 show (Infixl i) = "infixl " ++ show i
361 show (Infixr i) = "infixr " ++ show i
362 show (InfixN i) = "infix " ++ show i
363 show (PrefixN i) = "prefix " ++ show i
365data FixDecl = Fix Fixity String
368instance Show FixDecl where
369 show (Fix f s) = show f ++ " " ++ s
372deriving instance Binary FixDecl
373deriving instance NFData FixDecl
376instance Ord FixDecl where
377 compare (Fix x _) (Fix y _) = compare (prec x) (prec y)
380data Static = Static | Dynamic
383deriving instance Binary Static
384deriving instance NFData Static
387-- Mark bindings with their explicitness, and laziness
388data Plicity = Imp { pargopts :: [ArgOpt],
391 | Exp { pargopts :: [ArgOpt],
394 | Constraint { pargopts :: [ArgOpt],
396 | TacImp { pargopts :: [ArgOpt],
401plazy :: Plicity -> Bool
402plazy tm = Lazy `elem` pargopts tm
405deriving instance Binary Plicity
406deriving instance NFData Plicity
409impl = Imp [Lazy] Dynamic False
410expl = Exp [] Dynamic False
411expl_param = Exp [] Dynamic True
412constraint = Constraint [] Dynamic
413tacimpl t = TacImp [] Dynamic t
415data FnOpt = Inlinable -- always evaluate when simplifying
416 | TotalFn | PartialFn | CoveringFn
417 | Coinductive | AssertTotal
418 | Dictionary -- type class dictionary, eval only when
419 -- a function argument, and further evaluation resutls
420 | Implicit -- implicit coercion
421 | CExport String -- export, with a C name
422 | ErrorHandler -- ^^ an error handler for use with the ErrorReflection extension
423 | ErrorReverse -- ^^ attempt to reverse normalise before showing in error
424 | Reflection -- a reflecting function, compile-time only
425 | Specialise [(Name, Maybe Int)] -- specialise it, freeze these names
428deriving instance Binary FnOpt
429deriving instance NFData FnOpt
434inlinable :: FnOpts -> Bool
435inlinable = elem Inlinable
437dictionary :: FnOpts -> Bool
438dictionary = elem Dictionary
441-- | Data declaration options
442data DataOpt = Codata -- Set if the the data-type is coinductive
443 | DefaultEliminator -- Set if an eliminator should be generated for data type
447type DataOpts = [DataOpt]
449-- | Type provider - what to provide
450data ProvideWhat = ProvTerm -- ^ only allow providing terms
451 | ProvPostulate -- ^ only allow postulates
452 | ProvAny -- ^ either is ok
455-- | Top-level declarations such as compiler directives, definitions,
456-- datatypes and typeclasses.
458 = PFix FC Fixity [String] -- ^ Fixity declaration
459 | PTy Docstring [(Name, Docstring)] SyntaxInfo FC FnOpts Name t -- ^ Type declaration
460 | PPostulate Docstring SyntaxInfo FC FnOpts Name t -- ^ Postulate
461 | PClauses FC FnOpts Name [PClause' t] -- ^ Pattern clause
462 | PCAF FC Name t -- ^ Top level constant
463 | PData Docstring [(Name, Docstring)] SyntaxInfo FC DataOpts (PData' t) -- ^ Data declaration.
464 | PParams FC [(Name, t)] [PDecl' t] -- ^ Params block
465 | PNamespace String [PDecl' t] -- ^ New namespace
466 | PRecord Docstring SyntaxInfo FC Name t Docstring Name t -- ^ Record declaration
467 | PClass Docstring SyntaxInfo FC
470 [(Name, t)] -- parameters
471 [PDecl' t] -- declarations
472 -- ^ Type class: arguments are documentation, syntax info, source location, constraints,
473 -- class name, parameters, method declarations
474 | PInstance SyntaxInfo FC [t] -- constraints
477 t -- full instance type
478 (Maybe Name) -- explicit name
480 -- ^ Instance declaration: arguments are syntax info, source location, constraints,
481 -- class name, parameters, full instance type, optional explicit name, and definitions
482 | PDSL Name (DSL' t) -- ^ DSL declaration
483 | PSyntax FC Syntax -- ^ Syntax definition
484 | PMutual FC [PDecl' t] -- ^ Mutual block
485 | PDirective (Idris ()) -- ^ Compiler directive. The parser inserts the corresponding action in the Idris monad.
486 | PProvider SyntaxInfo FC ProvideWhat Name t t -- ^ Type provider. The first t is the type, the second is the term
487 | PTransform FC Bool t t -- ^ Source-to-source transformation rule. If
488 -- bool is True, lhs and rhs must be convertible
491deriving instance Binary PDecl'
492deriving instance NFData PDecl'
495-- For elaborator state
496type ElabD a = Elab' [PDecl] a
498-- | One clause of a top-level definition. Term arguments to constructors are:
500-- 1. The whole application (missing for PClauseR and PWithR because they're within a "with" clause)
502-- 2. The list of extra 'with' patterns
504-- 3. The right-hand side
506-- 4. The where block (PDecl' t)
508data PClause' t = PClause FC Name t [t] t [PDecl' t] -- ^ A normal top-level definition.
509 | PWith FC Name t [t] t [PDecl' t]
510 | PClauseR FC [t] t [PDecl' t]
511 | PWithR FC [t] t [PDecl' t]
514deriving instance Binary PClause'
515deriving instance NFData PClause'
519data PData' t = PDatadecl { d_name :: Name, -- ^ The name of the datatype
520 d_tcon :: t, -- ^ Type constructor
521 d_cons :: [(Docstring, [(Name, Docstring)], Name, t, FC, [Name])] -- ^ Constructors
523 -- ^ Data declaration
524 | PLaterdecl { d_name :: Name, d_tcon :: t }
525 -- ^ "Placeholder" for data whose constructors are defined later
528deriving instance Binary PData'
529deriving instance NFData PData'
532-- Handy to get a free function for applying PTerm -> PTerm functions
533-- across a program, by deriving Functor
535type PDecl = PDecl' PTerm
536type PData = PData' PTerm
537type PClause = PClause' PTerm
539-- get all the names declared in a decl
541declared :: PDecl -> [Name]
542declared (PFix _ _ _) = []
543declared (PTy _ _ _ _ _ n t) = [n]
544declared (PPostulate _ _ _ _ n t) = [n]
545declared (PClauses _ _ n _) = [] -- not a declaration
546declared (PCAF _ n _) = [n]
547declared (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
548 where fstt (_, _, a, _, _, _) = a
549declared (PData _ _ _ _ _ (PLaterdecl n _)) = [n]
550declared (PParams _ _ ds) = concatMap declared ds
551declared (PNamespace _ ds) = concatMap declared ds
552declared (PRecord _ _ _ n _ _ c _) = [n, c]
553declared (PClass _ _ _ _ n _ ms) = n : concatMap declared ms
554declared (PInstance _ _ _ _ _ _ _ _) = []
555declared (PDSL n _) = [n]
556declared (PSyntax _ _) = []
557declared (PMutual _ ds) = concatMap declared ds
558declared (PDirective _) = []
560-- get the names declared, not counting nested parameter blocks
561tldeclared :: PDecl -> [Name]
562tldeclared (PFix _ _ _) = []
563tldeclared (PTy _ _ _ _ _ n t) = [n]
564tldeclared (PPostulate _ _ _ _ n t) = [n]
565tldeclared (PClauses _ _ n _) = [] -- not a declaration
566tldeclared (PRecord _ _ _ n _ _ c _) = [n, c]
567tldeclared (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
568 where fstt (_, _, a, _, _, _) = a
569tldeclared (PParams _ _ ds) = []
570tldeclared (PMutual _ ds) = concatMap tldeclared ds
571tldeclared (PNamespace _ ds) = concatMap tldeclared ds
572tldeclared (PClass _ _ _ _ n _ ms) = concatMap tldeclared ms
573tldeclared (PInstance _ _ _ _ _ _ _ _) = []
576defined :: PDecl -> [Name]
577defined (PFix _ _ _) = []
578defined (PTy _ _ _ _ _ n t) = []
579defined (PPostulate _ _ _ _ n t) = []
580defined (PClauses _ _ n _) = [n] -- not a declaration
581defined (PCAF _ n _) = [n]
582defined (PData _ _ _ _ _ (PDatadecl n _ ts)) = n : map fstt ts
583 where fstt (_, _, a, _, _, _) = a
584defined (PData _ _ _ _ _ (PLaterdecl n _)) = []
585defined (PParams _ _ ds) = concatMap defined ds
586defined (PNamespace _ ds) = concatMap defined ds
587defined (PRecord _ _ _ n _ _ c _) = [n, c]
588defined (PClass _ _ _ _ n _ ms) = n : concatMap defined ms
589defined (PInstance _ _ _ _ _ _ _ _) = []
590defined (PDSL n _) = [n]
591defined (PSyntax _ _) = []
592defined (PMutual _ ds) = concatMap defined ds
593defined (PDirective _) = []
596updateN :: [(Name, Name)] -> Name -> Name
597updateN ns n | Just n' <- lookup n ns = n'
600updateNs :: [(Name, Name)] -> PTerm -> PTerm
602updateNs ns t = mapPT updateRef t
603 where updateRef (PRef fc f) = PRef fc (updateN ns f)
606-- updateDNs :: [(Name, Name)] -> PDecl -> PDecl
608-- updateDNs ns (PTy s f n t) | Just n' <- lookup n ns = PTy s f n' t
609-- updateDNs ns (PClauses f n c) | Just n' <- lookup n ns = PClauses f n' (map updateCNs c)
610-- where updateCNs ns (PClause n l ts r ds)
611-- = PClause (updateN ns n) (fmap (updateNs ns) l)
612-- (map (fmap (updateNs ns)) ts)
613-- (fmap (updateNs ns) r)
614-- (map (updateDNs ns) ds)
617data PunInfo = IsType | IsTerm | TypeOrTerm deriving (Eq, Show)
619-- | High level language terms
620data PTerm = PQuote Raw
622 | PInferRef FC Name -- ^ A name to be defined later
624 | PLam Name PTerm PTerm
625 | PPi Plicity Name PTerm PTerm
626 | PLet Name PTerm PTerm PTerm
627 | PTyped PTerm PTerm -- ^ Term with explicit type
628 | PApp FC PTerm [PArg]
629 | PAppBind FC PTerm [PArg] -- ^ implicitly bound application
630 | PMatchApp FC Name -- ^ Make an application by type matching
631 | PCase FC PTerm [(PTerm, PTerm)]
637 | PRewrite FC PTerm PTerm (Maybe PTerm)
638 | PPair FC PunInfo PTerm PTerm
639 | PDPair FC PunInfo PTerm PTerm PTerm
640 | PAlternative Bool [PTerm] -- True if only one may work
641 | PHidden PTerm -- ^ Irrelevant or hidden pattern
643 | PGoal FC PTerm Name PTerm
650 | PProof [PTactic] -- ^ Proof script
651 | PTactics [PTactic] -- ^ As PProof, but no auto solving
652 | PElabError Err -- ^ Error to report on elaboration
653 | PImpossible -- ^ Special case for declaring when an LHS can't typecheck
654 | PCoerced PTerm -- ^ To mark a coerced argument, so as not to coerce twice
655 | PDisamb [[T.Text]] PTerm -- ^ Preferences for explicit namespaces
656 | PUnifyLog PTerm -- ^ dump a trace of unifications when building term
657 | PNoImplicits PTerm -- ^ never run implicit converions on the term
662deriving instance Binary PTerm
663deriving instance NFData PTerm
666mapPT :: (PTerm -> PTerm) -> PTerm -> PTerm
667mapPT f t = f (mpt t) where
668 mpt (PLam n t s) = PLam n (mapPT f t) (mapPT f s)
669 mpt (PPi p n t s) = PPi p n (mapPT f t) (mapPT f s)
670 mpt (PLet n ty v s) = PLet n (mapPT f ty) (mapPT f v) (mapPT f s)
671 mpt (PRewrite fc t s g) = PRewrite fc (mapPT f t) (mapPT f s)
673 mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)
674 mpt (PAppBind fc t as) = PAppBind fc (mapPT f t) (map (fmap (mapPT f)) as)
675 mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)
676 mpt (PEq fc l r) = PEq fc (mapPT f l) (mapPT f r)
677 mpt (PTyped l r) = PTyped (mapPT f l) (mapPT f r)
678 mpt (PPair fc p l r) = PPair fc p (mapPT f l) (mapPT f r)
679 mpt (PDPair fc p l t r) = PDPair fc p (mapPT f l) (mapPT f t) (mapPT f r)
680 mpt (PAlternative a as) = PAlternative a (map (mapPT f) as)
681 mpt (PHidden t) = PHidden (mapPT f t)
682 mpt (PDoBlock ds) = PDoBlock (map (fmap (mapPT f)) ds)
683 mpt (PProof ts) = PProof (map (fmap (mapPT f)) ts)
684 mpt (PTactics ts) = PTactics (map (fmap (mapPT f)) ts)
685 mpt (PUnifyLog tm) = PUnifyLog (mapPT f tm)
686 mpt (PDisamb ns tm) = PDisamb ns (mapPT f tm)
687 mpt (PNoImplicits tm) = PNoImplicits (mapPT f tm)
688 mpt (PGoal fc r n sc) = PGoal fc (mapPT f r) n (mapPT f sc)
692data PTactic' t = Intro [Name] | Intros | Focus Name
693 | Refine Name [Bool] | Rewrite t
697 | LetTac Name t | LetTacTy Name t t
698 | Exact t | Compute | Trivial | TCInstance
699 | ProofSearch (Maybe Name) [Name]
702 | ProofState | ProofTerm | Undo
703 | Try (PTactic' t) (PTactic' t)
704 | TSeq (PTactic' t) (PTactic' t)
705 | ApplyTactic t -- see Language.Reflection module
709 | GoalType String (PTactic' t)
713 deriving (Show, Eq, Functor)
715deriving instance Binary PTactic'
716deriving instance NFData PTactic'
718instance Sized a => Sized (PTactic' a) where
719 size (Intro nms) = 1 + size nms
721 size (Focus nm) = 1 + size nm
722 size (Refine nm bs) = 1 + size nm + length bs
723 size (Rewrite t) = 1 + size t
724 size (Induction t) = 1 + size t
725 size (LetTac nm t) = 1 + size nm + size t
726 size (Exact t) = 1 + size t
734 size (Try l r) = 1 + size l + size r
735 size (TSeq l r) = 1 + size l + size r
736 size (ApplyTactic t) = 1 + size t
737 size (Reflect t) = 1 + size t
738 size (Fill t) = 1 + size t
742type PTactic = PTactic' PTerm
744data PDo' t = DoExp FC t
746 | DoBindP FC t t [(t,t)]
749 deriving (Eq, Functor)
751deriving instance Binary PDo'
752deriving instance NFData PDo'
755instance Sized a => Sized (PDo' a) where
756 size (DoExp fc t) = 1 + size fc + size t
757 size (DoBind fc nm t) = 1 + size fc + size nm + size t
758 size (DoBindP fc l r alts) = 1 + size fc + size l + size r + size alts
759 size (DoLet fc nm l r) = 1 + size fc + size nm + size l + size r
760 size (DoLetP fc l r) = 1 + size fc + size l + size r
764-- The priority gives a hint as to elaboration order. Best to elaborate
765-- things early which will help give a more concrete type to other
766-- variables, e.g. a before (interpTy a).
768data PArg' t = PImp { priority :: Int,
769 machine_inf :: Bool, -- true if the machine inferred it
771 pname :: Name, getTm :: t }
772 | PExp { priority :: Int,
775 | PConstraint { priority :: Int,
778 | PTacImplicit { priority :: Int,
783 deriving (Show, Eq, Functor)
785data ArgOpt = Lazy | HideDisplay
788lazyarg :: PArg' t -> Bool
789lazyarg tm = Lazy `elem` argopts tm
791instance Sized a => Sized (PArg' a) where
792 size (PImp p _ l nm trm) = 1 + size nm + size trm
793 size (PExp p l trm) = 1 + size trm
794 size (PConstraint p l trm) = 1 + size trm
795 size (PTacImplicit p l nm scr trm) = 1 + size nm + size scr + size trm
798deriving instance Binary PArg'
799deriving instance NFData PArg'
802pimp n t mach = PImp 1 mach [Lazy] n t
804pconst t = PConstraint 1 [] t
805ptacimp n s t = PTacImplicit 2 [Lazy] n s t
807type PArg = PArg' PTerm
811data ClassInfo = CI { instanceName :: Name,
812 class_methods :: [(Name, (FnOpts, PTerm))],
813 class_defaults :: [(Name, (Name, PDecl))], -- method name -> default impl
814 class_default_superclasses :: [PDecl],
815 class_params :: [Name],
816 class_instances :: [Name] }
819deriving instance Binary ClassInfo
820deriving instance NFData ClassInfo
823-- Type inference data
825data TIData = TIPartial -- ^ a function with a partially defined type
826 | TISolution [Term] -- ^ possible solutions to a metavariable in a type
829-- An argument is conditionally forceable iff its forceability
830-- depends on the collapsibility of the whole type.
831data Forceability = Conditional | Unconditional deriving (Show, Enum, Bounded, Eq, Ord)
834deriving instance Binary Forceability
835deriving instance NFData Forceability
838data OptInfo = Optimise { collapsible :: Bool,
840 -- The following should actually be (IntMap Forceability)
841 -- but the corresponding Binary instance seems to be broken.
842 -- Let's store a list and convert it to IntMap whenever needed.
843 forceable :: [(Int, Forceability)],
847deriving instance Binary OptInfo
848deriving instance NFData OptInfo
852data TypeInfo = TI { con_names :: [Name],
854 data_opts :: DataOpts,
858deriving instance Binary TypeInfo
859deriving instance NFData TypeInfo
862-- Syntactic sugar info
864data DSL' t = DSL { dsl_bind :: t,
869 index_first :: Maybe t,
870 index_next :: Maybe t,
871 dsl_lambda :: Maybe t,
874 deriving (Show, Functor)
876deriving instance Binary DSL'
877deriving instance NFData DSL'
882data SynContext = PatternSyntax | TermSyntax | AnySyntax
885deriving instance Binary SynContext
886deriving instance NFData SynContext
889data Syntax = Rule [SSymbol] PTerm SynContext
892deriving instance Binary Syntax
893deriving instance NFData Syntax
896data SSymbol = Keyword Name
903deriving instance Binary SSymbol
904deriving instance NFData SSymbol
907initDSL = DSL (PRef f (sUN ">>="))
908 (PRef f (sUN "return"))
910 (PRef f (sUN "pure"))
916 where f = fileFC "(builtin)"
918data Using = UImplicit Name PTerm
919 | UConstraint Name [Name]
922deriving instance Binary Using
923deriving instance NFData Using
926data SyntaxInfo = Syn { using :: [Using],
927 syn_params :: [(Name, PTerm)],
928 syn_namespace :: [String],
930 decoration :: Name -> Name,
932 implicitAllowed :: Bool,
936deriving instance NFData SyntaxInfo
937deriving instance Binary SyntaxInfo
940defaultSyntax = Syn [] [] [] [] id False False initDSL
942expandNS :: SyntaxInfo -> Name -> Name
943expandNS syn n@(NS _ _) = n
944expandNS syn n = case syn_namespace syn of
949-- For inferring types of things
953inferTy = sMN 0 "__Infer"
954inferCon = sMN 0 "__infer"
955inferDecl = PDatadecl inferTy
957 [(emptyDocstring, [], inferCon, PPi impl (sMN 0 "iType") PType (
958 PPi expl (sMN 0 "ival") (PRef bi (sMN 0 "iType"))
959 (PRef bi inferTy)), bi, [])]
962infTerm t = PApp bi (PRef bi inferCon) [pimp (sMN 0 "iType") Placeholder True, pexp t]
963infP = P (TCon 6 0) inferTy (TType (UVal 0))
965getInferTerm, getInferType :: Term -> Term
966getInferTerm (Bind n b sc) = Bind n b $ getInferTerm sc
967getInferTerm (App (App _ _) tm) = tm
968getInferTerm tm = tm -- error ("getInferTerm " ++ show tm)
970getInferType (Bind n b sc) = Bind n (toTy b) $ getInferType sc
971 where toTy (Lam t) = Pi t
972 toTy (PVar t) = PVTy t
974getInferType (App (App _ ty) _) = ty
978-- Handy primitives: Unit, False, Pair, MkPair, =, mkForeign, Elim type class
980primNames = [unitTy, unitCon,
981 falseTy, pairTy, pairCon,
982 eqTy, eqCon, inferTy, inferCon]
984unitTy = sMN 0 "__Unit"
985unitCon = sMN 0 "__II"
986unitDecl = PDatadecl unitTy PType
987 [(emptyDocstring, [], unitCon, PRef bi unitTy, bi, [])]
988unitOpts = [DefaultEliminator]
990falseTy = sMN 0 "__False"
991falseDecl = PDatadecl falseTy PType []
994pairTy = sMN 0 "__Pair"
995pairCon = sMN 0 "__MkPair"
996pairDecl = PDatadecl pairTy (piBind [(n "A", PType), (n "B", PType)] PType)
997 [(emptyDocstring, [], pairCon, PPi impl (n "A") PType (
998 PPi impl (n "B") PType (
999 PPi expl (n "a") (PRef bi (n "A")) (
1000 PPi expl (n "b") (PRef bi (n "B"))
1001 (PApp bi (PRef bi pairTy) [pexp (PRef bi (n "A")),
1002 pexp (PRef bi (n "B"))])))), bi, [])]
1008eqDecl = PDatadecl eqTy (piBind [(n "A", PType), (n "B", PType),
1009 (n "x", PRef bi (n "A")), (n "y", PRef bi (n "B"))]
1011 [(emptyDocstring, [], eqCon, PPi impl (n "A") PType (
1012 PPi impl (n "x") (PRef bi (n "A"))
1013 (PApp bi (PRef bi eqTy) [pimp (n "A") Placeholder False,
1014 pimp (n "B") Placeholder False,
1015 pexp (PRef bi (n "x")),
1016 pexp (PRef bi (n "x"))])), bi, [])]
1020elimName = sUN "__Elim"
1021elimMethElimTy = sUN "__elimTy"
1022elimMethElim = sUN "elim"
1023elimDecl = PClass (parseDocstring . T.pack $ "Type class for eliminators") defaultSyntax bi [] elimName [(sUN "scrutineeType", PType)]
1024 [PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElimTy PType,
1025 PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElim (PRef bi elimMethElimTy)]
1027-- Defined in builtins.idr
1028sigmaTy = sUN "Exists"
1029existsCon = sUN "Ex_intro"
1031piBind :: [(Name, PTerm)] -> PTerm -> PTerm
1032piBind = piBindp expl
1034piBindp :: Plicity -> [(Name, PTerm)] -> PTerm -> PTerm
1036piBindp p ((n, ty):ns) t = PPi p n ty (piBindp p ns t)
1039-- Pretty-printing declarations and terms
1041-- These "show" instances render to an absurdly wide screen because inserted line breaks
1042-- could interfere with interactive editing, which calls "show".
1044instance Show PTerm where
1045 showsPrec _ tm = (displayS . renderPretty 1.0 10000000 . prettyImp False) tm
1047instance Show PDecl where
1048 showsPrec _ d = (displayS . renderPretty 1.0 10000000 . showDeclImp False) d
1050instance Show PClause where
1051 showsPrec _ c = (displayS . renderPretty 1.0 10000000 . showCImp True) c
1053instance Show PData where
1054 showsPrec _ d = (displayS . renderPretty 1.0 10000000 . showDImp False) d
1056instance Pretty PTerm OutputAnnotation where
1057 pretty = prettyImp False
1059-- | Colourise annotations according to an Idris state. It ignores the names
1060-- in the annotation, as there's no good way to show extended information on a
1062consoleDecorate :: IState -> OutputAnnotation -> String -> String
1063consoleDecorate ist _ | not (idris_colourRepl ist) = id
1064consoleDecorate ist AnnConstData = let theme = idris_colourTheme ist
1065 in colouriseData theme
1066consoleDecorate ist AnnConstType = let theme = idris_colourTheme ist
1067 in colouriseType theme
1068consoleDecorate ist (AnnBoundName _ True) = colouriseImplicit (idris_colourTheme ist)
1069consoleDecorate ist (AnnBoundName _ False) = colouriseBound (idris_colourTheme ist)
1070consoleDecorate ist AnnKeyword = colouriseKeyword (idris_colourTheme ist)
1071consoleDecorate ist (AnnName n _ _) = let ctxt = tt_ctxt ist
1072 theme = idris_colourTheme ist
1074 _ | isDConName n ctxt -> colouriseData theme
1075 _ | isFnName n ctxt -> colouriseFun theme
1076 _ | isTConName n ctxt -> colouriseType theme
1077 _ | otherwise -> id -- don't colourise unknown names
1078consoleDecorate ist (AnnFC _) = id
1079consoleDecorate ist (AnnTextFmt fmt) = Idris.Colours.colourise (colour fmt)
1080 where colour BoldText = IdrisColour Nothing True False True False
1081 colour UnderlineText = IdrisColour Nothing True True False False
1082 colour ItalicText = IdrisColour Nothing True False False True
1084-- | Pretty-print a high-level closed Idris term
1085prettyImp :: Bool -- ^^ whether to show implicits
1086 -> PTerm -- ^^ the term to pretty-print
1087 -> Doc OutputAnnotation
1088prettyImp impl = pprintPTerm impl [] []
1090-- | Pretty-print a high-level Idris term in some bindings context
1091pprintPTerm :: Bool -- ^^ whether to show implicits
1092 -> [(Name, Bool)] -- ^^ the currently-bound names and whether they are implicit
1093 -> [Name] -- ^^ names to always show in pi, even if not used
1094 -> PTerm -- ^^ the term to pretty-print
1095 -> Doc OutputAnnotation
1096pprintPTerm impl bnd docArgs = prettySe 10 bnd
1098 prettySe :: Int -> [(Name, Bool)] -> PTerm -> Doc OutputAnnotation
1099 prettySe p bnd (PQuote r) =
1100 text "![" <> pretty r <> text "]"
1101 prettySe p bnd (PPatvar fc n) = pretty n
1103 | Just str <- slist p bnd e = str
1104 | Just n <- snat p e = annotate AnnConstData (text (show n))
1105 prettySe p bnd (PRef fc n) = prettyName impl bnd n
1106 prettySe p bnd (PLam n ty sc) =
1107 bracket p 2 . group . align . hang 2 $
1108 text "\\" <> bindingOf n False <+> text "=>" <$>
1109 prettySe 10 ((n, False):bnd) sc
1110 prettySe p bnd (PLet n ty v sc) =
1112 kwd "let" <+> bindingOf n False <+> text "=" </>
1113 prettySe 10 bnd v <+> kwd "in" </>
1114 prettySe 10 ((n, False):bnd) sc
1115 prettySe p bnd (PPi (Exp l s _) n ty sc)
1116 | n `elem` allNamesIn sc || impl || n `elem` docArgs =
1117 let open = if Lazy `elem` l then text "|" <> lparen else lparen in
1118 bracket p 2 . group $
1119 enclose open rparen (group . align $ bindingOf n False <+> colon <+> prettySe 10 bnd ty) <+>
1120 st <> text "->" <$> prettySe 10 ((n, False):bnd) sc
1122 bracket p 2 . group $
1123 group (prettySe 0 bnd ty <+> st) <> text "->" <$> group (prettySe 10 ((n, False):bnd) sc)
1127 Static -> text "[static]" <> space
1129 prettySe p bnd (PPi (Imp l s _) n ty sc)
1131 let open = if Lazy `elem` l then text "|" <> lbrace else lbrace in
1133 open <> bindingOf n True <+> colon <+> prettySe 10 bnd ty <> rbrace <+>
1134 st <> text "->" </> prettySe 10 ((n, True):bnd) sc
1135 | otherwise = prettySe 10 ((n, True):bnd) sc
1139 Static -> text "[static]" <> space
1141 prettySe p bnd (PPi (Constraint _ _) n ty sc) =
1143 prettySe 10 bnd ty <+> text "=>" </> prettySe 10 ((n, True):bnd) sc
1144 prettySe p bnd (PPi (TacImp _ _ s) n ty sc) =
1146 lbrace <> kwd "tacimp" <+> pretty n <+> colon <+> prettySe 10 bnd ty <>
1147 rbrace <+> text "->" </> prettySe 10 ((n, True):bnd) sc
1148 prettySe p bnd (PApp _ (PRef _ f) args) -- normal names, no explicit args
1149 | UN nm <- basename f
1150 , not impl && null (getExps args) = if isAlpha (thead nm)
1151 then prettyName impl bnd f
1152 else enclose lparen rparen $
1153 prettyName impl bnd f
1154 prettySe p bnd (PAppBind _ (PRef _ f) [])
1155 | not impl = text "!" <> prettyName impl bnd f
1156 prettySe p bnd (PApp _ (PRef _ op) args)
1157 | UN nm <- basename op
1159 (not impl) && (not $ isAlpha (thead nm)) =
1160 case getExps args of
1161 [] -> enclose lparen rparen opName
1162 [x] -> group (enclose lparen rparen opName <$> group (prettySe 0 bnd x))
1163 [l,r] -> bracket p 1 $ inFix l r
1164 (l:r:rest) -> bracket p 1 $
1165 enclose lparen rparen (inFix l r) <+>
1166 align (group (vsep (map (prettyArgSe bnd) rest)))
1167 where opName = prettyName impl bnd op
1168 inFix l r = align . group $
1169 (prettySe 1 bnd l <+> opName) <$> group (prettySe 0 bnd r)
1170 prettySe p bnd (PApp _ hd@(PRef fc f) [tm])
1171 | PConstant (Idris.Core.TT.Str str) <- getTm tm,
1172 f == sUN "Symbol_" = char '\'' <> prettySe 10 bnd (PRef fc (sUN str))
1173 prettySe p bnd (PApp _ f as) =
1174 let args = getExps as
1175 fp = prettySe 1 bnd f
1177 bracket p 1 . group $
1181 else fp <+> align (vsep (map (prettyArgS bnd) as))
1184 else fp <+> align (vsep (map (prettyArgSe bnd) args))
1185 prettySe p bnd (PCase _ scr opts) =
1186 kwd "case" <+> prettySe 10 bnd scr <+> kwd "of" <> prettyBody
1188 prettyBody = foldr (<>) empty $ intersperse (text "|") $ map sc opts
1190 sc (l, r) = nest nestingSize $ prettySe 10 bnd l <+> text "=>" <+> prettySe 10 bnd r
1191 prettySe p bnd (PHidden tm) = text "." <> prettySe 0 bnd tm
1192 prettySe p bnd (PRefl _ _) = annotate (AnnName eqCon Nothing Nothing) $ text "refl"
1193 prettySe p bnd (PResolveTC _) = text "resolvetc"
1194 prettySe p bnd (PTrue _ IsType) = annotate (AnnName unitTy Nothing Nothing) $ text "()"
1195 prettySe p bnd (PTrue _ IsTerm) = annotate (AnnName unitCon Nothing Nothing) $ text "()"
1196 prettySe p bnd (PTrue _ TypeOrTerm) = text "()"
1197 prettySe p bnd (PFalse _) = annotate (AnnName falseTy Nothing Nothing) $ text "_|_"
1198 prettySe p bnd (PEq _ l r) =
1199 bracket p 2 . align . group $
1200 prettySe 10 bnd l <+> eq <$> group (prettySe 10 bnd r)
1201 where eq = annotate (AnnName eqTy Nothing Nothing) (text "=")
1202 prettySe p bnd (PRewrite _ l r _) =
1204 text "rewrite" <+> prettySe 10 bnd l <+> text "in" <+> prettySe 10 bnd r
1205 prettySe p bnd (PTyped l r) =
1206 lparen <> prettySe 10 bnd l <+> colon <+> prettySe 10 bnd r <> rparen
1207 prettySe p bnd pair@(PPair _ pun _ _) -- flatten tuples to the right, like parser
1208 | Just elts <- pairElts pair = enclose (ann lparen) (ann rparen) .
1209 align . group . vsep . punctuate (ann comma) $
1210 map (prettySe 10 bnd) elts
1211 where ann = case pun of
1213 IsType -> annotate (AnnName pairTy Nothing Nothing)
1214 IsTerm -> annotate (AnnName pairCon Nothing Nothing)
1215 prettySe p bnd (PDPair _ TypeOrTerm l t r) =
1216 lparen <> prettySe 10 bnd l <+> text "**" <+> prettySe 10 bnd r <> rparen
1217 prettySe p bnd (PDPair _ IsType (PRef _ n) t r) =
1218 annotate (AnnName sigmaTy Nothing Nothing) lparen <>
1219 bindingOf n False <+>
1220 annotate (AnnName sigmaTy Nothing Nothing) (text "**") <+>
1221 prettySe 10 ((n, False):bnd) r <>
1222 annotate (AnnName sigmaTy Nothing Nothing) rparen
1223 prettySe p bnd (PDPair _ IsType l t r) =
1224 annotate (AnnName sigmaTy Nothing Nothing) lparen <>
1225 prettySe 10 bnd l <+>
1226 annotate (AnnName sigmaTy Nothing Nothing) (text "**") <+>
1227 prettySe 10 bnd r <>
1228 annotate (AnnName sigmaTy Nothing Nothing) rparen
1229 prettySe p bnd (PDPair _ IsTerm l t r) =
1230 annotate (AnnName existsCon Nothing Nothing) lparen <>
1231 prettySe 10 bnd l <+>
1232 annotate (AnnName existsCon Nothing Nothing) (text "**") <+>
1233 prettySe 10 bnd r <>
1234 annotate (AnnName existsCon Nothing Nothing) rparen
1235 prettySe p bnd (PAlternative a as) =
1236 lparen <> text "|" <> prettyAs <> text "|" <> rparen
1239 foldr (\l -> \r -> l <+> text "," <+> r) empty $ map (prettySe 10 bnd) as
1240 prettySe p bnd PType = annotate AnnConstType $ text "Type"
1241 prettySe p bnd (PConstant c) = annotate (annot c) (text (show c))
1242 where annot (AType _) = AnnConstType
1243 annot StrType = AnnConstType
1244 annot PtrType = AnnConstType
1245 annot VoidType = AnnConstType
1246 annot _ = AnnConstData
1247 -- XXX: add pretty for tactics
1248 prettySe p bnd (PProof ts) =
1249 text "proof" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1250 prettySe p bnd (PTactics ts) =
1251 text "tactics" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1252 prettySe p bnd (PMetavar n) = text "?" <> pretty n
1253 prettySe p bnd (PReturn f) = kwd "return"
1254 prettySe p bnd PImpossible = kwd "impossible"
1255 prettySe p bnd Placeholder = text "_"
1256 prettySe p bnd (PDoBlock _) = text "do block pretty not implemented"
1257 prettySe p bnd (PElabError s) = pretty s
1259 prettySe p bnd _ = text "test"
1261 prettyArgS bnd (PImp _ _ _ n tm) = prettyArgSi bnd (n, tm)
1262 prettyArgS bnd (PExp _ _ tm) = prettyArgSe bnd tm
1263 prettyArgS bnd (PConstraint _ _ tm) = prettyArgSc bnd tm
1264 prettyArgS bnd (PTacImplicit _ _ n _ tm) = prettyArgSti bnd (n, tm)
1266 prettyArgSe bnd arg = prettySe 0 bnd arg
1267 prettyArgSi bnd (n, val) = lbrace <> pretty n <+> text "=" <+> prettySe 10 bnd val <> rbrace
1268 prettyArgSc bnd val = lbrace <> lbrace <> prettySe 10 bnd val <> rbrace <> rbrace
1269 prettyArgSti bnd (n, val) = lbrace <> kwd "auto" <+> pretty n <+> text "=" <+> prettySe 10 bnd val <> rbrace
1271 basename :: Name -> Name
1272 basename (NS n _) = basename n
1275 slist' p bnd (PApp _ (PRef _ nil) _)
1276 | not impl && nsroot nil == sUN "Nil" = Just []
1277 slist' p bnd (PRef _ nil)
1278 | not impl && nsroot nil == sUN "Nil" = Just []
1279 slist' p bnd (PApp _ (PRef _ cons) args)
1280 | nsroot cons == sUN "::",
1281 (PExp {getTm=tl}):(PExp {getTm=hd}):imps <- reverse args,
1283 Just tl' <- slist' p bnd tl
1286 isImp (PImp {}) = True
1288 slist' _ _ tm = Nothing
1290 slist p bnd e | Just es <- slist' p bnd e = Just $
1291 case es of [] -> annotate AnnConstData $ text "[]"
1292 [x] -> enclose left right . group $
1294 xs -> (enclose left right .
1295 align . group . vsep .
1297 map (prettySe p bnd)) xs
1298 where left = (annotate AnnConstData (text "["))
1299 right = (annotate AnnConstData (text "]"))
1300 comma = (annotate AnnConstData (text ","))
1301 slist _ _ _ = Nothing
1303 pairElts :: PTerm -> Maybe [PTerm]
1304 pairElts (PPair _ _ x y) | Just elts <- pairElts y = Just (x:elts)
1305 | otherwise = Just [x, y]
1306 pairElts _ = Nothing
1308 natns = "Prelude.Nat."
1311 | show z == (natns++"Z") || show z == "Z" = Just 0
1312 snat p (PApp _ s [PExp {getTm=n}])
1313 | show s == (natns++"S") || show s == "S",
1318 bracket outer inner doc
1319 | inner > outer = lparen <> doc <> rparen
1322 kwd = annotate AnnKeyword . text
1324-- | Pretty-printer helper for the binding site of a name
1325bindingOf :: Name -- ^^ the bound name
1326 -> Bool -- ^^ whether the name is implicit
1327 -> Doc OutputAnnotation
1328bindingOf n imp = annotate (AnnBoundName n imp) (text (show n))
1330-- | Pretty-printer helper for names that attaches the correct annotations
1331prettyName :: Bool -- ^^ whether to show namespaces
1332 -> [(Name, Bool)] -- ^^ the current bound variables and whether they are implicit
1333 -> Name -- ^^ the name to pprint
1334 -> Doc OutputAnnotation
1335prettyName showNS bnd n | Just imp <- lookup n bnd = annotate (AnnBoundName n imp) (text (strName n))
1336 | otherwise = annotate (AnnName n Nothing Nothing) (text (strName n))
1337 where strName (UN n) = T.unpack n
1338 strName (NS n ns) | showNS = (concatMap (++ ".") . map T.unpack . reverse) ns ++ strName n
1339 | otherwise = strName n
1340 strName (MN i s) = T.unpack s
1341 strName other = show other
1344showCImp :: Bool -> PClause -> Doc OutputAnnotation
1345showCImp impl (PClause _ n l ws r w)
1346 = prettyImp impl l <+> showWs ws <+> text "=" <+> prettyImp impl r
1347 <+> text "where" <+> text (show w)
1350 showWs (x : xs) = text "|" <+> prettyImp impl x <+> showWs xs
1351showCImp impl (PWith _ n l ws r w)
1352 = prettyImp impl l <+> showWs ws <+> text "with" <+> prettyImp impl r
1353 <+> braces (text (show w))
1356 showWs (x : xs) = text "|" <+> prettyImp impl x <+> showWs xs
1359showDImp :: Bool -> PData -> Doc OutputAnnotation
1360showDImp impl (PDatadecl n ty cons)
1361 = text "data" <+> text (show n) <+> colon <+> prettyImp impl ty <+> text "where" <$>
1362 (indent 2 $ vsep (map (\ (_, _, n, t, _, _) -> pipe <+> prettyName False [] n <+> colon <+> prettyImp impl t) cons))
1364showDecls :: Bool -> [PDecl] -> Doc OutputAnnotation
1365showDecls i ds = vsep (map (showDeclImp i) ds)
1367showDeclImp _ (PFix _ f ops) = text (show f) <+> cat (punctuate (text ",") (map text ops))
1368showDeclImp i (PTy _ _ _ _ _ n t) = text "tydecl" <+> text (showCG n) <+> colon <+> prettyImp i t
1369showDeclImp i (PClauses _ _ n cs) = text "pat" <+> text (showCG n) <+> text "\t" <+>
1370 indent 2 (vsep (map (showCImp i) cs))
1371showDeclImp _ (PData _ _ _ _ _ d) = showDImp True d
1372showDeclImp i (PParams _ ns ps) = text "params" <+> braces (text (show ns) <> line <> showDecls i ps <> line)
1373showDeclImp i (PNamespace n ps) = text "namespace" <+> text n <> braces (line <> showDecls i ps <> line)
1374showDeclImp _ (PSyntax _ syn) = text "syntax" <+> text (show syn)
1375showDeclImp i (PClass _ _ _ cs n ps ds)
1376 = text "class" <+> text (show cs) <+> text (show n) <+> text (show ps) <> line <> showDecls i ds
1377showDeclImp i (PInstance _ _ cs n _ t _ ds)
1378 = text "instance" <+> text (show cs) <+> text (show n) <+> prettyImp i t <> line <> showDecls i ds
1379showDeclImp _ _ = text "..."
1380-- showDeclImp (PImport i) = "import " ++ i
1382instance Show (Doc OutputAnnotation) where
1383 show = flip (displayS . renderCompact) ""
1385getImps :: [PArg] -> [(Name, PTerm)]
1387getImps (PImp _ _ _ n tm : xs) = (n, tm) : getImps xs
1388getImps (_ : xs) = getImps xs
1390getExps :: [PArg] -> [PTerm]
1392getExps (PExp _ _ tm : xs) = tm : getExps xs
1393getExps (_ : xs) = getExps xs
1395getConsts :: [PArg] -> [PTerm]
1397getConsts (PConstraint _ _ tm : xs) = tm : getConsts xs
1398getConsts (_ : xs) = getConsts xs
1400getAll :: [PArg] -> [PTerm]
1405showName :: Maybe IState -- ^^ the Idris state, for information about names and colours
1406 -> [(Name, Bool)] -- ^^ the bound variables and whether they're implicit
1407 -> Bool -- ^^ whether to show implicits
1408 -> Bool -- ^^ whether to colourise
1409 -> Name -- ^^ the term to show
1411showName ist bnd impl colour n = case ist of
1412 Just i -> if colour then colourise n (idris_colourTheme i) else showbasic n
1413 Nothing -> showbasic n
1414 where name = if impl then show n else showbasic n
1415 showbasic n@(UN _) = showCG n
1416 showbasic (MN _ s) = str s
1417 showbasic (NS n s) = showSep "." (map str (reverse s)) ++ "." ++ showbasic n
1418 showbasic (SN s) = show s
1420 colourise n t = let ctxt' = fmap tt_ctxt ist in
1423 Just ctxt | Just impl <- lookup n bnd -> if impl then colouriseImplicit t name
1424 else colouriseBound t name
1425 | isDConName n ctxt -> colouriseData t name
1426 | isFnName n ctxt -> colouriseFun t name
1427 | isTConName n ctxt -> colouriseType t name
1428 -- The assumption is that if a name is not bound and does not exist in the
1429 -- global context, then we're somewhere in which implicit info has been lost
1430 -- (like error messages). Thus, unknown vars are colourised as implicits.
1431 | otherwise -> colouriseImplicit t name
1433showTm :: IState -- ^^ the Idris state, for information about identifiers and colours
1434 -> PTerm -- ^^ the term to show
1436showTm ist = displayDecorated (consoleDecorate ist) . renderCompact . prettyImp (opt_showimp (idris_options ist))
1438-- | Show a term with implicits, no colours
1439showTmImpls :: PTerm -> String
1440showTmImpls = flip (displayS . renderCompact . prettyImp True) ""
1443instance Sized PTerm where
1444 size (PQuote rawTerm) = size rawTerm
1445 size (PRef fc name) = size name
1446 size (PLam name ty bdy) = 1 + size ty + size bdy
1447 size (PPi plicity name ty bdy) = 1 + size ty + size bdy
1448 size (PLet name ty def bdy) = 1 + size ty + size def + size bdy
1449 size (PTyped trm ty) = 1 + size trm + size ty
1450 size (PApp fc name args) = 1 + size args
1451 size (PAppBind fc name args) = 1 + size args
1452 size (PCase fc trm bdy) = 1 + size trm + size bdy
1453 size (PTrue fc _) = 1
1454 size (PFalse fc) = 1
1455 size (PRefl fc _) = 1
1456 size (PResolveTC fc) = 1
1457 size (PEq fc left right) = 1 + size left + size right
1458 size (PRewrite fc left right _) = 1 + size left + size right
1459 size (PPair fc _ left right) = 1 + size left + size right
1460 size (PDPair fs _ left ty right) = 1 + size left + size ty + size right
1461 size (PAlternative a alts) = 1 + size alts
1462 size (PHidden hidden) = size hidden
1463 size (PUnifyLog tm) = size tm
1464 size (PDisamb _ tm) = size tm
1465 size (PNoImplicits tm) = size tm
1467 size (PConstant const) = 1 + size const
1468 size Placeholder = 1
1469 size (PDoBlock dos) = 1 + size dos
1470 size (PIdiom fc term) = 1 + size term
1471 size (PReturn fc) = 1
1472 size (PMetavar name) = 1
1473 size (PProof tactics) = size tactics
1474 size (PElabError err) = size err
1475 size PImpossible = 1
1477getPArity :: PTerm -> Int
1478getPArity (PPi _ _ _ sc) = 1 + getPArity sc
1481-- Return all names, free or globally bound, in the given term.
1483allNamesIn :: PTerm -> [Name]
1484allNamesIn tm = nub $ ni [] tm
1487 | not (n `elem` env) = [n]
1488 ni env (PPatvar _ n) = [n]
1489 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1490 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1491 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1492 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1493 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1494 ni env (PHidden tm) = ni env tm
1495 ni env (PEq _ l r) = ni env l ++ ni env r
1496 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1497 ni env (PTyped l r) = ni env l ++ ni env r
1498 ni env (PPair _ _ l r) = ni env l ++ ni env r
1499 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1500 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1501 ni env (PAlternative a ls) = concatMap (ni env) ls
1502 ni env (PUnifyLog tm) = ni env tm
1503 ni env (PDisamb _ tm) = ni env tm
1504 ni env (PNoImplicits tm) = ni env tm
1507-- Return all names defined in binders in the given term
1508boundNamesIn :: PTerm -> [Name]
1509boundNamesIn tm = nub $ ni tm
1511 ni (PApp _ f as) = ni f ++ concatMap (ni) (map getTm as)
1512 ni (PAppBind _ f as) = ni f ++ concatMap (ni) (map getTm as)
1513 ni (PCase _ c os) = ni c ++ concatMap (ni) (map snd os)
1514 ni (PLam n ty sc) = n : (ni ty ++ ni sc)
1515 ni (PLet n ty val sc) = n : (ni ty ++ ni val ++ ni sc)
1516 ni (PPi _ n ty sc) = n : (ni ty ++ ni sc)
1517 ni (PEq _ l r) = ni l ++ ni r
1518 ni (PRewrite _ l r _) = ni l ++ ni r
1519 ni (PTyped l r) = ni l ++ ni r
1520 ni (PPair _ _ l r) = ni l ++ ni r
1521 ni (PDPair _ _ (PRef _ n) t r) = ni t ++ ni r
1522 ni (PDPair _ _ l t r) = ni l ++ ni t ++ ni r
1523 ni (PAlternative a as) = concatMap (ni) as
1524 ni (PHidden tm) = ni tm
1525 ni (PUnifyLog tm) = ni tm
1526 ni (PDisamb _ tm) = ni tm
1527 ni (PNoImplicits tm) = ni tm
1530-- Return names which are free in the given term.
1531namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name]
1532namesIn uvars ist tm = nub $ ni [] tm
1535 | not (n `elem` env)
1536 = case lookupTy n (tt_ctxt ist) of
1538 _ -> if n `elem` (map fst uvars) then [n] else []
1539 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1540 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1541 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1542 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1543 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1544 ni env (PEq _ l r) = ni env l ++ ni env r
1545 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1546 ni env (PTyped l r) = ni env l ++ ni env r
1547 ni env (PPair _ _ l r) = ni env l ++ ni env r
1548 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1549 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1550 ni env (PAlternative a as) = concatMap (ni env) as
1551 ni env (PHidden tm) = ni env tm
1552 ni env (PUnifyLog tm) = ni env tm
1553 ni env (PDisamb _ tm) = ni env tm
1554 ni env (PNoImplicits tm) = ni env tm
1557-- Return which of the given names are used in the given term.
1559usedNamesIn :: [Name] -> IState -> PTerm -> [Name]
1560usedNamesIn vars ist tm = nub $ ni [] tm
1563 | n `elem` vars && not (n `elem` env)
1564 = case lookupTy n (tt_ctxt ist) of
1567 ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1568 ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
1569 ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
1570 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1571 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1572 ni env (PEq _ l r) = ni env l ++ ni env r
1573 ni env (PRewrite _ l r _) = ni env l ++ ni env r
1574 ni env (PTyped l r) = ni env l ++ ni env r
1575 ni env (PPair _ _ l r) = ni env l ++ ni env r
1576 ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1577 ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r
1578 ni env (PAlternative a as) = concatMap (ni env) as
1579 ni env (PHidden tm) = ni env tm
1580 ni env (PUnifyLog tm) = ni env tm
1581 ni env (PDisamb _ tm) = ni env tm
1582 ni env (PNoImplicits tm) = ni env tm
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