private void SyncComReferences(IReadOnlyList<VBProject> projects)
{
foreach (var vbProject in projects)
{
var projectId = QualifiedModuleName.GetProjectId(vbProject);
for (var priority = 1; priority <= vbProject.References.Count; priority++)
{
var reference = vbProject.References.Item(priority);
var referencedProjectId = QualifiedModuleName.GetProjectId(reference);
var map = _references.SingleOrDefault(r => r.ReferencedProjectId == referencedProjectId);
if (map == null)
{
map = new ReferencePriorityMap(referencedProjectId) {{projectId, priority}};
_references.Add(map);
}
else
{
map[projectId] = priority;
}
if (!map.IsLoaded)
{
_state.OnStatusMessageUpdate(ParserState.LoadingReference.ToString());
var items = _comReflector.GetDeclarationsForReference(reference).ToList();
foreach (var declaration in items)
{
_state.AddDeclaration(declaration);
}
map.IsLoaded = true;
}
}
}
var mappedIds = _references.Select(map => map.ReferencedProjectId);
var unmapped = projects.SelectMany(project => project.References.Cast<Reference>())
.Where(reference => !mappedIds.Contains(QualifiedModuleName.GetProjectId(reference)));
foreach (var reference in unmapped)
{
UnloadComReference(reference);
}
}