Sha256: 9e90b3b41ad920fe0919c01e2d3c12265e676ba8785a0c6ea2956144be319ac4

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

# typed: true
# frozen_string_literal: true

require "packwerk/node"
require "packwerk/offense"

module Packwerk
  class NodeProcessor
    def initialize(reference_extractor:, reference_lister:, filename:, checkers:)
      @reference_extractor = reference_extractor
      @reference_lister = reference_lister
      @filename = filename
      @checkers = checkers
    end

    def call(node, ancestors:)
      case Node.type(node)
      when Node::METHOD_CALL, Node::CONSTANT
        reference = @reference_extractor.reference_from_node(node, ancestors: ancestors, file_path: @filename)
        check_reference(reference, node) if reference
      end
    end

    private

    def check_reference(reference, node)
      return nil unless (message = failed_check(reference))

      constant = reference.constant

      Packwerk::Offense.new(
        location: Node.location(node),
        file: @filename,
        message: <<~EOS
          #{message}
          Inference details: this is a reference to #{constant.name} which seems to be defined in #{constant.location}.
          To receive help interpreting or resolving this error message, see: https://github.com/Shopify/packwerk/blob/main/TROUBLESHOOT.md#Troubleshooting-violations
        EOS
      )
    end

    def failed_check(reference)
      failing_checker = @checkers.find do |checker|
        checker.invalid_reference?(reference, @reference_lister)
      end
      failing_checker&.message_for(reference)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
packwerk-1.0.0 lib/packwerk/node_processor.rb