Class: RuboCop::Cop::Offense

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/rubocop/cop/offense.rb

Overview

An offense represents a style violation detected by RuboCop.

Constant Summary collapse

COMPARISON_ATTRIBUTES =

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.

%i[line column cop_name
message severity].freeze
NO_LOCATION =
PseudoSourceRange.new(1, 0, '', 0, 0).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(severity, location, message, cop_name, status = :uncorrected, corrector = nil) ⇒ Offense

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

Returns a new instance of Offense.


85
86
87
88
89
90
91
92
93
94
# File 'lib/rubocop/cop/offense.rb', line 85

def initialize(severity, location, message, cop_name, # rubocop:disable Metrics/ParameterLists
               status = :uncorrected, corrector = nil)
  @severity = RuboCop::Cop::Severity.new(severity)
  @location = location
  @message = message.freeze
  @cop_name = cop_name.freeze
  @status = status
  @corrector = corrector
  freeze
end

Instance Attribute Details

#cop_nameString (readonly)

Returns a cop class name without department. i.e. type of the violation.

Examples:

'LineLength'

Returns:

  • (String)

    a cop class name without department. i.e. type of the violation.


52
53
54
# File 'lib/rubocop/cop/offense.rb', line 52

def cop_name
  @cop_name
end

#correctable?Boolean (readonly)

Returns whether this offense can be automatically corrected via autocorrect or a todo.

Returns:

  • (Boolean)

    whether this offense can be automatically corrected via autocorrect or a todo.


103
104
105
# File 'lib/rubocop/cop/offense.rb', line 103

def correctable?
  @status != :unsupported
end

#corrected?Boolean (readonly)

Returns whether this offense is automatically corrected via autocorrect or a todo.

Returns:

  • (Boolean)

    whether this offense is automatically corrected via autocorrect or a todo.


114
115
116
# File 'lib/rubocop/cop/offense.rb', line 114

def corrected?
  @status == :corrected || @status == :corrected_with_todo
end

#corrected_with_todo?Boolean (readonly)

Returns whether this offense is automatically disabled via a todo.

Returns:

  • (Boolean)

    whether this offense is automatically disabled via a todo.


124
125
126
# File 'lib/rubocop/cop/offense.rb', line 124

def corrected_with_todo?
  @status == :corrected_with_todo
end

#correctorCorrector | nil (readonly)

Returns the autocorrection for this offense, or `nil` when not available.

Returns:

  • (Corrector | nil)

    the autocorrection for this offense, or `nil` when not available


63
64
65
# File 'lib/rubocop/cop/offense.rb', line 63

def corrector
  @corrector
end

#disabled?Boolean (readonly)

Returns whether this offense was locally disabled with a disable or todo where it occurred.

Returns:

  • (Boolean)

    whether this offense was locally disabled with a disable or todo where it occurred.


135
136
137
# File 'lib/rubocop/cop/offense.rb', line 135

def disabled?
  @status == :disabled || @status == :todo
end

#locationParser::Source::Range (readonly)

Returns the location where the violation is detected.

Returns:

  • (Parser::Source::Range)

    the location where the violation is detected.

See Also:


29
30
31
# File 'lib/rubocop/cop/offense.rb', line 29

def location
  @location
end

#messageString (readonly)

Returns human-readable message.

Examples:

'Line is too long. [90/80]'

Returns:

  • (String)

    human-readable message


40
41
42
# File 'lib/rubocop/cop/offense.rb', line 40

def message
  @message
end

#severityRuboCop::Cop::Severity (readonly)


18
19
20
# File 'lib/rubocop/cop/offense.rb', line 18

def severity
  @severity
end

#statusObject (readonly)

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


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

def status
  @status
end

Instance Method Details

#<=>(other) ⇒ Integer

Returns `-1`, `0`, or `+1` if this offense is less than, equal to, or greater than `other`.

Returns:

  • (Integer)

    comparison result


235
236
237
238
239
240
241
# File 'lib/rubocop/cop/offense.rb', line 235

def <=>(other)
  COMPARISON_ATTRIBUTES.each do |attribute|
    result = send(attribute) <=> other.send(attribute)
    return result unless result.zero?
  end
  0
end

#==(other) ⇒ Boolean Also known as: eql?

Returns `true` if two offenses contain same attributes

Returns:

  • (Boolean)

    returns `true` if two offenses contain same attributes


214
215
216
217
218
# File 'lib/rubocop/cop/offense.rb', line 214

def ==(other)
  COMPARISON_ATTRIBUTES.all? do |attribute|
    send(attribute) == other.send(attribute)
  end
end

#columnObject

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


163
164
165
# File 'lib/rubocop/cop/offense.rb', line 163

def column
  location.column
end

#column_lengthObject

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


173
174
175
176
177
178
179
# File 'lib/rubocop/cop/offense.rb', line 173

def column_length
  if first_line == last_line
    column_range.count
  else
    source_line.length - column
  end
end

#column_rangeObject

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


197
198
199
# File 'lib/rubocop/cop/offense.rb', line 197

def column_range
  location.column_range
end

#first_lineObject

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


182
183
184
# File 'lib/rubocop/cop/offense.rb', line 182

def first_line
  location.first_line
end

#hashObject


222
223
224
225
226
# File 'lib/rubocop/cop/offense.rb', line 222

def hash
  COMPARISON_ATTRIBUTES.reduce(0) do |hash, attribute|
    hash ^ send(attribute).hash
  end
end

#highlighted_areaParser::Source::Range

Returns the range of the code that is highlighted.

Returns:

  • (Parser::Source::Range)

    the range of the code that is highlighted


143
144
145
146
147
# File 'lib/rubocop/cop/offense.rb', line 143

def highlighted_area
  Parser::Source::Range.new(source_line,
                            column,
                            column + column_length)
end

#last_columnObject

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


192
193
194
# File 'lib/rubocop/cop/offense.rb', line 192

def last_column
  location.last_column
end

#last_lineObject

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


187
188
189
# File 'lib/rubocop/cop/offense.rb', line 187

def last_line
  location.last_line
end

#lineObject

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


158
159
160
# File 'lib/rubocop/cop/offense.rb', line 158

def line
  location.line
end

#real_columnObject

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

Internally we use column number that start at 0, but when outputting column numbers, we want them to start at 1. One reason is that editors, such as Emacs, expect this.


206
207
208
# File 'lib/rubocop/cop/offense.rb', line 206

def real_column
  column + 1
end

#source_lineObject

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


168
169
170
# File 'lib/rubocop/cop/offense.rb', line 168

def source_line
  location.source_line
end

#to_sObject

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

This is just for debugging purpose.


151
152
153
154
155
# File 'lib/rubocop/cop/offense.rb', line 151

def to_s
  format('%<severity>s:%3<line>d:%3<column>d: %<message>s',
         severity: severity.code, line: line,
         column: real_column, message: message)
end