class Solargraph::LanguageServer::Message::TextDocument::Formatting
def cli_args file_uri, config
def cli_args file_uri, config file = UriHelpers.uri_to_file(file_uri) args = [ config['cops'] == 'all' ? '-A' : '-a', '--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
def config_for(file_uri)
def config_for(file_uri) conf = host.formatter_config(file_uri) return {} unless conf.is_a?(Hash) conf['rubocop'] || {} end
def cop_list(value)
def cop_list(value) value = value.join(',') if value.respond_to?(:join) return nil if value == '' || !value.is_a?(String) value end
def format original, result
-
(void)
-
Parameters:
-
result
(String
) -- -
original
(String
) --
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
def formatter_class(config)
def formatter_class(config) if self.class.const_defined?('BlankRubocopFormatter') # @sg-ignore BlankRubocopFormatter else require_rubocop(config['version']) klass = Class.new(::RuboCop::Formatter::BaseFormatter) self.class.const_set 'BlankRubocopFormatter', klass end end
def log_corrections(corrections)
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
def process
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