@@ -839,7 +839,7 @@ def visit_in_node(node)
839
839
token ( node . in_loc ) ,
840
840
pattern ,
841
841
guard ,
842
- srange_find ( node . pattern . location . end_offset , node . statements &.location &.start_offset || node . location . end_offset , [ ";" , "then" ] ) ,
842
+ srange_find ( node . pattern . location . end_offset , node . statements &.location &.start_offset , [ ";" , "then" ] ) ,
843
843
visit ( node . statements )
844
844
)
845
845
end
@@ -1679,7 +1679,7 @@ def visit_unless_node(node)
1679
1679
end
1680
1680
1681
1681
# until foo; bar end
1682
- # ^^^^^^^^^^^^^^^^^
1682
+ # ^^^^^^^^^^^^^^^^^^
1683
1683
#
1684
1684
# bar until foo
1685
1685
# ^^^^^^^^^^^^^
@@ -1712,7 +1712,7 @@ def visit_when_node(node)
1712
1712
if node . then_keyword_loc
1713
1713
token ( node . then_keyword_loc )
1714
1714
else
1715
- srange_find ( node . conditions . last . location . end_offset , node . statements &.location &.start_offset || ( node . conditions . last . location . end_offset + 1 ) , [ ";" ] )
1715
+ srange_find ( node . conditions . last . location . end_offset , node . statements &.location &.start_offset , [ ";" ] )
1716
1716
end ,
1717
1717
visit ( node . statements )
1718
1718
)
@@ -1871,12 +1871,16 @@ def srange_offsets(start_offset, end_offset)
1871
1871
1872
1872
# Constructs a new source range by finding the given tokens between the
1873
1873
# given start offset and end offset. If the needle is not found, it
1874
- # returns nil.
1874
+ # returns nil. Importantly it does not search past newlines or comments.
1875
+ #
1876
+ # Note that end_offset is allowed to be nil, in which case this will
1877
+ # search until the end of the string.
1875
1878
def srange_find ( start_offset , end_offset , tokens )
1876
- tokens . find do |token |
1877
- next unless ( index = source_buffer . source . byteslice ( start_offset ...end_offset ) . index ( token ) )
1878
- offset = start_offset + index
1879
- return [ token , Range . new ( source_buffer , offset_cache [ offset ] , offset_cache [ offset + token . length ] ) ]
1879
+ if ( match = source_buffer . source . byteslice ( start_offset ...end_offset ) . match ( /(\s *)(#{ tokens . join ( "|" ) } )/ ) )
1880
+ _ , whitespace , token = *match
1881
+ token_offset = start_offset + whitespace . bytesize
1882
+
1883
+ [ token , Range . new ( source_buffer , offset_cache [ token_offset ] , offset_cache [ token_offset + token . bytesize ] ) ]
1880
1884
end
1881
1885
end
1882
1886
0 commit comments