| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  | require "forwardable" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module RuboCop | 
					
						
							|  |  |  |   module Cask | 
					
						
							|  |  |  |     module AST | 
					
						
							|  |  |  |       # This class wraps the AST send/block node that encapsulates the method | 
					
						
							|  |  |  |       # call that comprises the stanza. It includes various helper methods to | 
					
						
							|  |  |  |       # aid cops in their analysis. | 
					
						
							|  |  |  |       class Stanza | 
					
						
							|  |  |  |         extend Forwardable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { | 
					
						
							|  |  |  |           params( | 
					
						
							| 
									
										
										
										
											2025-01-25 21:07:44 +00:00
										 |  |  |             method_node:  RuboCop::AST::Node, | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |             all_comments: T::Array[T.any(String, Parser::Source::Comment)], | 
					
						
							|  |  |  |           ).void | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-04-12 23:14:43 +01:00
										 |  |  |         def initialize(method_node, all_comments) | 
					
						
							| 
									
										
										
										
											2025-01-25 21:07:44 +00:00
										 |  |  |           @method_node = T.let(method_node, RuboCop::AST::Node) | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |           @all_comments = T.let(all_comments, T::Array[T.any(String, Parser::Source::Comment)]) | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-25 21:07:44 +00:00
										 |  |  |         sig { returns(RuboCop::AST::Node) } | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         attr_reader :method_node | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         alias stanza_node method_node | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(T::Array[T.any(Parser::Source::Comment, String)]) } | 
					
						
							|  |  |  |         attr_reader :all_comments | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def_delegator :stanza_node, :parent, :parent_node | 
					
						
							| 
									
										
										
										
											2022-08-05 15:35:25 -04:00
										 |  |  |         def_delegator :stanza_node, :arch_variable? | 
					
						
							| 
									
										
										
										
											2023-05-07 08:23:19 +02:00
										 |  |  |         def_delegator :stanza_node, :on_system_block? | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(Parser::Source::Range) } | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def source_range | 
					
						
							| 
									
										
										
										
											2022-08-05 15:35:25 -04:00
										 |  |  |           stanza_node.location_expression | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(Parser::Source::Range) } | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def source_range_with_comments | 
					
						
							| 
									
										
										
										
											2023-04-12 23:08:49 +02:00
										 |  |  |           comments.reduce(source_range) do |range, comment| | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |             range.join(comment.loc.expression) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def_delegator :source_range, :source | 
					
						
							|  |  |  |         def_delegator :source_range_with_comments, :source, | 
					
						
							|  |  |  |                       :source_with_comments | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(Symbol) } | 
					
						
							| 
									
										
										
										
											2022-08-05 15:35:25 -04:00
										 |  |  |         def stanza_name | 
					
						
							|  |  |  |           return :on_arch_conditional if arch_variable? | 
					
						
							| 
									
										
										
										
											2025-01-25 21:35:21 +00:00
										 |  |  |           return stanza_node.method_node&.method_name if stanza_node.block_type? | 
					
						
							| 
									
										
										
										
											2022-08-05 15:35:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-25 21:35:21 +00:00
										 |  |  |           T.cast(stanza_node, RuboCop::AST::SendNode).method_name | 
					
						
							| 
									
										
										
										
											2022-08-05 15:35:25 -04:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(T.nilable(T::Array[Symbol])) } | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def stanza_group | 
					
						
							|  |  |  |           Constants::STANZA_GROUP_HASH[stanza_name] | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(T.nilable(Integer)) } | 
					
						
							| 
									
										
										
										
											2023-05-07 08:23:19 +02:00
										 |  |  |         def stanza_index | 
					
						
							|  |  |  |           Constants::STANZA_ORDER.index(stanza_name) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { params(other: Stanza).returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def same_group?(other) | 
					
						
							|  |  |  |           stanza_group == other.stanza_group | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(T::Array[Parser::Source::Comment]) } | 
					
						
							| 
									
										
										
										
											2023-04-12 23:08:49 +02:00
										 |  |  |         def comments | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |           @comments ||= T.let( | 
					
						
							|  |  |  |             stanza_node.each_node.reduce([]) do |comments, node| | 
					
						
							|  |  |  |               comments | comments_hash[node.loc] | 
					
						
							|  |  |  |             end, | 
					
						
							|  |  |  |             T.nilable(T::Array[Parser::Source::Comment]), | 
					
						
							|  |  |  |           ) | 
					
						
							| 
									
										
										
										
											2023-04-12 19:12:51 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { returns(T::Hash[Parser::Source::Range, T::Array[Parser::Source::Comment]]) } | 
					
						
							| 
									
										
										
										
											2023-04-12 19:12:51 +01:00
										 |  |  |         def comments_hash | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |           @comments_hash ||= T.let( | 
					
						
							|  |  |  |             Parser::Source::Comment.associate_locations(stanza_node.parent, all_comments), | 
					
						
							|  |  |  |             T.nilable(T::Hash[Parser::Source::Range, T::Array[Parser::Source::Comment]]), | 
					
						
							|  |  |  |           ) | 
					
						
							| 
									
										
										
										
											2023-04-12 19:12:51 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 23:17:22 +00:00
										 |  |  |         sig { params(other: T.untyped).returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def ==(other) | 
					
						
							|  |  |  |           self.class == other.class && stanza_node == other.stanza_node | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         alias eql? == | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Constants::STANZA_ORDER.each do |stanza_name| | 
					
						
							|  |  |  |           class_eval <<-RUBY, __FILE__, __LINE__ + 1
 | 
					
						
							| 
									
										
										
										
											2023-12-04 00:38:32 -05:00
										 |  |  |             def #{stanza_name.to_s.chomp("!")}?               # def url? | 
					
						
							|  |  |  |               stanza_name == :#{stanza_name}                  #   stanza_name == :url | 
					
						
							|  |  |  |             end                                               # end | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |