src/eric7/Plugins/PluginSyntaxChecker.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
--- a/src/eric7/Plugins/PluginSyntaxChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginSyntaxChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -45,71 +45,92 @@
     """
     Class implementing the Syntax Checker plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
         self.__initialize()
-        
+
         from Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService import (
-            SyntaxCheckService
+            SyntaxCheckService,
         )
+
         self.syntaxCheckService = SyntaxCheckService()
         ericApp().registerObject("SyntaxCheckService", self.syntaxCheckService)
 
-        ericPath = getConfig('ericDir')
-        path = os.path.join(ericPath, 'Plugins', 'CheckerPlugins',
-                            'SyntaxChecker')
-        
+        ericPath = getConfig("ericDir")
+        path = os.path.join(ericPath, "Plugins", "CheckerPlugins", "SyntaxChecker")
+
         self.syntaxCheckService.addLanguage(
-            'Python3', 'Python3', path, 'SyntaxCheck',
+            "Python3",
+            "Python3",
+            path,
+            "SyntaxCheck",
             self.__getPythonOptions,
             lambda: Preferences.getPython("Python3Extensions"),
             self.__translateSyntaxCheck,
-            self.syntaxCheckService.serviceErrorPy3)
-        
+            self.syntaxCheckService.serviceErrorPy3,
+        )
+
         self.syntaxCheckService.addLanguage(
-            'JavaScript', 'Python3', path,
-            'jsCheckSyntax',
+            "JavaScript",
+            "Python3",
+            path,
+            "jsCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.js'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorJavaScript)
-        
+            lambda: [".js"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorJavaScript,
+        )
+
         # YAML syntax check via Python3
         self.syntaxCheckService.addLanguage(
-            'YAML', 'Python3', path,
-            'yamlCheckSyntax',
+            "YAML",
+            "Python3",
+            path,
+            "yamlCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.yml', '.yaml'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorYAML)
-        
+            lambda: [".yml", ".yaml"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorYAML,
+        )
+
         # JSON syntax check via Python3
         self.syntaxCheckService.addLanguage(
-            'JSON', 'Python3', path,
-            'jsonCheckSyntax',
+            "JSON",
+            "Python3",
+            path,
+            "jsonCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.json'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorJSON)
-        
+            lambda: [".json"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorJSON,
+        )
+
         # TOML syntax check via Python3
         self.syntaxCheckService.addLanguage(
-            'TOML', 'Python3', path,
-            'tomlCheckSyntax',
+            "TOML",
+            "Python3",
+            path,
+            "tomlCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.toml'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorTOML)
+            lambda: [".toml"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorTOML,
+        )
 
     def __initialize(self):
         """
@@ -117,11 +138,11 @@
         """
         self.__projectAct = None
         self.__projectSyntaxCheckerDialog = None
-        
+
         self.__projectBrowserAct = None
         self.__projectBrowserMenu = None
         self.__projectBrowserSyntaxCheckerDialog = None
-        
+
         self.__editors = []
         self.__editorAct = None
         self.__editorSyntaxCheckerDialog = None
@@ -129,22 +150,21 @@
     def __getPythonOptions(self):
         """
         Private method to determine the syntax check options.
-        
+
         @return state of checkFlakes and ignoreStarImportWarnings (bool, bool)
         """
         checkFlakes = Preferences.getFlakes("IncludeInSyntaxCheck")
-        ignoreStarImportWarnings = Preferences.getFlakes(
-            "IgnoreStarImportWarnings")
+        ignoreStarImportWarnings = Preferences.getFlakes("IgnoreStarImportWarnings")
         return checkFlakes, ignoreStarImportWarnings
 
     def __translateSyntaxCheck(self, fn, problems):
         """
         Private slot to translate the resulting messages.
-        
+
         If checkFlakes is True, warnings contains a list of strings containing
         the warnings (marker, file name, line number, message)
         The values are only valid, if nok is False.
-        
+
         @param fn filename of the checked file (str)
         @param problems dictionary with the keys 'error' and 'warnings' which
             hold a list containing details about the error/ warnings
