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