docs: def save_widget(cls, editor):
          """
          Implements SplittableTabWidget.save_widget to actually save the
          code editor widget.
  
          If the editor.file.path is None or empty or the file does not exist,
          a save as dialog is shown (save as).
  
          :param editor: editor widget to save.
          :return: False if there was a problem saving the editor (e.g. the save
          as dialog has been canceled by the user, or a permission error,...)
          """
          if editor.original:
              editor = editor.original
          if editor.file.path is None or not os.path.exists(editor.file.path):
              # save as
              path, filter = cls._ask_path(editor)
              if not path:
                  return False
              if not os.path.splitext(path)[1]:
                  if len(editor.mimetypes):
                      path += mimetypes.guess_extension(editor.mimetypes[0])
              try:
                  _logger().debug('saving %r as %r', editor.file._old_path, path)
              except AttributeError:
                  _logger().debug('saving %r as %r', editor.file.path, path)
              editor.file._path = path
          else:
              path = editor.file.path
          try:
              editor.file.save(path)
          except Exception as e:
              QtWidgets.QMessageBox.warning(editor, "Failed to save file", 'Failed to save %r.\n\nError="%s"' %
                                            (path, e))
          else:
              tw = editor.parent_tab_widget
              text = tw.tabText(tw.indexOf(editor)).replace('*', '')
              tw.setTabText(tw.indexOf(editor), text)
              for clone in [editor] + editor.clones:
                  if clone != editor:
                      tw = clone.parent_tab_widget
                      tw.setTabText(tw.indexOf(clone), text)
          return True