1
1
use std:: cell:: RefCell ;
2
2
3
- use pretty:: { Doc , DocAllocator , DocBuilder , DocPtr , RefDoc } ;
3
+ use pretty:: { Doc , DocAllocator , DocPtr , RefDoc } ;
4
4
use scoped_arena:: Scope ;
5
5
6
6
use crate :: source:: { StringId , StringInterner } ;
@@ -9,6 +9,8 @@ use crate::surface::{Arg, FormatField, Item, Module, Param, Pattern, Plicity, Te
9
9
10
10
const INDENT : isize = 4 ;
11
11
12
+ type DocBuilder < ' interner , ' arena > = pretty:: DocBuilder < ' arena , Context < ' interner , ' arena > > ;
13
+
12
14
pub struct Context < ' interner , ' arena > {
13
15
interner : & ' interner RefCell < StringInterner > ,
14
16
scope : & ' arena Scope < ' arena > ,
@@ -22,29 +24,32 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
22
24
Context { interner, scope }
23
25
}
24
26
25
- fn string_id ( & ' arena self , name : StringId ) -> DocBuilder < ' arena , Self > {
27
+ fn string_id ( & ' arena self , name : StringId ) -> DocBuilder < ' interner , ' arena > {
26
28
match self . interner . borrow ( ) . resolve ( name) {
27
29
Some ( name) => self . text ( name. to_owned ( ) ) ,
28
30
None => self . text ( "#error" ) ,
29
31
}
30
32
}
31
33
32
- fn ident ( & ' arena self , name : StringId ) -> DocBuilder < ' arena , Self > {
34
+ fn ident ( & ' arena self , name : StringId ) -> DocBuilder < ' interner , ' arena > {
33
35
match self . interner . borrow ( ) . resolve ( name) {
34
36
Some ( name) if is_keyword ( name) => self . text ( format ! ( "r#{name}" ) ) ,
35
37
Some ( name) => self . text ( name. to_owned ( ) ) ,
36
38
None => self . text ( "#error" ) ,
37
39
}
38
40
}
39
41
40
- pub fn module < Range > ( & ' arena self , module : & Module < ' _ , Range > ) -> DocBuilder < ' arena , Self > {
42
+ pub fn module < Range > (
43
+ & ' arena self ,
44
+ module : & Module < ' _ , Range > ,
45
+ ) -> DocBuilder < ' interner , ' arena > {
41
46
self . intersperse (
42
47
module. items . iter ( ) . map ( |item| self . item ( item) ) ,
43
48
self . hardline ( ) ,
44
49
)
45
50
}
46
51
47
- fn item < Range > ( & ' arena self , item : & Item < ' _ , Range > ) -> DocBuilder < ' arena , Self > {
52
+ fn item < Range > ( & ' arena self , item : & Item < ' _ , Range > ) -> DocBuilder < ' interner , ' arena > {
48
53
match item {
49
54
Item :: Def ( item) => self
50
55
. concat ( [
@@ -79,7 +84,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
79
84
}
80
85
}
81
86
82
- fn pattern < Range > ( & ' arena self , pattern : & Pattern < Range > ) -> DocBuilder < ' arena , Self > {
87
+ fn pattern < Range > ( & ' arena self , pattern : & Pattern < Range > ) -> DocBuilder < ' interner , ' arena > {
83
88
match pattern {
84
89
Pattern :: Placeholder ( _) => self . text ( "_" ) ,
85
90
Pattern :: Name ( _, name) => self . ident ( * name) ,
@@ -92,7 +97,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
92
97
}
93
98
}
94
99
95
- fn plicity ( & ' arena self , plicity : Plicity ) -> DocBuilder < ' arena , Self > {
100
+ fn plicity ( & ' arena self , plicity : Plicity ) -> DocBuilder < ' interner , ' arena > {
96
101
match plicity {
97
102
Plicity :: Explicit => self . nil ( ) ,
98
103
Plicity :: Implicit => self . text ( "@" ) ,
@@ -103,7 +108,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
103
108
& ' arena self ,
104
109
pattern : & Pattern < Range > ,
105
110
r#type : Option < & Term < ' _ , Range > > ,
106
- ) -> DocBuilder < ' arena , Self > {
111
+ ) -> DocBuilder < ' interner , ' arena > {
107
112
match r#type {
108
113
None => self . pattern ( pattern) ,
109
114
Some ( r#type) => self . concat ( [
@@ -115,7 +120,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
115
120
}
116
121
}
117
122
118
- fn param < Range > ( & ' arena self , param : & Param < ' _ , Range > ) -> DocBuilder < ' arena , Self > {
123
+ fn param < Range > ( & ' arena self , param : & Param < ' _ , Range > ) -> DocBuilder < ' interner , ' arena > {
119
124
match & param. r#type {
120
125
None => self . concat ( [ self . plicity ( param. plicity ) , self . pattern ( & param. pattern ) ] ) ,
121
126
Some ( r#type) => self . concat ( [
@@ -134,15 +139,15 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
134
139
}
135
140
}
136
141
137
- fn params < Range > ( & ' arena self , params : & [ Param < ' _ , Range > ] ) -> DocBuilder < ' arena , Self > {
142
+ fn params < Range > ( & ' arena self , params : & [ Param < ' _ , Range > ] ) -> DocBuilder < ' interner , ' arena > {
138
143
self . concat ( ( params. iter ( ) ) . map ( |param| self . concat ( [ self . space ( ) , self . param ( param) ] ) ) )
139
144
}
140
145
141
- fn arg < Range > ( & ' arena self , arg : & Arg < ' _ , Range > ) -> DocBuilder < ' arena , Self > {
146
+ fn arg < Range > ( & ' arena self , arg : & Arg < ' _ , Range > ) -> DocBuilder < ' interner , ' arena > {
142
147
self . concat ( [ self . plicity ( arg. plicity ) , self . term ( & arg. term ) ] )
143
148
}
144
149
145
- pub fn term < Range > ( & ' arena self , term : & Term < ' _ , Range > ) -> DocBuilder < ' arena , Self > {
150
+ pub fn term < Range > ( & ' arena self , term : & Term < ' _ , Range > ) -> DocBuilder < ' interner , ' arena > {
146
151
// FIXME: indentation and grouping
147
152
148
153
match term {
@@ -337,7 +342,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
337
342
fn format_field < Range > (
338
343
& ' arena self ,
339
344
format_field : & FormatField < ' _ , Range > ,
340
- ) -> DocBuilder < ' arena , Self > {
345
+ ) -> DocBuilder < ' interner , ' arena > {
341
346
match format_field {
342
347
FormatField :: Format {
343
348
label,
@@ -385,7 +390,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
385
390
}
386
391
387
392
/// Wrap a document in parens.
388
- fn paren ( & ' arena self , doc : DocBuilder < ' arena , Self > ) -> DocBuilder < ' arena , Self > {
393
+ fn paren ( & ' arena self , doc : DocBuilder < ' interner , ' arena > ) -> DocBuilder < ' interner , ' arena > {
389
394
self . concat ( [ self . text ( "(" ) , doc, self . text ( ")" ) ] )
390
395
}
391
396
@@ -396,11 +401,11 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
396
401
pub fn sequence (
397
402
& ' arena self ,
398
403
space : bool ,
399
- start_delim : DocBuilder < ' arena , Self > ,
400
- docs : impl ExactSizeIterator < Item = DocBuilder < ' arena , Self > > + Clone ,
401
- separator : DocBuilder < ' arena , Self > ,
402
- end_delim : DocBuilder < ' arena , Self > ,
403
- ) -> DocBuilder < ' arena , Self > {
404
+ start_delim : DocBuilder < ' interner , ' arena > ,
405
+ docs : impl ExactSizeIterator < Item = DocBuilder < ' interner , ' arena > > + Clone ,
406
+ separator : DocBuilder < ' interner , ' arena > ,
407
+ end_delim : DocBuilder < ' interner , ' arena > ,
408
+ ) -> DocBuilder < ' interner , ' arena > {
404
409
if docs. len ( ) == 0 {
405
410
return self . concat ( [ start_delim, end_delim] ) ;
406
411
}
0 commit comments