@@ -5,29 +5,113 @@ module Agda.Compiler.Scala.AgdaToScalaExpr (
5
5
import Agda.Compiler.Backend ( funCompiled , funClauses , Defn (.. ), RecordData (.. ))
6
6
import Agda.Syntax.Abstract.Name ( QName )
7
7
import Agda.Syntax.Common.Pretty ( prettyShow )
8
- import Agda.Syntax.Common ( Arg (.. ), ArgName , Named (.. ) )
8
+ import Agda.Syntax.Common ( Arg (.. ), ArgName , Named (.. ), NamedName , WithOrigin ( .. ), Ranged ( .. ) )
9
9
import Agda.Syntax.Internal (
10
- Clause (.. ), DeBruijnPattern , DBPatVar (.. ), Dom (.. ), unDom , PatternInfo (.. ), Pattern' (.. ),
10
+ Clause (.. ), DeBruijnPattern , DBPatVar (.. ), Dom (.. ), Dom' ( .. ), unDom , PatternInfo (.. ), Pattern' (.. ),
11
11
qnameName , qnameModule , Telescope , Tele (.. ), Term (.. ), Type , Type'' (.. ) )
12
12
import Agda.TypeChecking.Monad.Base ( Definition (.. ) )
13
13
import Agda.TypeChecking.Monad
14
14
import Agda.TypeChecking.CompiledClause ( CompiledClauses (.. ), CompiledClauses' (.. ) )
15
+ import Agda.TypeChecking.Telescope ( teleNamedArgs , teleArgs , teleArgNames )
15
16
16
- import Agda.Compiler.Scala.ScalaExpr ( ScalaName , ScalaExpr (.. ) )
17
+ import Agda.Syntax.Common.Pretty ( prettyShow )
18
+
19
+ import Agda.Compiler.Scala.ScalaExpr ( ScalaName , ScalaType , FunBody , ScalaExpr (.. ), SeVar (.. ) )
17
20
18
21
compileDefn :: QName -> Defn -> ScalaExpr
19
22
compileDefn defName theDef = case theDef of
20
23
Datatype {dataCons = dataCons} ->
21
24
compileDataType defName dataCons
22
25
Function {funCompiled = funDef, funClauses = fc} ->
23
- Unhandled " compileDefn Function " ( show defName ++ " \n = \n " ++ show theDef)
26
+ compileFunction defName funDef fc
24
27
RecordDefn (RecordData {_recFields = recFields, _recTel = recTel}) ->
25
- Unhandled " compileDefn RecordDefn " ( show defName ++ " \n = \n " ++ show theDef)
28
+ compileRecord defName recFields recTel
26
29
other ->
27
30
Unhandled " compileDefn other" (show defName ++ " \n = \n " ++ show theDef)
28
31
32
+ compileRecord :: QName -> [Dom QName ] -> Telescope -> ScalaExpr
33
+ compileRecord defName recFields recTel = SeProd (fromQName defName) (foldl varsFromTelescope [] recTel)
34
+
35
+ varsFromTelescope :: [SeVar ] -> Dom Type -> [SeVar ]
36
+ varsFromTelescope xs dt = SeVar (nameFromDom dt) (fromDom dt) : xs
37
+
29
38
compileDataType :: QName -> [QName ] -> ScalaExpr
30
- compileDataType defName fields = SeAdt (showName defName) (map showName fields)
39
+ compileDataType defName fields = SeSum (fromQName defName) (map fromQName fields)
40
+
41
+ compileFunction :: QName
42
+ -> Maybe CompiledClauses
43
+ -> [Clause ]
44
+ -> ScalaExpr
45
+ compileFunction defName funDef fc =
46
+ SeFun
47
+ (fromQName defName)
48
+ [SeVar (compileFunctionArgument fc) (compileFunctionArgType fc)] -- TODO many function arguments
49
+ (compileFunctionResultType fc)
50
+ (compileFunctionBody funDef)
51
+
52
+ compileFunctionArgument :: [Clause ] -> ScalaName
53
+ compileFunctionArgument [] = " "
54
+ compileFunctionArgument [fc] = fromDeBruijnPattern (namedThing (unArg (head (namedClausePats fc))))
55
+ compileFunctionArgument xs = error " unsupported compileFunctionArgument" ++ (show xs) -- show xs
56
+
57
+ compileFunctionArgType :: [Clause ] -> ScalaType
58
+ compileFunctionArgType [ Clause {clauseTel = ct} ] = fromTelescope ct
59
+ compileFunctionArgType xs = error " unsupported compileFunctionArgType" ++ (show xs)
60
+
61
+ fromTelescope :: Telescope -> ScalaName -- TODO PP probably parent should be different, use fold on telescope above
62
+ fromTelescope tel = case tel of
63
+ ExtendTel a _ -> fromDom a
64
+ other -> error (" unhandled fromType" ++ show other)
65
+
66
+ nameFromDom :: Dom Type -> ScalaName
67
+ nameFromDom dt = case (domName dt) of
68
+ Nothing -> error (" nameFromDom" ++ show dt)
69
+ Just a -> namedNameToStr a
70
+
71
+ namedNameToStr :: NamedName -> ScalaName
72
+ namedNameToStr n = rangedThing (woThing n)
73
+
74
+ fromDom :: Dom Type -> ScalaName
75
+ fromDom x = fromType (unDom x)
76
+
77
+ compileFunctionResultType :: [Clause ] -> ScalaType
78
+ compileFunctionResultType [Clause {clauseType = ct}] = fromMaybeType ct
79
+ compileFunctionResultType other = error (" unhandled compileFunctionResultType" ++ show other)
80
+
81
+ fromMaybeType :: Maybe (Arg Type ) -> ScalaName
82
+ fromMaybeType (Just argType) = fromArgType argType
83
+ fromMaybeType other = error (" unhandled fromMaybeType" ++ show other)
84
+
85
+ fromArgType :: Arg Type -> ScalaName
86
+ fromArgType arg = fromType (unArg arg)
87
+
88
+ fromType :: Type -> ScalaName
89
+ fromType t = case t of
90
+ a@ (El _ ue) -> fromTerm ue
91
+ other -> error (" unhandled fromType" ++ show other)
92
+
93
+ fromTerm :: Term -> ScalaName
94
+ fromTerm t = case t of
95
+ Def qname el -> fromQName qname
96
+ other -> error (" unhandled fromTerm" ++ show other)
97
+
98
+ fromDeBruijnPattern :: DeBruijnPattern -> ScalaName
99
+ fromDeBruijnPattern d = case d of
100
+ VarP a b -> (dbPatVarName b)
101
+ a@ (ConP x y z) -> show a
102
+ other -> error (" unhandled fromDeBruijnPattern" ++ show other)
103
+
104
+ compileFunctionBody :: Maybe CompiledClauses -> FunBody
105
+ compileFunctionBody (Just funDef) = fromCompiledClauses funDef
106
+ compileFunctionBody funDef = error (" unhandled compileFunctionBody " ++ show funDef)
107
+
108
+ fromCompiledClauses :: CompiledClauses -> FunBody
109
+ fromCompiledClauses cc = case cc of
110
+ (Done (x: xs) term) -> fromArgName x
111
+ other -> error (" unhandled fromCompiledClauses " ++ show other)
112
+
113
+ fromArgName :: Arg ArgName -> FunBody
114
+ fromArgName = unArg
31
115
32
- showName :: QName -> ScalaName
33
- showName = prettyShow . qnameName
116
+ fromQName :: QName -> ScalaName
117
+ fromQName = prettyShow . qnameName
0 commit comments