rubocop 0.83.0 → 0.84.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +20 -3
  4. data/lib/rubocop.rb +6 -59
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  7. data/lib/rubocop/config.rb +1 -3
  8. data/lib/rubocop/config_loader.rb +3 -9
  9. data/lib/rubocop/config_loader_resolver.rb +2 -6
  10. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  11. data/lib/rubocop/cop/corrector.rb +1 -3
  12. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -6
  13. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -3
  14. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  15. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  16. data/lib/rubocop/cop/generator.rb +1 -1
  17. data/lib/rubocop/cop/ignored_node.rb +1 -3
  18. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  19. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +62 -4
  20. data/lib/rubocop/cop/layout/first_argument_indentation.rb +0 -2
  21. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -3
  22. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  23. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -6
  24. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  25. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -3
  26. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  27. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -6
  28. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  29. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  30. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -6
  31. data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -2
  32. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +133 -0
  33. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -6
  34. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +11 -3
  35. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -3
  36. data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -1
  37. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  38. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -3
  39. data/lib/rubocop/cop/migration/department_name.rb +5 -9
  40. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  41. data/lib/rubocop/cop/mixin/array_min_size.rb +2 -6
  42. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -12
  43. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  44. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -3
  45. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -3
  46. data/lib/rubocop/cop/mixin/surrounding_space.rb +1 -3
  47. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -3
  48. data/lib/rubocop/cop/naming/file_name.rb +1 -3
  49. data/lib/rubocop/cop/registry.rb +2 -6
  50. data/lib/rubocop/cop/severity.rb +1 -3
  51. data/lib/rubocop/cop/style/and_or.rb +2 -2
  52. data/lib/rubocop/cop/style/attr.rb +1 -3
  53. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  54. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -3
  55. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  56. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  57. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -4
  58. data/lib/rubocop/cop/style/hash_syntax.rb +12 -5
  59. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  60. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  61. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -6
  62. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  63. data/lib/rubocop/cop/style/safe_navigation.rb +2 -6
  64. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  65. data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
  66. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -3
  67. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +2 -6
  68. data/lib/rubocop/cop/variable_force.rb +3 -9
  69. data/lib/rubocop/cop/variable_force/branch.rb +2 -6
  70. data/lib/rubocop/cop/variable_force/variable.rb +2 -6
  71. data/lib/rubocop/ext/processed_source.rb +18 -0
  72. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  73. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  74. data/lib/rubocop/formatter/formatter_set.rb +1 -3
  75. data/lib/rubocop/options.rb +2 -8
  76. data/lib/rubocop/remote_config.rb +1 -3
  77. data/lib/rubocop/result_cache.rb +1 -3
  78. data/lib/rubocop/rspec/cop_helper.rb +1 -3
  79. data/lib/rubocop/rspec/expect_offense.rb +3 -9
  80. data/lib/rubocop/rspec/shared_contexts.rb +54 -16
  81. data/lib/rubocop/runner.rb +8 -10
  82. data/lib/rubocop/target_finder.rb +2 -6
  83. data/lib/rubocop/version.rb +5 -3
  84. metadata +19 -56
  85. data/lib/rubocop/ast/builder.rb +0 -85
  86. data/lib/rubocop/ast/node.rb +0 -637
  87. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  88. data/lib/rubocop/ast/node/and_node.rb +0 -29
  89. data/lib/rubocop/ast/node/args_node.rb +0 -29
  90. data/lib/rubocop/ast/node/array_node.rb +0 -70
  91. data/lib/rubocop/ast/node/block_node.rb +0 -121
  92. data/lib/rubocop/ast/node/break_node.rb +0 -17
  93. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  94. data/lib/rubocop/ast/node/case_node.rb +0 -56
  95. data/lib/rubocop/ast/node/class_node.rb +0 -31
  96. data/lib/rubocop/ast/node/def_node.rb +0 -82
  97. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  98. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  99. data/lib/rubocop/ast/node/float_node.rb +0 -12
  100. data/lib/rubocop/ast/node/for_node.rb +0 -53
  101. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  102. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  103. data/lib/rubocop/ast/node/if_node.rb +0 -175
  104. data/lib/rubocop/ast/node/int_node.rb +0 -12
  105. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  106. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  107. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  108. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  109. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  110. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  111. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -269
  112. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  113. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  114. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  115. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  116. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  117. data/lib/rubocop/ast/node/module_node.rb +0 -24
  118. data/lib/rubocop/ast/node/or_node.rb +0 -29
  119. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  120. data/lib/rubocop/ast/node/range_node.rb +0 -18
  121. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  122. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  123. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  124. data/lib/rubocop/ast/node/return_node.rb +0 -24
  125. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  126. data/lib/rubocop/ast/node/send_node.rb +0 -17
  127. data/lib/rubocop/ast/node/str_node.rb +0 -16
  128. data/lib/rubocop/ast/node/super_node.rb +0 -21
  129. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  130. data/lib/rubocop/ast/node/until_node.rb +0 -35
  131. data/lib/rubocop/ast/node/when_node.rb +0 -53
  132. data/lib/rubocop/ast/node/while_node.rb +0 -35
  133. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  134. data/lib/rubocop/ast/sexp.rb +0 -16
  135. data/lib/rubocop/ast/traversal.rb +0 -202
  136. data/lib/rubocop/node_pattern.rb +0 -887
  137. data/lib/rubocop/processed_source.rb +0 -213
  138. data/lib/rubocop/token.rb +0 -114
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common predicates for nodes that reference method identifiers:
6
- # `send`, `csend`, `def`, `defs`, `super`, `zsuper`
7
- #
8
- # @note this mixin expects `#method_name` and `#receiver` to be implemented
9
- module MethodIdentifierPredicates
10
- ENUMERATOR_METHODS = %i[collect collect_concat detect downto each
11
- find find_all find_index inject loop map!
12
- map reduce reject reject! reverse_each select
13
- select! times upto].freeze
14
-
15
- # http://phrogz.net/programmingruby/language.html#table_18.4
16
- OPERATOR_METHODS = %i[| ^ & <=> == === =~ > >= < <= << >> + - * /
17
- % ** ~ +@ -@ !@ ~@ [] []= ! != !~ `].freeze
18
-
19
- # Checks whether the method name matches the argument.
20
- #
21
- # @param [Symbol, String] name the method name to check for
22
- # @return [Boolean] whether the method name matches the argument
23
- def method?(name)
24
- method_name == name.to_sym
25
- end
26
-
27
- # Checks whether the method is an operator method.
28
- #
29
- # @return [Boolean] whether the method is an operator
30
- def operator_method?
31
- OPERATOR_METHODS.include?(method_name)
32
- end
33
-
34
- # Checks whether the method is a comparison method.
35
- #
36
- # @return [Boolean] whether the method is a comparison
37
- def comparison_method?
38
- Node::COMPARISON_OPERATORS.include?(method_name)
39
- end
40
-
41
- # Checks whether the method is an assignment method.
42
- #
43
- # @return [Boolean] whether the method is an assignment
44
- def assignment_method?
45
- !comparison_method? && method_name.to_s.end_with?('=')
46
- end
47
-
48
- # Checks whether the method is an enumerator method.
49
- #
50
- # @return [Boolean] whether the method is an enumerator
51
- def enumerator_method?
52
- ENUMERATOR_METHODS.include?(method_name) ||
53
- method_name.to_s.start_with?('each_')
54
- end
55
-
56
- # Checks whether the method is a predicate method.
57
- #
58
- # @return [Boolean] whether the method is a predicate method
59
- def predicate_method?
60
- method_name.to_s.end_with?('?')
61
- end
62
-
63
- # Checks whether the method is a bang method.
64
- #
65
- # @return [Boolean] whether the method is a bang method
66
- def bang_method?
67
- method_name.to_s.end_with?('!')
68
- end
69
-
70
- # Checks whether the method is a camel case method,
71
- # e.g. `Integer()`.
72
- #
73
- # @return [Boolean] whether the method is a camel case method
74
- def camel_case_method?
75
- method_name.to_s =~ /\A[A-Z]/
76
- end
77
-
78
- # Checks whether the *explicit* receiver of this node is `self`.
79
- #
80
- # @return [Boolean] whether the receiver of this node is `self`
81
- def self_receiver?
82
- receiver&.self_type?
83
- end
84
-
85
- # Checks whether the *explicit* receiver of node is a `const` node.
86
- #
87
- # @return [Boolean] whether the receiver of this node is a `const` node
88
- def const_receiver?
89
- receiver&.const_type?
90
- end
91
-
92
- # Checks whether this is a negation method, i.e. `!` or keyword `not`.
93
- #
94
- # @return [Boolean] whether this method is a negation method
95
- def negation_method?
96
- receiver && method_name == :!
97
- end
98
-
99
- # Checks whether this is a prefix not method, e.g. `not foo`.
100
- #
101
- # @return [Boolean] whether this method is a prefix not
102
- def prefix_not?
103
- negation_method? && loc.selector.is?('not')
104
- end
105
-
106
- # Checks whether this is a prefix bang method, e.g. `!foo`.
107
- #
108
- # @return [Boolean] whether this method is a prefix bang
109
- def prefix_bang?
110
- negation_method? && loc.selector.is?('!')
111
- end
112
- end
113
- end
114
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for nodes that can be used as modifiers:
6
- # `if`, `while`, `until`
7
- module ModifierNode
8
- # Checks whether the node is in a modifier form, i.e. a condition
9
- # trailing behind an expression.
10
- #
11
- # @return [Boolean] whether the node is a modifier
12
- def modifier_form?
13
- loc.end.nil?
14
- end
15
- end
16
- end
17
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for primitive numeric nodes: `int`, `float`, ...
6
- module NumericNode
7
- SIGN_REGEX = /\A[+-]/.freeze
8
-
9
- # Checks whether this is literal has a sign.
10
- #
11
- # @example
12
- #
13
- # +42
14
- #
15
- # @return [Boolean] whether this literal has a sign.
16
- def sign?
17
- source.match(SIGN_REGEX)
18
- end
19
- end
20
- end
21
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for nodes that are parameterized:
6
- # `send`, `super`, `zsuper`, `def`, `defs`
7
- module ParameterizedNode
8
- # Checks whether this node's arguments are wrapped in parentheses.
9
- #
10
- # @return [Boolean] whether this node's arguments are
11
- # wrapped in parentheses
12
- def parenthesized?
13
- loc.end&.is?(')')
14
- end
15
-
16
- # A shorthand for getting the first argument of the node.
17
- # Equivalent to `arguments.first`.
18
- #
19
- # @return [Node, nil] the first argument of the node,
20
- # or `nil` if there are no arguments
21
- def first_argument
22
- arguments[0]
23
- end
24
-
25
- # A shorthand for getting the last argument of the node.
26
- # Equivalent to `arguments.last`.
27
- #
28
- # @return [Node, nil] the last argument of the node,
29
- # or `nil` if there are no arguments
30
- def last_argument
31
- arguments[-1]
32
- end
33
-
34
- # Checks whether this node has any arguments.
35
- #
36
- # @return [Boolean] whether this node has any arguments
37
- def arguments?
38
- !arguments.empty?
39
- end
40
-
41
- # Checks whether any argument of the node is a splat
42
- # argument, i.e. `*splat`.
43
- #
44
- # @return [Boolean] whether the node is a splat argument
45
- def splat_argument?
46
- arguments? &&
47
- (arguments.any?(&:splat_type?) || arguments.any?(&:restarg_type?))
48
- end
49
- alias rest_argument? splat_argument?
50
-
51
- # Whether the last argument of the node is a block pass,
52
- # i.e. `&block`.
53
- #
54
- # @return [Boolean] whether the last argument of the node is a block pass
55
- def block_argument?
56
- arguments? &&
57
- (last_argument.block_pass_type? || last_argument.blockarg_type?)
58
- end
59
- end
60
- end
61
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for nodes that are predicates:
6
- # `or`, `and` ...
7
- module PredicateOperatorNode
8
- LOGICAL_AND = '&&'
9
- SEMANTIC_AND = 'and'
10
- LOGICAL_OR = '||'
11
- SEMANTIC_OR = 'or'
12
-
13
- # Returns the operator as a string.
14
- #
15
- # @return [String] the operator
16
- def operator
17
- loc.operator.source
18
- end
19
-
20
- # Checks whether this is a logical operator.
21
- #
22
- # @return [Boolean] whether this is a logical operator
23
- def logical_operator?
24
- operator == LOGICAL_AND || operator == LOGICAL_OR
25
- end
26
-
27
- # Checks whether this is a semantic operator.
28
- #
29
- # @return [Boolean] whether this is a semantic operator
30
- def semantic_operator?
31
- operator == SEMANTIC_AND || operator == SEMANTIC_OR
32
- end
33
- end
34
- end
35
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # A node extension for `module` nodes. This will be used in place of a
6
- # plain node when the builder constructs the AST, making its methods
7
- # available to all `module` nodes within RuboCop.
8
- class ModuleNode < Node
9
- # The identifer for this `module` node.
10
- #
11
- # @return [Node] the identifer of the module
12
- def identifier
13
- node_parts[0]
14
- end
15
-
16
- # The body of this `module` node.
17
- #
18
- # @return [Node, nil] the body of the module
19
- def body
20
- node_parts[1]
21
- end
22
- end
23
- end
24
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # A node extension for `or` nodes. This will be used in place of a plain
6
- # node when the builder constructs the AST, making its methods available
7
- # to all `or` nodes within RuboCop.
8
- class OrNode < Node
9
- include BinaryOperatorNode
10
- include PredicateOperatorNode
11
-
12
- # Returns the alternate operator of the `or` as a string.
13
- # Returns `or` for `||` and vice versa.
14
- #
15
- # @return [String] the alternate of the `or` operator
16
- def alternate_operator
17
- logical_operator? ? SEMANTIC_OR : LOGICAL_OR
18
- end
19
-
20
- # Returns the inverse keyword of the `or` node as a string.
21
- # Returns `and` for `or` and `&&` for `||`.
22
- #
23
- # @return [String] the inverse of the `or` operator
24
- def inverse_operator
25
- logical_operator? ? LOGICAL_AND : SEMANTIC_AND
26
- end
27
- end
28
- end
29
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # A node extension for `pair` nodes. This will be used in place of a plain
6
- # node when the builder constructs the AST, making its methods available
7
- # to all `pair` nodes within RuboCop.
8
- class PairNode < Node
9
- include HashElementNode
10
-
11
- HASH_ROCKET = '=>'
12
- SPACED_HASH_ROCKET = ' => '
13
- COLON = ':'
14
- SPACED_COLON = ': '
15
-
16
- # Checks whether the `pair` uses a hash rocket delimiter.
17
- #
18
- # @return [Boolean] whether this `pair` uses a hash rocket delimiter
19
- def hash_rocket?
20
- loc.operator.is?(HASH_ROCKET)
21
- end
22
-
23
- # Checks whether the `pair` uses a colon delimiter.
24
- #
25
- # @return [Boolean] whether this `pair` uses a colon delimiter
26
- def colon?
27
- loc.operator.is?(COLON)
28
- end
29
-
30
- # Returns the delimiter of the `pair` as a string. Returns `=>` for a
31
- # colon delimited `pair` and `:` for a hash rocket delimited `pair`.
32
- #
33
- # @param [Boolean] with_spacing whether to include spacing
34
- # @return [String] the delimiter of the `pair`
35
- def delimiter(with_spacing = false)
36
- if with_spacing
37
- hash_rocket? ? SPACED_HASH_ROCKET : SPACED_COLON
38
- else
39
- hash_rocket? ? HASH_ROCKET : COLON
40
- end
41
- end
42
-
43
- # Returns the inverse delimiter of the `pair` as a string.
44
- #
45
- # @param [Boolean] with_spacing whether to include spacing
46
- # @return [String] the inverse delimiter of the `pair`
47
- def inverse_delimiter(with_spacing = false)
48
- if with_spacing
49
- hash_rocket? ? SPACED_COLON : SPACED_HASH_ROCKET
50
- else
51
- hash_rocket? ? COLON : HASH_ROCKET
52
- end
53
- end
54
-
55
- # Checks whether the value starts on its own line.
56
- #
57
- # @return [Boolean] whether the value in the `pair` starts its own line
58
- def value_on_new_line?
59
- key.loc.line != value.loc.line
60
- end
61
- end
62
- end
63
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # A node extension for `irange` and `erange` nodes. This will be used in
6
- # place of a plain node when the builder constructs the AST, making its
7
- # methods available to all `irange` and `erange` nodes within RuboCop.
8
- class RangeNode < Node
9
- def begin
10
- node_parts[0]
11
- end
12
-
13
- def end
14
- node_parts[1]
15
- end
16
- end
17
- end
18
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # A node extension for `regexp` nodes. This will be used in place of a plain
6
- # node when the builder constructs the AST, making its methods available
7
- # to all `regexp` nodes within RuboCop.
8
- class RegexpNode < Node
9
- OPTIONS = {
10
- x: Regexp::EXTENDED,
11
- i: Regexp::IGNORECASE,
12
- m: Regexp::MULTILINE,
13
- n: Regexp::NOENCODING
14
- }.freeze
15
-
16
- # @return [Regexp] a regexp of this node
17
- def to_regexp
18
- option = regopt.children.map { |opt| OPTIONS[opt] }.inject(:|)
19
- Regexp.new(content, option)
20
- end
21
-
22
- # @return [RuboCop::AST::Node] a regopt node
23
- def regopt
24
- children.last
25
- end
26
-
27
- # @return [String] a string of regexp content
28
- def content
29
- children.select(&:str_type?).map(&:str_content).join
30
- end
31
- end
32
- end
33
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # A node extension for `resbody` nodes. This will be used in place of a
6
- # plain node when the builder constructs the AST, making its methods
7
- # available to all `resbody` nodes within RuboCop.
8
- class ResbodyNode < Node
9
- # Returns the body of the `rescue` clause.
10
- #
11
- # @return [Node, nil] The body of the `resbody`.
12
- def body
13
- node_parts[2]
14
- end
15
-
16
- # Returns the exception variable of the `rescue` clause.
17
- #
18
- # @return [Node, nil] The exception variable of the `resbody`.
19
- def exception_variable
20
- node_parts[1]
21
- end
22
- end
23
- end
24
- end