@@ -152,132 +172,142 @@
             errors), the message, a list with arguments for the message)
         """
         from CheckerPlugins.SyntaxChecker.pyflakes.translations import (
-            getTranslatedFlakesMessage
+            getTranslatedFlakesMessage,
         )
-        warnings = problems.get('warnings', [])
+
+        warnings = problems.get("warnings", [])
         for warning in warnings:
             # Translate messages
             msg_args = warning.pop()
             warning[4] = getTranslatedFlakesMessage(warning[4], msg_args)
-        
-        problems['warnings'] = warnings
+
+        problems["warnings"] = warnings
         self.syntaxCheckService.syntaxChecked.emit(fn, problems)
 
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         menu = ericApp().getObject("Project").getMenu("Checks")
         if menu:
             self.__projectAct = EricAction(
-                self.tr('Check Syntax'),
-                self.tr('&Syntax...'), 0, 0,
-                self, 'project_check_syntax')
-            self.__projectAct.setStatusTip(
-                self.tr('Check syntax.'))
-            self.__projectAct.setWhatsThis(self.tr(
-                """<b>Check Syntax...</b>"""
-                """<p>This checks Python files for syntax errors.</p>"""
-            ))
+                self.tr("Check Syntax"),
+                self.tr("&Syntax..."),
+                0,
+                0,
+                self,
+                "project_check_syntax",
+            )
+            self.__projectAct.setStatusTip(self.tr("Check syntax."))
+            self.__projectAct.setWhatsThis(
+                self.tr(
+                    """<b>Check Syntax...</b>"""
+                    """<p>This checks Python files for syntax errors.</p>"""
+                )
+            )
             self.__projectAct.triggered.connect(self.__projectSyntaxCheck)
             ericApp().getObject("Project").addEricActions([self.__projectAct])
             menu.addAction(self.__projectAct)
-        
+
         self.__editorAct = EricAction(
-            self.tr('Check Syntax'),
-            self.tr('&Syntax...'), 0, 0,
-            self, "")
-        self.__editorAct.setWhatsThis(self.tr(
-            """<b>Check Syntax...</b>"""
-            """<p>This checks Python files for syntax errors.</p>"""
-        ))
+            self.tr("Check Syntax"), self.tr("&Syntax..."), 0, 0, self, ""
+        )
+        self.__editorAct.setWhatsThis(
+            self.tr(
+                """<b>Check Syntax...</b>"""
+                """<p>This checks Python files for syntax errors.</p>"""
+            )
+        )
         self.__editorAct.triggered.connect(self.__editorSyntaxCheck)
-        
+
         ericApp().getObject("Project").showMenu.connect(self.__projectShowMenu)
         ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources").showMenu.connect(self.__projectBrowserShowMenu)
-        ericApp().getObject("ViewManager").editorOpenedEd.connect(
-            self.__editorOpened)
-        ericApp().getObject("ViewManager").editorClosedEd.connect(
-            self.__editorClosed)
-        
+            "sources"
+        ).showMenu.connect(self.__projectBrowserShowMenu)
+        ericApp().getObject("ViewManager").editorOpenedEd.connect(self.__editorOpened)
+        ericApp().getObject("ViewManager").editorClosedEd.connect(self.__editorClosed)
+
         for editor in ericApp().getObject("ViewManager").getOpenEditors():
             self.__editorOpened(editor)
-        
+
         return None, True
 
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
-        ericApp().getObject("Project").showMenu.disconnect(
-            self.__projectShowMenu)
+        ericApp().getObject("Project").showMenu.disconnect(self.__projectShowMenu)
         ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources").showMenu.disconnect(self.__projectBrowserShowMenu)
+            "sources"
+        ).showMenu.disconnect(self.__projectBrowserShowMenu)
         ericApp().getObject("ViewManager").editorOpenedEd.disconnect(
-            self.__editorOpened)
+            self.__editorOpened
+        )
         ericApp().getObject("ViewManager").editorClosedEd.disconnect(
-            self.__editorClosed)
-        
+            self.__editorClosed
+        )
+
         menu = ericApp().getObject("Project").getMenu("Checks")
         if menu:
             menu.removeAction(self.__projectAct)
-        
+
         if self.__projectBrowserMenu and self.__projectBrowserAct:
-            self.__projectBrowserMenu.removeAction(
-                self.__projectBrowserAct)
-        
+            self.__projectBrowserMenu.removeAction(self.__projectBrowserAct)
+
         for editor in self.__editors:
             editor.showMenu.disconnect(self.__editorShowMenu)
             menu = editor.getMenu("Checks")
             if menu is not None:
                 menu.removeAction(self.__editorAct)
-        
+
         self.__initialize()
-    
+
     def __projectShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
         if menuName == "Checks" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
-                ericApp().getObject("Project").getProjectLanguage() in
-                self.syntaxCheckService.getLanguages())
-    
+                ericApp().getObject("Project").getProjectLanguage()
+                in self.syntaxCheckService.getLanguages()
+            )
+
     def __projectBrowserShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project browser menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
         if (
-            menuName == "Checks" and
-            ericApp().getObject("Project").getProjectLanguage() in
-            self.syntaxCheckService.getLanguages()
+            menuName == "Checks"
+            and ericApp().getObject("Project").getProjectLanguage()
+            in self.syntaxCheckService.getLanguages()
         ):
             self.__projectBrowserMenu = menu
             if self.__projectBrowserAct is None:
                 self.__projectBrowserAct = EricAction(
-                    self.tr('Check Syntax'),
-                    self.tr('&Syntax...'), 0, 0,
-                    self, "")
-                self.__projectBrowserAct.setWhatsThis(self.tr(
-                    """<b>Check Syntax...</b>"""
-                    """<p>This checks Python files for syntax errors.</p>"""
-                ))
+                    self.tr("Check Syntax"), self.tr("&Syntax..."), 0, 0, self, ""
+                )
+                self.__projectBrowserAct.setWhatsThis(
+                    self.tr(
+                        """<b>Check Syntax...</b>"""
+                        """<p>This checks Python files for syntax errors.</p>"""
+                    )
+                )
                 self.__projectBrowserAct.triggered.connect(
-                    self.__projectBrowserSyntaxCheck)
+                    self.__projectBrowserSyntaxCheck
+                )
             if self.__projectBrowserAct not in menu.actions():
                 menu.addAction(self.__projectBrowserAct)
-    
+
     def __projectSyntaxCheck(self):
         """
         Private slot used to check the project files for syntax errors.
