src/eric7/Utilities/ClassBrowsers/__init__.py

branch
eric7
changeset 9490
77b8d3a635b7
parent 9482
a2bc06a54d9d
child 9497
8beca4047c53
--- 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

eric ide

mercurial