Class: Shirobai::Cop::Lint::SelfAssignment

Inherits:
RuboCop::Cop::Base
  • Object
show all
Defined in:
lib/shirobai/cop/lint/self_assignment.rb

Overview

Drop-in Rust reimplementation of Lint/SelfAssignment.

The detection (lvasgn/ivasgn/cvasgn/gvasgn/casgn rhs equals lhs name, masgn pair-wise self-assignment, or_asgn/and_asgn, attribute setter and []= self-assignment) happens entirely in Rust. Ruby only:

  1. Turns byte offsets into offenses.
  2. Filters by AllowRBSInlineAnnotation when that config is true — using stock's exact code path (processed_source.ast_with_comments[node]), keyed off the anchor node Rust returned per offense. When the config is the default false we skip the lookup entirely so the common case stays fast.

Constant Summary collapse

MSG =
"Self-assignment detected."

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.badgeObject



22
# File 'lib/shirobai/cop/lint/self_assignment.rb', line 22

def self.badge = RuboCop::Cop::Badge.parse("Lint/SelfAssignment")

.bundle_args(_config) ⇒ Object

Config is fully handled on the Ruby side (RBS lookup needs processed_source.ast_with_comments, only available here), so the bundle takes no per-cop args.



27
# File 'lib/shirobai/cop/lint/self_assignment.rb', line 27

def self.bundle_args(_config) = []

.cop_nameObject



21
# File 'lib/shirobai/cop/lint/self_assignment.rb', line 21

def self.cop_name = "Lint/SelfAssignment"

Instance Method Details

#on_new_investigationObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/shirobai/cop/lint/self_assignment.rb', line 29

def on_new_investigation
  offenses = Dispatch.offenses_for(processed_source, config, :self_assignment)
  return if offenses.empty?

  off = SourceOffsets.for(processed_source.raw_source)
  buffer = processed_source.buffer
  allow_rbs = !!cop_config["AllowRBSInlineAnnotation"]
  anchor_index = allow_rbs ? build_anchor_index : nil

  offenses.each do |start_offset, end_offset, anchor_offset|
    if allow_rbs && rbs_annotation_at?(anchor_index, anchor_offset)
      next
    end
    range = Parser::Source::Range.new(buffer, off[start_offset], off[end_offset])
    add_offense(range)
  end
end