@@ -286,24 +316,24 @@
         project.saveAllScripts()
         ppath = project.getProjectPath()
         extensions = tuple(self.syntaxCheckService.getExtensions())
-        files = [os.path.join(ppath, file)
-                 for file in project.pdata["SOURCES"]
-                 if file.endswith(extensions)]
-        
-        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import (
-            SyntaxCheckerDialog
-        )
+        files = [
+            os.path.join(ppath, file)
+            for file in project.pdata["SOURCES"]
+            if file.endswith(extensions)
+        ]
+
+        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import SyntaxCheckerDialog
+
         self.__projectSyntaxCheckerDialog = SyntaxCheckerDialog()
         self.__projectSyntaxCheckerDialog.show()
         self.__projectSyntaxCheckerDialog.prepare(files, project)
-    
+
     def __projectBrowserSyntaxCheck(self):
         """
         Private method to handle the syntax check context menu action of the
         project sources browser.
         """
-        browser = ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources")
+        browser = ericApp().getObject("ProjectBrowser").getProjectBrowser("sources")
         if browser.getSelectedItemsCount([ProjectBrowserFileItem]) > 1:
             fn = []
             for itm in browser.getSelectedItems([ProjectBrowserFileItem]):
@@ -314,18 +344,17 @@
                 fn = itm.fileName()
             except AttributeError:
                 fn = itm.dirName()
-        
-        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import (
-            SyntaxCheckerDialog
-        )
+
+        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import SyntaxCheckerDialog
+
         self.__projectBrowserSyntaxCheckerDialog = SyntaxCheckerDialog()
         self.__projectBrowserSyntaxCheckerDialog.show()
         self.__projectBrowserSyntaxCheckerDialog.start(fn)
-    
+
     def __editorOpened(self, editor):
         """
         Private slot called, when a new editor was opened.
-        
+
         @param editor reference to the new editor (QScintilla.Editor)
         """
         menu = editor.getMenu("Checks")
@@ -333,21 +362,21 @@
             menu.addAction(self.__editorAct)
             editor.showMenu.connect(self.__editorShowMenu)
             self.__editors.append(editor)
-    
+
     def __editorClosed(self, editor):
         """
         Private slot called, when an editor was closed.
-        
+
         @param editor reference to the editor (QScintilla.Editor)
         """
         with contextlib.suppress(ValueError):
             self.__editors.remove(editor)
-    
+
     def __editorShowMenu(self, menuName, menu, editor):
         """
         Private slot called, when the the editor context menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         @param editor reference to the editor
@@ -356,8 +385,9 @@
             if self.__editorAct not in menu.actions():
                 menu.addAction(self.__editorAct)
             self.__editorAct.setEnabled(
-                editor.getLanguage() in self.syntaxCheckService.getLanguages())
-    
+                editor.getLanguage() in self.syntaxCheckService.getLanguages()
+            )
+
     def __editorSyntaxCheck(self):
         """
         Private slot to handle the syntax check context menu action of the
@@ -366,8 +396,9 @@
         editor = ericApp().getObject("ViewManager").activeWindow()
         if editor is not None:
             from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import (
-                SyntaxCheckerDialog
+                SyntaxCheckerDialog,
             )
+
             self.__editorSyntaxCheckerDialog = SyntaxCheckerDialog()
             self.__editorSyntaxCheckerDialog.show()
             if editor.isJavascriptFile():
@@ -375,4 +406,5 @@
             else:
                 unnamed = "Unnamed.py"
             self.__editorSyntaxCheckerDialog.start(
-                editor.getFileName() or unnamed, editor.text())
+                editor.getFileName() or unnamed, editor.text()
+            )

eric ide

mercurial