class LanguageServer::Project

Attributes

file_store[R]
result_store[R]

Public Class Methods

new(file_store) click to toggle source
# File lib/language_server/project.rb, line 5
def initialize(file_store)
  @file_store = file_store
  @result_store = {}

  fetch_result
end

Public Instance Methods

classes(uri: nil, line: nil, character: nil) click to toggle source
# File lib/language_server/project.rb, line 39
def classes(uri: nil, line: nil, character: nil)
  node = find_nearest_node(uri: uri, line: line, character: character) if uri && line && character

  lazy_classes.select { |n| n.names[0..-2] == Array(node && node.names).first(n.names.size - 1) }.force
end
constants(uri: nil, line: nil, character: nil) click to toggle source
# File lib/language_server/project.rb, line 27
def constants(uri: nil, line: nil, character: nil)
  node = find_nearest_node(uri: uri, line: line, character: character) if uri && line && character

  lazy_constants.select { |n| n.names[0..-2] == Array(node && node.names).first(n.names.size - 1) }.force
end
find_definitions(uri:, line:, character:) click to toggle source
# File lib/language_server/project.rb, line 12
def find_definitions(uri:, line:, character:)
  result = result_store[file_store.path_from_remote_uri(uri)]

  ref = result.refs.select { |node| node.lines.include?(line) && node.characters.include?(character) }.min_by { |node| node.characters.size }

  return [] unless ref

  lazy_modules.select { |n| n.full_name == ref.full_name }.force + lazy_classes.select { |n| n.full_name == ref.full_name }.force
end
modules(uri: nil, line: nil, character: nil) click to toggle source
# File lib/language_server/project.rb, line 33
def modules(uri: nil, line: nil, character: nil)
  node = find_nearest_node(uri: uri, line: line, character: character) if uri && line && character

  lazy_modules.select { |n| n.names[0..-2] == Array(node && node.names).first(n.names.size - 1) }.force
end
recalculate_result(uri) click to toggle source
# File lib/language_server/project.rb, line 22
def recalculate_result(uri)
  path = file_store.path_from_remote_uri(uri)
  calculate(file_store.read(path), path)
end

Private Instance Methods

calculate(content, path) click to toggle source
# File lib/language_server/project.rb, line 73
def calculate(content, path)
  begin
    result = Parser.parse(content, path)
  rescue => e
    LanguageServer.logger.warn("Parse failed (local: #{path.local_path}, remote: #{path.remote_path})")
    LanguageServer.logger.warn(e)
  end

  result_store[path] = result if result
end
fetch_result() click to toggle source
# File lib/language_server/project.rb, line 61
def fetch_result
  file_store.each { |content, path|
    calculate(content, path)
  }
end
find_nearest_node(uri:, line:, character:) click to toggle source
# File lib/language_server/project.rb, line 67
def find_nearest_node(uri:, line:, character:)
  result = result_store[file_store.path_from_remote_uri(uri)]

  (result.modules + result.classes).select { |node| node.lines.include?(line) }.min_by { |node| node.lines.size }
end
lazy_classes() click to toggle source
# File lib/language_server/project.rb, line 57
def lazy_classes
  result_store.each_value.lazy.flat_map(&:classes)
end
lazy_constants() click to toggle source
# File lib/language_server/project.rb, line 49
def lazy_constants
  result_store.each_value.lazy.flat_map(&:constants)
end
lazy_modules() click to toggle source
# File lib/language_server/project.rb, line 53
def lazy_modules
  result_store.each_value.lazy.flat_map(&:modules)
end