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); }
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); }
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); }