123456789_123456789_123456789_123456789_123456789_

Class: RubyLsp::RuboCop::RuntimeAdapter Private

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/ruby_lsp/rubocop/runtime_adapter.rb

Overview

Provides an adapter to bridge RuboCop’s built-in LSP runtime with Ruby LSP’s add-on.

Class Method Summary

Instance Method Summary

Instance Method Details

#prism_result(document) (private)

[ GitHub ]

  
# File 'lib/ruby_lsp/rubocop/runtime_adapter.rb', line 90

def prism_result(document)
  prism_result = document.parse_result

  # NOTE: `prism_result` must be `Prism::ParseLexResult` compatible object.
  # This is for compatibility parsed result unsupported.
  prism_result.is_a?(Prism::ParseLexResult) ? prism_result : nil
end

#reload_config

[ GitHub ]

  
# File 'lib/ruby_lsp/rubocop/runtime_adapter.rb', line 15

def reload_config
  @runtime = nil
  options, _paths = ::RuboCop::Options.new.parse([])

  config_store = ::RuboCop::ConfigStore.new
  config_store.apply_options!(options)
  @runtime = ::RuboCop::LSP::Runtime.new(config_store)
rescue ::RuboCop::Error => e
  @message_queue << Notification.window_show_message(
    "RuboCop configuration error: #{e.message}. Formatting will not be available.",
    type: Constant::MessageType::ERROR
  )
end

#run_diagnostic(uri, document)

[ GitHub ]

  
# File 'lib/ruby_lsp/rubocop/runtime_adapter.rb', line 29

def run_diagnostic(uri, document)
  with_error_handling do
    @runtime.offenses(
      uri_to_path(uri),
      document.source,
      document.encoding,
      prism_result: prism_result(document)
    )
  end
end

#run_formatting(uri, document)

[ GitHub ]

  
# File 'lib/ruby_lsp/rubocop/runtime_adapter.rb', line 40

def run_formatting(uri, document)
  with_error_handling do
    @runtime.format(
      uri_to_path(uri),
      document.source,
      command: 'rubocop.formatAutocorrects',
      prism_result: prism_result(document)
    )
  end
end

#run_range_formatting(_uri, _partial_source, _base_indentation)

[ GitHub ]

  
# File 'lib/ruby_lsp/rubocop/runtime_adapter.rb', line 51

def run_range_formatting(_uri, _partial_source, _base_indentation)
  # Not yet supported. Should return the formatted version of `partial_source` which is
  # a partial selection of the entire document. For example, it should not try to add
  # a frozen_string_literal magic comment and all style corrections should start from
  # the `base_indentation`.
  nil
end

#uri_to_path(uri) (private)

duplicated from: lib/standard/lsp/routes.rb modified to incorporate Ruby LSP’s to_standardized_path method

[ GitHub ]

  
# File 'lib/ruby_lsp/rubocop/runtime_adapter.rb', line 82

def uri_to_path(uri)
  if uri.respond_to?(:to_standardized_path) && (standardized_path = uri.to_standardized_path)
    standardized_path
  else
    uri.to_s.delete_prefix('file://')
  end
end

#with_error_handling (private)

[ GitHub ]

  
# File 'lib/ruby_lsp/rubocop/runtime_adapter.rb', line 61

def with_error_handling
  return unless @runtime

  yield
rescue StandardError => e
  ::RuboCop::LSP::Logger.log(e.full_message, prefix: '[RuboCop]')

  message = if e.is_a?(::RuboCop::ErrorWithAnalyzedFileLocation)
              "for the #{e.cop.name} cop"
            else
              "- #{e.message}"
            end
  raise Requests::Formatting::Error, <<~MSG
    An internal error occurred #{message}.
    Updating to a newer version of RuboCop may solve this.
    For more details, run RuboCop on the command line.
  MSG
end