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.



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/rubocop/cop/offense.rb', line 90

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

  # Pre-compute the position eagerly because the offense is frozen and
  # `location.line` / `location.column` are expensive to compute; sorting
  # many offenses calls them repeatedly through `#<=>`.
  @line = location.line
  @column = location.column
  @message = message.freeze
  @cop_name = cop_name.freeze
  @status = status
  @corrector = corrector
  freeze
end

Instance Attribute Details

#columnObject (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.



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

def column
  @column
end

#cop_nameString (readonly)

Returns the cop name as a String for which this offense is for.

Examples:

'Layout/LineLength'

Returns:

  • (String)

    the cop name as a String for which this offense is for.



50
51
52
# File 'lib/rubocop/cop/offense.rb', line 50

def cop_name
  @cop_name
end

#correctable?Boolean (readonly)

Returns whether this offense can be automatically corrected via autocorrect. This includes todo comments, for example when requested with --disable-uncorrectable.

Returns:

  • (Boolean)

    whether this offense can be automatically corrected via autocorrect. This includes todo comments, for example when requested with --disable-uncorrectable.



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

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.



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

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.



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

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



61
62
63
# File 'lib/rubocop/cop/offense.rb', line 61

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.



156
157
158
# File 'lib/rubocop/cop/offense.rb', line 156

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

#lineObject (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.



178
179
180
# File 'lib/rubocop/cop/offense.rb', line 178

def line
  @line
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:



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

def location
  @location
end

#messageString (readonly)

Returns human-readable message.

Examples:

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

Returns:

  • (String)

    human-readable message



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

def message
  @message
end

#severityRuboCop::Cop::Severity (readonly)



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

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.



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

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



249
250
251
252
253
254
255
# File 'lib/rubocop/cop/offense.rb', line 249

def <=>(other)
  COMPARISON_ATTRIBUTES.each do |attribute|
    result = public_send(attribute) <=> other.public_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



230
231
232
233
234
# File 'lib/rubocop/cop/offense.rb', line 230

def ==(other)
  COMPARISON_ATTRIBUTES.all? do |attribute|
    public_send(attribute) == other.public_send(attribute)
  end
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.



189
190
191
192
193
194
195
# File 'lib/rubocop/cop/offense.rb', line 189

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.



213
214
215
# File 'lib/rubocop/cop/offense.rb', line 213

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.



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

def first_line
  location.first_line
end

#hashObject



238
239
240
# File 'lib/rubocop/cop/offense.rb', line 238

def hash
  COMPARISON_ATTRIBUTES.map { |attribute| public_send(attribute) }.hash
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



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

def highlighted_area
  source_buffer = Parser::Source::Buffer.new(location.source_buffer.name, source: source_line)
  Parser::Source::Range.new(source_buffer, 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.



208
209
210
# File 'lib/rubocop/cop/offense.rb', line 208

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.



203
204
205
# File 'lib/rubocop/cop/offense.rb', line 203

def last_line
  location.last_line
end

#marshal_dumpObject



107
108
109
# File 'lib/rubocop/cop/offense.rb', line 107

def marshal_dump
  [@severity, @location, @message, @cop_name, @status]
end

#marshal_load(array) ⇒ Object



111
112
113
114
115
# File 'lib/rubocop/cop/offense.rb', line 111

def marshal_load(array)
  @severity, @location, @message, @cop_name, @status = array
  @line = @location.line
  @column = @location.column
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.



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

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.



184
185
186
# File 'lib/rubocop/cop/offense.rb', line 184

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.



171
172
173
174
175
# File 'lib/rubocop/cop/offense.rb', line 171

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