Beispiel #1
0
        private void LoadReferenceFromTypeLibrary(IReference localReference, ReferencedDeclarationsCollector comReflector)
        {
            Logger.Trace(string.Format("COM reflecting reference '{0}'.", localReference.Name));
            var declarations = comReflector.LoadDeclarationsFromLibrary();

            foreach (var declaration in declarations)
            {
                State.AddDeclaration(declaration);
            }
        }
Beispiel #2
0
        private void LoadReferenceByDeserialization(IReference localReference, ReferencedDeclarationsCollector comReflector)
        {
            Logger.Trace(string.Format("Deserializing reference '{0}'.", localReference.Name));
            var declarations = comReflector.LoadDeclarationsFromXml();

            foreach (var declaration in declarations)
            {
                State.AddDeclaration(declaration);
            }
        }
Beispiel #3
0
        public RubberduckParser(VBE vbe, RubberduckParserState state, IAttributeParser attributeParser)
        {
            _resolverTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_central.Token);
            _vbe             = vbe;
            _state           = state;
            _attributeParser = attributeParser;

            _comReflector = new ReferencedDeclarationsCollector();

            state.ParseRequest += ReparseRequested;
            state.StateChanged += StateOnStateChanged;
        }
        public RubberduckParser(VBE vbe, RubberduckParserState state, IAttributeParser attributeParser)
        {
            _resolverTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_central.Token);
            _vbe = vbe;
            _state = state;
            _attributeParser = attributeParser;

            _comReflector = new ReferencedDeclarationsCollector();

            state.ParseRequest += ReparseRequested;
            state.StateChanged += StateOnStateChanged;
        }
        public RubberduckParser(
            VBE vbe,
            RubberduckParserState state,
            IAttributeParser attributeParser,
            Func <IVBAPreprocessor> preprocessorFactory)
        {
            _resolverTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_central.Token);
            _vbe                 = vbe;
            _state               = state;
            _attributeParser     = attributeParser;
            _preprocessorFactory = preprocessorFactory;

            _comReflector = new ReferencedDeclarationsCollector(_state);

            state.ParseRequest += ReparseRequested;
        }
Beispiel #6
0
        private void LoadReference(IReference localReference, ConcurrentBag <IReference> unmapped)
        {
            Logger.Trace(string.Format("Loading referenced type '{0}'.", localReference.Name));
            var comReflector = new ReferencedDeclarationsCollector(State, localReference, _serializedDeclarationsPath);

            try
            {
                if (comReflector.SerializedVersionExists)
                {
                    LoadReferenceByDeserialization(localReference, comReflector);
                }
                else
                {
                    LoadReferenceFromTypeLibrary(localReference, comReflector);
                }
            }
            catch (Exception exception)
            {
                unmapped.Add(localReference);
                Logger.Warn(string.Format("Types were not loaded from referenced type library '{0}'.", localReference.Name));
                Logger.Error(exception);
            }
        }
Beispiel #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);
            }
        }