Class: RuboCop::Cop::Style::Lambda
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
::RuboCop::Cop::AutoCorrector,
::RuboCop::Cop::Base,
::RuboCop::ExcludeLimit,
NodePattern::Macros,
RuboCop::AST::Sexp
|
|
|
Instance Chain:
|
|
| Inherits: |
RuboCop::Cop::Base
|
| Defined in: | lib/rubocop/cop/style/lambda.rb |
Overview
(by default) checks for uses of the lambda literal syntax for single line lambdas, and the method call syntax for multiline lambdas. It is configurable to enforce one of the styles for both single line and multiline lambdas as well.
Constant Summary
-
LITERAL_MESSAGE =
# File 'lib/rubocop/cop/style/lambda.rb', line 55'Use the `-> { ... }` lambda literal syntax for %<modifier>s lambdas.' -
METHOD_MESSAGE =
# File 'lib/rubocop/cop/style/lambda.rb', line 56'Use the `lambda` method for %<modifier>s lambdas.' -
OFFENDING_SELECTORS =
# File 'lib/rubocop/cop/style/lambda.rb', line 58{ style: { lambda: { single_line: '->', multiline: '->' }, literal: { single_line: 'lambda', multiline: 'lambda' }, line_count_dependent: { single_line: 'lambda', multiline: '->' } } }.freeze
::RuboCop::Cop::Base - Inherited
DEPARTMENT_SEVERITIES, EMPTY_OFFENSES, RESTRICT_ON_SEND
::RuboCop::Cop::ConfigurableEnforcedStyle - Included
::RuboCop::Cop::PatternMatchingHelp - Included
Class Attribute Summary
::RuboCop::Cop::AutoCorrector - Extended
::RuboCop::Cop::Base - Inherited
| .gem_requirements, .lint?, | |
| .support_autocorrect? | Returns if class supports autocorrect. |
| .support_multiple_source? | Override if your cop should be called repeatedly for multiple investigations Between calls to |
Class Method Summary
::RuboCop::Cop::Base - Inherited
| .autocorrect_incompatible_with | List of cops that should not try to autocorrect at the same time as this cop. |
| .badge | Naming. |
| .callbacks_needed, .cop_name, .department, | |
| .documentation_url | Returns a url to view this cops documentation online. |
| .exclude_from_registry | Call for abstract Cop classes. |
| .inherited, | |
| .joining_forces | Override and return the Force class(es) you need to join. |
| .match? | Returns true if the cop name or the cop namespace matches any of the given names. |
| .new, | |
| .requires_gem | Register a version requirement for the given gem name. |
| .restrict_on_send | Reserved for Commissioner. |
::RuboCop::ExcludeLimit - Extended
| exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
| transform | |
Instance Attribute Summary
::RuboCop::Cop::ConfigurableEnforcedStyle - Included
::RuboCop::Cop::Base - Inherited
| #active_support_extensions_enabled?, #always_autocorrect?, #config, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #disabled_autocorrect?, | |
| #preview? | Whether the user opted in to unstable behavior, with |
| #processed_source, #project_index, #string_literals_frozen_by_default?, #target_satisfies_all_gem_version_requirements? | |
::RuboCop::Cop::AutocorrectLogic - Included
| #autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?, | |
| #skipped_unsafe_correction_with_disable_uncorrectable? | Whether a correction exists but is skipped because it is unsafe in a safe autocorrect run, while |
| #contextual_autocorrect_held_back? | When LSP is enabled or the |
Instance Method Summary
- #on_block(node) (also: #on_numblock, #on_itblock)
-
#on_itblock(node)
Alias for #on_block.
-
#on_numblock(node)
Alias for #on_block.
- #arguments_with_whitespace(node) private
- #autocorrect_method_to_literal(corrector, node) private
- #lambda_arg_string(args) private
- #message(node, selector) private
- #message_line_modifier(node) private
- #offending_selector?(node, selector) ⇒ Boolean private
- #rescue_or_ensure_clause?(body) ⇒ Boolean private
- #uncorrectable_lambda_literal?(node) ⇒ Boolean private
::RuboCop::Cop::RescueNode - Included
::RuboCop::Cop::PatternMatchingHelp - Included
::RuboCop::Cop::ConfigurableEnforcedStyle - Included
::RuboCop::Cop::Base - Inherited
| #add_global_offense | Adds an offense that has no particular location. |
| #add_offense | Adds an offense on the specified range (or node with an expression) Unless that offense is disabled for this range, a corrector will be yielded to provide the cop the opportunity to autocorrect the offense. |
| #begin_investigation | Called before any investigation. |
| #callbacks_needed | — grouped under the Commissioner heading above. |
| #cop_config | Configuration Helpers. |
| #cop_name, #excluded_file?, | |
| #external_dependency_checksum | This method should be overridden when a cop’s behavior depends on state that lives outside of these locations: |
| #inspect, | |
| #message | Gets called if no message is specified when calling |
| #name | Alias for Base#cop_name. |
| #offenses, | |
| #on_investigation_end | Called after all on_… |
| #on_new_investigation | Called before all on_… |
| #on_other_file | Called instead of all on_… |
| #parse | There should be very limited reasons for a Cop to do it’s own parsing. |
| #parser_engine, | |
| #ready | Called between investigations. |
| #relevant_file?, | |
| #target_gem_version | Returns the version of a gem in the target, by default its locked version (i.e. from Gemfile.lock or gems.locked). |
| #target_rails_version, #target_ruby_version, #annotate, #apply_correction, #attempt_correction, | |
| #callback_argument | Reserved for Cop::Cop. |
| #complete_investigation | Called to complete an investigation. |
| #correct, #covering_disabled_range, #current_corrector, | |
| #current_offense_locations | Reserved for Commissioner: |
| #current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, | |
| #enabled_lines? | A multi-line offense is suppressed by a directive on any line of its range, not only its first line, matching the intuition that the directive is attached to the offending code. |
| #file_name_matches_any?, #find_message, #find_severity, #matches_absolute_include_pattern?, #new_offense, #range_for_original, #range_from_node_or_range, | |
| #reset_investigation | Actually private methods. |
| #suppression_reason | The |
| #use_corrector | |
::RuboCop::Cop::AutocorrectLogic - Included
::RuboCop::Cop::IgnoredNode - Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Class Method Details
.autocorrect_incompatible_with
[ GitHub ]# File 'lib/rubocop/cop/style/lambda.rb', line 66
def self.autocorrect_incompatible_with [Style::SymbolProc] end
Instance Method Details
#arguments_with_whitespace(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/lambda.rb', line 138
def arguments_with_whitespace(node) node.loc.begin.end.join(node.arguments.loc.end) end
#autocorrect_method_to_literal(corrector, node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/lambda.rb', line 127
def autocorrect_method_to_literal(corrector, node) corrector.replace(node.send_node, '->') return unless node.arguments? arg_str = "(#{lambda_arg_string(node.arguments)})" corrector.insert_after(node.send_node, arg_str) corrector.remove(arguments_with_whitespace(node)) end
#lambda_arg_string(args) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/lambda.rb', line 142
def lambda_arg_string(args) # Block-local (shadow) arguments are separated from regular arguments by a # `;`; joining everything with `,` would turn them into extra parameters # and change the lambda's arity. regular, shadow = args.children.partition { |arg| !arg.shadowarg_type? } arg_string = regular.map(&:source).join(', ') arg_string += "; #{shadow.map(&:source).join(', ')}" unless shadow.empty? arg_string end
#message(node, selector) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/lambda.rb', line 112
def (node, selector) = selector == '->' ? METHOD_MESSAGE : LITERAL_MESSAGE format(, modifier: (node)) end
#message_line_modifier(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/lambda.rb', line 118
def (node) case style when :line_count_dependent node.multiline? ? 'multiline' : 'single line' else 'all' end end
#offending_selector?(node, selector) ⇒ Boolean (private)
# File 'lib/rubocop/cop/style/lambda.rb', line 91
def offending_selector?(node, selector) lines = node.multiline? ? :multiline : :single_line selector == OFFENDING_SELECTORS[:style][style][lines] end
#on_block(node) Also known as: #on_numblock, #on_itblock
[ GitHub ]# File 'lib/rubocop/cop/style/lambda.rb', line 70
def on_block(node) return unless node.lambda? selector = node.send_node.source return unless offending_selector?(node, selector) return if uncorrectable_lambda_literal?(node) add_offense(node.send_node, message: (node, selector)) do |corrector| if node.send_node.lambda_literal? LambdaLiteralToMethodCorrector.new(node).call(corrector) else autocorrect_method_to_literal(corrector, node) end end end
#on_itblock(node)
Alias for #on_block.
# File 'lib/rubocop/cop/style/lambda.rb', line 87
alias on_itblock on_block
#on_numblock(node)
Alias for #on_block.
# File 'lib/rubocop/cop/style/lambda.rb', line 86
alias on_numblock on_block
#rescue_or_ensure_clause?(body) ⇒ Boolean (private)
# File 'lib/rubocop/cop/style/lambda.rb', line 105
def rescue_or_ensure_clause?(body) return false unless body return true if body.ensure_type? body.rescue_type? && !rescue_modifier?(body.resbody_branches.first) end
#uncorrectable_lambda_literal?(node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/style/lambda.rb', line 97
def uncorrectable_lambda_literal?(node) return false unless node.send_node.lambda_literal? return true if in_pattern?(node) return false unless rescue_or_ensure_clause?(node.body) LambdaLiteralToMethodCorrector.new(node).replace_delimiters? end