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))); }
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); }
private static IReadOnlyList <IAnalysisSet> GetTypeList(IAnalysisSet item) => item.OfType <TypingTypeInfo>().FirstOrDefault()?.ToTypeList() ?? new[] { item };
public IEnumerable <T> GetProtocols <T>() { return(_protocols.OfType <T>()); }
private static IReadOnlyList <IAnalysisSet> GetTypeList(IAnalysisSet item) { return(item.OfType <TypingTypeInfo>().FirstOrDefault()?.ToTypeList()); }
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)); } } } } } }