Esempio n. 1
0
        private void ProcessNewModule(Occurence <ModuleRegistration> validModule)
        {
            var moduleName = validModule.Key.Name;
            var fUnit      = new FileCompilationUnit <ModuleRegistration>(FilePath(), validModule.Key);

            if (RefTable.Instance.HasDuplicates(moduleName))
            {
                _modulePool.Request(fUnit);
                ModuleHub.Instance.ModuleDuplicated(moduleName);

                return;
            }

            //_modulePool.Request(fUnit);

            if (validModule.Occurences.Count == 1)
            {
                var newModule = _modulePool.Request(
                    fUnit,
                    validModule.Key.ClassRegistrations.ToViewModels(),
                    validModule.Key.ModuleRegistrations.CollectSubModules());

                ModuleHub.Instance.ModuleCreated(newModule);
            }
            else
            {
                ModuleHub.Instance.ModuleDuplicated(moduleName);
            }
        }
Esempio n. 2
0
        private void ProcessNewModule(ModuleRegistration validModule)
        {
            var fUnit = new FileCompilationUnit <ModuleRegistration>(FilePath(), validModule);

            if (RefTable.Instance.HasDuplicates(validModule.Name))
            {
                _modulePool.Request(fUnit);
                ModuleHub.Instance.ModuleDuplicated(validModule.Name);

                return;
            }

            var newModule = _modulePool.Request(
                fUnit,
                validModule.ClassRegistrations.ToViewModels(),
                validModule.ModuleRegistrations.CollectSubModules());

            ModuleHub.Instance.ModuleCreated(newModule);
        }
Esempio n. 3
0
        public IEnumerable <ITagSpan <ModuleDeclarationTag> > GetTags(NormalizedSnapshotSpanCollection spans)
        {
            if (spans.Count == 0)
            {
                return(EmptyTags);
            }

            var proj  = GetActiveProject();
            var tests = new List <string>();

            foreach (ProjectItem projItem in proj.ProjectItems)
            {
                tests.AddRange(GetModules(projItem));
            }

            if (!tests.Any(x => x.Equals(FilePath(), StringComparison.OrdinalIgnoreCase)))
            {
                return(EmptyTags);
            }

            RefTable.Instance.TryRemoveDeclarations(FilePath());

            var wholeText       = spans.First().Snapshot.GetText();
            var compilationUnit = Compiler.Instance.CompileModuleOnFly(wholeText, FilePath()).OnlyValidModules();

            if (_previousUnits == null)
            {
                _previousUnits = compilationUnit.ValidModules;

                foreach (var validModule in compilationUnit.ValidModules)
                {
                    ProcessNewModule(validModule);
                }
            }
            else
            {
                Func <ModuleRegistration, ModuleRegistration, bool> equals = (l, r) => l.Name.Equals(r.Name, StringComparison.OrdinalIgnoreCase);
                Func <ModuleRegistration, int> getHashCode = m => m.Name.ToUpperInvariant().GetHashCode();
                var comparer = EqualityComparerFactory.Create(equals, getHashCode);
                var(newModules, sameModules, removedModules) = compilationUnit.ValidModules.SplitD(_previousUnits, comparer);

                foreach (var validModuleRegistration in newModules)
                {
                    ProcessNewModule(validModuleRegistration);
                }

                foreach (var validModuleRegistration in removedModules)
                {
                    _modulePool
                    .TryRelease(new FileCompilationUnit <string>(FilePath(), validModuleRegistration.Key.Name))
                    .WhenHasValueThen(ModuleHub.Instance.ModuleRemoved);
                }

                foreach (var sameModule in sameModules)
                {
                    var fUnit = new FileCompilationUnit <ModuleRegistration>(FilePath(), sameModule.leftIntersection.Key);
                    _modulePool.Request(fUnit);
                }

                foreach (var sameModule in sameModules)
                {
                    var fUnit = new FileCompilationUnit <ModuleRegistration>(FilePath(), sameModule.leftIntersection.Key);

                    //if (sameModule.leftIntersection.Occurences.Count > 1 ||
                    //    RefTable.Instance.HasDuplicates(sameModule.leftIntersection.Key.Name))
                    //{
                    //    continue;
                    //}

                    var(duplicated, module) = _modulePool.Request(fUnit);

                    if (duplicated)
                    {
                        continue;
                    }

                    var left  = sameModule.leftIntersection.Key;
                    var right = sameModule.rightIntersection.Key;

                    module.Dependencies.Clear();

                    left
                    .ClassRegistrations
                    .Select(x => new PlainDependency(x.Dependency, x.Implementation))
                    .ForEach(newDep => module.Add(newDep));

                    left
                    .ModuleRegistrations
                    .ForEach(newModule => _modulePool.TryRequest(newModule.Name).WhenHasValueThen(m => module.Add(m)));

                    //right
                    //    .ClassRegistrations
                    //    .Select(x => new PlainDependency(x.Dependency, x.Implementation))
                    //    .ForEach(oldDep => module.Remove(oldDep));
                    //left
                    //    .ClassRegistrations
                    //    .Select(x => new PlainDependency(x.Dependency, x.Implementation))
                    //    .ForEach(newDep => module.Add(newDep));

                    //right
                    //    .ModuleRegistrations
                    //    .ForEach(oldModule => _modulePool.TryRequest(oldModule.Name).WhenHasValueThen(m => module.Remove(m)));
                    //left
                    //    .ModuleRegistrations
                    //    .ForEach(newModule => _modulePool.TryRequest(newModule.Name).WhenHasValueThen(m => module.Add(m)));
                }
            }

            _previousUnits = compilationUnit.ValidModules;

            return(EmptyTags);
        }