Class: RubyLsp::Refactor::Addon

Inherits:
Addon
  • Object
show all
Defined in:
lib/ruby_lsp/ruby_lsp_refactor/addon.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.refactor_actions_for(document, range) ⇒ Array<Interface::CodeAction>

Runs the full listener pipeline against document at range and returns an array of Interface::CodeAction objects.

Called from CodeActionsExtension#perform and from the test helper.

Parameters:

  • document (RubyLsp::RubyDocument)
  • range (Hash)

    LSP range hash { start: character:, end: character: }

Returns:

  • (Array<Interface::CodeAction>)


74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/ruby_lsp/ruby_lsp_refactor/addon.rb', line 74

def self.refactor_actions_for(document, range)
  return [] unless document.is_a?(RubyLsp::RubyDocument)
  return [] if document.source.empty?

  cursor_range = Interface::Range.new(
    start: Interface::Position.new(
      line: range.dig(:start, :line),
      character: range.dig(:start, :character)
    ),
    end: Interface::Position.new(
      line: range.dig(:end, :line),
      character: range.dig(:end, :character)
    )
  )

  node_context     = NodeContext.new(document.uri.to_s, cursor_range)
  response_builder = RubyLsp::ResponseBuilders::CollectionResponseBuilder.new
  dispatcher       = Prism::Dispatcher.new

  # Phase 1 – Local rewrites
  ConditionalListener.new(response_builder, node_context, dispatcher)
  StringListener.new(response_builder, node_context, dispatcher)
  BlockStyleListener.new(response_builder, node_context, dispatcher)
  LogicalOperatorListener.new(response_builder, node_context, dispatcher)

  # Phase 2 – Variable & literal optimisation
  VariableListener.new(response_builder, node_context, dispatcher)
  HashListener.new(response_builder, node_context, dispatcher)
  ArrayListener.new(response_builder, node_context, dispatcher)
  StringArrayListener.new(response_builder, node_context, dispatcher)
  StringFreezeListener.new(response_builder, node_context, dispatcher)
  EnumerableListener.new(response_builder, node_context, dispatcher)
  RaiseListener.new(response_builder, node_context, dispatcher)

  # Phase 3 – Advanced structure
  MethodListener.new(response_builder, node_context, dispatcher)
  ConstantListener.new(response_builder, node_context, dispatcher)
  AccessorListener.new(response_builder, node_context, dispatcher)
  RescueListener.new(response_builder, node_context, dispatcher)
  SuperListener.new(response_builder, node_context, dispatcher)
  RspecLetListener.new(response_builder, node_context, dispatcher)

  dispatcher.dispatch(document.ast)
  response_builder.response
rescue StandardError
  []
end

Instance Method Details

#activate(global_state, _message_queue) ⇒ Object

Called once when the language server activates this add-on.



49
50
51
52
53
54
# File 'lib/ruby_lsp/ruby_lsp_refactor/addon.rb', line 49

def activate(global_state, _message_queue)
  @global_state = global_state

  # Inject our actions into the standard code-actions response.
  RubyLsp::Requests::CodeActions.prepend(CodeActionsExtension)
end

#deactivateObject



56
# File 'lib/ruby_lsp/ruby_lsp_refactor/addon.rb', line 56

def deactivate; end

#nameObject



58
59
60
# File 'lib/ruby_lsp/ruby_lsp_refactor/addon.rb', line 58

def name
  "Ruby LSP Refactor"
end

#versionObject



62
63
64
# File 'lib/ruby_lsp/ruby_lsp_refactor/addon.rb', line 62

def version
  "0.1.0"
end