Skip to content

Commit fdbebb6

Browse files
VictorCMiraldojespercockx
authored andcommitted
Closes #309: Ensures we compile pattern variables correctly by relying
on the existing compileTypeArgs.
1 parent 4c750c6 commit fdbebb6

File tree

5 files changed

+28
-13
lines changed

5 files changed

+28
-13
lines changed

src/Agda2Hs/Compile/TypeDefinition.hs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,28 @@ import Agda.Compiler.Backend
1010

1111
import Agda.Syntax.Common ( namedArg )
1212
import Agda.Syntax.Internal
13+
import Agda.Syntax.Internal.Pattern
1314

1415
import Agda.TypeChecking.Telescope ( mustBePi )
1516

1617
import Agda.Utils.Impossible ( __IMPOSSIBLE__ )
1718
import Agda.Utils.Monad
1819

19-
import Agda2Hs.Compile.Type ( compileType, compileDom, DomOutput(..) )
20+
import Agda2Hs.Compile.Type ( compileType, compileDom, DomOutput(..), compileTypeArgs )
2021
import Agda2Hs.Compile.Types
2122
import Agda2Hs.Compile.Utils
2223
import Agda2Hs.Compile.Var ( compileDBVar )
2324
import Agda2Hs.HsUtils
25+
import Agda.Syntax.Common.Pretty (prettyShow)
26+
import Agda.TypeChecking.Substitute
2427

2528

2629
compileTypeDef :: Hs.Name () -> Definition -> C [Hs.Decl ()]
2730
compileTypeDef name (Defn {..}) = do
2831
unlessM (isTransparentFunction defName) $ checkValidTypeName name
2932
Clause{..} <- singleClause funClauses
3033
addContext (KeepNames clauseTel) $ do
31-
as <- compileTypeArgs defType namedClausePats
34+
as <- compileTypePatternArgs defType namedClausePats
3235
let hd = foldl (Hs.DHApp ()) (Hs.DHead () name) as
3336
rhs <- compileType $ fromMaybe __IMPOSSIBLE__ clauseBody
3437
return [Hs.TypeDecl () hd rhs]
@@ -38,17 +41,15 @@ compileTypeDef name (Defn {..}) = do
3841
[cl] -> return cl
3942
_ -> genericError "Not supported: type definition with several clauses"
4043

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"
5253

5354
compileTypeArg :: DeBruijnPattern -> C (Hs.TyVarBind ())
5455
compileTypeArg p@(VarP o i) = do

test/AllTests.agda

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import Issue264
8383
import Issue301
8484
import Issue305
8585
import Issue302
86+
import Issue309
8687

8788
{-# FOREIGN AGDA2HS
8889
import Issue14
@@ -163,4 +164,5 @@ import Issue264
163164
import Issue301
164165
import Issue305
165166
import Issue302
167+
import Issue309
166168
#-}

test/Issue309.agda

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Issue309 where
2+
3+
private variable @0 a : Set
4+
5+
Ap : (p : @0 a Set) @0 a Set
6+
Ap p x = p x
7+
{-# COMPILE AGDA2HS Ap #-}

test/golden/AllTests.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,5 @@ import Issue264
7878
import Issue301
7979
import Issue305
8080
import Issue302
81+
import Issue309
8182

test/golden/Issue309.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module Issue309 where
2+
3+
type Ap p = p
4+

0 commit comments

Comments
 (0)