8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use ty:: TyCtxt ;
11
+ use dep_graph:: { DepGraph , DepNode } ;
12
+ use hir:: def_id:: { DefId , CrateNum , CRATE_DEF_INDEX } ;
13
+ use rustc_data_structures:: bitvec:: BitVector ;
12
14
use std:: rc:: Rc ;
15
+ use std:: sync:: Arc ;
13
16
use syntax:: codemap:: CodeMap ;
14
17
use syntax_pos:: { BytePos , FileMap } ;
18
+ use ty:: TyCtxt ;
15
19
16
20
#[ derive( Clone ) ]
17
21
struct CacheEntry {
@@ -20,30 +24,37 @@ struct CacheEntry {
20
24
line_start : BytePos ,
21
25
line_end : BytePos ,
22
26
file : Rc < FileMap > ,
27
+ file_index : usize ,
23
28
}
24
29
25
30
pub struct CachingCodemapView < ' tcx > {
26
31
codemap : & ' tcx CodeMap ,
27
32
line_cache : [ CacheEntry ; 3 ] ,
28
33
time_stamp : usize ,
34
+ dep_graph : DepGraph ,
35
+ dep_tracking_reads : BitVector ,
29
36
}
30
37
31
38
impl < ' tcx > CachingCodemapView < ' tcx > {
32
39
pub fn new < ' a > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ) -> CachingCodemapView < ' tcx > {
33
40
let codemap = tcx. sess . codemap ( ) ;
34
- let first_file = codemap. files . borrow ( ) [ 0 ] . clone ( ) ;
41
+ let files = codemap. files_untracked ( ) ;
42
+ let first_file = files[ 0 ] . clone ( ) ;
35
43
let entry = CacheEntry {
36
44
time_stamp : 0 ,
37
45
line_number : 0 ,
38
46
line_start : BytePos ( 0 ) ,
39
47
line_end : BytePos ( 0 ) ,
40
48
file : first_file,
49
+ file_index : 0 ,
41
50
} ;
42
51
43
52
CachingCodemapView {
53
+ dep_graph : tcx. dep_graph . clone ( ) ,
44
54
codemap : codemap,
45
55
line_cache : [ entry. clone ( ) , entry. clone ( ) , entry. clone ( ) ] ,
46
56
time_stamp : 0 ,
57
+ dep_tracking_reads : BitVector :: new ( files. len ( ) ) ,
47
58
}
48
59
}
49
60
@@ -56,6 +67,10 @@ impl<'tcx> CachingCodemapView<'tcx> {
56
67
for cache_entry in self . line_cache . iter_mut ( ) {
57
68
if pos >= cache_entry. line_start && pos < cache_entry. line_end {
58
69
cache_entry. time_stamp = self . time_stamp ;
70
+ if self . dep_tracking_reads . insert ( cache_entry. file_index ) {
71
+ self . dep_graph . read ( dep_node ( cache_entry) ) ;
72
+ }
73
+
59
74
return Some ( ( cache_entry. file . clone ( ) ,
60
75
cache_entry. line_number ,
61
76
pos - cache_entry. line_start ) ) ;
@@ -75,14 +90,15 @@ impl<'tcx> CachingCodemapView<'tcx> {
75
90
// If the entry doesn't point to the correct file, fix it up
76
91
if pos < cache_entry. file . start_pos || pos >= cache_entry. file . end_pos {
77
92
let file_valid;
78
- let files = self . codemap . files . borrow ( ) ;
93
+ let files = self . codemap . files_untracked ( ) ;
79
94
80
95
if files. len ( ) > 0 {
81
96
let file_index = self . codemap . lookup_filemap_idx ( pos) ;
82
97
let file = files[ file_index] . clone ( ) ;
83
98
84
99
if pos >= file. start_pos && pos < file. end_pos {
85
100
cache_entry. file = file;
101
+ cache_entry. file_index = file_index;
86
102
file_valid = true ;
87
103
} else {
88
104
file_valid = false ;
@@ -104,8 +120,21 @@ impl<'tcx> CachingCodemapView<'tcx> {
104
120
cache_entry. line_end = line_bounds. 1 ;
105
121
cache_entry. time_stamp = self . time_stamp ;
106
122
123
+ if self . dep_tracking_reads . insert ( cache_entry. file_index ) {
124
+ self . dep_graph . read ( dep_node ( cache_entry) ) ;
125
+ }
126
+
107
127
return Some ( ( cache_entry. file . clone ( ) ,
108
128
cache_entry. line_number ,
109
129
pos - cache_entry. line_start ) ) ;
110
130
}
111
131
}
132
+
133
+ fn dep_node ( cache_entry : & CacheEntry ) -> DepNode < DefId > {
134
+ let def_id = DefId {
135
+ krate : CrateNum :: from_u32 ( cache_entry. file . crate_of_origin ) ,
136
+ index : CRATE_DEF_INDEX ,
137
+ } ;
138
+ let name = Arc :: new ( cache_entry. file . name . clone ( ) ) ;
139
+ DepNode :: FileMap ( def_id, name)
140
+ }
0 commit comments