Populate class member caches for TypingDeclProvider
[hiphop-php.git] / hphp / hack / src / rupro / lib / typing_decl_provider / provider.rs
blob0f33015e802c24200a56841114fc92828adc61e7
1 // Copyright (c) Facebook, Inc. and its 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 use crate::cache::Cache;
7 use crate::folded_decl_provider::FoldedDeclProvider;
8 use crate::reason::Reason;
9 use crate::typing_decl_provider::Class;
10 use pos::TypeName;
11 use std::sync::Arc;
13 #[derive(Debug)]
14 pub struct TypingDeclProvider<R: Reason> {
15     cache: Arc<dyn Cache<TypeName, Arc<Class<R>>>>,
16     folded_decl_provider: Arc<FoldedDeclProvider<R>>,
19 impl<R: Reason> TypingDeclProvider<R> {
20     pub fn new(
21         cache: Arc<dyn Cache<TypeName, Arc<Class<R>>>>,
22         folded_decl_provider: Arc<FoldedDeclProvider<R>>,
23     ) -> Self {
24         Self {
25             cache,
26             folded_decl_provider,
27         }
28     }
30     pub fn get_folded_decl_provider(&self) -> &Arc<FoldedDeclProvider<R>> {
31         &self.folded_decl_provider
32     }
34     pub fn get_class(&self, name: TypeName) -> Option<Arc<Class<R>>> {
35         match self.cache.get(name) {
36             Some(rc) => Some(rc),
37             None => {
38                 let folded_decl = self.folded_decl_provider.get_folded_class(name)?;
39                 let cls = Arc::new(Class::new(
40                     Arc::clone(&self.folded_decl_provider),
41                     folded_decl,
42                 ));
43                 self.cache.insert(name, Arc::clone(&cls));
44                 Some(cls)
45             }
46         }
47     }
49     pub fn get_class_or_typedef(&self, name: TypeName) -> Option<Arc<Class<R>>> {
50         self.get_class(name)
51     }