@@ -6,22 +6,22 @@ use crate::elaborate::{Context, ElabError, ErrorKind};
6
6
use crate :: types:: { Constructor , Type } ;
7
7
use crate :: { Decl , Expr , ExprKind , Lambda , Pat , PatKind , Row , Rule , SortedRecord } ;
8
8
use sml_util:: interner:: Symbol ;
9
+ use sml_util:: pretty_print:: PrettyPrinter ;
9
10
use sml_util:: span:: Span ;
10
11
use sml_util:: Const ;
11
12
use std:: { cell:: Cell , collections:: HashMap } ;
12
13
13
- pub struct Entry {
14
+ pub struct Entry < ' a > {
14
15
name : Symbol ,
15
16
tyvars : Vec < usize > ,
16
- // usages:
17
+ usages : Vec < Vec < & ' a Type < ' a > > > ,
17
18
}
18
19
19
- pub struct Monomorphizer { }
20
-
21
20
pub struct Rename < ' a > {
22
21
pub decls : Vec < Decl < ' a > > ,
23
22
arena : & ' a CoreArena < ' a > ,
24
23
stack : Vec < Namespace > ,
24
+ cache : HashMap < Symbol , Vec < Vec < & ' a Type < ' a > > > > ,
25
25
id : u32 ,
26
26
}
27
27
@@ -39,6 +39,7 @@ impl<'a> Rename<'a> {
39
39
decls : Vec :: default ( ) ,
40
40
arena,
41
41
stack : vec ! [ Namespace :: default ( ) ] ,
42
+ cache : HashMap :: new ( ) ,
42
43
id : 0 ,
43
44
}
44
45
}
@@ -51,6 +52,47 @@ impl<'a> Rename<'a> {
51
52
self . stack . pop ( ) ;
52
53
}
53
54
55
+ fn cache_decl ( & mut self , name : Symbol , tyvars : Vec < usize > ) {
56
+ let entry = Entry {
57
+ name,
58
+ tyvars,
59
+ usages : Vec :: new ( ) ,
60
+ } ;
61
+ self . cache . insert ( name, Vec :: new ( ) ) ;
62
+ }
63
+
64
+ pub fn dump_cache ( & self , pp : & mut PrettyPrinter < ' _ > ) {
65
+ for ( k, entry) in & self . cache {
66
+ pp. line ( ) . text ( "CACHE " ) . print ( k) ;
67
+ for usage in entry {
68
+ for ty in usage {
69
+ pp. text ( " " ) . print ( * ty) . text ( "," ) ;
70
+ }
71
+ }
72
+ }
73
+ let mut b = String :: new ( ) ;
74
+ let _ = pp. write_fmt ( & mut b) ;
75
+ println ! ( "{}" , b) ;
76
+ }
77
+
78
+ fn add_usage ( & mut self , name : Symbol , usage : Vec < & ' a Type < ' a > > , pp : & mut PrettyPrinter < ' _ > ) {
79
+ // self.cache.entry(name)
80
+ // for (k, entry) in &self.cache {
81
+ // pp.line().text("CACHE ").print(k);
82
+ // for usage in entry {
83
+ // pp.text(" ").print(*usage).text(",");
84
+ // }
85
+ // }
86
+ // let mut b = String::new();
87
+ // let _ = pp.write_fmt(&mut b);
88
+ // println!("{}", b);
89
+ // let entry = self
90
+ // .cache
91
+ // .get_mut(&name)
92
+ // .expect(&format!("Invalid usage! {:?}", name));
93
+ self . cache . entry ( name) . or_default ( ) . push ( usage) ;
94
+ }
95
+
54
96
#[ inline]
55
97
pub fn fresh ( & mut self ) -> Symbol {
56
98
let id = self . id ;
@@ -102,11 +144,11 @@ impl<'a> Rename<'a> {
102
144
}
103
145
}
104
146
105
- pub fn visit_decl ( & mut self , decl : & Decl < ' a > ) -> Decl < ' a > {
147
+ pub fn visit_decl ( & mut self , decl : & Decl < ' a > , pp : & mut PrettyPrinter < ' _ > ) -> Decl < ' a > {
106
148
match decl {
107
149
Decl :: Val ( vars, Rule { pat, expr } ) => {
108
- let pat = self . visit_pat ( & pat) ;
109
- let expr = self . visit_expr ( & expr) ;
150
+ let pat = self . visit_pat ( & pat, pp ) ;
151
+ let expr = self . visit_expr ( & expr, pp ) ;
110
152
111
153
Decl :: Val ( vars. clone ( ) , Rule { pat, expr } )
112
154
}
@@ -117,8 +159,8 @@ impl<'a> Rename<'a> {
117
159
let sym = self . register_val ( * sym) ;
118
160
self . enter ( ) ;
119
161
lam. arg = self . register_val ( lam. arg ) ;
120
- lam. ty = self . visit_type ( lam. ty ) ;
121
- lam. body = self . visit_expr ( & lam. body ) ;
162
+ lam. ty = self . visit_type ( lam. ty , pp ) ;
163
+ lam. body = self . visit_expr ( & lam. body , pp ) ;
122
164
self . leave ( ) ;
123
165
( sym, lam)
124
166
} )
@@ -128,7 +170,7 @@ impl<'a> Rename<'a> {
128
170
}
129
171
Decl :: Datatype ( dts) => {
130
172
for dt in dts {
131
- self . register_type ( dt. tycon . name ) ;
173
+ let name = self . register_type ( dt. tycon . name ) ;
132
174
}
133
175
134
176
Decl :: Datatype (
@@ -155,32 +197,33 @@ impl<'a> Rename<'a> {
155
197
let mut con = * con;
156
198
con. name = self . register_val ( con. name ) ;
157
199
// con.tycon should be EXN
158
- let ty = ty. map ( |ty| self . visit_type ( ty) ) ;
200
+ let ty = ty. map ( |ty| self . visit_type ( ty, pp ) ) ;
159
201
Decl :: Exn ( con, ty)
160
202
}
161
203
}
162
204
}
163
205
164
- fn visit_type ( & mut self , ty : & ' a Type < ' a > ) -> & ' a Type < ' a > {
206
+ fn visit_type ( & mut self , ty : & ' a Type < ' a > , pp : & mut PrettyPrinter < ' _ > ) -> & ' a Type < ' a > {
165
207
match ty {
166
208
Type :: Var ( tyvar) => match tyvar. ty ( ) {
167
- Some ( ty) => self . visit_type ( ty) ,
209
+ Some ( ty) => self . visit_type ( ty, pp ) ,
168
210
None => {
169
211
// emit warning for unused type variable
170
- self . arena . types . unit ( )
212
+ // self.arena.types.unit()
213
+ ty
171
214
}
172
215
} ,
173
216
Type :: Record ( fields) => {
174
217
let args = SortedRecord :: new_unchecked (
175
218
fields
176
219
. iter ( )
177
- . map ( |row| row. fmap ( |ty| self . visit_type ( ty) ) )
220
+ . map ( |row| row. fmap ( |ty| self . visit_type ( ty, pp ) ) )
178
221
. collect ( ) ,
179
222
) ;
180
223
self . arena . types . alloc ( Type :: Record ( args) )
181
224
}
182
225
Type :: Flex ( flex) => match flex. ty ( ) {
183
- Some ( ty) => self . visit_type ( ty) ,
226
+ Some ( ty) => self . visit_type ( ty, pp ) ,
184
227
None => {
185
228
// emit warning for unused type variable
186
229
self . arena . types . unit ( )
@@ -190,18 +233,20 @@ impl<'a> Rename<'a> {
190
233
con. name = self . swap_type ( con. name ) . expect ( "BUG: Type::Con" ) ;
191
234
self . arena . types . alloc ( Type :: Con (
192
235
con,
193
- args. iter ( ) . map ( |ty| self . visit_type ( ty) ) . collect ( ) ,
236
+ args. iter ( ) . map ( |ty| self . visit_type ( ty, pp ) ) . collect ( ) ,
194
237
) )
195
238
}
196
239
}
197
240
}
198
241
199
- fn visit_pat ( & mut self , pat : & Pat < ' a > ) -> Pat < ' a > {
242
+ fn visit_pat ( & mut self , pat : & Pat < ' a > , pp : & mut PrettyPrinter < ' _ > ) -> Pat < ' a > {
243
+ let ty = self . visit_type ( pat. ty , pp) ;
244
+
200
245
let kind = match pat. kind {
201
246
PatKind :: App ( mut con, Some ( pat) ) => {
202
247
con. name = self . swap_value ( con. name ) . expect ( "BUG: PatKind::Con" ) ;
203
248
con. tycon = self . swap_type ( con. tycon ) . expect ( "BUG: PatKind::Con" ) ;
204
- PatKind :: App ( con, Some ( self . visit_pat ( pat) ) )
249
+ PatKind :: App ( con, Some ( self . visit_pat ( pat, pp ) ) )
205
250
}
206
251
PatKind :: App ( mut con, None ) => {
207
252
con. name = self . swap_value ( con. name ) . expect ( "BUG: PatKind::Con" ) ;
@@ -212,37 +257,39 @@ impl<'a> Rename<'a> {
212
257
PatKind :: Record ( fields) => PatKind :: Record ( SortedRecord :: new_unchecked (
213
258
fields
214
259
. iter ( )
215
- . map ( |row| row. fmap ( |pat| self . visit_pat ( pat) ) )
260
+ . map ( |row| row. fmap ( |pat| self . visit_pat ( pat, pp ) ) )
216
261
. collect ( ) ,
217
262
) ) ,
218
263
PatKind :: Var ( sym) => PatKind :: Var ( self . register_val ( * sym) ) ,
219
264
PatKind :: Wild => PatKind :: Var ( self . fresh ( ) ) ,
220
265
} ;
221
- Pat :: new (
222
- self . arena . pats . alloc ( kind) ,
223
- self . visit_type ( pat. ty ) ,
224
- pat. span ,
225
- )
266
+ Pat :: new ( self . arena . pats . alloc ( kind) , ty, pat. span )
226
267
}
227
268
228
- fn visit_expr ( & mut self , expr : & Expr < ' a > ) -> Expr < ' a > {
269
+ fn visit_expr ( & mut self , expr : & Expr < ' a > , pp : & mut PrettyPrinter < ' _ > ) -> Expr < ' a > {
270
+ pp. text ( "visiting " ) . print ( expr) ;
271
+ let mut b = String :: new ( ) ;
272
+ let _ = pp. write_fmt ( & mut b) ;
273
+ println ! ( "{}" , b) ;
274
+
275
+ let ty = self . visit_type ( expr. ty , pp) ;
229
276
let kind = match expr. kind {
230
277
ExprKind :: App ( e1, e2) => {
231
- let e1 = self . visit_expr ( e1) ;
232
- let e2 = self . visit_expr ( e2) ;
278
+ let e1 = self . visit_expr ( e1, pp ) ;
279
+ let e2 = self . visit_expr ( e2, pp ) ;
233
280
ExprKind :: App ( e1, e2)
234
281
}
235
282
ExprKind :: Case ( casee, rules) => {
236
283
let ( var, ty) = casee;
237
284
let var = self . swap_value ( * var) . expect ( "BUG: ExprKind::Case" ) ;
238
- let ty = self . visit_type ( ty) ;
285
+ let ty = self . visit_type ( ty, pp ) ;
239
286
240
287
let rules = rules
241
288
. iter ( )
242
289
. map ( |rule| {
243
290
self . enter ( ) ;
244
- let pat = self . visit_pat ( & rule. pat ) ;
245
- let expr = self . visit_expr ( & rule. expr ) ;
291
+ let pat = self . visit_pat ( & rule. pat , pp ) ;
292
+ let expr = self . visit_expr ( & rule. expr , pp ) ;
246
293
self . leave ( ) ;
247
294
Rule { pat, expr }
248
295
} )
@@ -253,50 +300,70 @@ impl<'a> Rename<'a> {
253
300
ExprKind :: Con ( mut con, tys) => {
254
301
con. name = self . swap_value ( con. name ) . expect ( "BUG: ExprKind::Con" ) ;
255
302
con. tycon = self . swap_type ( con. tycon ) . expect ( "BUG: ExprKind::Con" ) ;
256
- ExprKind :: Con ( con, tys. iter ( ) . map ( |ty| self . visit_type ( ty) ) . collect ( ) )
303
+ let tys = tys
304
+ . iter ( )
305
+ . map ( |ty| self . visit_type ( ty, pp) )
306
+ . collect :: < Vec < _ > > ( ) ;
307
+ self . add_usage ( con. name , tys. clone ( ) , pp) ;
308
+ ExprKind :: Con ( con, tys)
257
309
}
258
310
ExprKind :: Const ( c) => ExprKind :: Const ( * c) ,
259
311
ExprKind :: Handle ( tryy, sym, handler) => {
260
- let tryy = self . visit_expr ( tryy) ;
312
+ let tryy = self . visit_expr ( tryy, pp ) ;
261
313
let sym = self . swap_value ( * sym) . expect ( "BUG: ExprKind::Handle" ) ;
262
- let handler = self . visit_expr ( handler) ;
314
+ let handler = self . visit_expr ( handler, pp ) ;
263
315
ExprKind :: Handle ( tryy, sym, handler)
264
316
}
265
317
ExprKind :: Lambda ( lam) => {
266
318
let mut lam = * lam;
267
319
self . enter ( ) ;
268
320
lam. arg = self . register_val ( lam. arg ) ;
269
- lam. ty = self . visit_type ( lam. ty ) ;
270
- lam. body = self . visit_expr ( & lam. body ) ;
321
+ lam. ty = self . visit_type ( lam. ty , pp ) ;
322
+ lam. body = self . visit_expr ( & lam. body , pp ) ;
271
323
self . leave ( ) ;
272
324
ExprKind :: Lambda ( lam)
273
325
}
274
326
ExprKind :: Let ( decls, body) => {
275
327
self . enter ( ) ;
276
- let decls = decls. iter ( ) . map ( |d| self . visit_decl ( d) ) . collect ( ) ;
277
- let body = self . visit_expr ( body) ;
328
+ let decls = decls. iter ( ) . map ( |d| self . visit_decl ( d, pp ) ) . collect ( ) ;
329
+ let body = self . visit_expr ( body, pp ) ;
278
330
self . leave ( ) ;
279
331
ExprKind :: Let ( decls, body)
280
332
}
281
333
ExprKind :: List ( exprs) => {
282
- ExprKind :: List ( exprs. iter ( ) . map ( |e| self . visit_expr ( e) ) . collect ( ) )
334
+ ExprKind :: List ( exprs. iter ( ) . map ( |e| self . visit_expr ( e, pp ) ) . collect ( ) )
283
335
}
284
336
ExprKind :: Primitive ( sym) => ExprKind :: Primitive ( * sym) ,
285
- ExprKind :: Raise ( e) => ExprKind :: Raise ( self . visit_expr ( e) ) ,
337
+ ExprKind :: Raise ( e) => ExprKind :: Raise ( self . visit_expr ( e, pp ) ) ,
286
338
ExprKind :: Record ( rows) => ExprKind :: Record (
287
339
rows. iter ( )
288
- . map ( |row| row. fmap ( |ex| self . visit_expr ( ex) ) )
340
+ . map ( |row| row. fmap ( |ex| self . visit_expr ( ex, pp ) ) )
289
341
. collect ( ) ,
290
342
) ,
291
343
ExprKind :: Seq ( exprs) => {
292
- ExprKind :: Seq ( exprs. iter ( ) . map ( |e| self . visit_expr ( e) ) . collect ( ) )
344
+ ExprKind :: Seq ( exprs. iter ( ) . map ( |e| self . visit_expr ( e, pp) ) . collect ( ) )
345
+ }
346
+ ExprKind :: Var ( s, tys) => {
347
+ let name = self . swap_value ( * s) . expect ( "BUG" ) ;
348
+ let tys = tys
349
+ . iter ( )
350
+ . map ( |ty| self . visit_type ( ty, pp) )
351
+ . collect :: < Vec < _ > > ( ) ;
352
+ self . add_usage ( name, tys. clone ( ) , pp) ;
353
+ pp. line ( ) . text ( "VAR " ) . print ( & name) . print ( ty) ;
354
+ ExprKind :: Var ( name, tys)
355
+ // if vars.is_empty() {
356
+ // ExprKind::Var(name, Vec::new())
357
+ // } else {
358
+ // let usage = vars
359
+ // .iter()
360
+ // .map(|ty| self.visit_type(ty, pp))
361
+ // .collect::<Vec<_>>();
362
+ // self.add_usage(name, usage.clone(), pp);
363
+ // ExprKind::Var(name, usage)
364
+ // }
293
365
}
294
- ExprKind :: Var ( s) => ExprKind :: Var ( self . swap_value ( * s) . expect ( "BUG" ) ) ,
295
366
} ;
296
- Expr :: new (
297
- self . arena . exprs . alloc ( kind) ,
298
- self . visit_type ( expr. ty ) ,
299
- expr. span ,
300
- )
367
+ Expr :: new ( self . arena . exprs . alloc ( kind) , ty, expr. span )
301
368
}
302
369
}
0 commit comments