@@ -10,25 +10,28 @@ import Agda.Compiler.Backend
10
10
11
11
import Agda.Syntax.Common ( namedArg )
12
12
import Agda.Syntax.Internal
13
+ import Agda.Syntax.Internal.Pattern
13
14
14
15
import Agda.TypeChecking.Telescope ( mustBePi )
15
16
16
17
import Agda.Utils.Impossible ( __IMPOSSIBLE__ )
17
18
import Agda.Utils.Monad
18
19
19
- import Agda2Hs.Compile.Type ( compileType , compileDom , DomOutput (.. ) )
20
+ import Agda2Hs.Compile.Type ( compileType , compileDom , DomOutput (.. ), compileTypeArgs )
20
21
import Agda2Hs.Compile.Types
21
22
import Agda2Hs.Compile.Utils
22
23
import Agda2Hs.Compile.Var ( compileDBVar )
23
24
import Agda2Hs.HsUtils
25
+ import Agda.Syntax.Common.Pretty (prettyShow )
26
+ import Agda.TypeChecking.Substitute
24
27
25
28
26
29
compileTypeDef :: Hs. Name () -> Definition -> C [Hs. Decl () ]
27
30
compileTypeDef name (Defn {.. }) = do
28
31
unlessM (isTransparentFunction defName) $ checkValidTypeName name
29
32
Clause {.. } <- singleClause funClauses
30
33
addContext (KeepNames clauseTel) $ do
31
- as <- compileTypeArgs defType namedClausePats
34
+ as <- compileTypePatternArgs defType namedClausePats
32
35
let hd = foldl (Hs. DHApp () ) (Hs. DHead () name) as
33
36
rhs <- compileType $ fromMaybe __IMPOSSIBLE__ clauseBody
34
37
return [Hs. TypeDecl () hd rhs]
@@ -38,17 +41,15 @@ compileTypeDef name (Defn {..}) = do
38
41
[cl] -> return cl
39
42
_ -> genericError " Not supported: type definition with several clauses"
40
43
41
-
42
- compileTypeArgs :: Type -> NAPs -> C [Hs. TyVarBind () ]
43
- compileTypeArgs ty [] = return []
44
- compileTypeArgs ty (p: ps) = do
45
- (a,b) <- mustBePi ty
46
- let rest = underAbstraction a b $ \ ty' -> compileTypeArgs ty' ps
47
- compileDom a >>= \ case
48
- DODropped -> rest
49
- DOType -> (:) <$> compileTypeArg (namedArg p) <*> rest
50
- DOTerm -> genericError " Not supported: type definition with term arguments"
51
- DOInstance -> genericError " Not supported: type definition with instance arguments"
44
+ compileTypePatternArgs :: Type -> NAPs -> C [Hs. TyVarBind () ]
45
+ compileTypePatternArgs ty naps = do
46
+ aux <- compileTypeArgs ty $ fromMaybe __IMPOSSIBLE__ $ allApplyElims $ patternsToElims naps
47
+ mapM assertIsTyVarBind aux
48
+ where
49
+ assertIsTyVarBind :: Hs. Type () -> C (Hs. TyVarBind () )
50
+ assertIsTyVarBind = \ case
51
+ Hs. TyVar _ n -> pure $ Hs. UnkindedVar () n
52
+ _ -> genericError " Not supported: type definition by pattern matching"
52
53
53
54
compileTypeArg :: DeBruijnPattern -> C (Hs. TyVarBind () )
54
55
compileTypeArg p@ (VarP o i) = do
0 commit comments