ruby-lsp-refactor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +327 -0
- data/Rakefile +16 -0
- data/lib/ruby/lsp/refactor/version.rb +9 -0
- data/lib/ruby/lsp/refactor.rb +12 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/addon.rb +97 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/listeners/array_listener.rb +65 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/listeners/conditional_listener.rb +250 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/listeners/hash_listener.rb +97 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/listeners/method_listener.rb +316 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/listeners/string_listener.rb +61 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/listeners/variable_listener.rb +134 -0
- data/lib/ruby_lsp/ruby_lsp_refactor/support/node_helpers.rb +101 -0
- data/lib/ruby_lsp/test_helper.rb +50 -0
- data/sig/ruby/lsp/refactor.rbs +8 -0
- data/test/ruby_lsp_refactor/array_listener_test.rb +82 -0
- data/test/ruby_lsp_refactor/conditional_listener_test.rb +307 -0
- data/test/ruby_lsp_refactor/hash_listener_test.rb +72 -0
- data/test/ruby_lsp_refactor/method_listener_test.rb +193 -0
- data/test/ruby_lsp_refactor/string_listener_test.rb +70 -0
- data/test/ruby_lsp_refactor/variable_listener_test.rb +97 -0
- metadata +143 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "minitest/autorun"
|
|
4
|
+
require "ruby_lsp/test_helper"
|
|
5
|
+
|
|
6
|
+
module RubyLsp
|
|
7
|
+
module Refactor
|
|
8
|
+
class VariableListenerTest < Minitest::Test
|
|
9
|
+
include RubyLsp::Refactor::TestHelper
|
|
10
|
+
|
|
11
|
+
def find_action(actions, title_pattern)
|
|
12
|
+
actions.find { |a| a.title.match?(title_pattern) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def all_edits(action)
|
|
16
|
+
action.edit.changes.values.flatten
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# ===========================================================================
|
|
20
|
+
# 1. Inline variable
|
|
21
|
+
# ===========================================================================
|
|
22
|
+
|
|
23
|
+
def test_inline_variable_replaces_reads_and_deletes_assignment
|
|
24
|
+
source = <<~RUBY
|
|
25
|
+
result = user.calculate
|
|
26
|
+
puts result
|
|
27
|
+
log result
|
|
28
|
+
RUBY
|
|
29
|
+
|
|
30
|
+
actions = code_actions_for(source, line: 0)
|
|
31
|
+
action = find_action(actions, /Inline variable/)
|
|
32
|
+
refute_nil action
|
|
33
|
+
|
|
34
|
+
edits = all_edits(action)
|
|
35
|
+
# 1 delete + 2 replacements
|
|
36
|
+
assert_equal 3, edits.size
|
|
37
|
+
|
|
38
|
+
delete_edit = edits.find { |e| e.new_text == "" }
|
|
39
|
+
refute_nil delete_edit
|
|
40
|
+
assert_equal 0, delete_edit.range.start.line
|
|
41
|
+
|
|
42
|
+
replace_edits = edits.reject { |e| e.new_text == "" }
|
|
43
|
+
replace_edits.each { |e| assert_equal "user.calculate", e.new_text }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_inline_variable_title_includes_variable_name
|
|
47
|
+
source = "total = price * qty\nputs total\n"
|
|
48
|
+
actions = code_actions_for(source, line: 0)
|
|
49
|
+
action = find_action(actions, /Inline variable/)
|
|
50
|
+
refute_nil action
|
|
51
|
+
assert_match(/total/, action.title)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_does_not_offer_inline_when_cursor_not_on_assignment
|
|
55
|
+
source = <<~RUBY
|
|
56
|
+
result = user.calculate
|
|
57
|
+
puts result
|
|
58
|
+
RUBY
|
|
59
|
+
|
|
60
|
+
# Cursor on the `puts` line, not the assignment.
|
|
61
|
+
actions = code_actions_for(source, line: 1)
|
|
62
|
+
assert_nil find_action(actions, /Inline variable/)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# ===========================================================================
|
|
66
|
+
# 2. Extract local variable
|
|
67
|
+
# ===========================================================================
|
|
68
|
+
|
|
69
|
+
def test_extract_local_variable_inserts_assignment_above
|
|
70
|
+
source = "user.full_name.upcase\n"
|
|
71
|
+
actions = code_actions_for(source, line: 0)
|
|
72
|
+
action = find_action(actions, "Extract local variable")
|
|
73
|
+
refute_nil action
|
|
74
|
+
|
|
75
|
+
edits = all_edits(action)
|
|
76
|
+
assert_equal 2, edits.size
|
|
77
|
+
|
|
78
|
+
insert_edit = edits.find { |e| e.new_text.include?("variable =") }
|
|
79
|
+
replace_edit = edits.find { |e| e.new_text == "variable" }
|
|
80
|
+
|
|
81
|
+
refute_nil insert_edit
|
|
82
|
+
refute_nil replace_edit
|
|
83
|
+
|
|
84
|
+
assert_match(/variable = user\.full_name\.upcase/, insert_edit.new_text)
|
|
85
|
+
assert_equal 0, insert_edit.range.start.line
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# ---------------------------------------------------------------------------
|
|
89
|
+
# Resilience
|
|
90
|
+
# ---------------------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
def test_does_not_raise_on_empty_source
|
|
93
|
+
assert_silent { code_actions_for("", line: 0) }
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: ruby-lsp-refactor
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Aboobacker MK
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: ruby-lsp
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0.17'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '2'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '0.17'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '2'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: prism
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - ">="
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '0.29'
|
|
39
|
+
type: :runtime
|
|
40
|
+
prerelease: false
|
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
42
|
+
requirements:
|
|
43
|
+
- - ">="
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '0.29'
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: minitest
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
requirements:
|
|
50
|
+
- - "~>"
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '5.0'
|
|
53
|
+
type: :development
|
|
54
|
+
prerelease: false
|
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '5.0'
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: rake
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - "~>"
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '13.0'
|
|
67
|
+
type: :development
|
|
68
|
+
prerelease: false
|
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
70
|
+
requirements:
|
|
71
|
+
- - "~>"
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
version: '13.0'
|
|
74
|
+
- !ruby/object:Gem::Dependency
|
|
75
|
+
name: rubocop
|
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - "~>"
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
version: '1.21'
|
|
81
|
+
type: :development
|
|
82
|
+
prerelease: false
|
|
83
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - "~>"
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '1.21'
|
|
88
|
+
description: A ruby-lsp add-on that provides safe, AST-driven refactoring operations
|
|
89
|
+
(post-conditional conversion, inline variable, etc.) natively within any LSP-supported
|
|
90
|
+
IDE.
|
|
91
|
+
email:
|
|
92
|
+
- aboobackervyd@gmail.com
|
|
93
|
+
executables: []
|
|
94
|
+
extensions: []
|
|
95
|
+
extra_rdoc_files: []
|
|
96
|
+
files:
|
|
97
|
+
- CHANGELOG.md
|
|
98
|
+
- LICENSE.txt
|
|
99
|
+
- README.md
|
|
100
|
+
- Rakefile
|
|
101
|
+
- lib/ruby/lsp/refactor.rb
|
|
102
|
+
- lib/ruby/lsp/refactor/version.rb
|
|
103
|
+
- lib/ruby_lsp/ruby_lsp_refactor/addon.rb
|
|
104
|
+
- lib/ruby_lsp/ruby_lsp_refactor/listeners/array_listener.rb
|
|
105
|
+
- lib/ruby_lsp/ruby_lsp_refactor/listeners/conditional_listener.rb
|
|
106
|
+
- lib/ruby_lsp/ruby_lsp_refactor/listeners/hash_listener.rb
|
|
107
|
+
- lib/ruby_lsp/ruby_lsp_refactor/listeners/method_listener.rb
|
|
108
|
+
- lib/ruby_lsp/ruby_lsp_refactor/listeners/string_listener.rb
|
|
109
|
+
- lib/ruby_lsp/ruby_lsp_refactor/listeners/variable_listener.rb
|
|
110
|
+
- lib/ruby_lsp/ruby_lsp_refactor/support/node_helpers.rb
|
|
111
|
+
- lib/ruby_lsp/test_helper.rb
|
|
112
|
+
- sig/ruby/lsp/refactor.rbs
|
|
113
|
+
- test/ruby_lsp_refactor/array_listener_test.rb
|
|
114
|
+
- test/ruby_lsp_refactor/conditional_listener_test.rb
|
|
115
|
+
- test/ruby_lsp_refactor/hash_listener_test.rb
|
|
116
|
+
- test/ruby_lsp_refactor/method_listener_test.rb
|
|
117
|
+
- test/ruby_lsp_refactor/string_listener_test.rb
|
|
118
|
+
- test/ruby_lsp_refactor/variable_listener_test.rb
|
|
119
|
+
homepage: https://github.com/tachyons/ruby-lsp-refactor
|
|
120
|
+
licenses:
|
|
121
|
+
- MIT
|
|
122
|
+
metadata:
|
|
123
|
+
homepage_uri: https://github.com/tachyons/ruby-lsp-refactor
|
|
124
|
+
source_code_uri: https://github.com/tachyons/ruby-lsp-refactor
|
|
125
|
+
changelog_uri: https://github.com/tachyons/ruby-lsp-refactor/blob/main/CHANGELOG.md
|
|
126
|
+
rdoc_options: []
|
|
127
|
+
require_paths:
|
|
128
|
+
- lib
|
|
129
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
|
+
requirements:
|
|
131
|
+
- - ">="
|
|
132
|
+
- !ruby/object:Gem::Version
|
|
133
|
+
version: 3.2.0
|
|
134
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - ">="
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0'
|
|
139
|
+
requirements: []
|
|
140
|
+
rubygems_version: 4.0.10
|
|
141
|
+
specification_version: 4
|
|
142
|
+
summary: AST-driven refactoring code actions for the ruby-lsp ecosystem.
|
|
143
|
+
test_files: []
|