Class: Utils::AST::CaskAST Private

Inherits:
Object show all
Includes:
Utils::AST
Defined in:
utils/ast.rb

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Helper class for editing casks.

Constant Summary

Constants included from Utils::AST

BlockNode, DefNode, Node, ProcessedSource, SendNode, TreeRewriter

Constants included from Kernel

Kernel::IGNORE_INTERRUPTS_MUTEX

Instance Method Summary collapse

Methods included from Utils::AST

body_children, call_node_match?, component_match?, literal_value, process_source, ruby_literal, stanza_text

Methods included from Kernel

#ensure_executable!, #exec_browser, #exec_editor, #ignore_interrupts, #interactive_shell, #quiet_system, #redirect_stdout, #safe_system, #which, #which_editor, #with_env, #with_homebrew_path

Constructor Details

#initialize(cask_contents) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:



568
569
570
571
572
573
574
# File 'utils/ast.rb', line 568

def initialize(cask_contents)
  @cask_contents = cask_contents
  processed_source, cask_block = process_cask
  @processed_source = T.let(processed_source, ProcessedSource)
  @cask_block = T.let(cask_block, BlockNode)
  @tree_rewriter = T.let(TreeRewriter.new(processed_source.buffer), TreeRewriter)
end

Instance Method Details

#depends_on_macos?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:

  • (Boolean)


663
664
665
666
667
668
669
670
671
672
# File 'utils/ast.rb', line 663

def depends_on_macos?
  stanzas(:depends_on).any? do |stanza_node|
    stanza_node.arguments.any? do |argument|
      literal_value(argument) == :macos ||
        (argument.hash_type? && T.cast(argument, RuboCop::AST::HashNode).pairs.any? do |pair|
          literal_value(pair.key) == :macos
        end)
    end
  end
end

#first_stanza_value(name, within: nil) ⇒ T.untyped

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (T.untyped)


607
608
609
610
611
612
# File 'utils/ast.rb', line 607

def first_stanza_value(name, within: nil)
  stanza_node = stanzas(name, within:).first
  return if stanza_node.blank?

  literal_value(stanza_node.first_argument)
end

#processString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



577
578
579
# File 'utils/ast.rb', line 577

def process
  tree_rewriter.process
end

#replace_first_stanza_value(name, value) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:



582
583
584
585
586
587
# File 'utils/ast.rb', line 582

def replace_first_stanza_value(name, value)
  stanza_node = stanzas(name).first
  raise "Could not find '#{name}' stanza!" if stanza_node.blank?

  replace_stanza_argument(stanza_node, value)
end

#replace_root_stanza_with_arch_blocks(name, old_value) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:



644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
# File 'utils/ast.rb', line 644

def replace_root_stanza_with_arch_blocks(name, old_value)
  stanza_node = top_level_stanzas(name).find do |node|
    literal_value(node.first_argument) == old_value
  end
  return if stanza_node.blank?

  indent = " " * stanza_node.source_range.column
  replacement = <<~EOS
    #{indent}on_arm do
    #{indent}  #{name} #{ruby_literal(old_value)}
    #{indent}end
    #{indent}on_intel do
    #{indent}  #{name} #{ruby_literal(old_value)}
    #{indent}end
  EOS
  tree_rewriter.replace(whole_line_range(stanza_node.source_range), replacement)
end

#replace_stanza_value(name, old_value, new_value, within: nil) ⇒ Integer

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
# File 'utils/ast.rb', line 622

def replace_stanza_value(name, old_value, new_value, within: nil)
  replacement_count = T.let(0, Integer)
  stanzas(name, within:).each do |stanza_node|
    if literal_value(stanza_node.first_argument) == old_value
      replace_stanza_argument(stanza_node, new_value)
      replacement_count += 1
    end

    stanza_node.arguments.grep(RuboCop::AST::HashNode).each do |hash_node|
      hash_node.pairs.each do |pair|
        next if literal_value(pair.value) != old_value

        tree_rewriter.replace(pair.value.source_range, ruby_literal(new_value))
        replacement_count += 1
      end
    end
  end

  replacement_count
end

#stanza?(name, within: nil) ⇒ Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (Boolean)


590
591
592
# File 'utils/ast.rb', line 590

def stanza?(name, within: nil)
  stanzas(name, within:).present?
end

#stanza_anywhere?(name, within:) ⇒ Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (Boolean)


595
596
597
598
599
600
601
602
603
604
# File 'utils/ast.rb', line 595

def stanza_anywhere?(name, within:)
  cask_block.each_node(:block).any? do |node|
    block_node = T.cast(node, BlockNode)
    next false if block_node.method_name != within || block_node.receiver.present?

    block_node.each_node(:send).any? do |send_node|
      send_node.method_name == name && send_node.receiver.nil? && send_node.first_argument.present?
    end
  end
end