@@ -696,14 +696,16 @@ def visit_array_node(node)
696696 previous = nil
697697
698698 node . elements . each do |element |
699- visit_words_sep ( opening_loc , previous , element )
699+ visit_words_sep ( opening_loc , previous , element . start_offset )
700700
701701 bounds ( element . location )
702702 elements = on_qwords_add ( elements , on_tstring_content ( element . content ) )
703703
704704 previous = element
705705 end
706706
707+ visit_words_sep ( opening_loc , node . elements . last , node . closing_loc . start_offset )
708+
707709 bounds ( node . closing_loc )
708710 on_tstring_end ( node . closing )
709711 when /^%i/
@@ -715,14 +717,16 @@ def visit_array_node(node)
715717 previous = nil
716718
717719 node . elements . each do |element |
718- visit_words_sep ( opening_loc , previous , element )
720+ visit_words_sep ( opening_loc , previous , element . start_offset )
719721
720722 bounds ( element . location )
721723 elements = on_qsymbols_add ( elements , on_tstring_content ( element . value ) )
722724
723725 previous = element
724726 end
725727
728+ visit_words_sep ( opening_loc , node . elements . last , node . closing_loc . start_offset )
729+
726730 bounds ( node . closing_loc )
727731 on_tstring_end ( node . closing )
728732 when /^%W/
@@ -734,7 +738,7 @@ def visit_array_node(node)
734738 previous = nil
735739
736740 node . elements . each do |element |
737- visit_words_sep ( opening_loc , previous , element )
741+ visit_words_sep ( opening_loc , previous , element . start_offset )
738742
739743 bounds ( element . location )
740744 elements =
@@ -760,6 +764,8 @@ def visit_array_node(node)
760764 previous = element
761765 end
762766
767+ visit_words_sep ( opening_loc , node . elements . last , node . closing_loc . start_offset )
768+
763769 bounds ( node . closing_loc )
764770 on_tstring_end ( node . closing )
765771 when /^%I/
@@ -771,7 +777,7 @@ def visit_array_node(node)
771777 previous = nil
772778
773779 node . elements . each do |element |
774- visit_words_sep ( opening_loc , previous , element )
780+ visit_words_sep ( opening_loc , previous , element . start_offset )
775781
776782 bounds ( element . location )
777783 elements =
@@ -797,6 +803,8 @@ def visit_array_node(node)
797803 previous = element
798804 end
799805
806+ visit_words_sep ( opening_loc , node . elements . last , node . closing_loc . start_offset )
807+
800808 bounds ( node . closing_loc )
801809 on_tstring_end ( node . closing )
802810 else
@@ -813,15 +821,20 @@ def visit_array_node(node)
813821 on_array ( elements )
814822 end
815823
816- # Dispatch a words_sep event that contains the space between the elements
824+ # Dispatch words_sep events that contains the whitespace between the elements
817825 # of list literals.
818- private def visit_words_sep ( opening_loc , previous , current )
819- end_offset = ( previous . nil? ? opening_loc : previous . location ) . end_offset
820- start_offset = current . location . start_offset
821-
822- if end_offset != start_offset
823- bounds ( current . location . copy ( start_offset : end_offset ) )
824- on_words_sep ( source . byteslice ( end_offset ...start_offset ) )
826+ private def visit_words_sep ( opening_loc , previous , end_offset )
827+ start_offset = ( previous . nil? ? opening_loc : previous . location ) . end_offset
828+ length = end_offset - start_offset
829+
830+ if length > 0
831+ whitespace = source . byteslice ( start_offset , length )
832+ current_offset = start_offset
833+ whitespace . each_line do |part |
834+ bounds ( opening_loc . copy ( start_offset : current_offset , length : part . bytesize ) )
835+ on_words_sep ( part )
836+ current_offset += part . bytesize
837+ end
825838 end
826839 end
827840
0 commit comments