Example #1
0
            public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet index) {
                var res = base.GetIndex(node, unit, index);

                var names = index.OfType<ConstantInfo>()
                    .Select(ci => ci.GetConstantValueAsString())
                    .Where(s => !string.IsNullOrEmpty(s))
                    .Distinct()
                    .ToArray();

                if (names.Length != 1) {
                    // Unless you request a specific module by string literal,
                    // you won't get any object out of sys.modules.
                    return AnalysisSet.Empty;
                }

                var name = names[0];

                lock (_owner.Modules) {
                    IAnalysisSet knownValues;
                    if (_owner.Modules.TryGetValue(name, out knownValues) &&
                        knownValues != null &&
                        knownValues.Any()
                    ) {
                        return knownValues;
                    }
                }

                ModuleReference modRef;
                if (unit.ProjectState.Modules.TryImport(name, out modRef)) {
                    return modRef.AnalysisModule;
                }

                return AnalysisSet.Empty;
            }
        public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet index)
        {
            LazyValueInfo lazyIndex = null;

            // We only use the index if it is not lazy
            if (!index.OfType <LazyValueInfo>().Any())
            {
                lazyIndex = new LazyValueInfo(node, index);
            }
            return(new LazyValueInfo(node, this, lazyIndex, LazyOperation.GetIndex));
        }
        public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet index)
        {
            var constants = index.OfType <ConstantInfo>().Select(ci => ci.Value).OfType <int>().ToArray();

            if (constants.Length == 0)
            {
                return(AnalysisSet.UnionAll(_values));
            }

            return(AnalysisSet.UnionAll(constants.Select(GetItem)));
        }
Example #4
0
            public override void SetIndex(Node node, AnalysisUnit unit, IAnalysisSet index, IAnalysisSet value)
            {
                base.SetIndex(node, unit, index, value);

                foreach (var name in index.OfType <ConstantInfo>()
                         .Select(ci => ci.GetConstantValueAsString())
                         .Where(s => !string.IsNullOrEmpty(s))
                         )
                {
                    lock (_owner.Modules) {
                        _owner.Modules[name] = value;
                    }

                    var modules = value.OfType <ModuleInfo>().ToArray();
                    var modRef  = unit.State.Modules.GetOrAdd(name);

                    switch (modRef.Module)
                    {
                    case MultipleMemberInfo mmi:
                        if (modules.Except(mmi.Members.OfType <ModuleInfo>()).Any())
                        {
                            modules = modules.Concat(mmi.Members.OfType <ModuleInfo>()).Distinct().ToArray();
                        }

                        break;

                    case ModuleInfo mi:
                        if (!modules.Contains(mi))
                        {
                            modules = modules.Concat(Enumerable.Repeat(mi, 1)).ToArray();
                        }

                        break;
                    }

                    modRef.Module = MultipleMemberInfo.Create(modules) as IModule;

                    foreach (var module in modules)
                    {
                        int lastDot = name.LastIndexOf('.');
                        if (lastDot > 0)
                        {
                            var parentName = name.Remove(lastDot);
                            if (ProjectState.Modules.TryImport(parentName, out var parent))
                            {
                                if (parent.AnalysisModule is ModuleInfo mi)
                                {
                                    mi.AddChildPackage(module, unit, name.Substring(lastDot + 1));
                                }
                            }
                        }
                    }
                }
            }
        private bool ProcessAbstractDecorators(IAnalysisSet decorator)
        {
            var res = false;

            // Only handle these if they are specialized
            foreach (var d in decorator.OfType <SpecializedCallable>())
            {
                if (d.DeclaringModule != null &&
                    d.DeclaringModule.ModuleName != "abc")
                {
                    continue;
                }

                switch (d.Name)
                {
                case "abstractmethod":
                    res = true;
                    Function.IsAbstract = true;
                    break;

                case "abstractstaticmethod":
                    Function.IsStatic   = true;
                    Function.IsAbstract = true;
                    res = true;
                    break;

                case "abstractclassmethod":
                    Function.IsClassMethod = true;
                    Function.IsAbstract    = true;
                    res = true;
                    break;

                case "abstractproperty":
                    Function.IsProperty = true;
                    Function.IsAbstract = true;
                    res = true;
                    break;
                }
            }

            return(res);
        }
            public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet index)
            {
                var res = base.GetIndex(node, unit, index);

                var names = index.OfType <ConstantInfo>()
                            .Select(ci => ci.GetConstantValueAsString())
                            .Where(s => !string.IsNullOrEmpty(s))
                            .Distinct()
                            .ToArray();

                if (names.Length != 1)
                {
                    // Unless you request a specific module by string literal,
                    // you won't get any object out of sys.modules.
                    return(AnalysisSet.Empty);
                }

                var name = names[0];

                lock (_owner.Modules) {
                    IAnalysisSet knownValues;
                    if (_owner.Modules.TryGetValue(name, out knownValues) &&
                        knownValues != null &&
                        knownValues.Any()
                        )
                    {
                        return(knownValues);
                    }
                }

                ModuleReference modRef;

                if (unit.ProjectState.Modules.TryImport(name, out modRef))
                {
                    return(modRef.AnalysisModule);
                }

                return(AnalysisSet.Empty);
            }
Example #7
0
 private static IReadOnlyList <IAnalysisSet> GetTypeList(IAnalysisSet item) => item.OfType <TypingTypeInfo>().FirstOrDefault()?.ToTypeList() ?? new[] { item };
 public IEnumerable <T> GetProtocols <T>()
 {
     return(_protocols.OfType <T>());
 }
Example #9
0
 private static IReadOnlyList <IAnalysisSet> GetTypeList(IAnalysisSet item)
 {
     return(item.OfType <TypingTypeInfo>().FirstOrDefault()?.ToTypeList());
 }
Example #10
0
            public override void SetIndex(Node node, AnalysisUnit unit, IAnalysisSet index, IAnalysisSet value) {
                base.SetIndex(node, unit, index, value);

                foreach (var name in index.OfType<ConstantInfo>()
                    .Select(ci => ci.GetConstantValueAsString())
                    .Where(s => !string.IsNullOrEmpty(s))
                ) {
                    lock (_owner.Modules) {
                        _owner.Modules[name] = value;
                    }

                    var modules = value.OfType<ModuleInfo>().ToArray();

                    var modRef = unit.ProjectState.Modules.GetOrAdd(name);

                    MultipleMemberInfo mmi;
                    ModuleInfo mi;
                    if ((mmi = modRef.Module as MultipleMemberInfo) != null) {
                        if (modules.Except(mmi.Members.OfType<ModuleInfo>()).Any()) {
                            modules = modules.Concat(mmi.Members.OfType<ModuleInfo>()).Distinct().ToArray();
                        }
                    } else if ((mi = modRef.Module as ModuleInfo) != null) {
                        if (!modules.Contains(mi)) {
                            modules = modules.Concat(Enumerable.Repeat(mi, 1)).ToArray();
                        }
                    }
                    modRef.Module = MultipleMemberInfo.Create(modules) as IModule;

                    foreach (var module in modules) {
                        int lastDot = name.LastIndexOf('.');
                        if (lastDot > 0) {
                            var parentName = name.Remove(lastDot);
                            ModuleReference parent;
                            if (ProjectState.Modules.TryImport(parentName, out parent)) {
                                if ((mi = parent.AnalysisModule as ModuleInfo) != null) {
                                    mi.AddChildPackage(module, unit, name.Substring(lastDot + 1));
                                }
                            }
                        }
                    }
                }
            }