1
+ {-# LANGUAGE RecordWildCards #-}
2
+
3
+ module Synth.Replace where
4
+
5
+ import Bag
6
+ import Data.Map hiding (map )
7
+ import GHC
8
+ import Synth.Util
9
+
10
+ -- Fill the first hole in the expression.
11
+ replaceExpr :: Map SrcSpan (HsExpr GhcPs ) -> LHsExpr GhcPs -> LHsExpr GhcPs
12
+ replaceExpr repls (L loc _) | loc `member` repls = L loc (repls ! loc)
13
+ replaceExpr repls (L loc (HsApp x l r)) =
14
+ L loc $ HsApp x (re l) (re r)
15
+ where
16
+ re = replaceExpr repls
17
+ replaceExpr repls (L loc (HsPar x l)) =
18
+ L loc . HsPar x $ replaceExpr repls l
19
+ replaceExpr repls (L loc (ExprWithTySig x l t)) =
20
+ L loc . flip (ExprWithTySig x) t $ replaceExpr repls l
21
+ replaceExpr repls (L loc (HsLet x b e)) =
22
+ L loc $ HsLet x (replaceExprLocalBinds repls b) (replaceExpr repls e)
23
+ replaceExpr repls (L loc (HsIf x mb c t e)) =
24
+ L loc $ HsIf x mb (re c) (re t) (re e)
25
+ where
26
+ re = replaceExpr repls
27
+ replaceExpr repls (L loc (OpApp x c t e)) =
28
+ L loc $ OpApp x (re c) (re t) (re e)
29
+ where
30
+ re = replaceExpr repls
31
+ replaceExpr _ e = e
32
+
33
+ replaceExprLocalBinds :: Map SrcSpan (HsExpr GhcPs ) -> LHsLocalBinds GhcPs -> LHsLocalBinds GhcPs
34
+ replaceExprLocalBinds repls (L loc (HsValBinds x (ValBinds xv bs sigs))) =
35
+ L loc $ HsValBinds x $ ValBinds xv (replaceExprBinds repls bs) sigs
36
+ replaceExprLocalBinds _ e = e
37
+
38
+ replaceExprBinds ::
39
+ Map SrcSpan (HsExpr GhcPs ) ->
40
+ LHsBinds GhcPs ->
41
+ LHsBinds GhcPs
42
+ replaceExprBinds repls bs =
43
+ listToBag $ map (replaceExprBind repls) (bagToList bs)
44
+
45
+ replaceExprBind ::
46
+ Map SrcSpan (HsExpr GhcPs ) ->
47
+ LHsBindLR GhcPs GhcPs ->
48
+ LHsBindLR GhcPs GhcPs
49
+ replaceExprBind repls (L loc fb@ FunBind {fun_matches = mg@ MG {mg_alts = (L locms mtcs)}}) =
50
+ L loc (fb {fun_matches = mg {mg_alts = L locms (map (replaceMatch repls) mtcs)}})
51
+ replaceExprBind repls (L loc (VarBind x b v k)) =
52
+ L loc . flip (VarBind x b) k $ replaceExpr repls v
53
+ replaceExprBind _ e = e
54
+
55
+ replaceMatch ::
56
+ Map SrcSpan (HsExpr GhcPs ) ->
57
+ LMatch GhcPs (LHsExpr GhcPs ) ->
58
+ LMatch GhcPs (LHsExpr GhcPs )
59
+ replaceMatch repls (L loc m@ Match {m_grhss = m_grhss}) =
60
+ L loc (m {m_grhss = replaceGRHSs repls m_grhss})
61
+ replaceMatch _ e = e
62
+
63
+ replaceGRHSs ::
64
+ Map SrcSpan (HsExpr GhcPs ) ->
65
+ GRHSs GhcPs (LHsExpr GhcPs ) ->
66
+ GRHSs GhcPs (LHsExpr GhcPs )
67
+ replaceGRHSs repls grhss@ GRHSs {.. } =
68
+ grhss
69
+ { grhssGRHSs = map (replaceLGRHS repls) grhssGRHSs,
70
+ grhssLocalBinds = replaceExprLocalBinds repls grhssLocalBinds
71
+ }
72
+ replaceGRHSs _ e = e
73
+
74
+ replaceLGRHS ::
75
+ Map SrcSpan (HsExpr GhcPs ) ->
76
+ LGRHS GhcPs (LHsExpr GhcPs ) ->
77
+ LGRHS GhcPs (LHsExpr GhcPs )
78
+ replaceLGRHS repls (L l (GRHS x guards e)) =
79
+ L l $ GRHS x (map (replaceGStmt repls) guards) (replaceExpr repls e)
80
+ replaceLGRHS _ e = e
81
+
82
+ replaceGStmt ::
83
+ Map SrcSpan (HsExpr GhcPs ) ->
84
+ GuardLStmt GhcPs ->
85
+ GuardLStmt GhcPs
86
+ replaceGStmt = replaceLStmt
87
+
88
+ -- TODO: more kinds of statements
89
+ replaceLStmt ::
90
+ Map SrcSpan (HsExpr GhcPs ) ->
91
+ LStmt GhcPs (LHsExpr GhcPs ) ->
92
+ LStmt GhcPs (LHsExpr GhcPs )
93
+ replaceLStmt repls (L l (LastStmt x e b s)) =
94
+ (\ ne -> L l (LastStmt x ne b s)) $ replaceExpr repls e
95
+ replaceLStmt repls (L l (BodyStmt x e se1 se2)) =
96
+ (\ ne -> L l (BodyStmt x ne se1 se2)) $ replaceExpr repls e
97
+ -- Guard statements are Bind statements
98
+ replaceLStmt repls (L l (BindStmt x p e se1 se2)) =
99
+ (\ ne -> L l (BindStmt x p ne se1 se2)) $ replaceExpr repls e
100
+ replaceLStmt repls (L l (LetStmt x lbs)) =
101
+ L l . LetStmt x $ replaceExprLocalBinds repls lbs
102
+ replaceLStmt _ e = e
0 commit comments