123456789_123456789_123456789_123456789_123456789_

Class: RuboCop::Cop::Layout::LeadingCommentSpace

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/layout/leading_comment_space.rb

Overview

Checks whether comments have a leading space after the denoting the start of the comment. The leading space is not required for some RDoc special syntax, like ++, --, :nodoc, =begin- and =end comments, "shebang" directives, or rackup options.

Examples:

# bad
#Some comment

# good
# Some comment

AllowDoxygenCommentStyle: false (default)

# bad

#**
# Some comment
# Another line of comment
#*

AllowDoxygenCommentStyle: true

# good

#**
# Some comment
# Another line of comment
#*

AllowGemfileRubyComment: false (default)

# bad

#ruby=2.7.0
#ruby-gemset=myproject

AllowGemfileRubyComment: true

# good

#ruby=2.7.0
#ruby-gemset=myproject

AllowRBSInlineAnnotation: false (default)

# bad

include Enumerable #[Integer]

attr_reader :name #: String
attr_reader :age  #: Integer?

AllowRBSInlineAnnotation: true

# good

include Enumerable #[Integer]

attr_reader :name #: String
attr_reader :age  #: Integer?

AllowSteepAnnotation: false (default)

# bad
[1, 2, 3].each_with_object([]) do |n, list| #$ Array[Integer]
  list << n
end

name = 'John'      #: String

AllowSteepAnnotation: true

# good

[1, 2, 3].each_with_object([]) do |n, list| #$ Array[Integer]
  list << n
end

name = 'John'      #: String

Constant Summary

::RuboCop::Cop::Base - Inherited

EMPTY_OFFENSES, RESTRICT_ON_SEND

::RuboCop::Cop::RangeHelp - Included

BYTE_ORDER_MARK, NOT_GIVEN

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 #on_new_investigation and on_investigation_end, the result of processed_source will remain constant.

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

::RuboCop::ExcludeLimit - Extended

exclude_limit

Sets up a configuration option to have an exclude limit tracked.

transform

Instance Attribute Summary

Instance Method Summary

::RuboCop::Cop::RangeHelp - Included

#add_range, #column_offset_between,
#contents_range

A range containing only the contents of a literal with delimiters (e.g.

#directions,
#effective_column

Returns the column attribute of the range, except if the range is on the first line and there’s a byte order mark at the beginning of that line, in which case 1 is subtracted from the column value.

#final_pos, #move_pos, #move_pos_str, #range_between, #range_by_whole_lines, #range_with_comments, #range_with_comments_and_lines, #range_with_surrounding_comma, #range_with_surrounding_space, #source_range

::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,
#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 add_offense or add_global_offense Cops are discouraged to override this; instead pass your message directly.

#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 a gems locked versions (i.e.

#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, #current_corrector,
#current_offense_locations

Reserved for Commissioner:

#current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, #file_name_matches_any?, #find_message, #find_severity, #range_for_original, #range_from_node_or_range,
#reset_investigation

Actually private methods.

#use_corrector

::RuboCop::Cop::AutocorrectLogic - Included

::RuboCop::Cop::IgnoredNode - Included

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Attribute Details

#allow_doxygen_comment?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 149

def allow_doxygen_comment?
  cop_config['AllowDoxygenCommentStyle']
end

#allow_gemfile_ruby_comment?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 157

def allow_gemfile_ruby_comment?
  cop_config['AllowGemfileRubyComment']
end

#allow_rbs_inline_annotation?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 173

def allow_rbs_inline_annotation?
  cop_config['AllowRBSInlineAnnotation']
end

#allow_steep_annotation?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 181

def allow_steep_annotation?
  cop_config['AllowSteepAnnotation']
end

#gemfile?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 161

def gemfile?
  File.basename(processed_source.file_path).eql?('Gemfile')
end

#rackup_config_file?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 145

def rackup_config_file?
  File.basename(processed_source.file_path).eql?('config.ru')
end

Instance Method Details

#allowed_on_first_line?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 119

def allowed_on_first_line?(comment)
  shebang?(comment) || (rackup_config_file? && rackup_options?(comment))
end

#doxygen_comment_style?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 153

def doxygen_comment_style?(comment)
  allow_doxygen_comment? && comment.text.start_with?('#*')
end

#gemfile_ruby_comment?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 169

def gemfile_ruby_comment?(comment)
  allow_gemfile_ruby_comment? && ruby_comment_in_gemfile?(comment)
end

#hash_mark(expr) (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 115

def hash_mark(expr)
  range_between(expr.begin_pos, expr.begin_pos + 1)
end

#on_new_investigation

Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 95

def on_new_investigation # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
  processed_source.comments.each do |comment|
    next unless /\A(?!#\+\+|#--)(#+[^#\s=])/.match?(comment.text)
    next if comment.loc.line == 1 && allowed_on_first_line?(comment)
    next if shebang_continuation?(comment)
    next if doxygen_comment_style?(comment)
    next if gemfile_ruby_comment?(comment)
    next if rbs_inline_annotation?(comment)
    next if steep_annotation?(comment)

    add_offense(comment) do |corrector|
      expr = comment.source_range

      corrector.insert_after(hash_mark(expr), ' ')
    end
  end
end

#rackup_options?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 141

def rackup_options?(comment)
  comment.text.start_with?('#\\')
end

#rbs_inline_annotation?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 177

def rbs_inline_annotation?(comment)
  allow_rbs_inline_annotation? && comment.text.start_with?(/#:|#\[.+\]/)
end

#ruby_comment_in_gemfile?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 165

def ruby_comment_in_gemfile?(comment)
  gemfile? && comment.text.start_with?('#ruby')
end

#shebang?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 123

def shebang?(comment)
  comment.text.start_with?('#!')
end

#shebang_continuation?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 127

def shebang_continuation?(comment)
  return false unless shebang?(comment)
  return true if comment.loc.line == 1

  previous_line_comment = processed_source.comment_at_line(comment.loc.line - 1)
  return false unless previous_line_comment

  # If the comment is a shebang but not on the first line, check if the previous
  # line has a shebang comment that wasn't marked as an offense; if so, this comment
  # continues the shebang and is acceptable.
  shebang?(previous_line_comment) &&
    !current_offense_locations.include?(previous_line_comment.source_range)
end

#steep_annotation?(comment) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/layout/leading_comment_space.rb', line 185

def steep_annotation?(comment)
  allow_steep_annotation? && comment.text.start_with?(/#[$:]/)
end