Ejemplo n.º 1
0
        private bool TryImportModule(string modName, bool forceAbsolute, out ModuleReference moduleRef)
        {
            if (ProjectState.Limits.CrossModule > 0 &&
                ProjectState.ModulesByFilename.Count > ProjectState.Limits.CrossModule)
            {
                // too many modules loaded, disable cross module analysis by blocking
                // scripts from seeing other modules.
                moduleRef = null;
                return(false);
            }

            foreach (var name in PythonAnalyzer.ResolvePotentialModuleNames(_unit.ProjectEntry, modName, forceAbsolute))
            {
                foreach (var part in ModulePath.GetParents(name, includeFullName: false))
                {
                    ModuleReference parentRef;
                    if (ProjectState.Modules.TryImport(part, out parentRef))
                    {
                        parentRef.Module?.Imported(_unit);
                    }
                }

                if (ProjectState.Modules.TryImport(name, out moduleRef))
                {
                    return(true);
                }
            }

            _unit.DeclaringModule.AddUnresolvedModule(modName, forceAbsolute);

            moduleRef = null;
            return(false);
        }
Ejemplo n.º 2
0
        private bool TryImportModule(string modName, bool forceAbsolute, out ModuleReference moduleRef, out IReadOnlyList <string> remainingParts)
        {
            moduleRef      = null;
            remainingParts = null;

            if (ProjectState.Limits.CrossModule > 0 &&
                ProjectState.ModulesByFilename.Count > ProjectState.Limits.CrossModule)
            {
                // too many modules loaded, disable cross module analysis by blocking
                // scripts from seeing other modules.
                return(false);
            }

            var candidates = PythonAnalyzer.ResolvePotentialModuleNames(_unit.ProjectEntry, modName, forceAbsolute).ToArray();

            foreach (var name in candidates)
            {
                if (ProjectState.Modules.TryImport(name, out moduleRef))
                {
                    return(true);
                }
            }

            foreach (var name in candidates)
            {
                moduleRef = null;
                foreach (var part in ModulePath.GetParents(name, includeFullName: true))
                {
                    if (ProjectState.Modules.TryImport(part, out var mref))
                    {
                        moduleRef = mref;
                        if (part.Length < name.Length)
                        {
                            moduleRef.Module?.Imported(_unit);
                        }
                    }
                    else if (moduleRef != null)
                    {
                        Debug.Assert(moduleRef.Name.Length + 1 < name.Length, $"Expected {name} to be a child of {moduleRef.Name}");
                        if (moduleRef.Name.Length + 1 < name.Length)
                        {
                            remainingParts = name.Substring(moduleRef.Name.Length + 1).Split('.');
                        }
                        return(true);
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(moduleRef?.Module != null);
        }
Ejemplo n.º 3
0
        private bool TryImportModule(string modName, bool forceAbsolute, out ModuleReference moduleRef, out IReadOnlyList <string> remainingParts)
        {
            moduleRef      = null;
            remainingParts = null;

            if (ProjectState.Limits.CrossModule > 0 &&
                ProjectState.ModulesByFilename.Count > ProjectState.Limits.CrossModule)
            {
                // too many modules loaded, disable cross module analysis by blocking
                // scripts from seeing other modules.
                return(false);
            }

            var candidates = ModuleResolver.ResolvePotentialModuleNames(_unit.ProjectEntry, modName, forceAbsolute).ToArray();

            foreach (var name in candidates)
            {
                ModuleReference modRef;

                bool          gotAllParents = true;
                AnalysisValue lastParent    = null;
                remainingParts = name.Split('.');
                foreach (var part in ModulePath.GetParents(name, includeFullName: false))
                {
                    if (!ProjectState.Modules.TryImport(part, out modRef))
                    {
                        gotAllParents = false;
                        break;
                    }
                    moduleRef = modRef;
                    (lastParent as BuiltinModule)?.AddChildModule(remainingParts[0], moduleRef.AnalysisModule);
                    lastParent     = moduleRef.AnalysisModule;
                    remainingParts = remainingParts.Skip(1).ToArray();
                }

                if (gotAllParents && ProjectState.Modules.TryImport(name, out modRef))
                {
                    moduleRef = modRef;
                    (lastParent as BuiltinModule)?.AddChildModule(remainingParts[0], moduleRef.AnalysisModule);
                    _unit.DeclaringModule.AddModuleReference(moduleRef);
                    remainingParts = null;
                    return(true);
                }
            }

            if (moduleRef?.Module != null)
            {
                _unit.DeclaringModule.AddModuleReference(moduleRef);
                return(true);
            }
            return(false);
        }