@@ -241,53 +241,51 @@ def visit_call_node(node)
241
241
block = nil
242
242
end
243
243
244
+ if node . call_operator_loc . nil?
245
+ case name
246
+ when :!
247
+ return visit_block ( builder . not_op ( token ( node . message_loc ) , token ( node . opening_loc ) , visit ( node . receiver ) , token ( node . closing_loc ) ) , block )
248
+ when :[]
249
+ return visit_block ( builder . index ( visit ( node . receiver ) , token ( node . opening_loc ) , visit_all ( arguments ) , token ( node . closing_loc ) ) , block )
250
+ when :[]=
251
+ if node . message != "[]=" && node . arguments && block . nil? && !node . safe_navigation?
252
+ return visit_block (
253
+ builder . assign (
254
+ builder . index_asgn (
255
+ visit ( node . receiver ) ,
256
+ token ( node . opening_loc ) ,
257
+ visit_all ( node . arguments . arguments [ ...-1 ] ) ,
258
+ token ( node . closing_loc ) ,
259
+ ) ,
260
+ srange_find ( node . message_loc . end_offset , node . arguments . arguments . last . location . start_offset , [ "=" ] ) ,
261
+ visit ( node . arguments . arguments . last )
262
+ ) ,
263
+ block
264
+ )
265
+ end
266
+ end
267
+ end
268
+
269
+ message_loc = node . message_loc
270
+ call_operator_loc = node . call_operator_loc
271
+ call_operator = [ { "." => :dot , "&." => :anddot , "::" => "::" } . fetch ( call_operator_loc . slice ) , srange ( call_operator_loc ) ] if call_operator_loc
272
+
244
273
visit_block (
245
- if name == :!
246
- builder . not_op (
247
- token ( node . message_loc ) ,
248
- token ( node . opening_loc ) ,
249
- visit ( node . receiver ) ,
250
- token ( node . closing_loc )
274
+ if name . end_with? ( "=" ) && !message_loc . slice . end_with? ( "=" ) && node . arguments && block . nil?
275
+ builder . assign (
276
+ builder . attr_asgn ( visit ( node . receiver ) , call_operator , token ( message_loc ) ) ,
277
+ srange_find ( message_loc . end_offset , node . arguments . location . start_offset , [ "=" ] ) ,
278
+ visit ( node . arguments . arguments . last )
251
279
)
252
- elsif name == :[]
253
- builder . index (
280
+ else
281
+ builder . call_method (
254
282
visit ( node . receiver ) ,
283
+ call_operator ,
284
+ message_loc ? [ node . name , srange ( message_loc ) ] : nil ,
255
285
token ( node . opening_loc ) ,
256
286
visit_all ( arguments ) ,
257
287
token ( node . closing_loc )
258
288
)
259
- elsif name == :[]= && node . message != "[]=" && node . arguments && block . nil?
260
- builder . assign (
261
- builder . index_asgn (
262
- visit ( node . receiver ) ,
263
- token ( node . opening_loc ) ,
264
- visit_all ( node . arguments . arguments [ ...-1 ] ) ,
265
- token ( node . closing_loc ) ,
266
- ) ,
267
- srange_find ( node . message_loc . end_offset , node . arguments . arguments . last . location . start_offset , [ "=" ] ) ,
268
- visit ( node . arguments . arguments . last )
269
- )
270
- else
271
- message_loc = node . message_loc
272
- call_operator_loc = node . call_operator_loc
273
- call_operator = [ { "." => :dot , "&." => :anddot , "::" => "::" } . fetch ( call_operator_loc . slice ) , srange ( call_operator_loc ) ] if call_operator_loc
274
-
275
- if name . end_with? ( "=" ) && !message_loc . slice . end_with? ( "=" ) && node . arguments && block . nil?
276
- builder . assign (
277
- builder . attr_asgn ( visit ( node . receiver ) , call_operator , token ( message_loc ) ) ,
278
- srange_find ( message_loc . end_offset , node . arguments . location . start_offset , [ "=" ] ) ,
279
- visit ( node . arguments . arguments . last )
280
- )
281
- else
282
- builder . call_method (
283
- visit ( node . receiver ) ,
284
- call_operator ,
285
- message_loc ? [ node . name , srange ( message_loc ) ] : nil ,
286
- token ( node . opening_loc ) ,
287
- visit_all ( arguments ) ,
288
- token ( node . closing_loc )
289
- )
290
- end
291
289
end ,
292
290
block
293
291
)
@@ -519,8 +517,6 @@ def visit_constant_path_target_node(node)
519
517
# def self.foo; end
520
518
# ^^^^^^^^^^^^^^^^^
521
519
def visit_def_node ( node )
522
- forwarding = find_forwarding ( node . parameters )
523
-
524
520
if node . equal_loc
525
521
if node . receiver
526
522
builder . def_endless_singleton (
@@ -530,15 +526,15 @@ def visit_def_node(node)
530
526
token ( node . name_loc ) ,
531
527
builder . args ( token ( node . lparen_loc ) , visit ( node . parameters ) || [ ] , token ( node . rparen_loc ) , false ) ,
532
528
token ( node . equal_loc ) ,
533
- node . body &.accept ( copy_compiler ( forwarding : forwarding ) )
529
+ node . body &.accept ( copy_compiler ( forwarding : find_forwarding ( node . parameters ) ) )
534
530
)
535
531
else
536
532
builder . def_endless_method (
537
533
token ( node . def_keyword_loc ) ,
538
534
token ( node . name_loc ) ,
539
535
builder . args ( token ( node . lparen_loc ) , visit ( node . parameters ) || [ ] , token ( node . rparen_loc ) , false ) ,
540
536
token ( node . equal_loc ) ,
541
- node . body &.accept ( copy_compiler ( forwarding : forwarding ) )
537
+ node . body &.accept ( copy_compiler ( forwarding : find_forwarding ( node . parameters ) ) )
542
538
)
543
539
end
544
540
elsif node . receiver
@@ -548,15 +544,15 @@ def visit_def_node(node)
548
544
token ( node . operator_loc ) ,
549
545
token ( node . name_loc ) ,
550
546
builder . args ( token ( node . lparen_loc ) , visit ( node . parameters ) || [ ] , token ( node . rparen_loc ) , false ) ,
551
- node . body &.accept ( copy_compiler ( forwarding : forwarding ) ) ,
547
+ node . body &.accept ( copy_compiler ( forwarding : find_forwarding ( node . parameters ) ) ) ,
552
548
token ( node . end_keyword_loc )
553
549
)
554
550
else
555
551
builder . def_method (
556
552
token ( node . def_keyword_loc ) ,
557
553
token ( node . name_loc ) ,
558
554
builder . args ( token ( node . lparen_loc ) , visit ( node . parameters ) || [ ] , token ( node . rparen_loc ) , false ) ,
559
- node . body &.accept ( copy_compiler ( forwarding : forwarding ) ) ,
555
+ node . body &.accept ( copy_compiler ( forwarding : find_forwarding ( node . parameters ) ) ) ,
560
556
token ( node . end_keyword_loc )
561
557
)
562
558
end
@@ -993,24 +989,24 @@ def visit_keyword_rest_parameter_node(node)
993
989
994
990
# -> {}
995
991
def visit_lambda_node ( node )
992
+ parameters = node . parameters
993
+
996
994
builder . block (
997
995
builder . call_lambda ( token ( node . operator_loc ) ) ,
998
996
[ node . opening , srange ( node . opening_loc ) ] ,
999
- if node . parameters
1000
- if node . parameters . is_a? ( NumberedParametersNode )
1001
- visit ( node . parameters )
1002
- else
1003
- builder . args (
1004
- token ( node . parameters . opening_loc ) ,
1005
- visit ( node . parameters ) ,
1006
- token ( node . parameters . closing_loc ) ,
1007
- false
1008
- )
1009
- end
1010
- else
997
+ if parameters . nil?
1011
998
builder . args ( nil , [ ] , nil , false )
999
+ elsif node . parameters . is_a? ( NumberedParametersNode )
1000
+ visit ( node . parameters )
1001
+ else
1002
+ builder . args (
1003
+ token ( node . parameters . opening_loc ) ,
1004
+ visit ( node . parameters ) ,
1005
+ token ( node . parameters . closing_loc ) ,
1006
+ false
1007
+ )
1012
1008
end ,
1013
- node . body &.accept ( copy_compiler ( forwarding : find_forwarding ( node . parameters &.parameters ) ) ) ,
1009
+ node . body &.accept ( copy_compiler ( forwarding : parameters . is_a? ( NumberedParametersNode ) ? [ ] : find_forwarding ( parameters &.parameters ) ) ) ,
1014
1010
[ node . closing , srange ( node . closing_loc ) ]
1015
1011
)
1016
1012
end
@@ -1096,7 +1092,7 @@ def visit_match_write_node(node)
1096
1092
# case of a syntax error. The parser gem doesn't have such a concept, so
1097
1093
# we invent our own here.
1098
1094
def visit_missing_node ( node )
1099
- raise CompilationError , "Cannot compile missing nodes"
1095
+ :: AST :: Node . new ( :missing , [ ] , location : :: Parser :: Source :: Map . new ( srange ( node . location ) ) )
1100
1096
end
1101
1097
1102
1098
# module Foo; end
@@ -1727,29 +1723,29 @@ def token(location)
1727
1723
# Visit a block node on a call.
1728
1724
def visit_block ( call , block )
1729
1725
if block
1726
+ parameters = block . parameters
1727
+
1730
1728
builder . block (
1731
1729
call ,
1732
1730
token ( block . opening_loc ) ,
1733
- if ( parameters = block . parameters )
1734
- if parameters . is_a? ( NumberedParametersNode )
1735
- visit ( parameters )
1736
- else
1737
- builder . args (
1738
- token ( parameters . opening_loc ) ,
1739
- if procarg0? ( parameters . parameters )
1740
- parameter = parameters . parameters . requireds . first
1741
- [ builder . procarg0 ( visit ( parameter ) ) ] . concat ( visit_all ( parameters . locals ) )
1742
- else
1743
- visit ( parameters )
1744
- end ,
1745
- token ( parameters . closing_loc ) ,
1746
- false
1747
- )
1748
- end
1749
- else
1731
+ if parameters . nil?
1750
1732
builder . args ( nil , [ ] , nil , false )
1733
+ elsif parameters . is_a? ( NumberedParametersNode )
1734
+ visit ( parameters )
1735
+ else
1736
+ builder . args (
1737
+ token ( parameters . opening_loc ) ,
1738
+ if procarg0? ( parameters . parameters )
1739
+ parameter = parameters . parameters . requireds . first
1740
+ [ builder . procarg0 ( visit ( parameter ) ) ] . concat ( visit_all ( parameters . locals ) )
1741
+ else
1742
+ visit ( parameters )
1743
+ end ,
1744
+ token ( parameters . closing_loc ) ,
1745
+ false
1746
+ )
1751
1747
end ,
1752
- block . body &.accept ( copy_compiler ( forwarding : find_forwarding ( block . parameters &.parameters ) ) ) ,
1748
+ block . body &.accept ( copy_compiler ( forwarding : parameters . is_a? ( NumberedParametersNode ) ? [ ] : find_forwarding ( parameters &.parameters ) ) ) ,
1753
1749
token ( block . closing_loc )
1754
1750
)
1755
1751
else
@@ -1762,9 +1758,9 @@ def visit_heredoc(node)
1762
1758
children = [ ]
1763
1759
node . parts . each do |part |
1764
1760
pushing =
1765
- if part . is_a? ( StringNode ) && part . unescaped . count ( "\n " ) > 1
1766
- unescaped = part . unescaped . split ( " \n " )
1767
- escaped = part . content . split ( " \n " )
1761
+ if part . is_a? ( StringNode ) && part . unescaped . include? ( "\n " )
1762
+ unescaped = part . unescaped . lines ( chomp : true )
1763
+ escaped = part . content . lines ( chomp : true )
1768
1764
1769
1765
escaped_lengths =
1770
1766
if node . opening . end_with? ( "'" )
@@ -1779,7 +1775,6 @@ def visit_heredoc(node)
1779
1775
unescaped . zip ( escaped_lengths ) . map do |unescaped_line , escaped_length |
1780
1776
end_offset = start_offset + ( escaped_length || 0 )
1781
1777
inner_part = builder . string_internal ( [ "#{ unescaped_line } \n " , srange_offsets ( start_offset , end_offset ) ] )
1782
-
1783
1778
start_offset = end_offset
1784
1779
inner_part
1785
1780
end
0 commit comments