Skip to content

Dynamically register handlers #3291

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ require:
- rubocop-minitest
- rubocop-rake
- ./lib/rubocop/cop/ruby_lsp/use_language_server_aliases
- ./lib/rubocop/cop/ruby_lsp/use_register_with_handler_method

AllCops:
NewCops: disable
Expand Down
119 changes: 0 additions & 119 deletions lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb

This file was deleted.

39 changes: 1 addition & 38 deletions lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,44 +37,7 @@ def initialize(index, dispatcher, parse_result, uri, collect_comments: false)
@indexing_errors = T.let([], T::Array[String])
@collect_comments = collect_comments

dispatcher.register(
self,
:on_class_node_enter,
:on_class_node_leave,
:on_module_node_enter,
:on_module_node_leave,
:on_singleton_class_node_enter,
:on_singleton_class_node_leave,
:on_def_node_enter,
:on_def_node_leave,
:on_call_node_enter,
:on_call_node_leave,
:on_multi_write_node_enter,
:on_constant_path_write_node_enter,
:on_constant_path_or_write_node_enter,
:on_constant_path_operator_write_node_enter,
:on_constant_path_and_write_node_enter,
:on_constant_write_node_enter,
:on_constant_or_write_node_enter,
:on_constant_and_write_node_enter,
:on_constant_operator_write_node_enter,
:on_global_variable_and_write_node_enter,
:on_global_variable_operator_write_node_enter,
:on_global_variable_or_write_node_enter,
:on_global_variable_target_node_enter,
:on_global_variable_write_node_enter,
:on_instance_variable_write_node_enter,
:on_instance_variable_and_write_node_enter,
:on_instance_variable_operator_write_node_enter,
:on_instance_variable_or_write_node_enter,
:on_instance_variable_target_node_enter,
:on_alias_method_node_enter,
:on_class_variable_and_write_node_enter,
:on_class_variable_operator_write_node_enter,
:on_class_variable_or_write_node_enter,
:on_class_variable_target_node_enter,
:on_class_variable_write_node_enter,
)
dispatcher.register(self)
end

#: (Prism::ClassNode node) -> void
Expand Down
4 changes: 2 additions & 2 deletions lib/ruby_indexer/lib/ruby_indexer/enhancement.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ def initialize(listener)
# `ClassMethods` modules
# @overridable
#: (Prism::CallNode node) -> void
def on_call_node_enter(node); end # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_enter(node); end

# @overridable
#: (Prism::CallNode node) -> void
def on_call_node_leave(node); end # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_leave(node); end
end
end
17 changes: 17 additions & 0 deletions lib/ruby_indexer/lib/ruby_indexer/prism_dispatcher_patch.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# typed: strict
# frozen_string_literal: true

require "prism"

module RubyIndexer
module PrismDispatcherDynamicRegistrationPatch
#: (Object listener, Symbol events) -> void
def register(listener, *events)
events = listener.public_methods.grep(/^on_.+_(?:enter|leave)$/) if events.empty?

super
end
end

Prism::Dispatcher.prepend(PrismDispatcherDynamicRegistrationPatch)
end
31 changes: 1 addition & 30 deletions lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,36 +69,7 @@ def initialize(target, index, dispatcher, uri, include_declarations: true)
@stack = T.let([], T::Array[String])
@references = T.let([], T::Array[Reference])

dispatcher.register(
self,
:on_class_node_enter,
:on_class_node_leave,
:on_module_node_enter,
:on_module_node_leave,
:on_singleton_class_node_enter,
:on_singleton_class_node_leave,
:on_def_node_enter,
:on_def_node_leave,
:on_multi_write_node_enter,
:on_constant_path_write_node_enter,
:on_constant_path_or_write_node_enter,
:on_constant_path_operator_write_node_enter,
:on_constant_path_and_write_node_enter,
:on_constant_or_write_node_enter,
:on_constant_path_node_enter,
:on_constant_read_node_enter,
:on_constant_write_node_enter,
:on_constant_or_write_node_enter,
:on_constant_and_write_node_enter,
:on_constant_operator_write_node_enter,
:on_instance_variable_read_node_enter,
:on_instance_variable_write_node_enter,
:on_instance_variable_and_write_node_enter,
:on_instance_variable_operator_write_node_enter,
:on_instance_variable_or_write_node_enter,
:on_instance_variable_target_node_enter,
:on_call_node_enter,
)
dispatcher.register(self)
end

