lib/ruby_indexer/lib/ruby_indexer/index.rb in ruby-lsp-0.12.3 vs lib/ruby_indexer/lib/ruby_indexer/index.rb in ruby-lsp-0.12.4

- old
+ new

@@ -91,12 +91,18 @@ # [ # [#<Entry::Class name="Foo::Bar">, #<Entry::Class name="Foo::Bar">], # [#<Entry::Class name="Foo::Baz">], # ] # ``` - sig { params(query: String, nesting: T::Array[String]).returns(T::Array[T::Array[Entry]]) } - def prefix_search(query, nesting) + sig { params(query: String, nesting: T.nilable(T::Array[String])).returns(T::Array[T::Array[Entry]]) } + def prefix_search(query, nesting = nil) + unless nesting + results = @entries_tree.search(query) + results.uniq! + return results + end + results = nesting.length.downto(0).flat_map do |i| prefix = T.must(nesting[0...i]).join("::") namespaced_query = prefix.empty? ? query : "#{prefix}::#{query}" @entries_tree.search(namespaced_query) end @@ -178,12 +184,12 @@ sig { params(indexable_path: IndexablePath, source: T.nilable(String)).void } def index_single(indexable_path, source = nil) content = source || File.read(indexable_path.full_path) result = Prism.parse(content) - visitor = IndexVisitor.new(self, result, indexable_path.full_path) - result.value.accept(visitor) + collector = Collector.new(self, result, indexable_path.full_path) + collector.collect(result.value) require_path = indexable_path.require_path @require_paths_tree.insert(require_path, indexable_path) if require_path rescue Errno::EISDIR # If `path` is a directory, just ignore it and continue indexing @@ -227,9 +233,21 @@ real_parts.unshift(T.must(parts[i])) end end real_parts.join("::") + end + + # Attempts to find a given method for a resolved fully qualified receiver name. Returns `nil` if the method does not + # exist on that receiver + sig { params(method_name: String, receiver_name: String).returns(T.nilable(Entry::Method)) } + def resolve_method(method_name, receiver_name) + method_entries = T.cast(self[method_name], T.nilable(T::Array[Entry::Method])) + owner_entries = self[receiver_name] + return unless owner_entries && method_entries + + owner_name = T.must(owner_entries.first).name + method_entries.find { |entry| entry.owner&.name == owner_name } end private # Attempts to resolve an UnresolvedAlias into a resolved Alias. If the unresolved alias is pointing to a constant