Sha256: c1b1574898dfb6a156c0cd5a7bfd5654951c9deabf1a9cf48b34817349cd9264

Contents?: true

Size: 1.79 KB

Versions: 195

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true

require_relative "helpers/rubocop_helpers"

module ERBLint
  module Linters
    # Replaces calls to `super` with calls to `render_parent`.
    class SuperInComponentTemplates < Linter
      include ERBLint::LinterRegistry
      include Helpers::RubocopHelpers

      def run(processed_source)
        processed_source.ast.descendants(:erb).each do |erb_node|
          indicator_node, _, code_node = *erb_node
          code = code_node.children.first
          ast = erb_ast(code)
          next unless ast

          super_call_nodes = find_super_call_nodes(ast)
          next if super_call_nodes.empty?

          indicator, = *indicator_node
          indicator ||= ""

          # +2 to account for the leading "<%" characters
          code_start_pos = erb_node.location.begin_pos + indicator.size + 2

          super_call_nodes.each do |super_call_node|
            orig_loc = code_node.location
            super_call_loc = super_call_node.location.expression

            new_loc = orig_loc.with(
              begin_pos: super_call_loc.begin_pos + code_start_pos,
              end_pos: super_call_loc.end_pos + code_start_pos
            )

            add_offense(
              new_loc,
              "Avoid calling `super` in component templates. Call `render_parent` instead",
              "render_parent"
            )
          end
        end
      end

      def autocorrect(_, offense)
        return unless offense.context

        lambda do |corrector|
          corrector.replace(offense.source_range, offense.context)
        end
      end

      private

      def find_super_call_nodes(ast)
        return [ast] if ast.type == :zsuper

        ast.each_child_node.flat_map do |child_ast|
          find_super_call_nodes(child_ast)
        end
      end
    end
  end
end

Version data entries

195 entries across 195 versions & 3 rubygems

Version Path
openproject-primer_view_components-0.54.0 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.53.1 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.53.0 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.52.4 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.52.3 lib/primer/view_components/linters/super_in_component_templates.rb
primer_view_components-0.36.5 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.52.2 lib/primer/view_components/linters/super_in_component_templates.rb
primer_view_components-0.36.4 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.52.1 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.52.0 lib/primer/view_components/linters/super_in_component_templates.rb
primer_view_components-0.36.3 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.51.0 lib/primer/view_components/linters/super_in_component_templates.rb
primer_view_components-0.36.2 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.50.1 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.50.0 lib/primer/view_components/linters/super_in_component_templates.rb
primer_view_components-0.36.1 lib/primer/view_components/linters/super_in_component_templates.rb
primer_view_components-0.36.0 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.49.2 lib/primer/view_components/linters/super_in_component_templates.rb
primer_view_components-0.35.2 lib/primer/view_components/linters/super_in_component_templates.rb
openproject-primer_view_components-0.49.1 lib/primer/view_components/linters/super_in_component_templates.rb