rubocop 0.92.0 → 0.93.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +30 -0
- data/lib/rubocop.rb +3 -1
- data/lib/rubocop/cached_data.rb +2 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +10 -10
- data/lib/rubocop/cop/layout/dot_position.rb +6 -9
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +6 -7
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +2 -11
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +0 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +18 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +78 -0
- data/lib/rubocop/cop/metrics/block_length.rb +3 -1
- data/lib/rubocop/cop/metrics/class_length.rb +14 -6
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -1
- data/lib/rubocop/cop/offense.rb +15 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +6 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
- data/lib/rubocop/cop/style/case_like_if.rb +20 -4
- data/lib/rubocop/cop/style/class_equality_comparison.rb +64 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +8 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +6 -2
- data/lib/rubocop/cop/style/for.rb +0 -4
- data/lib/rubocop/cop/style/format_string_token.rb +1 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -0
- data/lib/rubocop/cop/style/raise_args.rb +0 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -8
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +6 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +39 -24
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -15
- data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/variable_force/branch.rb +0 -4
- data/lib/rubocop/ext/regexp_node.rb +20 -4
- data/lib/rubocop/result_cache.rb +8 -2
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/runner.rb +4 -4
- data/lib/rubocop/target_finder.rb +23 -25
- data/lib/rubocop/version.rb +1 -1
- metadata +11 -9
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8ce11205d6a6bb518654cbe498544aa799fbb8d9c9057afd2f551edfc35bbb8
|
4
|
+
data.tar.gz: a1f79001991b28508ca7c9a79d75ed58f39ae0dcf2bad419d6a75919b3a3d539
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a32001a91575c41b5ca71b6a148af79f45b2a7b8cbc3909a0dcbb7a652f5e62b6a79a84c14189eda64fd3d2a9e8c40d207c37c0f5a78a156e1f636c5191b995e
|
7
|
+
data.tar.gz: 9ac5df57938099031807a96bd87a7fb9c5f7f40c314528b4c3254edb45b1386ce199fa9c394c9e7531655d117df9d3d5215bd66e4a927b9b2b0878e0eac2a1f6
|
data/README.md
CHANGED
@@ -49,7 +49,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
|
|
49
49
|
might want to use a conservative version lock in your `Gemfile`:
|
50
50
|
|
51
51
|
```rb
|
52
|
-
gem 'rubocop', '~> 0.
|
52
|
+
gem 'rubocop', '~> 0.93.1', require: false
|
53
53
|
```
|
54
54
|
|
55
55
|
## Quickstart
|
data/config/default.yml
CHANGED
@@ -1546,6 +1546,13 @@ Lint/FormatParameterMismatch:
|
|
1546
1546
|
Enabled: true
|
1547
1547
|
VersionAdded: '0.33'
|
1548
1548
|
|
1549
|
+
Lint/HashCompareByIdentity:
|
1550
|
+
Description: 'Prefer using `Hash#compare_by_identity` than using `object_id` for keys.'
|
1551
|
+
StyleGuide: '#identity-comparison'
|
1552
|
+
Enabled: pending
|
1553
|
+
Safe: false
|
1554
|
+
VersionAdded: '0.93'
|
1555
|
+
|
1549
1556
|
Lint/HeredocMethodCallPosition:
|
1550
1557
|
Description: >-
|
1551
1558
|
Checks for the ordering of a method call where
|
@@ -1746,6 +1753,19 @@ Lint/RedundantRequireStatement:
|
|
1746
1753
|
Enabled: true
|
1747
1754
|
VersionAdded: '0.76'
|
1748
1755
|
|
1756
|
+
Lint/RedundantSafeNavigation:
|
1757
|
+
Description: 'Checks for redundant safe navigation calls.'
|
1758
|
+
Enabled: pending
|
1759
|
+
VersionAdded: '0.93'
|
1760
|
+
AllowedMethods:
|
1761
|
+
- instance_of?
|
1762
|
+
- kind_of?
|
1763
|
+
- is_a?
|
1764
|
+
- eql?
|
1765
|
+
- respond_to?
|
1766
|
+
- equal?
|
1767
|
+
Safe: false
|
1768
|
+
|
1749
1769
|
Lint/RedundantSplatExpansion:
|
1750
1770
|
Description: 'Checks for splat unnecessarily being called on literals.'
|
1751
1771
|
Enabled: true
|
@@ -2702,6 +2722,16 @@ Style/ClassCheck:
|
|
2702
2722
|
- is_a?
|
2703
2723
|
- kind_of?
|
2704
2724
|
|
2725
|
+
Style/ClassEqualityComparison:
|
2726
|
+
Description: 'Enforces the use of `Object#instance_of?` instead of class comparison for equality.'
|
2727
|
+
StyleGuide: '#instance-of-vs-class-comparison'
|
2728
|
+
Enabled: pending
|
2729
|
+
VersionAdded: '0.93'
|
2730
|
+
IgnoredMethods:
|
2731
|
+
- ==
|
2732
|
+
- equal?
|
2733
|
+
- eql?
|
2734
|
+
|
2705
2735
|
Style/ClassMethods:
|
2706
2736
|
Description: 'Use self when defining module/class methods.'
|
2707
2737
|
StyleGuide: '#def-self-class-methods'
|
data/lib/rubocop.rb
CHANGED
@@ -105,7 +105,6 @@ require_relative 'rubocop/cop/mixin/percent_literal'
|
|
105
105
|
require_relative 'rubocop/cop/mixin/preceding_following_alignment'
|
106
106
|
require_relative 'rubocop/cop/mixin/preferred_delimiters'
|
107
107
|
require_relative 'rubocop/cop/mixin/rational_literal'
|
108
|
-
require_relative 'rubocop/cop/mixin/regexp_literal_help'
|
109
108
|
require_relative 'rubocop/cop/mixin/rescue_node'
|
110
109
|
require_relative 'rubocop/cop/mixin/safe_assignment'
|
111
110
|
require_relative 'rubocop/cop/mixin/space_after_punctuation'
|
@@ -279,6 +278,7 @@ require_relative 'rubocop/cop/lint/flip_flop'
|
|
279
278
|
require_relative 'rubocop/cop/lint/float_comparison'
|
280
279
|
require_relative 'rubocop/cop/lint/float_out_of_range'
|
281
280
|
require_relative 'rubocop/cop/lint/format_parameter_mismatch'
|
281
|
+
require_relative 'rubocop/cop/lint/hash_compare_by_identity'
|
282
282
|
require_relative 'rubocop/cop/lint/heredoc_method_call_position'
|
283
283
|
require_relative 'rubocop/cop/lint/identity_comparison'
|
284
284
|
require_relative 'rubocop/cop/lint/implicit_string_concatenation'
|
@@ -308,6 +308,7 @@ require_relative 'rubocop/cop/lint/rand_one'
|
|
308
308
|
require_relative 'rubocop/cop/lint/redundant_cop_disable_directive'
|
309
309
|
require_relative 'rubocop/cop/lint/redundant_cop_enable_directive'
|
310
310
|
require_relative 'rubocop/cop/lint/redundant_require_statement'
|
311
|
+
require_relative 'rubocop/cop/lint/redundant_safe_navigation'
|
311
312
|
require_relative 'rubocop/cop/lint/redundant_splat_expansion'
|
312
313
|
require_relative 'rubocop/cop/lint/redundant_string_coercion'
|
313
314
|
require_relative 'rubocop/cop/lint/redundant_with_index'
|
@@ -398,6 +399,7 @@ require_relative 'rubocop/cop/style/case_like_if'
|
|
398
399
|
require_relative 'rubocop/cop/style/character_literal'
|
399
400
|
require_relative 'rubocop/cop/style/class_and_module_children'
|
400
401
|
require_relative 'rubocop/cop/style/class_check'
|
402
|
+
require_relative 'rubocop/cop/style/class_equality_comparison'
|
401
403
|
require_relative 'rubocop/cop/style/class_methods'
|
402
404
|
require_relative 'rubocop/cop/style/class_methods_definitions'
|
403
405
|
require_relative 'rubocop/cop/style/class_vars'
|
data/lib/rubocop/cached_data.rb
CHANGED
@@ -21,6 +21,7 @@ module RuboCop
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def serialize_offense(offense)
|
24
|
+
status = :uncorrected if %i[corrected corrected_with_todo].include?(offense.status)
|
24
25
|
{
|
25
26
|
# Calling #to_s here ensures that the serialization works when using
|
26
27
|
# other json serializers such as Oj. Some of these gems do not call
|
@@ -32,7 +33,7 @@ module RuboCop
|
|
32
33
|
},
|
33
34
|
message: message(offense),
|
34
35
|
cop_name: offense.cop_name,
|
35
|
-
status:
|
36
|
+
status: status || offense.status
|
36
37
|
}
|
37
38
|
end
|
38
39
|
|
@@ -52,8 +52,8 @@ module RuboCop
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def semicolon(node)
|
55
|
-
@semicolon ||= {}
|
56
|
-
@semicolon[node
|
55
|
+
@semicolon ||= {}.compare_by_identity
|
56
|
+
@semicolon[node] ||= processed_source.tokens_within(node).find(&:semicolon?)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
@@ -58,24 +58,22 @@ module RuboCop
|
|
58
58
|
(send _ :required_ruby_version= $_)
|
59
59
|
PATTERN
|
60
60
|
|
61
|
-
def_node_matcher :
|
62
|
-
{(str _) (array (str _))
|
61
|
+
def_node_matcher :defined_ruby_version, <<~PATTERN
|
62
|
+
{$(str _) $(array (str _) (str _))
|
63
|
+
(send (const (const nil? :Gem) :Requirement) :new $(str _))}
|
63
64
|
PATTERN
|
64
65
|
|
65
66
|
# rubocop:disable Metrics/AbcSize
|
66
67
|
def investigate(processed_source)
|
67
|
-
|
68
|
+
version_def = required_ruby_version(processed_source.ast).first
|
68
69
|
|
69
|
-
if
|
70
|
-
|
71
|
-
|
72
|
-
ruby_version = extract_ruby_version(version)
|
73
|
-
|
74
|
-
return if ruby_version == target_ruby_version.to_s
|
70
|
+
if version_def
|
71
|
+
ruby_version = extract_ruby_version(defined_ruby_version(version_def))
|
72
|
+
return if !ruby_version || ruby_version == target_ruby_version.to_s
|
75
73
|
|
76
74
|
add_offense(
|
77
75
|
processed_source.ast,
|
78
|
-
location:
|
76
|
+
location: version_def.loc.expression,
|
79
77
|
message: not_equal_message(ruby_version, target_ruby_version)
|
80
78
|
)
|
81
79
|
else
|
@@ -88,6 +86,8 @@ module RuboCop
|
|
88
86
|
private
|
89
87
|
|
90
88
|
def extract_ruby_version(required_ruby_version)
|
89
|
+
return unless required_ruby_version
|
90
|
+
|
91
91
|
if required_ruby_version.array_type?
|
92
92
|
required_ruby_version = required_ruby_version.children.detect do |v|
|
93
93
|
/[>=]/.match?(v.str_content)
|
@@ -29,17 +29,14 @@ module RuboCop
|
|
29
29
|
def on_send(node)
|
30
30
|
return unless node.dot? || ampersand_dot?(node)
|
31
31
|
|
32
|
-
if proper_dot_position?(node)
|
33
|
-
correct_style_detected
|
34
|
-
else
|
35
|
-
return unless opposite_style_detected
|
32
|
+
return correct_style_detected if proper_dot_position?(node)
|
36
33
|
|
37
|
-
|
38
|
-
|
34
|
+
opposite_style_detected
|
35
|
+
dot = node.loc.dot
|
36
|
+
message = message(dot)
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
end
|
38
|
+
add_offense(dot, message: message) do |corrector|
|
39
|
+
autocorrect(corrector, dot, node)
|
43
40
|
end
|
44
41
|
end
|
45
42
|
alias on_csend on_send
|
@@ -84,7 +84,8 @@ module RuboCop
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def on_send(node)
|
87
|
-
return unless
|
87
|
+
return unless node.bare_access_modifier? && !node.parent&.block_type?
|
88
|
+
return if expected_empty_lines?(node)
|
88
89
|
|
89
90
|
message = message(node)
|
90
91
|
add_offense(node, message: message) do |corrector|
|
@@ -98,17 +99,15 @@ module RuboCop
|
|
98
99
|
|
99
100
|
private
|
100
101
|
|
101
|
-
def
|
102
|
-
return false unless node.bare_access_modifier? && !node.parent.block_type?
|
103
|
-
|
102
|
+
def expected_empty_lines?(node)
|
104
103
|
case style
|
105
104
|
when :around
|
106
|
-
return
|
105
|
+
return true if empty_lines_around?(node)
|
107
106
|
when :only_before
|
108
|
-
return
|
107
|
+
return true if allowed_only_before_style?(node)
|
109
108
|
end
|
110
109
|
|
111
|
-
|
110
|
+
false
|
112
111
|
end
|
113
112
|
|
114
113
|
def allowed_only_before_style?(node)
|
@@ -51,22 +51,13 @@ module RuboCop
|
|
51
51
|
style == :no_space && no_surrounding_space
|
52
52
|
correct_style_detected
|
53
53
|
else
|
54
|
-
incorrect_style_detected(arg, value
|
55
|
-
no_surrounding_space)
|
54
|
+
incorrect_style_detected(arg, value)
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
59
|
-
def incorrect_style_detected(arg, value
|
60
|
-
no_surrounding_space)
|
58
|
+
def incorrect_style_detected(arg, value)
|
61
59
|
range = range_between(arg.end_pos, value.begin_pos)
|
62
60
|
|
63
|
-
if style == :space && no_surrounding_space ||
|
64
|
-
style == :no_space && space_on_both_sides
|
65
|
-
return unless opposite_style_detected
|
66
|
-
else
|
67
|
-
return unless unrecognized_style_detected
|
68
|
-
end
|
69
|
-
|
70
61
|
add_offense(range) do |corrector|
|
71
62
|
autocorrect(corrector, range)
|
72
63
|
end
|
@@ -206,8 +206,6 @@ module RuboCop
|
|
206
206
|
|
207
207
|
def no_space(begin_pos, end_pos, msg)
|
208
208
|
if style == :space
|
209
|
-
return unless opposite_style_detected
|
210
|
-
|
211
209
|
offense(begin_pos, end_pos, msg)
|
212
210
|
else
|
213
211
|
correct_style_detected
|
@@ -216,8 +214,6 @@ module RuboCop
|
|
216
214
|
|
217
215
|
def space(begin_pos, end_pos, msg)
|
218
216
|
if style == :no_space
|
219
|
-
return unless opposite_style_detected
|
220
|
-
|
221
217
|
offense(begin_pos, end_pos, msg)
|
222
218
|
else
|
223
219
|
correct_style_detected
|
@@ -47,7 +47,24 @@ module RuboCop
|
|
47
47
|
regexp_node.source_range.begin_pos == diagnostic.location.begin_pos
|
48
48
|
end
|
49
49
|
|
50
|
-
node.parent
|
50
|
+
find_offense_node(node.parent, node)
|
51
|
+
end
|
52
|
+
|
53
|
+
def find_offense_node(node, regexp_receiver)
|
54
|
+
return node unless node.parent
|
55
|
+
|
56
|
+
if node.parent.send_type? || method_chain_to_regexp_receiver?(node, regexp_receiver)
|
57
|
+
node = find_offense_node(node.parent, regexp_receiver)
|
58
|
+
end
|
59
|
+
|
60
|
+
node
|
61
|
+
end
|
62
|
+
|
63
|
+
def method_chain_to_regexp_receiver?(node, regexp_receiver)
|
64
|
+
return false unless (parent = node.parent)
|
65
|
+
return false unless (parent_receiver = parent.receiver)
|
66
|
+
|
67
|
+
parent.parent && parent_receiver.receiver == regexp_receiver
|
51
68
|
end
|
52
69
|
end
|
53
70
|
end
|
@@ -32,6 +32,9 @@ module RuboCop
|
|
32
32
|
def on_sym(node)
|
33
33
|
return unless boolean_symbol?(node)
|
34
34
|
|
35
|
+
parent = node.parent
|
36
|
+
return if parent&.array_type? && parent&.percent_literal?(:symbol)
|
37
|
+
|
35
38
|
add_offense(node, message: format(MSG, boolean: node.value)) do |corrector|
|
36
39
|
autocorrect(corrector, node)
|
37
40
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Prefer using `Hash#compare_by_identity` than using `object_id` for hash keys.
|
7
|
+
#
|
8
|
+
# This cop is marked as unsafe as a hash possibly can contain other keys
|
9
|
+
# besides `object_id`s.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# # bad
|
13
|
+
# hash = {}
|
14
|
+
# hash[foo.object_id] = :bar
|
15
|
+
# hash.key?(baz.object_id)
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# hash = {}.compare_by_identity
|
19
|
+
# hash[foo] = :bar
|
20
|
+
# hash.key?(baz)
|
21
|
+
#
|
22
|
+
class HashCompareByIdentity < Base
|
23
|
+
RESTRICT_ON_SEND = %i[key? has_key? fetch [] []=].freeze
|
24
|
+
|
25
|
+
MSG = 'Use `Hash#compare_by_identity` instead of using `object_id` for keys.'
|
26
|
+
|
27
|
+
def_node_matcher :id_as_hash_key?, <<~PATTERN
|
28
|
+
(send _ {:key? :has_key? :fetch :[] :[]=} (send _ :object_id) ...)
|
29
|
+
PATTERN
|
30
|
+
|
31
|
+
def on_send(node)
|
32
|
+
add_offense(node) if id_as_hash_key?(node)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for redundant safe navigation calls.
|
7
|
+
# `instance_of?`, `kind_of?`, `is_a?`, `eql?`, `respond_to?`, and `equal?` methods
|
8
|
+
# are checked by default. These are customizable with `AllowedMethods` option.
|
9
|
+
#
|
10
|
+
# This cop is marked as unsafe, because auto-correction can change the
|
11
|
+
# return type of the expression. An offending expression that previously
|
12
|
+
# could return `nil` will be auto-corrected to never return `nil`.
|
13
|
+
#
|
14
|
+
# In the example below, the safe navigation operator (`&.`) is unnecessary
|
15
|
+
# because `NilClass` has methods like `respond_to?` and `is_a?`.
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# # bad
|
19
|
+
# do_something if attrs&.respond_to?(:[])
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# do_something if attrs.respond_to?(:[])
|
23
|
+
#
|
24
|
+
# # bad
|
25
|
+
# while node&.is_a?(BeginNode)
|
26
|
+
# node = node.parent
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# while node.is_a?(BeginNode)
|
31
|
+
# node = node.parent
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# # good - without `&.` this will always return `true`
|
35
|
+
# foo&.respond_to?(:to_a)
|
36
|
+
#
|
37
|
+
class RedundantSafeNavigation < Base
|
38
|
+
include AllowedMethods
|
39
|
+
include RangeHelp
|
40
|
+
extend AutoCorrector
|
41
|
+
|
42
|
+
MSG = 'Redundant safe navigation detected.'
|
43
|
+
|
44
|
+
NIL_SPECIFIC_METHODS = (nil.methods - Object.new.methods).to_set.freeze
|
45
|
+
|
46
|
+
def_node_matcher :respond_to_nil_specific_method?, <<~PATTERN
|
47
|
+
(csend _ :respond_to? (sym %NIL_SPECIFIC_METHODS))
|
48
|
+
PATTERN
|
49
|
+
|
50
|
+
def on_csend(node)
|
51
|
+
return unless check?(node) && allowed_method?(node.method_name)
|
52
|
+
return if respond_to_nil_specific_method?(node)
|
53
|
+
|
54
|
+
range = range_between(node.loc.dot.begin_pos, node.source_range.end_pos)
|
55
|
+
add_offense(range) do |corrector|
|
56
|
+
corrector.replace(node.loc.dot, '.')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def check?(node)
|
63
|
+
parent = node.parent
|
64
|
+
return false unless parent
|
65
|
+
|
66
|
+
condition?(parent, node) ||
|
67
|
+
parent.and_type? ||
|
68
|
+
parent.or_type? ||
|
69
|
+
(parent.send_type? && parent.negation_method?)
|
70
|
+
end
|
71
|
+
|
72
|
+
def condition?(parent, node)
|
73
|
+
(parent.conditional? || parent.post_condition_loop?) && parent.condition == node
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|