5 | module Language.Reflection.Compat
7 | import public Data.List.Quantifiers
8 | import public Data.List1
9 | import public Data.String
10 | import public Data.Vect
12 | import public Language.Reflection
13 | import Language.Reflection.Expr
14 | import Language.Reflection.Logging
15 | import public Language.Reflection.Syntax
16 | import public Language.Reflection.Syntax.Ops
34 | getCon : Elaboration m => Name -> m Con
35 | getCon n = do (n', tt) <- lookupName n
36 | let (args, tpe) = unPi $
cleanupNamedHoles tt
37 | pure $
MkCon n' args tpe
40 | LogPosition Con where
41 | logPosition con = do
42 | let fullName = show con.name
43 | let fullName' = unpack fullName
44 | maybe fullName (pack . flip drop fullName' . S . finToNat) $
findLastIndex (== '.') fullName'
54 | record TypeInfo where
55 | constructor MkTypeInfo
61 | LogPosition TypeInfo where
62 | logPosition = show . name
68 | getInfo' : Elaboration m => Name -> m TypeInfo
70 | (n',tt) <- lookupName n
71 | let (args,IType _) = unPi $
cleanupNamedHoles tt
72 | | (_,_) => fail "Type declaration does not end in IType"
73 | conNames <- getCons n'
74 | cons <- traverse getCon conNames
75 | pure (MkTypeInfo n' args cons)
79 | getInfo : Name -> Elab TypeInfo
85 | data ConArgsNamed : Con -> Type where
86 | TheyAreNamed : All IsNamedArg ars -> ConArgsNamed $
MkCon nm ars ty
89 | areConArgsNamed : (con : Con) -> Dec $
ConArgsNamed con
90 | areConArgsNamed $
MkCon _ ars _ with (all isNamedArg ars)
91 | _ | Yes ars' = Yes $
TheyAreNamed ars'
92 | _ | No nars = No $
\(TheyAreNamed ars') => nars ars'
95 | 0 conArgsNamed : (0 _ : ConArgsNamed c) => All IsNamedArg c.args
96 | conArgsNamed @{TheyAreNamed p} = p
99 | data AllTyArgsNamed : TypeInfo -> Type where
100 | TheyAllAreNamed : All IsNamedArg ars -> All ConArgsNamed cns -> AllTyArgsNamed $
MkTypeInfo nm ars cns
103 | areAllTyArgsNamed : (ty : TypeInfo) -> Dec $
AllTyArgsNamed ty
104 | areAllTyArgsNamed $
MkTypeInfo _ ars cns with (all isNamedArg ars, all areConArgsNamed cns)
105 | _ | (Yes ars', Yes cns') = Yes $
TheyAllAreNamed ars' cns'
106 | _ | (No nars, _) = No $
\(TheyAllAreNamed ars' _) => nars ars'
107 | _ | (_, No ncns) = No $
\(TheyAllAreNamed _ cns') => ncns cns'
110 | 0 (.tyArgsNamed) : (0 _ : AllTyArgsNamed t) -> All IsNamedArg t.args
111 | (.tyArgsNamed) (TheyAllAreNamed at ct) = at
114 | 0 (.tyConArgsNamed) : (0 _ : AllTyArgsNamed t) -> All ConArgsNamed t.cons
115 | (.tyConArgsNamed) (TheyAllAreNamed at ct) = ct
121 | public export %inline
122 | (.tyName) : TypeInfo -> Name
125 | public export %inline
126 | (.tyArgs) : TypeInfo -> List Arg
129 | public export %inline
130 | (.tyCons) : TypeInfo -> List Con
133 | public export %inline
134 | (.conArgs) : Con -> List Arg
138 | [ConEqByName] Eq Con where
139 | (==) = (==) `on` name
142 | [ConOrdByName] Ord Con using ConEqByName where
143 | compare = comparing name