private string GetReferenceProjectId(Reference reference, IReadOnlyList <VBProject> projects) { VBProject project = null; foreach (var item in projects) { try { if (item.FileName == reference.FullPath) { project = item; } } catch (IOException) { // Filename throws exception if unsaved. } } if (project != null) { return(QualifiedModuleName.GetProjectId(project)); } return(QualifiedModuleName.GetProjectId(reference)); }
private string GetReferenceProjectId(IReference reference, IReadOnlyList <IVBProject> projects) { IVBProject project = null; foreach (var item in projects) { try { // check the name not just the path, because path is empty in tests: if (item.Name == reference.Name && item.FileName == reference.FullPath) { project = item; break; } } catch (IOException) { // Filename throws exception if unsaved. } catch (COMException e) { Logger.Warn(e); } } if (project != null) { if (string.IsNullOrEmpty(project.ProjectId)) { project.AssignProjectId(); } return(project.ProjectId); } return(QualifiedModuleName.GetProjectId(reference)); }
private bool TryStoreLockedProject(IVBProject project) { if (!project.TryGetFullPath(out var path)) { _logger.Warn("Path of locked project could not be read."); } var projectName = project.Name; var projectId = QualifiedModuleName.GetProjectId(projectName, path); _lockedProjects.Add(projectId, project); return(true); }
private List <IReference> GetReferencesToLoadAndSaveReferencePriority(IReadOnlyList <IVBProject> projects) { var referencesToLoad = new List <IReference>(); foreach (var vbProject in projects) { var projectId = QualifiedModuleName.GetProjectId(vbProject); var references = vbProject.References; // use a 'for' loop to store the order of references as a 'priority'. // reference resolver needs this to know which declaration to prioritize when a global identifier exists in multiple libraries. for (var priority = 1; priority <= references.Count; priority++) { var reference = references[priority]; if (reference.IsBroken) { continue; } // skip loading Rubberduck.tlb (GUID is defined in AssemblyInfo.cs) if (reference.Guid == "{E07C841C-14B4-4890-83E9-8C80B06DD59D}") { // todo: figure out why Rubberduck.tlb *sometimes* throws //continue; } var referencedProjectId = GetReferenceProjectId(reference, projects); var map = _projectReferences.FirstOrDefault(item => item.ReferencedProjectId == referencedProjectId); if (map == null) { map = new ReferencePriorityMap(referencedProjectId) { { projectId, priority } }; _projectReferences.Add(map); } else { map[projectId] = priority; } if (!map.IsLoaded) { referencesToLoad.Add(reference); map.IsLoaded = true; } } } return(referencesToLoad); }
private void SyncComReferences(IReadOnlyList <VBProject> projects) { foreach (var vbProject in projects) { var projectId = QualifiedModuleName.GetProjectId(vbProject); // use a 'for' loop to store the order of references as a 'priority'. // reference resolver needs this to know which declaration to prioritize when a global identifier exists in multiple libraries. for (var priority = 1; priority <= vbProject.References.Count; priority++) { var reference = vbProject.References.Item(priority); var referencedProjectId = GetReferenceProjectId(reference, projects); var map = _projectReferences.SingleOrDefault(r => r.ReferencedProjectId == referencedProjectId); if (map == null) { map = new ReferencePriorityMap(referencedProjectId) { { projectId, priority } }; _projectReferences.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 = _projectReferences.Select(map => map.ReferencedProjectId); var unmapped = projects.SelectMany(project => project.References.Cast <Reference>()) .Where(reference => !mappedIds.Contains(GetReferenceProjectId(reference, projects))); foreach (var reference in unmapped) { UnloadComReference(reference, projects); } }
private string GetReferenceProjectId(Reference reference, IReadOnlyList <VBProject> projects) { var id = projects.FirstOrDefault(project => { try { return(project.FileName == reference.FullPath); } catch (IOException) { // Filename throws exception if unsaved. return(false); } }); if (id != null) { return(QualifiedModuleName.GetProjectId(id)); } return(QualifiedModuleName.GetProjectId(reference)); }
private void SyncComReferences(IReadOnlyList <VBProject> projects) { var loadTasks = new List <Task>(); foreach (var vbProject in projects) { var projectId = QualifiedModuleName.GetProjectId(vbProject); // use a 'for' loop to store the order of references as a 'priority'. // reference resolver needs this to know which declaration to prioritize when a global identifier exists in multiple libraries. for (var priority = 1; priority <= vbProject.References.Count; priority++) { var reference = vbProject.References.Item(priority); var referencedProjectId = GetReferenceProjectId(reference, projects); ReferencePriorityMap map = null; foreach (var item in _projectReferences) { if (item.ReferencedProjectId == referencedProjectId) { map = map != null ? null : item; } } if (map == null) { map = new ReferencePriorityMap(referencedProjectId) { { projectId, priority } }; _projectReferences.Add(map); } else { map[projectId] = priority; } if (!map.IsLoaded) { State.OnStatusMessageUpdate(ParserState.LoadingReference.ToString()); var tightlyScopedCapture = reference; loadTasks.Add( Task.Run(() => { var comReflector = new ReferencedDeclarationsCollector(State); var items = comReflector.GetDeclarationsForReference(tightlyScopedCapture); foreach (var declaration in items) { State.AddDeclaration(declaration); } })); map.IsLoaded = true; } } } var mappedIds = new List <string>(); foreach (var item in _projectReferences) { mappedIds.Add(item.ReferencedProjectId); } var unmapped = new List <Reference>(); foreach (var project in projects) { foreach (Reference item in project.References) { if (!mappedIds.Contains(GetReferenceProjectId(item, projects))) { unmapped.Add(item); } } } Task.WaitAll(loadTasks.ToArray()); foreach (var reference in unmapped) { UnloadComReference(reference, projects); } }
public void RemoveBuiltInDeclarations(IReference reference) { var projectName = reference.Name; var key = new QualifiedModuleName(projectName, reference.FullPath, projectName); ClearAsTypeDeclarationPointingToReference(key); if (_moduleStates.TryRemove(key, out var moduleState)) { moduleState?.Dispose(); Logger.Warn("Could not remove declarations for removed reference '{0}' ({1}).", reference.Name, QualifiedModuleName.GetProjectId(reference)); } }
public void RemoveProject(VBProject project) { RemoveProject(QualifiedModuleName.GetProjectId(project)); ClearStateCache(project); }
public void RemoveBuiltInDeclarations(Reference reference) { var projectName = reference.Name; var key = new QualifiedModuleName(projectName, reference.FullPath, projectName); ModuleState moduleState; if (_moduleStates.TryRemove(key, out moduleState)) { if (moduleState != null) { moduleState.Dispose(); } Logger.Warn("Could not remove declarations for removed reference '{0}' ({1}).", reference.Name, QualifiedModuleName.GetProjectId(reference)); } }
public void RemoveBuiltInDeclarations(Reference reference) { var projectName = reference.Name; var key = new QualifiedModuleName(projectName, reference.FullPath, projectName); ConcurrentDictionary <Declaration, byte> items; if (!_declarations.TryRemove(key, out items)) { Debug.WriteLine("Could not remove declarations for removed reference '{0}' ({1}).", reference.Name, QualifiedModuleName.GetProjectId(reference)); } }