Skip to content

Commit 9e176f4

Browse files
committed
[ elab ] Implement resugaring primitive for elaborator scripts
1 parent 1678b46 commit 9e176f4

File tree

7 files changed

+98
-9
lines changed

7 files changed

+98
-9
lines changed

CHANGELOG_NEXT.md

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ This CHANGELOG describes the merged but unreleased changes. Please see [CHANGELO
8585
`parameters {0 t : Type} (v : t)` to indicate if arguments are implicit or
8686
erased.
8787

88+
* Elaborator scripts were made to be able to get pretty-printed resugared expressions.
89+
8890
### Compiler changes
8991

9092
* The compiler now differentiates between "package search path" and "package

libs/base/Language/Reflection.idr

+7
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ data Elab : Type -> Type where
6060
||| * term
6161
LogSugaredTerm : String -> Nat -> String -> TTImp -> Elab ()
6262

63+
ResugarTerm : (maxLineWidth : Maybe Nat) -> TTImp -> Elab String
64+
6365
-- Elaborate a TTImp term to a concrete value
6466
Check : TTImp -> Elab expected
6567
-- Quote a concrete expression back to a TTImp
@@ -149,6 +151,9 @@ interface Monad m => Elaboration m where
149151
||| Write a log message and a resugared & rendered term, if the log level is >= the given level
150152
logSugaredTerm : String -> Nat -> String -> TTImp -> m ()
151153

154+
||| Resugar given term to a pretty string
155+
resugarTerm : (maxLineWidth : Maybe Nat) -> TTImp -> m String
156+
152157
||| Check that some TTImp syntax has the expected type
153158
||| Returns the type checked value
154159
check : TTImp -> m expected
@@ -233,6 +238,7 @@ Elaboration Elab where
233238
logMsg = LogMsg
234239
logTerm = LogTerm
235240
logSugaredTerm = LogSugaredTerm
241+
resugarTerm = ResugarTerm
236242
check = Check
237243
quote = Quote
238244
lambda = Lambda
@@ -260,6 +266,7 @@ Elaboration m => MonadTrans t => Monad (t m) => Elaboration (t m) where
260266
logMsg s = lift .: logMsg s
261267
logTerm s n = lift .: logTerm s n
262268
logSugaredTerm s n = lift .: logSugaredTerm s n
269+
resugarTerm = lift .: resugarTerm
263270
check = lift . check
264271
quote v = lift $ quote v
265272
lambda x = lift . lambda x

src/Idris/Pretty/Render.idr

+12-9
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,22 @@ getPageWidth = do
2323
Just 0 => pure $ Unbounded
2424
Just cw => pure $ AvailablePerLine (cast cw) 1
2525

26+
export
27+
render' : PageWidth ->
28+
Maybe (ann -> AnsiStyle) ->
29+
Doc ann -> String
30+
render' pageWidth stylerAnn doc = do
31+
let opts = MkLayoutOptions pageWidth
32+
let layout = layoutPretty opts doc
33+
renderString $ case stylerAnn of
34+
Just stylerAnn => reAnnotateS stylerAnn layout
35+
Nothing => unAnnotateS layout
36+
2637
export
2738
render : {auto o : Ref ROpts REPLOpts} ->
2839
(ann -> AnsiStyle) ->
2940
Doc ann -> Core String
30-
render stylerAnn doc = do
31-
color <- getColor
32-
pageWidth <- getPageWidth
33-
let opts = MkLayoutOptions pageWidth
34-
let layout = layoutPretty opts doc
35-
pure $ renderString $
36-
if color
37-
then reAnnotateS stylerAnn layout
38-
else unAnnotateS layout
41+
render stylerAnn doc = pure $ render' !getPageWidth (toMaybe !getColor stylerAnn) doc
3942

4043
export
4144
renderWithoutColor : {auto o : Ref ROpts REPLOpts} -> Doc ann -> Core String

src/TTImp/Elab/RunElab.idr

+8
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import Core.Value
1515

1616
import Idris.Resugar
1717
import Idris.REPL.Opts
18+
import Idris.Pretty
1819
import Idris.Syntax
1920

2021
import Libraries.Data.NameMap
2122
import Libraries.Data.WithDefault
23+
import Libraries.Text.PrettyPrint.Prettyprinter.Doc -- for PageWidth
2224
import Libraries.Utils.Path
2325

2426
import TTImp.Elab.Check
@@ -228,6 +230,12 @@ elabScript rig fc nest env script@(NDCon nfc nm t ar args) exp
228230
ptm <- pterm (map defaultKindedName tm')
229231
pure $ !(reify defs str') ++ ": " ++ show ptm
230232
scriptRet ()
233+
elabCon defs "ResugarTerm" [maxLineWidth, tm]
234+
= do ptm <- pterm . map defaultKindedName =<< reify defs !(evalClosure defs tm)
235+
mlw <- reify defs !(evalClosure defs maxLineWidth)
236+
let _ : Maybe Nat = mlw
237+
let pw = maybe Unbounded (\w => AvailablePerLine (cast w) 1) mlw
238+
scriptRet $ render' pw Nothing $ pretty {ann=IdrisSyntax} ptm
231239
elabCon defs "Check" [exp, ttimp]
232240
= do exp' <- evalClosure defs exp
233241
ttimp' <- evalClosure defs ttimp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import Language.Reflection
2+
3+
%language ElabReflection
4+
5+
e1 : TTImp
6+
e1 = `(let x = 5 in x + 2)
7+
8+
p1 : String
9+
p1 = %runElab resugarTerm (Just 20) e1
10+
11+
p2 : String
12+
p2 = %runElab resugarTerm Nothing e1
13+
14+
e2 : TTImp
15+
e2 = `(
16+
do x <- case y of
17+
Nice => pure $ nicest
18+
Just x => x <*> foo "ha"
19+
let f : Nat -> Nat; f = S . S . S . S . S . S . S . S . S . S
20+
Z <- f 16
21+
| S n => 18
22+
f 2
23+
)
24+
25+
p3 : String
26+
p3 = %runElab resugarTerm (Just 20) e2
27+
28+
p4 : String
29+
p4 = %runElab resugarTerm Nothing e2
30+
31+
main : IO ()
32+
main = traverse_ (\(n, e) => do putStrLn "\n--------\n\{n}:"; putStrLn e)
33+
[ ("p1", p1)
34+
, ("p2", p2)
35+
, ("p3", p3)
36+
, ("p4", p4)
37+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
1/1: Building ResugarTerm (ResugarTerm.idr)
2+
3+
--------
4+
p1:
5+
let x =
6+
fromInteger 5
7+
in x + fromInteger 2
8+
9+
--------
10+
p2:
11+
let x = fromInteger 5 in x + fromInteger 2
12+
13+
--------
14+
p3:
15+
(case y of
16+
{ Nice => pure nicest
17+
; Just x => x <*> foo (fromString "ha")
18+
}) >>= (\x =>
19+
let {<<definitions>>}
20+
in f (fromInteger 16) >>= (\_ =>
21+
case _ of
22+
{ Z => f (fromInteger 2)
23+
; S n => fromInteger 18
24+
}))
25+
26+
--------
27+
p4:
28+
(case y of { Nice => pure nicest ; Just x => x <*> foo (fromString "ha") }) >>= (\x => let {<<definitions>>} in f (fromInteger 16) >>= (\_ => case _ of { Z => f (fromInteger 2) ; S n => fromInteger 18 }))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
. ../../../testutils.sh
2+
3+
check ResugarTerm.idr
4+
run ResugarTerm.idr

0 commit comments

Comments
 (0)