#: -> Array[Reference]
Expand Down
1 change: 1 addition & 0 deletions lib/ruby_indexer/ruby_indexer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

require "ruby_indexer/lib/ruby_indexer/uri"
require "ruby_indexer/lib/ruby_indexer/visibility_scope"
require "ruby_indexer/lib/ruby_indexer/prism_dispatcher_patch"
require "ruby_indexer/lib/ruby_indexer/declaration_listener"
require "ruby_indexer/lib/ruby_indexer/reference_finder"
require "ruby_indexer/lib/ruby_indexer/enhancement"
Expand Down
16 changes: 8 additions & 8 deletions lib/ruby_indexer/test/enhancements_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def teardown

def test_enhancing_indexing_included_hook
Class.new(Enhancement) do
def on_call_node_enter(call_node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_enter(call_node)
owner = @listener.current_owner
return unless owner
return unless call_node.name == :extend
Expand Down Expand Up @@ -95,7 +95,7 @@ class User < ActiveRecord::Base

def test_enhancing_indexing_configuration_dsl
Class.new(Enhancement) do
def on_call_node_enter(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_enter(node)
return unless @listener.current_owner

name = node.name
Expand Down Expand Up @@ -148,7 +148,7 @@ class User < ActiveRecord::Base

def test_error_handling_in_on_call_node_enter_enhancement
Class.new(Enhancement) do
def on_call_node_enter(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_enter(node)
raise "Error"
end

Expand Down Expand Up @@ -181,7 +181,7 @@ def self.extended(base)

def test_error_handling_in_on_call_node_leave_enhancement
Class.new(Enhancement) do
def on_call_node_leave(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_leave(node)
raise "Error"
end

Expand Down Expand Up @@ -214,7 +214,7 @@ def self.extended(base)

def test_advancing_namespace_stack_from_enhancement
Class.new(Enhancement) do
def on_call_node_enter(call_node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_enter(call_node)
owner = @listener.current_owner
return unless owner

Expand Down Expand Up @@ -243,7 +243,7 @@ def on_call_node_enter(call_node) # rubocop:disable RubyLsp/UseRegisterWithHandl
end
end

def on_call_node_leave(call_node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_leave(call_node)
return unless call_node.name == :class_methods

@listener.pop_namespace_stack
Expand Down Expand Up @@ -289,7 +289,7 @@ class User

def test_creating_anonymous_classes_from_enhancement
Class.new(Enhancement) do
def on_call_node_enter(call_node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_enter(call_node)
case call_node.name
when :context
arguments = call_node.arguments&.arguments
Expand All @@ -306,7 +306,7 @@ def on_call_node_enter(call_node) # rubocop:disable RubyLsp/UseRegisterWithHandl
end
end

def on_call_node_leave(call_node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
def on_call_node_leave(call_node)
return unless call_node.name == :context

@listener.pop_namespace_stack
Expand Down
25 changes: 1 addition & 24 deletions lib/ruby_lsp/listeners/completion.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,30 +69,7 @@ def initialize( # rubocop:disable Metrics/ParameterLists
@uri = uri
@trigger_character = trigger_character

dispatcher.register(
self,
:on_constant_path_node_enter,
:on_constant_read_node_enter,
:on_call_node_enter,
:on_global_variable_and_write_node_enter,
:on_global_variable_operator_write_node_enter,
:on_global_variable_or_write_node_enter,
:on_global_variable_read_node_enter,
:on_global_variable_target_node_enter,
:on_global_variable_write_node_enter,
:on_instance_variable_read_node_enter,
:on_instance_variable_write_node_enter,
:on_instance_variable_and_write_node_enter,
:on_instance_variable_operator_write_node_enter,
:on_instance_variable_or_write_node_enter,
:on_instance_variable_target_node_enter,
:on_class_variable_and_write_node_enter,
:on_class_variable_operator_write_node_enter,
:on_class_variable_or_write_node_enter,
:on_class_variable_read_node_enter,
:on_class_variable_target_node_enter,
:on_class_variable_write_node_enter,
)
dispatcher.register(self)
end

# Handle completion on regular constant references (e.g. `Bar`)
Expand Down
Loading