Esempio n. 1
0
    def handle_source_errors(self, source_errors):
        """
        Makes sure views containing errors are open and shows error messages + highlighting
        """

        errors = list(parse_source_errors(source_errors))

        # TODO: we should pass the errorKind too if the error has no span
        error_panel = self.reset_error_panel()
        for error in errors:
            error_panel.run_command("append_to_error_panel", {"message": repr(error)})

        if errors:
            self.show_error_panel()
        else:
            self.hide_error_panel()

        error_panel.set_read_only(True)

        file_errors = list(filter(lambda error: error.span, errors))
        # First, make sure we have views open for each error
        need_load_wait = False
        paths = set(error.span.filePath for error in file_errors)
        for path in paths:
            view = self.find_view_for_path(path)
            if not view:
                need_load_wait = True
                self.open_view_for_path(path)

        # If any error-holding files need to be opened, wait briefly to
        # make sure the file is loaded before trying to annotate it
        if need_load_wait:
            sublime.set_timeout(lambda: self.highlight_errors(file_errors), 100)
        else:
            self.highlight_errors(file_errors)
Esempio n. 2
0
    def handle_source_errors(self, source_errors):
        """
        Makes sure views containing errors are open and shows error messages + highlighting
        """

        errors = list(parse_source_errors(source_errors))

        # TODO: we should pass the errorKind too if the error has no span
        error_panel = self.reset_error_panel()
        for error in errors:
            error_panel.run_command("update_error_panel", {"message": repr(error)})

        if errors:
            self.window.run_command("show_panel", {"panel":"output.hide_errors"})
        else:
            self.window.run_command("hide_panel", {"panel":"output.hide_errors"})

        error_panel.set_read_only(True)

        file_errors = list(filter(lambda error: error.span, errors))
        # First, make sure we have views open for each error
        need_load_wait = False
        paths = set(error.span.filePath for error in file_errors)
        for path in paths:
            view = self.find_view_for_path(path)
            if not view:
                need_load_wait = True
                self.open_view_for_path(path)

        # If any error-holding files need to be opened, wait briefly to
        # make sure the file is loaded before trying to annotate it
        if need_load_wait:
            sublime.set_timeout(lambda: self.highlight_errors(file_errors), 100)
        else:
            self.highlight_errors(file_errors)
Esempio n. 3
0
    def test_parse_source_errors_error(self):
        errors = list(res.parse_source_errors(source_errors.get('contents')))
        self.assertEqual(2, len(errors))
        err1, err2 = errors
        self.assertEqual(err1.kind, 'KindError')
        self.assertRegex(err1.msg, "Couldn\'t match expected type ‘Integer’")
        self.assertEqual(err1.span.filePath, 'src/Lib.hs')
        self.assertEqual(err1.span.fromLine, 11)
        self.assertEqual(err1.span.fromColumn, 22)

        self.assertEqual(err2.kind, 'KindError')
        self.assertRegex(err2.msg, "Couldn\'t match expected type ‘\[Char\]’")
        self.assertEqual(err2.span.filePath, 'src/Lib.hs')
        self.assertEqual(err2.span.fromLine, 15)
        self.assertEqual(err2.span.fromColumn, 24)
Esempio n. 4
0
 def test_parse_source_errors_empty(self):
     errors = res.parse_source_errors([])
     self.assertEqual(0, len(list(errors)))