docs: def settings(self, document_path=None):
          """Settings are constructed from a few sources:
  
              1. User settings, found in user's home directory
              2. Plugin settings, reported by PyLS plugins
              3. LSP settings, given to us from didChangeConfiguration
              4. Project settings, found in config files in the current project.
  
          Since this function is nondeterministic, it is important to call
          settings.cache_clear() when the config is updated
          """
          settings = {}
          sources = self._settings.get('configurationSources', DEFAULT_CONFIG_SOURCES)
  
          for source_name in reversed(sources):
              source = self._config_sources.get(source_name)
              if not source:
                  continue
              source_conf = source.user_config()
              log.debug("Got user config from %s: %s", source.__class__.__name__, source_conf)
              settings = _utils.merge_dicts(settings, source_conf)
          log.debug("With user configuration: %s", settings)
  
          settings = _utils.merge_dicts(settings, self._plugin_settings)
          log.debug("With plugin configuration: %s", settings)
  
          settings = _utils.merge_dicts(settings, self._settings)
          log.debug("With lsp configuration: %s", settings)
  
          for source_name in reversed(sources):
              source = self._config_sources.get(source_name)
              if not source:
                  continue
              source_conf = source.project_config(document_path or self._root_path)
              log.debug("Got project config from %s: %s", source.__class__.__name__, source_conf)
              settings = _utils.merge_dicts(settings, source_conf)
          log.debug("With project configuration: %s", settings)
  
          return settings