class RBS::Locator
Attributes
decls[R]
Public Class Methods
new(decls:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 5 def initialize(decls:) @decls = decls end
Public Instance Methods
buffer()
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 9 def buffer decls[0].location&.buffer or raise end
find(line:, column:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 13 def find(line:, column:) pos = buffer.loc_to_pos([line, column]) decls.each do |decl| array = [] find_in_decl(pos, decl: decl, array: array) and return array end [] end
find2(line:, column:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 24 def find2(line:, column:) path = find(line: line, column: column) return if path.empty? hd, *tl = path if hd.is_a?(Symbol) [hd, tl] else [nil, path] end end
find_in_decl(pos, decl:, array:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 37 def find_in_decl(pos, decl:, array:) if test_loc(pos, location: decl.location) array.unshift(decl) case decl when AST::Declarations::Class decl.type_params.each do |param| if test_loc(pos, location: param.location) array.unshift(param) find_in_loc(pos, array: array, location: param.location) return true end end if super_class = decl.super_class if test_loc(pos, location: super_class.location) array.unshift(super_class) find_in_loc(pos, array: array, location: super_class.location) return true end end decl.each_decl do |decl_| find_in_decl(pos, decl: decl_, array: array) and return true end decl.each_member do |member| find_in_member(pos, array: array, member: member) and return true end when AST::Declarations::Module decl.type_params.each do |param| if test_loc(pos, location: param.location) array.unshift(param) find_in_loc(pos, array: array, location: param.location) return true end end decl.self_types.each do |self_type| if test_loc(pos, location: self_type.location) array.unshift(self_type) find_in_loc(pos, array: array, location: self_type.location) return true end end decl.each_decl do |decl_| find_in_decl(pos, decl: decl_, array: array) and return true end decl.each_member do |member| find_in_member(pos, array: array, member: member) and return true end when AST::Declarations::Interface decl.type_params.each do |param| if test_loc(pos, location: param.location) array.unshift(param) find_in_loc(pos, array: array, location: param.location) return true end end decl.members.each do |member| find_in_member(pos, array: array, member: member) and return true end when AST::Declarations::Constant, AST::Declarations::Global find_in_type(pos, array: array, type: decl.type) and return true when AST::Declarations::Alias find_in_type(pos, array: array, type: decl.type) and return true end find_in_loc(pos, location: decl.location, array: array) true else false end end
find_in_loc(pos, location:, array:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 173 def find_in_loc(pos, location:, array:) if test_loc(pos, location: location) if location.is_a?(Location) location.each_optional_key do |key| if loc = location[key] if loc.range === pos array.unshift(key) return true end end end location.each_required_key do |key| loc = location[key] or raise if loc.range === pos array.unshift(key) return true end end end true else false end end
find_in_member(pos, member:, array:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 120 def find_in_member(pos, member:, array:) if test_loc(pos, location: member.location) array.unshift(member) case member when AST::Members::MethodDefinition member.types.each do |method_type| find_in_method_type(pos, array: array, method_type: method_type) and return true end when AST::Members::InstanceVariable, AST::Members::ClassInstanceVariable, AST::Members::ClassVariable find_in_type(pos, array: array, type: member.type) and return true when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor find_in_type(pos, array: array, type: member.type) and return true end find_in_loc(pos, location: member.location, array: array) true else false end end
find_in_method_type(pos, method_type:, array:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 143 def find_in_method_type(pos, method_type:, array:) if test_loc(pos, location: method_type.location) array.unshift(method_type) method_type.each_type do |type| find_in_type(pos, array: array, type: type) and break end true else false end end
find_in_type(pos, type:, array:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 157 def find_in_type(pos, type:, array:) if test_loc(pos, location: type.location) array.unshift(type) type.each_type do |type_| find_in_type(pos, array: array, type: type_) and return true end find_in_loc(pos, array: array, location: type.location) true else false end end
test_loc(pos, location:)
click to toggle source
# File rbs-2.1.0/lib/rbs/locator.rb, line 200 def test_loc(pos, location:) if location location.range === pos else false end end