on master help sign in
Support names and terms in error reflection
commit40da42f2d572eeebd52dbba4f923e7eeb0a49039 authorDavid Raymond Christiansen <david@davidchristiansen.dk> dateFri 10 Jan 2014, 09:02 (13 years ago) parentb0e43f0
5 files changed+84−49
libs/base/Language/Reflection/Errors.idr+4−3 src/Idris/Core/TT.hs+43−30 src/Idris/Delaborate.hs+11 src/Idris/ElabTerm.hs+26−2 src/Idris/Error.hs−14
libs/base/Language/Reflection/Errors.idr+4−3
@@ -32,11 +32,12 @@ data Err = Msg String
3232 | At SourceLocation Err
3333 | Elaborating String TTName Err
3434 | ProviderError String
35+ | LoadingFailed String Err
3536
3637-- | Error reports are a list of report parts
37−data ErrorReportPart = Message String
38− | Name TTName
39− | Term TT
38+data ErrorReportPart = TextPart String
39+ | NamePart TTName
40+ | TermPart TT
4041
4142
4243-- Error reports become functions in List (String, TT) -> Err -> ErrorReport
src/Idris/Core/TT.hs+43−30
@@ -74,37 +74,50 @@ instance Sized FC where
7474instance Show FC where
7575 show (FC f l c) = f ++ ":" ++ show l ++ ":" ++ show c
7676
77+-- | Used for error reflection
78+data ErrorReportPart = TextPart String
79+ | NamePart Name
80+ | TermPart Term
81+ deriving (Show, Eq)
82+
83+
84+-- Please remember to keep Err synchronised with
85+-- Language.Reflection.Errors.Err in the stdlib!
86+
87+-- | Idris errors. Used as exceptions in the compiler, but reported to users
88+-- if they reach the top level.
7789data Err = Msg String
78− | InternalMsg String
79− | CantUnify Bool Term Term Err [(Name, Type)] Int
80− -- Int is 'score' - how much we did unify
81− -- Bool indicates recoverability, True indicates more info may make
82− -- unification succeed
83− | InfiniteUnify Name Term [(Name, Type)]
84− | CantConvert Term Term [(Name, Type)]
85− | UnifyScope Name Name Term [(Name, Type)]
86− | CantInferType String
87− | NonFunctionType Term Term
88− | NotEquality Term Term
89− | TooManyArguments Name
90− | CantIntroduce Term
91− | NoSuchVariable Name
92− | NoTypeDecl Name
93− | NotInjective Term Term Term
94− | CantResolve Term
95− | CantResolveAlts [String]
96− | IncompleteTerm Term
97− | UniverseError
98− | ProgramLineComment
99− | Inaccessible Name
100− | NonCollapsiblePostulate Name
101− | AlreadyDefined Name
102− | ProofSearchFail Err
103− | NoRewriting Term
104− | At FC Err
105− | Elaborating String Name Err
106− | ProviderError String
107− | LoadingFailed String Err
90+ | InternalMsg String
91+ | CantUnify Bool Term Term Err [(Name, Type)] Int
92+ -- Int is 'score' - how much we did unify
93+ -- Bool indicates recoverability, True indicates more info may make
94+ -- unification succeed
95+ | InfiniteUnify Name Term [(Name, Type)]
96+ | CantConvert Term Term [(Name, Type)]
97+ | UnifyScope Name Name Term [(Name, Type)]
98+ | CantInferType String
99+ | NonFunctionType Term Term
100+ | NotEquality Term Term
101+ | TooManyArguments Name
102+ | CantIntroduce Term
103+ | NoSuchVariable Name
104+ | NoTypeDecl Name
105+ | NotInjective Term Term Term
106+ | CantResolve Term
107+ | CantResolveAlts [String]
108+ | IncompleteTerm Term
109+ | UniverseError
110+ | ProgramLineComment
111+ | Inaccessible Name
112+ | NonCollapsiblePostulate Name
113+ | AlreadyDefined Name
114+ | ProofSearchFail Err
115+ | NoRewriting Term
116+ | At FC Err
117+ | Elaborating String Name Err
118+ | ProviderError String
119+ | LoadingFailed String Err
120+ | ReflectionError [ErrorReportPart]
108121 deriving Eq
109122{-!
110123deriving instance NFData Err
src/Idris/Delaborate.hs+11
@@ -9,6 +9,8 @@ import Idris.AbsSyntax
99import Idris.Core.TT
1010import Idris.Core.Evaluate
1111
12+import Data.List (intersperse)
13+
1214import Debug.Trace
1315
1416bugaddr = "https://github.com/idris-lang/Idris-dev/issues"
@@ -190,6 +192,15 @@ pshow i (Elaborating s n e) = "When elaborating " ++ s ++
190192 showqual i n ++ ":\n" ++ pshow i e
191193pshow i (ProviderError msg) = "Type provider error: " ++ msg
192194pshow i (LoadingFailed fn e) = "Loading " ++ fn ++ " failed: " ++ pshow i e
195+pshow i (ReflectionError parts) = let parts' = map showPart parts in
196+ concat (intersperse " " parts')
197+ where showPart :: ErrorReportPart -> String
198+ showPart (TextPart str) = str
199+ showPart (NamePart n) = let colour = idris_colourRepl i in
200+ showName (Just i) [] False colour n
201+ showPart (TermPart tm) = let colour = idris_colourRepl i
202+ in showImp (Just i) False colour (delab i tm)
203+
193204
194205showSc i [] = ""
195206showSc i xs = "\n\nIn context:\n" ++ showSep "\n" (map showVar (reverse xs))
src/Idris/ElabTerm.hs+26−2
@@ -1379,13 +1379,37 @@ withErrorReflection x = idrisCatch x (\ e -> handle e >>= ierror)
13791379
13801380
13811381 errorparts <- mapM reifyReportPart (concat (mapMaybe unList (mapMaybe fromTTMaybe results)))
1382− newMsgs <- mapM renderReportPart errorparts
1383− return . Msg $ concat (intersperse " " newMsgs)
1382+ return $ ReflectionError errorparts
13841383
13851384 fromTTMaybe :: Term -> Maybe Term -- WARNING: Assumes the term has type Maybe a
13861385 fromTTMaybe (App (App (P (DCon _ _) (NS (UN "Just") _) _) ty) tm) = Just tm
13871386 fromTTMaybe x = Nothing
13881387
1388+reflErrName :: String -> Name
1389+reflErrName n = NS (UN n) ["Errors", "Reflection", "Language"]
1390+
1391+reifyReportPart :: Term -> Idris ErrorReportPart
1392+reifyReportPart (App (P (DCon _ _) n _) (Constant (Str msg))) | n == reflErrName "TextPart" =
1393+ return (TextPart msg)
1394+reifyReportPart (App (P (DCon _ _) n _) ttn)
1395+ | n == reflErrName "NamePart" =
1396+ case runElab [] (reifyTTName ttn) (initElaborator NErased initContext Erased) of
1397+ Error e -> ierror . InternalMsg $
1398+ "could not reify name term " ++
1399+ show ttn ++
1400+ " when reflecting an error"
1401+ OK (n', _)-> return $ NamePart n'
1402+reifyReportPart (App (P (DCon _ _) n _) tm)
1403+ | n == reflErrName "TermPart" =
1404+ do ist <- getIState
1405+ case runElab [] (reifyTT tm) (initElaborator NErased initContext Erased) of
1406+ Error e -> ierror . InternalMsg $
1407+ "could not reify reflected term " ++
1408+ show tm ++
1409+ " when reflecting an error"
1410+ OK (tm', _) -> return $ TermPart tm'
1411+reifyReportPart x = ierror . InternalMsg $ "could not reify " ++ show x
1412+
13891413envTupleType :: Raw
13901414envTupleType
13911415 = raw_apply (Var pairTy) [ (Var $ reflm "TTName")
src/Idris/Error.hs−14
@@ -73,17 +73,3 @@ getErrColumn :: Err -> Int
7373getErrColumn (At (FC _ _ c) _) = c
7474getErrColumn _ = 0
7575
76−data ErrorReportPart = Message String
77− | Name Name
78− | Term Term
79− deriving (Show)
80−
81−reifyReportPart :: Term -> Idris ErrorReportPart
82−reifyReportPart (App (P (DCon _ _) (NS (UN "Message") ["Errors", "Reflection", "Language"]) _) (Constant (Str msg))) =
83− return (Message msg)
84−reifyReportPart x = ierror . Msg $ "could not reify " ++ show x
85−
86−renderReportPart :: ErrorReportPart -> Idris String
87−renderReportPart (Message str) = return str
88−renderReportPart (Name n) = return (show n) -- TODO colouring
89−renderReportPart (Term t) = return (show t) -- TODO pretty-print and colour