yoshiki 11.0.0.pre.9 → 11.0.0.pre.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15c6b40d96843b4e382ed33f54c8f0aab30f8f7c85f84b79f52552ec0ca68f30
4
- data.tar.gz: 43addf10ac85160ca98e9a10df47db1defe7d3ff841bcca1eb30e7689dfccd6c
3
+ metadata.gz: 5bf1901967e5f7d00c6463a17508751166e6981eb1edac1172e52c44c0623580
4
+ data.tar.gz: 2c82f7056a5fa916ff1eff0d54c688113ff285fac49f8b7d0fe8469ebce33e70
5
5
  SHA512:
6
- metadata.gz: 4443fd5e0d5d268a8a3b4adaea6ee4dabea427803b1fdad635012fca031f9cb2ab9b9b7f5cce3b89fad100c676738a3293e11efaa30ad8d422810cafe9237465
7
- data.tar.gz: 185d9c3f40485a41cf997573098c93ed4dd01b95d1aa18fb06896a2e9d9df469c18f07046cfd93155fefded56747a2ba1449c8d7b1cf4d3f7ef121e502247546
6
+ metadata.gz: ed3f86f1b4cf9bacb1ca3da1793f2b5a9fe6e0ff2b76b486600b59a81f574ef869234a7a47720be1a0f6958ef8ec47d2b947310993fb013ccb5a604fd88c87de
7
+ data.tar.gz: '00294aa60e50cb7d4152902b0de1b4b22145c6fafc55f76ecbb71a7fa28aea2ba80083af30cc3708f95bcd88ded99d7a0e8066613d74c5ef91661851acb2b25c'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- yoshiki (11.0.0.pre.9)
4
+ yoshiki (11.0.0.pre.10)
5
5
  rubocop (= 1.89.0)
6
6
  rubocop-performance (= 1.26.1)
7
7
  rubocop-rake (= 0.7.1)
@@ -5,15 +5,23 @@ module RuboCop
5
5
  # Checks for blocks with one argument where `it` block parameter can be used.
6
6
  #
7
7
  # `force_single_line` requires a single-line one-parameter block to use `it`.
8
- # Multi-line blocks may keep a named parameter.
8
+ # Multi-line blocks may keep a named parameter, except `|it|` — never
9
+ # declare that name; it is the anonymous parameter.
10
+ #
11
+ # Hash value omission keeps the original key (`name:` becomes
12
+ # `name: it`, not `it:`). Replacing the identifier would make
13
+ # `it:`, which calls a method named `it` instead of the parameter.
9
14
  #
10
15
  # @example EnforcedStyle: force_single_line
11
16
  # # bad
12
17
  # block { |named_param| do_something(named_param) }
13
18
  # block { do_something(_1) }
19
+ # block { |name| remember!(name:) }
20
+ # block { |it| do_something(it) }
14
21
  #
15
22
  # # good
16
23
  # block { do_something(it) }
24
+ # block { remember!(name: it) }
17
25
  # block do |named_param|
18
26
  # do_something(named_param)
19
27
  # end
@@ -29,6 +37,7 @@ module RuboCop
29
37
  minimum_target_ruby_version 3.4
30
38
 
31
39
  def on_block node
40
+ return correct_named_it(node) if named_it_parameter?(node)
32
41
  return unless force_single_line?
33
42
  return unless node.single_line?
34
43
  return unless node.arguments.one?
@@ -53,9 +62,26 @@ module RuboCop
53
62
  style == :force_single_line
54
63
  end
55
64
 
65
+ def named_it_parameter? node
66
+ node.arguments.one? &&
67
+ node.first_argument.arg_type? &&
68
+ node.first_argument.source == 'it'
69
+ end
70
+
71
+ def correct_named_it node
72
+ correct_to_it(node, 'it') do |corrector|
73
+ remove_block_arguments(corrector, node)
74
+ end
75
+ end
76
+
56
77
  def remove_block_arguments corrector, node
57
78
  range = node.arguments.source_range
58
- range = range.adjust(end_pos: 1) if range.source_buffer.source[range.end_pos] == ' '
79
+ buf = range.source_buffer.source
80
+ if buf[range.end_pos] == ' '
81
+ range = range.adjust(end_pos: 1)
82
+ elsif buf[range.begin_pos - 1] == ' '
83
+ range = range.adjust(begin_pos: -1)
84
+ end
59
85
  corrector.remove(range)
60
86
  end
61
87
 
@@ -65,13 +91,34 @@ module RuboCop
65
91
  return if variables.any? { used_in_nested_block?(it, node) }
66
92
 
67
93
  variables.each do |variable|
68
- add_offense(variable, message: MSG_USE_IT_PARAMETER) do |corrector|
94
+ target = omitted_pair_for(variable) || variable
95
+ add_offense(target, message: MSG_USE_IT_PARAMETER) do |corrector|
69
96
  before_replace&.call(corrector)
70
- corrector.replace(variable, 'it')
97
+ replace_with_it(corrector, variable)
71
98
  end
72
99
  end
73
100
  end
74
101
 
102
+ def replace_with_it corrector, variable
103
+ pair = omitted_pair_for(variable)
104
+ if pair
105
+ corrector.replace(pair, "#{ pair.key.source }: it")
106
+ else
107
+ corrector.replace(variable, 'it')
108
+ end
109
+ end
110
+
111
+ # `name:` shares one identifier for key and value. Replacing the
112
+ # lvar would rewrite the keyword to `it:` (a method call).
113
+ def omitted_pair_for variable
114
+ parent = variable.parent
115
+ return unless parent&.pair_type?
116
+ return unless parent.value_omission?
117
+ return unless parent.value.equal?(variable)
118
+
119
+ parent
120
+ end
121
+
75
122
  def find_block_variables node, name
76
123
  return [] unless node.body
77
124
 
@@ -1,5 +1,5 @@
1
1
  module Yoshiki
2
2
 
3
- VERSION = '11.0.0-9'.freeze
3
+ VERSION = '11.0.0-10'.freeze
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yoshiki
3
3
  version: !ruby/object:Gem::Version
4
- version: 11.0.0.pre.9
4
+ version: 11.0.0.pre.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - BM5k