| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-12 23:14:43 +01:00
										 |  |  |         def initialize(method_node, all_comments) | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |           @method_node = method_node | 
					
						
							| 
									
										
										
										
											2023-04-12 23:14:43 +01:00
										 |  |  |           @all_comments = all_comments | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-12 23:14:43 +01:00
										 |  |  |         attr_reader :method_node, :all_comments | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         alias stanza_node method_node | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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
										 |  |  | 
 | 
					
						
							|  |  |  |         def source_range | 
					
						
							| 
									
										
										
										
											2022-08-05 15:35:25 -04:00
										 |  |  |           stanza_node.location_expression | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 15:35:25 -04:00
										 |  |  |         def stanza_name | 
					
						
							|  |  |  |           return :on_arch_conditional if arch_variable? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           stanza_node.method_name | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def stanza_group | 
					
						
							|  |  |  |           Constants::STANZA_GROUP_HASH[stanza_name] | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-07 08:23:19 +02:00
										 |  |  |         def stanza_index | 
					
						
							|  |  |  |           Constants::STANZA_ORDER.index(stanza_name) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 19:49:21 +01:00
										 |  |  |         def same_group?(other) | 
					
						
							|  |  |  |           stanza_group == other.stanza_group | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-12 23:08:49 +02:00
										 |  |  |         def comments | 
					
						
							|  |  |  |           @comments ||= stanza_node.each_node.reduce([]) do |comments, node| | 
					
						
							| 
									
										
										
										
											2023-04-12 19:12:51 +01:00
										 |  |  |             comments | comments_hash[node.loc] | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def comments_hash | 
					
						
							| 
									
										
										
										
											2023-04-12 23:14:43 +01:00
										 |  |  |           @comments_hash ||= Parser::Source::Comment.associate_locations(stanza_node.parent, all_comments) | 
					
						
							| 
									
										
										
										
											2023-04-12 19:12:51 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2020-11-10 00:28:45 +11:00
										 |  |  |             def #{stanza_name}?               # 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 |