Class: RuboCop::DirectiveComment

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/directive_comment.rb

Overview

This class wraps the `Parser::Source::Comment` object that represents a special `rubocop:disable` and `rubocop:enable` comment and exposes what cops it contains.

Constant Summary collapse

REDUNDANT_DIRECTIVE_COP_DEPARTMENT =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

'Lint'
REDUNDANT_DIRECTIVE_COP =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

"#{REDUNDANT_DIRECTIVE_COP_DEPARTMENT}/RedundantCopDisableDirective"
COP_NAME_PATTERN =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

'([A-Z]\w+/)*(?:[A-Z]\w+)'
COP_NAMES_PATTERN =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

"(?:#{COP_NAME_PATTERN} , )*#{COP_NAME_PATTERN}"
COPS_PATTERN =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

"(all|#{COP_NAMES_PATTERN})"
DIRECTIVE_COMMENT_REGEXP =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Regexp.new(
  "# rubocop : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
    .gsub(' ', '\s*')
)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(comment, cop_registry = Cop::Registry.global) ⇒ DirectiveComment

Returns a new instance of DirectiveComment.


30
31
32
33
34
# File 'lib/rubocop/directive_comment.rb', line 30

def initialize(comment, cop_registry = Cop::Registry.global)
  @comment = comment
  @cop_registry = cop_registry
  @mode, @cops = match_captures
end

Instance Attribute Details

#commentObject (readonly)

Returns the value of attribute comment.


28
29
30
# File 'lib/rubocop/directive_comment.rb', line 28

def comment
  @comment
end

#cop_registryObject (readonly)

Returns the value of attribute cop_registry.


28
29
30
# File 'lib/rubocop/directive_comment.rb', line 28

def cop_registry
  @cop_registry
end

#copsObject (readonly)

Returns the value of attribute cops.


28
29
30
# File 'lib/rubocop/directive_comment.rb', line 28

def cops
  @cops
end

#modeObject (readonly)

Returns the value of attribute mode.


28
29
30
# File 'lib/rubocop/directive_comment.rb', line 28

def mode
  @mode
end

Class Method Details

.before_comment(line) ⇒ Object


24
25
26
# File 'lib/rubocop/directive_comment.rb', line 24

def self.before_comment(line)
  line.split(DIRECTIVE_COMMENT_REGEXP).first
end

Instance Method Details

#all_cops?Boolean

Checks if all cops specified in this directive

Returns:

  • (Boolean)

80
81
82
# File 'lib/rubocop/directive_comment.rb', line 80

def all_cops?
  cops == 'all'
end

#cop_namesObject

Returns array of specified in this directive cop names


85
86
87
# File 'lib/rubocop/directive_comment.rb', line 85

def cop_names
  @cop_names ||= all_cops? ? all_cop_names : parsed_cop_names
end

#department_namesObject

Returns array of specified in this directive department names when all department disabled


91
92
93
# File 'lib/rubocop/directive_comment.rb', line 91

def department_names
  splitted_cops_string.select { |cop| department?(cop) }
end

#directive_countObject


105
106
107
# File 'lib/rubocop/directive_comment.rb', line 105

def directive_count
  splitted_cops_string.count
end

#disabled?Boolean

Checks if this directive disables cops

Returns:

  • (Boolean)

60
61
62
# File 'lib/rubocop/directive_comment.rb', line 60

def disabled?
  %w[disable todo].include?(mode)
end

#disabled_all?Boolean

Checks if this directive disables all cops

Returns:

  • (Boolean)

75
76
77
# File 'lib/rubocop/directive_comment.rb', line 75

def disabled_all?
  disabled? && all_cops?
end

#enabled?Boolean

Checks if this directive enables cops

Returns:

  • (Boolean)

65
66
67
# File 'lib/rubocop/directive_comment.rb', line 65

def enabled?
  mode == 'enable'
end

#enabled_all?Boolean

Checks if this directive enables all cops

Returns:

  • (Boolean)

70
71
72
# File 'lib/rubocop/directive_comment.rb', line 70

def enabled_all?
  !disabled? && all_cops?
end

#in_directive_department?(cop) ⇒ Boolean

Checks if directive departments include cop

Returns:

  • (Boolean)

96
97
98
# File 'lib/rubocop/directive_comment.rb', line 96

def in_directive_department?(cop)
  department_names.any? { |department| cop.start_with?(department) }
end

#line_numberObject

Returns line number for directive


110
111
112
# File 'lib/rubocop/directive_comment.rb', line 110

def line_number
  comment.loc.expression.line
end

#match?(cop_names) ⇒ Boolean

Checks if this directive contains all the given cop names

Returns:

  • (Boolean)

42
43
44
# File 'lib/rubocop/directive_comment.rb', line 42

def match?(cop_names)
  parsed_cop_names.uniq.sort == cop_names.uniq.sort
end

#match_capturesObject

Returns match captures to directive comment pattern


55
56
57
# File 'lib/rubocop/directive_comment.rb', line 55

def match_captures
  @match_captures ||= comment.text.match(DIRECTIVE_COMMENT_REGEXP)&.captures
end

#overridden_by_department?(cop) ⇒ Boolean

Checks if cop department has already used in directive comment

Returns:

  • (Boolean)

101
102
103
# File 'lib/rubocop/directive_comment.rb', line 101

def overridden_by_department?(cop)
  in_directive_department?(cop) && splitted_cops_string.include?(cop)
end

#rangeObject


46
47
48
49
50
51
52
# File 'lib/rubocop/directive_comment.rb', line 46

def range
  match = comment.text.match(DIRECTIVE_COMMENT_REGEXP)
  begin_pos = comment.loc.expression.begin_pos
  Parser::Source::Range.new(
    comment.loc.expression.source_buffer, begin_pos + match.begin(0), begin_pos + match.end(0)
  )
end

#single_line?Boolean

Checks if this directive relates to single line

Returns:

  • (Boolean)

37
38
39
# File 'lib/rubocop/directive_comment.rb', line 37

def single_line?
  !self.class.before_comment(comment.text).empty?
end