diff --git a/codegraph-kernel/src/resolve/mod.rs b/codegraph-kernel/src/resolve/mod.rs index f00a04b89..fb8401a6b 100644 --- a/codegraph-kernel/src/resolve/mod.rs +++ b/codegraph-kernel/src/resolve/mod.rs @@ -706,6 +706,11 @@ pub struct KernelResolver { ts_imported_type_memo: HashMap<(String, String), Option>, /// `(package, type)` → the project file declaring the package with that type in it. ts_ambient_memo: HashMap<(String, String), Option>, + /// `file` → its ambient/global scope scan (None when unreadable). The + /// scan parses the file and ambient-module lookup walks every `.d.ts` + /// once per import, so each file is scanned once and shared — upstream + /// memoizes the same way (TS_GLOBAL_SCOPES). + ts_scope_memo: HashMap>>, /// `(file, type as written)` → what the name names there. ts_named_type_memo: HashMap<(String, String), ts_known::TsNamedType>, /// Whether the project declares a `createInstance` returning an `InstanceType` of its constructor argument. @@ -935,6 +940,7 @@ impl KernelResolver { ts_field_reading: HashSet::new(), ts_imported_type_memo: HashMap::new(), ts_ambient_memo: HashMap::new(), + ts_scope_memo: HashMap::new(), ts_named_type_memo: HashMap::new(), ts_create_instance_declared: None, python_bound_memo: HashMap::new(), diff --git a/codegraph-kernel/src/resolve/ts_known.rs b/codegraph-kernel/src/resolve/ts_known.rs index a6cd234f0..92a257447 100644 --- a/codegraph-kernel/src/resolve/ts_known.rs +++ b/codegraph-kernel/src/resolve/ts_known.rs @@ -489,7 +489,16 @@ pub(super) struct TsScopeScan { } impl KernelResolver { - pub(super) fn ts_scope_scan(&mut self, file: &str, r: &ResolveRefIn) -> Option { + pub(super) fn ts_scope_scan(&mut self, file: &str, r: &ResolveRefIn) -> Option> { + if let Some(memo) = self.ts_scope_memo.get(file) { + return memo.clone(); + } + let scan = self.ts_scope_scan_uncached(file, r).map(Rc::new); + self.ts_scope_memo.insert(file.to_string(), scan.clone()); + scan + } + + fn ts_scope_scan_uncached(&mut self, file: &str, r: &ResolveRefIn) -> Option { let source = self.read_file(file)?; let mut site = r.clone(); site.file_path = file.to_string(); site.language = "typescript".to_string(); let tree = self.js_binding_tree(&source, &site)?;