Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
        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));
            }
        }
Ejemplo n.º 9
0
 public void RemoveProject(VBProject project)
 {
     RemoveProject(QualifiedModuleName.GetProjectId(project));
     ClearStateCache(project);
 }
Ejemplo n.º 10
0
        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));
            }
        }