class Solargraph::LanguageServer::Message::TextDocument::Formatting

Public Instance Methods

process() click to toggle source
# File lib/solargraph/language_server/message/text_document/formatting.rb, line 12
def process
  file_uri = params['textDocument']['uri']
  config = config_for(file_uri)
  original = host.read_text(file_uri)
  args = cli_args(file_uri, config)

  require_rubocop(config['version'])
  options, paths = RuboCop::Options.new.parse(args)
  options[:stdin] = original
  corrections = redirect_stdout do
    RuboCop::Runner.new(options, RuboCop::ConfigStore.new).run(paths)
  end
  result = options[:stdin]

  log_corrections(corrections)

  format original, result
rescue RuboCop::ValidationError, RuboCop::ConfigNotFoundError => e
  set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
end

Private Instance Methods

cli_args(file_uri, config) click to toggle source
# File lib/solargraph/language_server/message/text_document/formatting.rb, line 53
def cli_args file_uri, config
  file = UriHelpers.uri_to_file(file_uri)
  args = [
    config['cops'] == 'all' ? '--autocorrect-all' : '--autocorrect',
    '--cache', 'false',
    '--format', formatter_class(config).name,
  ]

  ['except', 'only'].each do |arg|
    cops = cop_list(config[arg])
    args += ["--#{arg}", cops] if cops
  end

  args += config['extra_args'] if config['extra_args']
  args + [file]
end
config_for(file_uri) click to toggle source
# File lib/solargraph/language_server/message/text_document/formatting.rb, line 46
def config_for(file_uri)
  conf = host.formatter_config(file_uri)
  return {} unless conf.is_a?(Hash)

  conf['rubocop'] || {}
end
cop_list(value) click to toggle source
# File lib/solargraph/language_server/message/text_document/formatting.rb, line 80
def cop_list(value)
  value = value.join(',') if value.respond_to?(:join)
  return nil if value == '' || !value.is_a?(String)
  value
end
format(original, result) click to toggle source

@param original [String] @param result [String] @return [void]

# File lib/solargraph/language_server/message/text_document/formatting.rb, line 89
def format original, result
  ending = if original.end_with?("\n")
             {
               line: original.lines.length,
               character: 0
             }
           elsif original.lines.empty?
             {
               line: 0,
               character: 0
             }
           else
             {
               line: original.lines.length - 1,
               character: original.lines.last.length
             }
           end
  set_result(
    [
      {
        range: {
          start: {
            line: 0,
            character: 0
          },
          end: ending
        },
        newText: result
      }
    ]
  )
end
formatter_class(config) click to toggle source
# File lib/solargraph/language_server/message/text_document/formatting.rb, line 70
def formatter_class(config)
  if self.class.const_defined?('BlankRubocopFormatter')
    BlankRubocopFormatter
  else
    require_rubocop(config['version'])
    klass = Class.new(::RuboCop::Formatter::BaseFormatter)
    self.class.const_set 'BlankRubocopFormatter', klass
  end
end
log_corrections(corrections) click to toggle source
# File lib/solargraph/language_server/message/text_document/formatting.rb, line 35
def log_corrections(corrections)
  corrections = corrections&.strip
  return if corrections&.empty?

  Solargraph.logger.info('Formatting result:')
  corrections.each_line do |line|
    next if line.strip.empty?
    Solargraph.logger.info(line.strip)
  end
end