1 // Copyright (c) Meta Platforms, Inc. and affiliates.
3 // This source code is licensed under the MIT license found in the
4 // LICENSE file in the "hack" directory of this source tree.
12 use datastore::{ChangesStore, NonEvictingStore, Store};
13 use depgraph_api::{DepGraph, NoDepGraph};
14 use file_provider::{FileProvider, PlainFileProvider};
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};
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>,
41 shallow_decl_store: Arc<ShallowDeclStore<BReason>>,
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 _,
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::<
62 hackrs_test_utils::serde_store::StoreOpts::Unserialized,
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 _,
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 _,
84 providers: ProviderBackend {
89 naming_provider: Arc::clone(&naming_table) as _,
90 shallow_decl_provider,
100 pub fn naming_table(&self) -> &NamingTable {
104 pub fn file_provider(&self) -> &dyn FileProvider {
105 Arc::as_ref(&self.providers.file_provider)
108 pub fn shallow_decl_provider(&self) -> &dyn ShallowDeclProvider<BReason> {
109 Arc::as_ref(&self.providers.shallow_decl_provider)
112 pub fn folded_decl_provider(&self) -> &dyn FoldedDeclProvider<BReason> {
113 Arc::as_ref(&self.providers.folded_decl_provider)
116 pub fn push_local_changes(&self) {
117 self.file_store.push_local_changes();
118 self.naming_table.push_local_changes();
121 pub fn pop_local_changes(&self) {
122 self.file_store.pop_local_changes();
123 self.naming_table.pop_local_changes();