@@ -3,6 +3,7 @@ use std::collections::hash_map::Entry;
33use crate :: diagnostic:: { Diagnostic , Rule } ;
44use crate :: model:: definitions:: Definition ;
55use crate :: model:: document:: Document ;
6+ use crate :: model:: graph:: NameDependent ;
67use crate :: model:: identity_maps:: IdentityHashMap ;
78use crate :: model:: ids:: { DefinitionId , NameId , ReferenceId , StringId , UriId } ;
89use crate :: model:: name:: { Name , NameRef } ;
@@ -18,6 +19,7 @@ type LocalGraphParts = (
1819 IdentityHashMap < NameId , NameRef > ,
1920 IdentityHashMap < ReferenceId , ConstantReference > ,
2021 IdentityHashMap < ReferenceId , MethodRef > ,
22+ IdentityHashMap < NameId , Vec < NameDependent > > ,
2123) ;
2224
2325#[ derive( Debug ) ]
@@ -29,6 +31,7 @@ pub struct LocalGraph {
2931 names : IdentityHashMap < NameId , NameRef > ,
3032 constant_references : IdentityHashMap < ReferenceId , ConstantReference > ,
3133 method_references : IdentityHashMap < ReferenceId , MethodRef > ,
34+ name_dependents : IdentityHashMap < NameId , Vec < NameDependent > > ,
3235}
3336
3437impl LocalGraph {
@@ -42,6 +45,7 @@ impl LocalGraph {
4245 names : IdentityHashMap :: default ( ) ,
4346 constant_references : IdentityHashMap :: default ( ) ,
4447 method_references : IdentityHashMap :: default ( ) ,
48+ name_dependents : IdentityHashMap :: default ( ) ,
4549 }
4650 }
4751
@@ -70,6 +74,13 @@ impl LocalGraph {
7074 pub fn add_definition ( & mut self , definition : Definition ) -> DefinitionId {
7175 let definition_id = definition. id ( ) ;
7276
77+ if let Some ( name_id) = definition. name_id ( ) {
78+ self . name_dependents
79+ . entry ( * name_id)
80+ . or_default ( )
81+ . push ( NameDependent :: Definition ( definition_id) ) ;
82+ }
83+
7384 if self . definitions . insert ( definition_id, definition) . is_some ( ) {
7485 debug_assert ! ( false , "DefinitionId collision in local graph" ) ;
7586 }
@@ -110,6 +121,8 @@ impl LocalGraph {
110121
111122 pub fn add_name ( & mut self , name : Name ) -> NameId {
112123 let name_id = name. id ( ) ;
124+ let nesting_id = name. nesting ( ) . as_ref ( ) . copied ( ) ;
125+ let parent_scope_id = name. parent_scope ( ) . as_ref ( ) . copied ( ) ;
113126
114127 match self . names . entry ( name_id) {
115128 Entry :: Occupied ( mut entry) => {
@@ -118,6 +131,15 @@ impl LocalGraph {
118131 }
119132 Entry :: Vacant ( entry) => {
120133 entry. insert ( NameRef :: Unresolved ( Box :: new ( name) ) ) ;
134+
135+ // Track nesting and parent_scope dependents for new names
136+ let dep = NameDependent :: Name ( name_id) ;
137+ for dep_owner_id in [ nesting_id, parent_scope_id] . into_iter ( ) . flatten ( ) {
138+ let deps = self . name_dependents . entry ( dep_owner_id) . or_default ( ) ;
139+ if !deps. contains ( & dep) {
140+ deps. push ( dep) ;
141+ }
142+ }
121143 }
122144 }
123145
@@ -134,6 +156,11 @@ impl LocalGraph {
134156 pub fn add_constant_reference ( & mut self , reference : ConstantReference ) -> ReferenceId {
135157 let reference_id = reference. id ( ) ;
136158
159+ self . name_dependents
160+ . entry ( * reference. name_id ( ) )
161+ . or_default ( )
162+ . push ( NameDependent :: Reference ( reference_id) ) ;
163+
137164 if self . constant_references . insert ( reference_id, reference) . is_some ( ) {
138165 debug_assert ! ( false , "ReferenceId collision in local graph" ) ;
139166 }
@@ -184,6 +211,7 @@ impl LocalGraph {
184211 self . names ,
185212 self . constant_references ,
186213 self . method_references ,
214+ self . name_dependents ,
187215 )
188216 }
189217}
0 commit comments