Remove push/pop_local_changes from FileProvider trait
[hiphop-php.git] / hphp / hack / src / providers / hackrs_provider_backend / hackrs_provider_backend.rs
blobbd7da185fe1721ccecdceb9120453eaa1e7d1fe4
1 // Copyright (c) Meta Platforms, Inc. and affiliates.
2 //
3 // This source code is licensed under the MIT license found in the
4 // LICENSE file in the "hack" directory of this source tree.
6 pub mod naming_table;
8 #[cfg(test)]
9 mod test_naming_table;
11 use anyhow::Result;
12 use datastore::{ChangesStore, NonEvictingStore, Store};
13 use depgraph_api::{DepGraph, NoDepGraph};
14 use file_provider::{FileProvider, PlainFileProvider};
15 use hackrs::{
16     decl_parser::DeclParser,
17     folded_decl_provider::{FoldedDeclProvider, LazyFoldedDeclProvider},
18     shallow_decl_provider::{LazyShallowDeclProvider, ShallowDeclProvider, ShallowDeclStore},
20 use naming_provider::NamingProvider;
21 use naming_table::NamingTable;
22 use oxidized_by_ref::parser_options::ParserOptions;
23 use pos::{RelativePath, RelativePathCtx, TypeName};
24 use std::sync::Arc;
25 use ty::{decl::folded::FoldedClass, reason::BReason};
27 pub struct ProviderBackend {
28     pub path_ctx: Arc<RelativePathCtx>,
29     pub file_provider: Arc<dyn FileProvider>,
30     pub decl_parser: DeclParser<BReason>,
31     pub dependency_graph: Arc<dyn DepGraph>,
32     pub naming_provider: Arc<dyn NamingProvider>,
33     pub shallow_decl_provider: Arc<dyn ShallowDeclProvider<BReason>>,
34     pub folded_decl_provider: Arc<dyn FoldedDeclProvider<BReason>>,
37 pub struct HhServerProviderBackend {
38     file_store: Arc<ChangesStore<RelativePath, file_provider::FileType>>,
39     naming_table: Arc<NamingTable>,
40     #[allow(dead_code)]
41     shallow_decl_store: Arc<ShallowDeclStore<BReason>>,
42     #[allow(dead_code)]
43     folded_classes_store: Arc<dyn Store<TypeName, Arc<FoldedClass<BReason>>>>,
44     providers: ProviderBackend,
47 impl HhServerProviderBackend {
48     pub fn new(path_ctx: RelativePathCtx, popt: &ParserOptions<'_>) -> Result<Self> {
49         let path_ctx = Arc::new(path_ctx);
50         let file_store = Arc::new(ChangesStore::new(Arc::new(NonEvictingStore::new())));
51         let file_provider: Arc<dyn FileProvider> = Arc::new(PlainFileProvider::new(
52             Arc::clone(&path_ctx),
53             Arc::clone(&file_store) as _,
54         ));
55         let decl_parser = DeclParser::with_options(Arc::clone(&file_provider), popt);
56         let dependency_graph = Arc::new(NoDepGraph::new());
57         let naming_table = Arc::new(NamingTable::new());
59         let shallow_decl_store = Arc::new(hackrs_test_utils::store::make_shallow_decl_store::<
60             BReason,
61         >(
62             hackrs_test_utils::serde_store::StoreOpts::Unserialized,
63         ));
65         let shallow_decl_provider: Arc<dyn ShallowDeclProvider<_>> =
66             Arc::new(LazyShallowDeclProvider::new(
67                 Arc::clone(&shallow_decl_store),
68                 Arc::clone(&naming_table) as _,
69                 decl_parser.clone(),
70             ));
72         let folded_classes_store: Arc<dyn Store<pos::TypeName, Arc<FoldedClass<_>>>> =
73             Arc::new(datastore::NonEvictingStore::new());
75         let folded_decl_provider: Arc<dyn FoldedDeclProvider<_>> =
76             Arc::new(LazyFoldedDeclProvider::new(
77                 Arc::new(Default::default()), // TODO: remove?
78                 Arc::clone(&folded_classes_store),
79                 Arc::clone(&shallow_decl_provider),
80                 Arc::clone(&dependency_graph) as _,
81             ));
83         Ok(Self {
84             providers: ProviderBackend {
85                 path_ctx,
86                 file_provider,
87                 decl_parser,
88                 dependency_graph,
89                 naming_provider: Arc::clone(&naming_table) as _,
90                 shallow_decl_provider,
91                 folded_decl_provider,
92             },
93             file_store,
94             naming_table,
95             shallow_decl_store,
96             folded_classes_store,
97         })
98     }
100     pub fn naming_table(&self) -> &NamingTable {
101         &self.naming_table
102     }
104     pub fn file_provider(&self) -> &dyn FileProvider {
105         Arc::as_ref(&self.providers.file_provider)
106     }
108     pub fn shallow_decl_provider(&self) -> &dyn ShallowDeclProvider<BReason> {
109         Arc::as_ref(&self.providers.shallow_decl_provider)
110     }
112     pub fn folded_decl_provider(&self) -> &dyn FoldedDeclProvider<BReason> {
113         Arc::as_ref(&self.providers.folded_decl_provider)
114     }
116     pub fn push_local_changes(&self) {
117         self.file_store.push_local_changes();
118         self.naming_table.push_local_changes();
119     }
121     pub fn pop_local_changes(&self) {
122         self.file_store.pop_local_changes();
123         self.naming_table.pop_local_changes();
124     }