class LanguageServer::Linter::RubyWC

Public Class Methods

new(source) click to toggle source
# File lib/language_server/linter/ruby_wc.rb, line 25
def initialize(source)
  @source = source
end

Public Instance Methods

call() click to toggle source
# File lib/language_server/linter/ruby_wc.rb, line 29
def call
  error_message.scan(/.+:(\d+):\s*(.+?)[,:]\s(.+)/).map do |line_num, type, message|
    Error.new(line_num: line_num.to_i - 1, characters: get_characters_from_error_message(error_message, line_num.to_i - 1), message: message, type: type)
  end
end

Private Instance Methods

capture_stderr() { || ... } click to toggle source
# File lib/language_server/linter/ruby_wc.rb, line 69
def capture_stderr
  origin = $stderr
  $stderr = StringIO.new

  yield

  $stderr.string
ensure
  $stderr = origin
end
error_message() click to toggle source
# File lib/language_server/linter/ruby_wc.rb, line 39
def error_message
  with_verbose do
    begin
      capture_stderr { RubyVM::InstructionSequence.compile(@source) }
    rescue SyntaxError => e
      e.message
    end
  end
end
get_characters_from_error_message(error_message, line_index) click to toggle source
# File lib/language_server/linter/ruby_wc.rb, line 80
def get_characters_from_error_message(error_message, line_index)
  error_mark_included_line = error_message.split("\n")[2]

  if !error_mark_included_line.nil? && character_start = error_mark_included_line.index("^")
    Range.new(character_start, character_start + 1)
  else
    Range.new(0, @source.split("\n")[line_index].length - 1)
  end
end
with_verbose() { || ... } click to toggle source
# File lib/language_server/linter/ruby_wc.rb, line 61
def with_verbose
  origin = $VERBOSE
  $VERBOSE = true
  yield
ensure
  $VERBOSE = origin
end