@@ -214,10 +214,8 @@ private void ExecuteCommonParseActivities(List<IVBComponent> toParse, Cancellati
214
214
215
215
token . ThrowIfCancellationRequested ( ) ;
216
216
217
- _projectDeclarations . Clear ( ) ;
218
- State . ClearAllReferences ( ) ;
219
-
220
- ClearModuleToModuleReferences ( toParse ) ;
217
+ var toResolveReferences = ModulesForWhichToResolveReferences ( toParse ) ;
218
+ PerformPreParseCleanup ( toParse , toResolveReferences ) ;
221
219
222
220
ParseComponents ( toParse , token ) ;
223
221
@@ -241,7 +239,7 @@ private void ExecuteCommonParseActivities(List<IVBComponent> toParse, Cancellati
241
239
throw new OperationCanceledException ( token ) ;
242
240
}
243
241
244
- var toResolveReferences = State . ParseTrees . Select ( kvp => kvp . Key ) . ToHashSet ( ) ;
242
+ toResolveReferences = State . ParseTrees . Select ( kvp => kvp . Key ) . ToHashSet ( ) ;
245
243
ResolveAllReferences ( toResolveReferences , token ) ;
246
244
247
245
if ( token . IsCancellationRequested || State . Status >= ParserState . Error )
@@ -271,6 +269,24 @@ private void SetModuleStates(List<IVBComponent> components, ParserState parserSt
271
269
}
272
270
}
273
271
272
+ private ICollection < QualifiedModuleName > ModulesForWhichToResolveReferences ( List < IVBComponent > toParse )
273
+ {
274
+ var toResolveReferences = new HashSet < QualifiedModuleName > ( ) ;
275
+ foreach ( var qmn in toParse . Select ( component => new QualifiedModuleName ( component ) ) )
276
+ {
277
+ toResolveReferences . UnionWith ( State . ModulesReferencing ( qmn ) ) ;
278
+ }
279
+ return toResolveReferences ;
280
+ }
281
+
282
+ private void PerformPreParseCleanup ( List < IVBComponent > toParse , ICollection < QualifiedModuleName > toResolveReferences )
283
+ {
284
+ ClearModuleToModuleReferences ( toParse ) ;
285
+ State . RemoveAllReferencesBy ( toResolveReferences ) ;
286
+ State . ClearAllReferences ( ) ; //This has to stay here until the selective resolving actually works.
287
+ _projectDeclarations . Clear ( ) ;
288
+ }
289
+
274
290
private void ClearModuleToModuleReferences ( List < IVBComponent > toClear )
275
291
{
276
292
foreach ( var component in toClear )
@@ -711,10 +727,12 @@ private bool CleanUpRemovedComponents(List<IVBComponent> components)
711
727
{
712
728
var removedModuledecalrations = RemovedModuleDeclarations ( components ) ;
713
729
var componentRemoved = removedModuledecalrations . Any ( ) ;
714
- foreach ( var declaration in removedModuledecalrations )
730
+ var removedModules = removedModuledecalrations . Select ( declaration => declaration . QualifiedName . QualifiedModuleName ) . ToHashSet ( ) ;
731
+ State . RemoveAllReferencesBy ( removedModules ) ;
732
+ foreach ( var qmn in removedModules )
715
733
{
716
- State . ClearModuleToModuleReferencesFromModule ( declaration . QualifiedName . QualifiedModuleName ) ;
717
- State . ClearStateCache ( declaration . QualifiedName . QualifiedModuleName ) ;
734
+ State . ClearModuleToModuleReferencesFromModule ( qmn ) ;
735
+ State . ClearStateCache ( qmn ) ;
718
736
}
719
737
return componentRemoved ;
720
738
}
0 commit comments