module RuboCop::Cop::Style::MethodCallWithArgsParentheses::OmitParentheses
Style
omit_parentheses
rubocop:disable Metrics/ModuleLength, Metrics/CyclomaticComplexity
Constants
- OMIT_MSG
- TRAILING_WHITESPACE_REGEX
Private Instance Methods
allowed_camel_case_method_call?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 76 def allowed_camel_case_method_call?(node) node.camel_case_method? && (node.arguments.none? || cop_config['AllowParenthesesInCamelCaseMethod']) end
allowed_chained_call_with_parentheses?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 161 def allowed_chained_call_with_parentheses?(node) return false unless cop_config['AllowParenthesesInChaining'] previous = node.descendants.first return false unless previous&.send_type? previous.parenthesized? || allowed_chained_call_with_parentheses?(previous) end
allowed_multiline_call_with_parentheses?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 157 def allowed_multiline_call_with_parentheses?(node) cop_config['AllowParenthesesInMultilineCall'] && node.multiline? end
allowed_string_interpolation_method_call?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 81 def allowed_string_interpolation_method_call?(node) cop_config['AllowParenthesesInStringInterpolation'] && inside_string_interpolation?(node) end
ambiguous_literal?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 170 def ambiguous_literal?(node) splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) || unary_literal?(node) end
assigned_before?(node, target)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 199 def assigned_before?(node, target) node.assignment? && node.loc.operator.begin < target.loc.begin end
assignment_in_condition?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 207 def assignment_in_condition?(node) parent = node.parent return false unless parent grandparent = parent.parent return false unless grandparent parent.assignment? && (grandparent.conditional? || grandparent.when_type?) end
autocorrect(corrector, node)
click to toggle source
rubocop:enable Metrics/PerceivedComplexity
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 33 def autocorrect(corrector, node) if parentheses_at_the_end_of_multiline_call?(node) corrector.replace(args_begin(node), ' \\') else corrector.replace(args_begin(node), ' ') end corrector.remove(node.loc.end) end
call_as_argument_or_chain?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 144 def call_as_argument_or_chain?(node) node.parent && ((node.parent.send_type? && !assigned_before?(node.parent, node)) || node.parent.csend_type? || node.parent.super_type? || node.parent.yield_type?) end
call_in_literals?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 104 def call_in_literals?(node) node.parent && (node.parent.pair_type? || node.parent.array_type? || node.parent.range_type? || splat?(node.parent) || ternary_if?(node.parent)) end
call_in_logical_operators?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 113 def call_in_logical_operators?(node) parent = node.parent&.block_type? ? node.parent.parent : node.parent parent && (logical_operator?(parent) || (parent.send_type? && parent.arguments.any? { |argument| logical_operator?(argument) })) end
call_in_optional_arguments?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 121 def call_in_optional_arguments?(node) node.parent && (node.parent.optarg_type? || node.parent.kwoptarg_type?) end
call_in_single_line_inheritance?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 125 def call_in_single_line_inheritance?(node) node.parent&.class_type? && node.parent&.single_line? end
call_with_ambiguous_arguments?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 129 def call_with_ambiguous_arguments?(node) call_with_braced_block?(node) || call_as_argument_or_chain?(node) || hash_literal_in_arguments?(node) || node.descendants.any? do |n| n.forwarded_args_type? || ambiguous_literal?(n) || logical_operator?(n) || call_with_braced_block?(n) end end
call_with_braced_block?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 139 def call_with_braced_block?(node) (node.send_type? || node.super_type?) && ((node.parent&.block_type? || node.parent&.numblock_type?) && node.parent&.braces?) end
exist_next_line_expression?(node)
click to toggle source
Require hash value omission be enclosed in parentheses to prevent the following issue: bugs.ruby-lang.org/issues/18396.
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 64 def exist_next_line_expression?(node) node.parent&.assignment? ? node.parent.right_sibling : node.right_sibling end
hash_literal?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 186 def hash_literal?(node) node.hash_type? && node.braces? end
hash_literal_in_arguments?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 150 def hash_literal_in_arguments?(node) node.arguments.any? do |n| hash_literal?(n) || (n.send_type? && node.descendants.any? { |descendant| hash_literal?(descendant) }) end end
inside_endless_method_def?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 46 def inside_endless_method_def?(node) # parens are required around arguments inside an endless method node.each_ancestor(:def, :defs).any?(&:endless?) && node.arguments.any? end
inside_string_interpolation?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 203 def inside_string_interpolation?(node) node.ancestors.drop_while { |a| !a.begin_type? }.any?(&:dstr_type?) end
legitimate_call_with_parentheses?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 93 def legitimate_call_with_parentheses?(node) call_in_literals?(node) || call_with_ambiguous_arguments?(node) || call_in_logical_operators?(node) || call_in_optional_arguments?(node) || call_in_single_line_inheritance?(node) || allowed_multiline_call_with_parentheses?(node) || allowed_chained_call_with_parentheses?(node) || assignment_in_condition?(node) end
logical_operator?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 182 def logical_operator?(node) (node.and_type? || node.or_type?) && node.logical_operator? end
modifier_form?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 58 def modifier_form?(node) node.parent.respond_to?(:modifier_form?) && node.parent.modifier_form? end
offense_range(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 42 def offense_range(node) node.loc.begin.join(node.loc.end) end
omit_parentheses(node)
click to toggle source
rubocop:disable Metrics/PerceivedComplexity
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 17 def omit_parentheses(node) return unless node.parenthesized? return if inside_endless_method_def?(node) return if require_parentheses_for_hash_value_omission?(node) return if syntax_like_method_call?(node) return if super_call_without_arguments?(node) return if legitimate_call_with_parentheses?(node) return if allowed_camel_case_method_call?(node) return if allowed_string_interpolation_method_call?(node) add_offense(offense_range(node), message: OMIT_MSG) do |corrector| autocorrect(corrector, node) end end
parentheses_at_the_end_of_multiline_call?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 86 def parentheses_at_the_end_of_multiline_call?(node) node.multiline? && node.loc.begin.source_line .gsub(TRAILING_WHITESPACE_REGEX, '') .end_with?('(') end
regexp_slash_literal?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 190 def regexp_slash_literal?(node) node.regexp_type? && node.loc.begin.source == '/' end
require_parentheses_for_hash_value_omission?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 51 def require_parentheses_for_hash_value_omission?(node) return false unless (last_argument = node.last_argument) return false if !last_argument.hash_type? || !last_argument.pairs.last&.value_omission? modifier_form?(node) || exist_next_line_expression?(node) end
splat?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 174 def splat?(node) node.splat_type? || node.kwsplat_type? || node.block_pass_type? end
super_call_without_arguments?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 72 def super_call_without_arguments?(node) node.super_type? && node.arguments.none? end
syntax_like_method_call?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 68 def syntax_like_method_call?(node) node.implicit_call? || node.operator_method? end
ternary_if?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 178 def ternary_if?(node) node.if_type? && node.ternary? end
unary_literal?(node)
click to toggle source
# File lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb, line 194 def unary_literal?(node) (node.numeric_type? && node.sign?) || (node.parent&.send_type? && node.parent&.unary_operation?) end