@@ -1,5 +1,5 @@
1{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor, DeriveDataTypeable #-}
1{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor, DeriveDataTypeable #-}
2−
2+{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
3{-| TT is the core language of Idris. The language has:
3{-| TT is the core language of Idris. The language has:
5 * Full dependent types
5 * Full dependent types
@@ -366,6 +366,7 @@ data SpecialName = WhereN Int Name Name
366 | CaseN Name
366 | CaseN Name
367 | ElimN Name
367 | ElimN Name
368 | InstanceCtorN Name
368 | InstanceCtorN Name
369 deriving (Eq, Ord, Data, Typeable)
370 deriving (Eq, Ord, Data, Typeable)
371deriving instance Binary SpecialName
372deriving instance Binary SpecialName
@@ -390,6 +391,9 @@ instance Pretty Name OutputAnnotation where
390 pretty n@(MN i s) = annotate (AnnName n Nothing Nothing Nothing) $
391 pretty n@(MN i s) = annotate (AnnName n Nothing Nothing Nothing) $
391 lbrace <+> text (T.unpack s) <+> (text . show $ i) <+> rbrace
392 lbrace <+> text (T.unpack s) <+> (text . show $ i) <+> rbrace
392 pretty n@(SN s) = annotate (AnnName n Nothing Nothing Nothing) $ text (show s)
393 pretty n@(SN s) = annotate (AnnName n Nothing Nothing Nothing) $ text (show s)
394+ pretty n@(SymRef i) = annotate (AnnName n Nothing Nothing Nothing) $
395+ text $ "##symbol" ++ show i ++ "##"
396+ pretty NErased = annotate (AnnName NErased Nothing Nothing Nothing) $ text "_"
394instance Pretty [Name] OutputAnnotation where
398instance Pretty [Name] OutputAnnotation where
395 pretty = encloseSep empty empty comma . map pretty
399 pretty = encloseSep empty empty comma . map pretty
@@ -400,6 +404,7 @@ instance Show Name where
400 show (MN _ u) | u == txt "underscore" = "_"
404 show (MN _ u) | u == txt "underscore" = "_"
401 show (MN i s) = "{" ++ str s ++ show i ++ "}"
405 show (MN i s) = "{" ++ str s ++ show i ++ "}"
402 show (SN s) = show s
406 show (SN s) = show s
407+ show (SymRef i) = "##symbol" ++ show i ++ "##"
403 show NErased = "_"
408 show NErased = "_"
405instance Show SpecialName where
410instance Show SpecialName where
@@ -411,6 +416,7 @@ instance Show SpecialName where
411 show (CaseN n) = "case block in " ++ show n
416 show (CaseN n) = "case block in " ++ show n
412 show (ElimN n) = "<<" ++ show n ++ " eliminator>>"
417 show (ElimN n) = "<<" ++ show n ++ " eliminator>>"
413 show (InstanceCtorN n) = "constructor of " ++ show n
418 show (InstanceCtorN n) = "constructor of " ++ show n
419+ show (MetaN parent meta) = "<<" ++ show parent ++ " " ++ show meta ++ ">>"
415-- Show a name in a way decorated for code generation, not human reading
421-- Show a name in a way decorated for code generation, not human reading
416showCG :: Name -> String
422showCG :: Name -> String
@@ -427,6 +433,8 @@ showCG (SN s) = showCG' s
427 showCG' (CaseN c) = showCG c ++ "_case"
433 showCG' (CaseN c) = showCG c ++ "_case"
428 showCG' (ElimN sn) = showCG sn ++ "_elim"
434 showCG' (ElimN sn) = showCG sn ++ "_elim"
429 showCG' (InstanceCtorN n) = showCG n ++ "_ictor"
435 showCG' (InstanceCtorN n) = showCG n ++ "_ictor"
436+ showCG' (MetaN parent meta) = showCG parent ++ "_meta_" ++ showCG meta
437+showCG (SymRef i) = error "can't do codegen for a symbol reference"
430showCG NErased = "_"
438showCG NErased = "_"
@@ -861,6 +869,9 @@ instance TermSize (TT Name) where
861 termsize n (Proj t i) = termsize n t
869 termsize n (Proj t i) = termsize n t
862 termsize n _ = 1
870 termsize n _ = 1
872+instance Sized Universe where
864instance Sized a => Sized (TT a) where
875instance Sized a => Sized (TT a) where
865 size (P name n trm) = 1 + size name + size n + size trm
876 size (P name n trm) = 1 + size name + size n + size trm
866 size (V v) = 1
877 size (V v) = 1
@@ -869,6 +880,9 @@ instance Sized a => Sized (TT a) where
869 size (Constant c) = size c
880 size (Constant c) = size c
870 size Erased = 1
881 size Erased = 1
871 size (TType u) = 1 + size u
882 size (TType u) = 1 + size u
883+ size (Proj a _) = 1 + size a
885+ size (UType u) = 1 + size u
873instance Pretty a o => Pretty (TT a) o where
887instance Pretty a o => Pretty (TT a) o where
874 pretty _ = text "test"
888 pretty _ = text "test"
@@ -952,7 +966,7 @@ instantiate e = subst 0 where
952-- that has been substituted.
966-- that has been substituted.
953substV :: TT n -> TT n -> TT n
967substV :: TT n -> TT n -> TT n
954substV x tm = dropV 0 (instantiate x tm) where
968substV x tm = dropV 0 (instantiate x tm) where
955− subst i (P nt x ty) = P nt x (subst i ty)
969+ dropV i (P nt x ty) = P nt x (dropV i ty)
956 dropV i (V x) | x > i = V (x - 1)
970 dropV i (V x) | x > i = V (x - 1)
957 | otherwise = V x
971 | otherwise = V x
958 dropV i (Bind x b sc) = Bind x (fmap (dropV i) b) (dropV (i+1) sc)
972 dropV i (Bind x b sc) = Bind x (fmap (dropV i) b) (dropV (i+1) sc)
@@ -1186,23 +1200,25 @@ forgetEnv env tm = case safeForgetEnv env tm of
1186safeForgetEnv :: [Name] -> TT Name -> Maybe Raw
1200safeForgetEnv :: [Name] -> TT Name -> Maybe Raw
1187safeForgetEnv env (P _ n _) = Just $ Var n
1201safeForgetEnv env (P _ n _) = Just $ Var n
1188safeForgetEnv env (V i) | i < length env = Just $ Var (env !! i)
1202safeForgetEnv env (V i) | i < length env = Just $ Var (env !! i)
1189− | otherwise = Nothing
1203+ | otherwise = Nothing
1190−safeForgetEnv env (Bind n b sc)
1204+safeForgetEnv env (Bind n b sc)
1191 = do let n' = uniqueName n env
1205 = do let n' = uniqueName n env
1192 b' <- safeForgetEnvB env b
1206 b' <- safeForgetEnvB env b
1193 sc' <- safeForgetEnv (n':env) sc
1207 sc' <- safeForgetEnv (n':env) sc
1194 Just $ RBind n' b' sc'
1208 Just $ RBind n' b' sc'
1195− where safeForgetEnvB env (Let t v) = liftM2 Let (safeForgetEnv env t)
1209+ where safeForgetEnvB env (Let t v) = liftM2 Let (safeForgetEnv env t)
1196 (safeForgetEnv env v)
1210 (safeForgetEnv env v)
1197− safeForgetEnvB env (Guess t v) = liftM2 Guess (safeForgetEnv env t)
1211+ safeForgetEnvB env (Guess t v) = liftM2 Guess (safeForgetEnv env t)
1198 (safeForgetEnv env v)
1212 (safeForgetEnv env v)
1199 safeForgetEnvB env b = do ty' <- safeForgetEnv env (binderTy b)
1213 safeForgetEnvB env b = do ty' <- safeForgetEnv env (binderTy b)
1200− Just $ fmap (\_ -> ty') b
1214+ Just $ fmap (\_ -> ty') b
1201safeForgetEnv env (App _ f a) = liftM2 RApp (safeForgetEnv env f) (safeForgetEnv env a)
1215safeForgetEnv env (App _ f a) = liftM2 RApp (safeForgetEnv env f) (safeForgetEnv env a)
1202safeForgetEnv env (Constant c) = Just $ RConstant c
1216safeForgetEnv env (Constant c) = Just $ RConstant c
1203safeForgetEnv env (TType i) = Just RType
1217safeForgetEnv env (TType i) = Just RType
1204safeForgetEnv env (UType u) = Just $ RUType u
1218safeForgetEnv env (UType u) = Just $ RUType u
1205safeForgetEnv env Erased = Just $ RConstant Forgot
1219safeForgetEnv env Erased = Just $ RConstant Forgot
1220+safeForgetEnv env (Proj tm i) = error "Don't know how to forget a projection"
1221+safeForgetEnv env Impossible = error "Don't know how to forget Impossible"
1207-- | Introduce a 'Bind' into the given term for each element of the
1223-- | Introduce a 'Bind' into the given term for each element of the
1208-- given list of (name, binder) pairs.
1224-- given list of (name, binder) pairs.
@@ -1255,6 +1271,7 @@ uniqueBinders ns = ubSet (fromList ns) where
1255 ubSet ns t = t
1271 ubSet ns t = t
1274+nextName :: Name -> Name
1258nextName (NS x s) = NS (nextName x) s
1275nextName (NS x s) = NS (nextName x) s
1259nextName (MN i n) = MN (i+1) n
1276nextName (MN i n) = MN (i+1) n
1260nextName (UN x) = let (num', nm') = T.span isDigit (T.reverse x)
1277nextName (UN x) = let (num', nm') = T.span isDigit (T.reverse x)
@@ -1274,6 +1291,9 @@ nextName (SN x) = SN (nextName' x)
1274 nextName' (ElimN n) = ElimN (nextName n)
1291 nextName' (ElimN n) = ElimN (nextName n)
1275 nextName' (MethodN n) = MethodN (nextName n)
1292 nextName' (MethodN n) = MethodN (nextName n)
1276 nextName' (InstanceCtorN n) = InstanceCtorN (nextName n)
1293 nextName' (InstanceCtorN n) = InstanceCtorN (nextName n)
1294+ nextName' (MetaN parent meta) = MetaN parent (nextName meta)
1295+nextName NErased = NErased
1296+nextName (SymRef i) = error "Can't generate a name from a symbol reference"
1278type Term = TT Name
1298type Term = TT Name
1279type Type = Term
1299type Type = Term
@@ -1313,11 +1333,13 @@ instance Show Const where
1313 show WorldType = "prim__WorldType"
1333 show WorldType = "prim__WorldType"
1314 show StrType = "String"
1334 show StrType = "String"
1315 show VoidType = "Void"
1335 show VoidType = "Void"
1336+ show Forgot = "Forgot"
1317showEnv :: (Eq n, Show n) => EnvTT n -> TT n -> String
1338showEnv :: (Eq n, Show n) => EnvTT n -> TT n -> String
1318showEnv env t = showEnv' env t False
1339showEnv env t = showEnv' env t False
1319showEnvDbg env t = showEnv' env t True
1340showEnvDbg env t = showEnv' env t True
1342+prettyEnv :: Env -> Term -> Doc OutputAnnotation
1321prettyEnv env t = prettyEnv' env t False
1343prettyEnv env t = prettyEnv' env t False
1323 prettyEnv' env t dbg = prettySe 10 env t dbg
1345 prettyEnv' env t dbg = prettySe 10 env t dbg
@@ -1351,14 +1373,18 @@ prettyEnv env t = prettyEnv' env t False
1351 prettySe p env (Constant c) debug = pretty c
1373 prettySe p env (Constant c) debug = pretty c
1352 prettySe p env Erased debug = text "[_]"
1374 prettySe p env Erased debug = text "[_]"
1353 prettySe p env (TType i) debug = text "Type" <+> (text . show $ i)
1375 prettySe p env (TType i) debug = text "Type" <+> (text . show $ i)
1376+ prettySe p env Impossible debug = text "Impossible"
1377+ prettySe p env (UType u) debug = text (show u)
1355 -- Render a `Binder` and its name
1379 -- Render a `Binder` and its name
1356 prettySb env n (Lam t) = prettyB env "λ" "=>" n t
1380 prettySb env n (Lam t) = prettyB env "λ" "=>" n t
1357 prettySb env n (Hole t) = prettyB env "?defer" "." n t
1381 prettySb env n (Hole t) = prettyB env "?defer" "." n t
1382+ prettySb env n (GHole _ t) = prettyB env "?gdefer" "." n t
1358 prettySb env n (Pi _ t _) = prettyB env "(" ") ->" n t
1383 prettySb env n (Pi _ t _) = prettyB env "(" ") ->" n t
1359 prettySb env n (PVar t) = prettyB env "pat" "." n t
1384 prettySb env n (PVar t) = prettyB env "pat" "." n t
1360 prettySb env n (PVTy t) = prettyB env "pty" "." n t
1385 prettySb env n (PVTy t) = prettyB env "pty" "." n t
1361 prettySb env n (Let t v) = prettyBv env "let" "in" n t v
1386 prettySb env n (Let t v) = prettyBv env "let" "in" n t v
1387+ prettySb env n (NLet t v) = prettyBv env "nlet" "in" n t v
1362 prettySb env n (Guess t v) = prettyBv env "??" "in" n t v
1388 prettySb env n (Guess t v) = prettyBv env "??" "in" n t v
1364 -- Use `op` and `sc` to delimit `n` (a binding name) and its type
1390 -- Use `op` and `sc` to delimit `n` (a binding name) and its type
@@ -1404,6 +1430,7 @@ showEnv' env t dbg = se 10 env t where
1404 sb env n (PVar t) = showb env "pat " ". " n t
1430 sb env n (PVar t) = showb env "pat " ". " n t
1405 sb env n (PVTy t) = showb env "pty " ". " n t
1431 sb env n (PVTy t) = showb env "pty " ". " n t
1406 sb env n (Let t v) = showbv env "let " " in " n t v
1432 sb env n (Let t v) = showbv env "let " " in " n t v
1433+ sb env n (NLet t v) = showbv env "nlet " " in " n t v
1407 sb env n (Guess t v) = showbv env "?? " " in " n t v
1434 sb env n (Guess t v) = showbv env "?? " " in " n t v
1409 showb env op sc n t = op ++ show n ++ " : " ++ se 10 env t ++ sc
1436 showb env op sc n t = op ++ show n ++ " : " ++ se 10 env t ++ sc