Class: Utils::AST::CaskAST Private
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
- #depends_on_macos? ⇒ Boolean private
- #first_stanza_value(name, within: nil) ⇒ T.untyped private
- #initialize(cask_contents) ⇒ void constructor private
- #process ⇒ String private
- #replace_first_stanza_value(name, value) ⇒ void private
- #replace_root_stanza_with_arch_blocks(name, old_value) ⇒ void private
- #replace_stanza_value(name, old_value, new_value, within: nil) ⇒ Integer private
- #stanza?(name, within: nil) ⇒ Boolean private
- #stanza_anywhere?(name, within:) ⇒ Boolean private
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.
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.
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.
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 |
#process ⇒ String
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.
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.
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.
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.
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.
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.
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 |