--- a/src/eric7/Utilities/ClassBrowsers/__init__.py Tue Nov 08 16:57:46 2022 +0100 +++ b/src/eric7/Utilities/ClassBrowsers/__init__.py Tue Nov 08 18:03:11 2022 +0100 @@ -29,6 +29,7 @@ IDL_SOURCE = 130 JS_SOURCE = 131 PROTO_SOURCE = 132 +UNKNOWN_SOURCE = 255 SUPPORTED_TYPES = [ PY_SOURCE, @@ -48,10 +49,36 @@ } +def getClassBrowserModule(moduleType): + """ + Function to import a class browser module. + + @param moduleType type of class browser to load + @type str + @return reference to the imported class browser module + @rtype module + """ + typeMapping = { + "idl": "idlclbr", + "javascript": "jsclbr", + "protobuf": "protoclbr", + "python": "pyclbr", + "ruby": "rbclbr", + } + + if moduleType in typeMapping: + mod = importlib.import_module( + "eric7.Utilities.ClassBrowsers.{0}".format(typeMapping[moduleType]) + ) + return mod + + return None + + def readmodule(module, path=None, isPyFile=False): """ - Read a source file and return a dictionary of classes, functions, modules, - etc. . + Function to read a source file and return a dictionary of classes, functions, + modules, etc. . The real work of parsing the source file is delegated to the individual file parsers. @@ -69,43 +96,32 @@ path = [] if path is None else path[:] if ext in __extensions["IDL"]: - from . import idlclbr # __IGNORE_WARNING_I101__ - - dictionary = idlclbr.readmodule_ex(module, path) - idlclbr._modules.clear() + moduleType = "idl" elif ext in __extensions["ProtoBuf"]: - from . import protoclbr # __IGNORE_WARNING_I101__ - - dictionary = protoclbr.readmodule_ex(module, path) - protoclbr._modules.clear() + moduleType = "protobuf" elif ext in __extensions["Ruby"]: - from . import rbclbr # __IGNORE_WARNING_I101__ - - dictionary = rbclbr.readmodule_ex(module, path) - rbclbr._modules.clear() + moduleType = "ruby" elif ext in __extensions["JavaScript"]: - from . import jsclbr # __IGNORE_WARNING_I101__ - - dictionary = jsclbr.readmodule_ex(module, path) - jsclbr._modules.clear() + moduleType = "javascript" elif ext in Preferences.getPython("Python3Extensions") or isPyFile: - from . import pyclbr # __IGNORE_WARNING_I101__ - - dictionary = pyclbr.readmodule_ex(module, path, isPyFile=isPyFile) - pyclbr._modules.clear() + moduleType = "python" else: # try Python if it is without extension - from . import pyclbr # __IGNORE_WARNING_I101__ + moduleType = "python" - dictionary = pyclbr.readmodule_ex(module, path) - pyclbr._modules.clear() + classBrowserModule = getClassBrowserModule(moduleType) + if classBrowserModule: + dictionary = classBrowserModule.readmodule_ex(module, path, isTypeFile=isPyFile) + classBrowserModule.clearModulesCache() + else: + dictionary = {} return dictionary def find_module(name, path, isPyFile=False): """ - Module function to extend the Python module finding mechanism. + Function to extend the Python module finding mechanism. This function searches for files in the given list of paths. If the file name doesn't have an extension or an extension of .py, the normal @@ -126,66 +142,41 @@ ext = os.path.splitext(name)[1].lower() if ext in __extensions["Ruby"]: - for p in path: # only search in path - pathname = os.path.join(p, name) - if os.path.exists(pathname): - return (open(pathname), pathname, (ext, "r", RB_SOURCE)) - # __IGNORE_WARNING_Y115__ - raise ImportError - + sourceType = RB_SOURCE elif ext in __extensions["IDL"]: - for p in path: # only search in path - pathname = os.path.join(p, name) - if os.path.exists(pathname): - return (open(pathname), pathname, (ext, "r", IDL_SOURCE)) - # __IGNORE_WARNING_Y115__ - raise ImportError - + sourceType = IDL_SOURCE elif ext in __extensions["ProtoBuf"]: - for p in path: # only search in path - pathname = os.path.join(p, name) - if os.path.exists(pathname): - return (open(pathname), pathname, (ext, "r", PROTO_SOURCE)) - # __IGNORE_WARNING_Y115__ - raise ImportError - + sourceType = PROTO_SOURCE elif ext in __extensions["JavaScript"]: - for p in path: # only search in path - pathname = os.path.join(p, name) - if os.path.exists(pathname): - return (open(pathname), pathname, (ext, "r", JS_SOURCE)) - # __IGNORE_WARNING_Y115__ - raise ImportError - + sourceType = JS_SOURCE elif ext == ".ptl": - for p in path: # only search in path - pathname = os.path.join(p, name) - if os.path.exists(pathname): - return (open(pathname), pathname, (ext, "r", PTL_SOURCE)) - # __IGNORE_WARNING_Y115__ - raise ImportError - + sourceType = PTL_SOURCE elif ( name.lower().endswith(tuple(Preferences.getPython("Python3Extensions"))) or isPyFile ): + sourceType = PY_SOURCE + else: + sourceType = UNKNOWN_SOURCE + + if sourceType != UNKNOWN_SOURCE: for p in path: # search in path pathname = os.path.join(p, name) if os.path.exists(pathname): - return (open(pathname), pathname, (ext, "r", PY_SOURCE)) + return (open(pathname), pathname, (ext, "r", sourceType)) # __IGNORE_WARNING_Y115__ - raise ImportError - - # standard Python module file - if name.lower().endswith(".py"): - name = name[:-3] + raise ImportError + else: + # standard Python module file + if name.lower().endswith(".py"): + name = name[:-3] - spec = importlib.machinery.PathFinder.find_spec(name, path) - if spec is None: - raise ImportError - if isinstance(spec.loader, importlib.machinery.SourceFileLoader): - ext = os.path.splitext(spec.origin)[-1] - return (open(spec.origin), spec.origin, (ext, "r", PY_SOURCE)) - # __IGNORE_WARNING_Y115__ + spec = importlib.machinery.PathFinder.find_spec(name, path) + if spec is None: + raise ImportError + if isinstance(spec.loader, importlib.machinery.SourceFileLoader): + ext = os.path.splitext(spec.origin)[-1] + return (open(spec.origin), spec.origin, (ext, "r", PY_SOURCE)) + # __IGNORE_WARNING_Y115__ raise ImportError