2 * Copyright (c) 2015, Facebook, Inc.
5 * This source code is licensed under the MIT license found in the
6 * LICENSE file in the "hack" directory of this source tree.
13 Shared memory heap containing the contents of files.
14 Acts as a sort of caching facade which is filled on-demand
15 as contents are needed - The "cache" is filled by loading from
16 the file system if the file isn't opened in the IDE
17 (otherwise uses the IDE contents).
18 That is, the IDE version take precedence over file system's.
21 type file_type
= Rust_provider_backend.File.file_type
=
25 exception File_provider_stale
29 (SharedMem.ImmediateBackend
(SharedMem.Evictable
)) (Relative_path.S
)
33 let description = "File"
36 let read_file_contents_from_disk (fn
: Relative_path.t
) : string option =
37 try Some
(Sys_utils.cat
(Relative_path.to_absolute fn
)) with
41 match Provider_backend.get () with
42 | Provider_backend.Analysis
-> failwith
"invalid"
43 | Provider_backend.Pessimised_shared_memory _
44 | Provider_backend.Shared_memory
->
46 | Provider_backend.Rust_provider_backend backend
->
47 Rust_provider_backend.File.get backend fn
48 | Provider_backend.Local_memory _
49 | Provider_backend.Decl_service _
->
50 failwith
"File_provider.get not supported with local/decl memory provider"
53 match Provider_backend.get () with
54 | Provider_backend.Analysis
-> failwith
"invalid"
55 | Provider_backend.Pessimised_shared_memory _
56 | Provider_backend.Shared_memory
->
59 | Some contents
-> contents
60 | None
-> failwith
("File not found: " ^
Relative_path.to_absolute fn
)
62 | Provider_backend.Rust_provider_backend backend
->
64 match Rust_provider_backend.File.get backend fn
with
65 | Some contents
-> contents
66 | None
-> failwith
("File not found: " ^
Relative_path.to_absolute fn
)
68 | Provider_backend.Local_memory _
69 | Provider_backend.Decl_service _
->
71 "File_provider.get_unsafe not supported with local/decl memory provider"
73 let get_contents ?
(force_read_disk
= false) fn
=
74 match Provider_backend.get () with
75 | Provider_backend.Analysis
-> failwith
"invalid"
76 | Provider_backend.Pessimised_shared_memory _
77 | Provider_backend.Shared_memory
->
79 if force_read_disk
then
84 (match from_cache with
85 | Some
(Ide f
) -> Some f
86 | Some
(Disk contents
) -> Some contents
89 Option.value (read_file_contents_from_disk fn
) ~default
:""
92 | Provider_backend.Rust_provider_backend backend
->
93 Some
(Rust_provider_backend.File.get_contents backend fn
)
94 | Provider_backend.Local_memory _
95 | Provider_backend.Decl_service _
->
96 read_file_contents_from_disk fn
98 let get_ide_contents_unsafe fn
=
99 match Provider_backend.get () with
100 | Provider_backend.Analysis
-> failwith
"invalid"
101 | Provider_backend.Pessimised_shared_memory _
102 | Provider_backend.Shared_memory
->
104 match FileHeap.get fn
with
106 | _
-> failwith
("IDE file not found: " ^
Relative_path.to_absolute fn
)
108 | Provider_backend.Rust_provider_backend backend
->
110 match Rust_provider_backend.File.get backend fn
with
112 | _
-> failwith
("IDE file not found: " ^
Relative_path.to_absolute fn
)
114 | Provider_backend.Local_memory _
115 | Provider_backend.Decl_service _
->
117 ("File_provider.get_ide_contents_unsafe not supported "
118 ^
"with local/decl memory provider")
120 let provide_file_for_tests fn
contents =
121 match Provider_backend.get () with
122 | Provider_backend.Analysis
-> failwith
"invalid"
123 | Provider_backend.Pessimised_shared_memory _
124 | Provider_backend.Shared_memory
->
125 FileHeap.add fn
(Disk
contents)
126 | Provider_backend.Rust_provider_backend backend
->
127 Rust_provider_backend.File.provide_file_for_tests backend fn
contents
128 | Provider_backend.Local_memory _
129 | Provider_backend.Decl_service _
->
131 "File_provider.provide_file_for_tests not supported with local/decl memory provider"
133 let provide_file_for_ide fn
contents =
134 match Provider_backend.get () with
135 | Provider_backend.Analysis
-> failwith
"invalid"
136 | Provider_backend.Pessimised_shared_memory _
137 | Provider_backend.Shared_memory
->
138 FileHeap.add fn
(Ide
contents)
139 | Provider_backend.Rust_provider_backend backend
->
140 Rust_provider_backend.File.provide_file_for_ide backend fn
contents
141 | Provider_backend.Local_memory _
142 | Provider_backend.Decl_service _
->
144 "File_provider.provide_file_for_ide not supported with local/decl memory provider"
146 let provide_file_hint fn
contents =
147 match Provider_backend.get () with
148 | Provider_backend.Analysis
-> failwith
"invalid"
149 | Provider_backend.Pessimised_shared_memory _
150 | Provider_backend.Shared_memory
->
152 | Ide _
-> FileHeap.add fn
contents
154 | Provider_backend.Rust_provider_backend backend
->
155 Rust_provider_backend.File.provide_file_hint backend fn
contents
156 | Provider_backend.Local_memory _
157 | Provider_backend.Decl_service _
->
159 "File_provider.provide_file_hint not supported with local/decl memory provider"
161 let remove_batch paths
=
162 match Provider_backend.get () with
163 | Provider_backend.Analysis
-> failwith
"invalid"
164 | Provider_backend.Pessimised_shared_memory _
165 | Provider_backend.Shared_memory
->
166 FileHeap.remove_batch paths
167 | Provider_backend.Rust_provider_backend backend
->
168 Rust_provider_backend.File.remove_batch backend paths
169 | Provider_backend.Local_memory _
170 | Provider_backend.Decl_service _
->
172 "File_provider.remove_batch not supported with local/decl memory provider"
174 let local_changes_push_sharedmem_stack () = FileHeap.LocalChanges.push_stack
()
176 let local_changes_pop_sharedmem_stack () = FileHeap.LocalChanges.pop_stack
()