ruby_parser 3.17.0 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  # encoding: ASCII-8BIT
2
- # TODO: remove
2
+ # frozen_string_literal: true
3
+ # TODO: remove encoding comment
3
4
 
4
5
  require "sexp"
5
6
  require "ruby_lexer"
@@ -29,7 +30,7 @@ class Sexp
29
30
  end
30
31
 
31
32
  module RubyParserStuff
32
- VERSION = "3.16.0"
33
+ VERSION = "3.18.0"
33
34
 
34
35
  attr_accessor :lexer, :in_def, :in_single, :file
35
36
  attr_accessor :in_kwarg
@@ -155,11 +156,25 @@ module RubyParserStuff
155
156
  end
156
157
 
157
158
  args.each do |arg|
159
+ if arg.instance_of? Array and arg.size == 2 and arg.last.is_a? Numeric then
160
+ arg = arg.first
161
+ end
162
+
158
163
  case arg
159
164
  when Sexp then
160
165
  case arg.sexp_type
161
166
  when :args, :block, :array, :call_args then # HACK call_args mismatch
162
- result.concat arg.sexp_body
167
+ rest = arg.sexp_body
168
+
169
+ rest.map! { |x|
170
+ if x.instance_of? Array and x.size == 2 and Numeric === x.last then
171
+ x.first
172
+ else
173
+ x
174
+ end
175
+ }
176
+
177
+ result.concat rest
163
178
  when :forward_args then
164
179
  self.env[:*] = :lvar # TODO: arg_var(p, idFWD_REST) ?
165
180
  self.env[:**] = :lvar
@@ -185,6 +200,8 @@ module RubyParserStuff
185
200
  name = arg.to_s.delete("&*")
186
201
  self.env[name.to_sym] = :lvar unless name.empty?
187
202
  result << arg
203
+ when true, false then
204
+ self.in_kwarg = arg
188
205
  when ",", "|", ";", "(", ")", nil then
189
206
  # ignore
190
207
  else
@@ -195,6 +212,23 @@ module RubyParserStuff
195
212
  result
196
213
  end
197
214
 
215
+ def end_args args
216
+ lexer.lex_state = RubyLexer::State::Values::EXPR_BEG
217
+ lexer.command_start = true
218
+ self.args args
219
+ end
220
+
221
+ def endless_method_name defn_or_defs
222
+ name = defn_or_defs[1]
223
+ name = defn_or_defs[2] unless Symbol === name
224
+
225
+ if name.end_with? "=" then
226
+ yyerror "setter method cannot be defined in an endless method definition"
227
+ end
228
+
229
+ # TODO? token_info_drop(p, "def", loc->beg_pos);
230
+ end
231
+
198
232
  def array_to_hash array
199
233
  case array.sexp_type
200
234
  when :kwsplat then
@@ -214,17 +248,10 @@ module RubyParserStuff
214
248
  end
215
249
 
216
250
  def assignable(lhs, value = nil)
217
- id = lhs.to_sym unless Sexp === lhs
218
-
219
- raise "WTF" if Sexp === id
220
- id = id.to_sym if Sexp === id
221
-
222
- raise "write a test 1" if id.to_s =~ /^(?:self|nil|true|false|__LINE__|__FILE__)$/
251
+ id, line = lhs
252
+ id = id.to_sym
223
253
 
224
- raise SyntaxError, "Can't change the value of #{id}" if
225
- id.to_s =~ /^(?:self|nil|true|false|__LINE__|__FILE__)$/
226
-
227
- result = case id.to_s
254
+ result = case id
228
255
  when /^@@/ then
229
256
  asgn = in_def || in_single > 0
230
257
  s((asgn ? :cvasgn : :cvdecl), id)
@@ -245,17 +272,9 @@ module RubyParserStuff
245
272
 
246
273
  self.env[id] ||= :lvar if result.sexp_type == :lasgn
247
274
 
248
- line = case lhs
249
- when Sexp then
250
- lhs.line
251
- else
252
- value && value.line || lexer.lineno
253
- end
254
-
255
275
  result << value if value
256
- result.line = line
257
-
258
- return result
276
+ result.line line
277
+ result
259
278
  end
260
279
 
261
280
  def backref_assign_error ref
@@ -279,9 +298,9 @@ module RubyParserStuff
279
298
  line = [head.line, tail.line].compact.min
280
299
 
281
300
  head = remove_begin(head)
282
- head = s(:block, head) unless head.node_type == :block
301
+ head = s(:block, head).line(line) unless head.sexp_type == :block
283
302
 
284
- head.line = line
303
+ # head.line = line
285
304
  head << tail
286
305
  end
287
306
 
@@ -307,6 +326,10 @@ module RubyParserStuff
307
326
  end
308
327
 
309
328
  args.each do |arg|
329
+ if arg.instance_of? Array and arg.size == 2 and arg.last.is_a? Numeric then
330
+ arg = arg.first
331
+ end
332
+
310
333
  case arg
311
334
  when Sexp then
312
335
  case arg.sexp_type
@@ -317,6 +340,9 @@ module RubyParserStuff
317
340
  end
318
341
  when Symbol then
319
342
  result << arg
343
+ when Array then
344
+ id, _line = arg
345
+ result << id
320
346
  when ",", nil, "(" then
321
347
  # ignore
322
348
  else
@@ -441,7 +467,7 @@ module RubyParserStuff
441
467
  end
442
468
  else
443
469
  warn "unprocessed: %p" % [s]
444
- end.map { |l| whitespace_width l[/^[ \t]*/] }
470
+ end.map { |l| whitespace_width l.chomp }
445
471
  }.compact.min
446
472
  end
447
473
 
@@ -465,7 +491,6 @@ module RubyParserStuff
465
491
  end
466
492
 
467
493
  def gettable(id)
468
- lineno = id.lineno if id.respond_to? :lineno
469
494
  id = id.to_sym if String === id
470
495
 
471
496
  result = case id.to_s
@@ -486,8 +511,6 @@ module RubyParserStuff
486
511
  end
487
512
  end
488
513
 
489
- result.line lineno if lineno
490
-
491
514
  raise "identifier #{id.inspect} is not valid" unless result
492
515
 
493
516
  result
@@ -546,7 +569,7 @@ module RubyParserStuff
546
569
  header.map! { |s| s.force_encoding "ASCII-8BIT" } if has_enc
547
570
 
548
571
  first = header.first || ""
549
- encoding, str = "utf-8", str.b[3..-1] if first =~ /\A\xEF\xBB\xBF/
572
+ encoding, str = +"utf-8", str.b[3..-1] if first =~ /\A\xEF\xBB\xBF/
550
573
 
551
574
  encoding = $1.strip if header.find { |s|
552
575
  s[/^#.*?-\*-.*?coding:\s*([^ ;]+).*?-\*-/, 1] ||
@@ -630,7 +653,7 @@ module RubyParserStuff
630
653
  when :evstr then
631
654
  if htype == :str then
632
655
  f, l = head.file, head.line
633
- head = s(:dstr, *head.sexp_body).line head.line
656
+ head = s(:dstr, *head.sexp_body)
634
657
  head.file = f
635
658
  head.line = l
636
659
  end
@@ -649,6 +672,13 @@ module RubyParserStuff
649
672
  return head
650
673
  end
651
674
 
675
+ def local_pop in_def
676
+ lexer.cond.pop # group = local_pop
677
+ lexer.cmdarg.pop
678
+ self.env.unextend
679
+ self.in_def = in_def
680
+ end
681
+
652
682
  def logical_op type, left, right
653
683
  left = value_expr left
654
684
 
@@ -678,6 +708,73 @@ module RubyParserStuff
678
708
  new_call val[0], :"[]", val[2]
679
709
  end
680
710
 
711
+ def new_arg val
712
+ arg, = val
713
+
714
+ case arg
715
+ when Symbol then
716
+ result = s(:args, arg).line line
717
+ when Sexp then
718
+ result = arg
719
+ when Array then
720
+ (arg, line), = val
721
+ result = s(:args, arg).line line
722
+ else
723
+ debug20 32
724
+ raise "Unknown f_arg type: #{val.inspect}"
725
+ end
726
+
727
+ result
728
+ end
729
+
730
+ def new_array_pattern const, pre_arg, arypat, loc
731
+ result = s(:array_pat, const).line loc
732
+ result << pre_arg if pre_arg
733
+
734
+ if arypat && arypat.sexp_type == :array_TAIL then
735
+ result.concat arypat.sexp_body
736
+ else
737
+ raise "NO?: %p" % [arypat]
738
+ end
739
+
740
+ result
741
+ end
742
+
743
+ def array_pat_concat lhs, rhs
744
+ case lhs.sexp_type
745
+ when :PATTERN then
746
+ lhs.sexp_type = :array_pat
747
+ end
748
+
749
+ if rhs then
750
+ case rhs.sexp_type
751
+ when :array_pat, :array_TAIL, :PATTERN then
752
+ lhs.concat rhs.sexp_body
753
+ else
754
+ lhs << rhs
755
+ end
756
+ end
757
+ end
758
+
759
+ def new_array_pattern_tail pre_args, has_rest, rest_arg, post_args
760
+ # TODO: remove has_rest once all tests pass !!!
761
+ rest_arg = if has_rest then
762
+ :"*#{rest_arg}"
763
+ else
764
+ nil
765
+ end
766
+
767
+ result = s(:array_TAIL).line 666
768
+
769
+ array_pat_concat result, pre_args
770
+
771
+ result << rest_arg if rest_arg
772
+
773
+ array_pat_concat result, post_args
774
+
775
+ result
776
+ end
777
+
681
778
  def new_assign lhs, rhs
682
779
  return nil unless lhs
683
780
 
@@ -697,6 +794,8 @@ module RubyParserStuff
697
794
  end
698
795
 
699
796
  def new_attrasgn recv, meth, call_op = :"."
797
+ call_op = call_op.first if Array === call_op
798
+
700
799
  meth = :"#{meth}="
701
800
 
702
801
  result = case call_op.to_sym
@@ -761,6 +860,8 @@ module RubyParserStuff
761
860
  end
762
861
 
763
862
  def new_call recv, meth, args = nil, call_op = :"."
863
+ call_op = call_op.first if Array === call_op
864
+
764
865
  result = case call_op.to_sym
765
866
  when :"."
766
867
  s(:call, recv, meth)
@@ -788,10 +889,14 @@ module RubyParserStuff
788
889
  result
789
890
  end
790
891
 
892
+ def new_in pat, body, cases, line
893
+ s(:in, pat, body, cases).line line
894
+ end
895
+
791
896
  def new_case expr, body, line
792
897
  result = s(:case, expr)
793
898
 
794
- while body and body.node_type == :when
899
+ while body and [:when, :in].include? body.sexp_type
795
900
  result << body
796
901
  body = body.delete_at 3
797
902
  end
@@ -810,8 +915,11 @@ module RubyParserStuff
810
915
  end
811
916
 
812
917
  def new_class val
918
+ # TODO: get line from class keyword
813
919
  line, path, superclass, body = val[1], val[2], val[3], val[5]
814
920
 
921
+ path = path.first if path.instance_of? Array
922
+
815
923
  result = s(:class, path, superclass)
816
924
 
817
925
  if body then
@@ -834,7 +942,8 @@ module RubyParserStuff
834
942
  end
835
943
 
836
944
  def new_const_op_asgn val
837
- lhs, asgn_op, rhs = val[0], val[1].to_sym, val[2]
945
+ lhs, (asgn_op, _), rhs = val
946
+ asgn_op = asgn_op.to_sym
838
947
 
839
948
  result = case asgn_op
840
949
  when :"||" then
@@ -850,55 +959,71 @@ module RubyParserStuff
850
959
  end
851
960
 
852
961
  def new_defn val
853
- (_, line), name, _, args, body, nil_body_line, * = val
854
- body ||= s(:nil).line nil_body_line
962
+ _, (name, line), in_def, args, body, _ = val
963
+
964
+ body ||= s(:nil).line line
855
965
 
856
966
  args.line line
857
967
 
858
968
  result = s(:defn, name.to_sym, args).line line
859
969
 
860
- if body then
861
- if body.sexp_type == :block then
862
- result.push(*body.sexp_body)
863
- else
864
- result.push body
865
- end
970
+ if body.sexp_type == :block then
971
+ result.push(*body.sexp_body)
972
+ else
973
+ result.push body
866
974
  end
867
975
 
868
976
  result.comments = self.comments.pop
869
977
 
870
- result
978
+ [result, in_def]
871
979
  end
872
980
 
873
981
  def new_defs val
874
- _, recv, _, _, name, (_in_def, line), args, body, _ = val
982
+ _, recv, (name, line), in_def, args, body, _ = val
875
983
 
876
984
  body ||= s(:nil).line line
877
985
 
878
986
  args.line line
879
987
 
880
- result = s(:defs, recv, name.to_sym, args)
988
+ result = s(:defs, recv, name.to_sym, args).line line
881
989
 
882
990
  # TODO: remove_begin
883
991
  # TODO: reduce_nodes
884
992
 
885
- if body then
886
- if body.sexp_type == :block then
887
- result.push(*body.sexp_body)
888
- else
889
- result.push body
890
- end
993
+ if body.sexp_type == :block then
994
+ result.push(*body.sexp_body)
995
+ else
996
+ result.push body
891
997
  end
892
998
 
893
- result.line = recv.line
894
999
  result.comments = self.comments.pop
895
- result
1000
+
1001
+ [result, in_def]
896
1002
  end
897
1003
 
898
1004
  def new_do_body args, body, lineno
899
1005
  new_iter(nil, args, body).line(lineno)
900
1006
  end
901
1007
 
1008
+ def new_find_pattern const, pat
1009
+ pat.sexp_type = :find_pat
1010
+ pat.insert 1, const
1011
+ end
1012
+
1013
+ def new_find_pattern_tail lhs, mid, rhs
1014
+ lhs_id, line = lhs
1015
+ rhs_id, _line = rhs
1016
+
1017
+ # TODO: fpinfo->pre_rest_arg = pre_rest_arg ? assignable(p, pre_rest_arg, 0, loc) : NODE_SPECIAL_NO_NAME_REST;
1018
+
1019
+ lhs_id = "*#{lhs_id}".to_sym
1020
+ rhs_id = "*#{rhs_id}".to_sym
1021
+
1022
+ mid.sexp_type = :array_pat # HACK?
1023
+
1024
+ s(:find_pat_TAIL, lhs_id, mid, rhs_id).line line
1025
+ end
1026
+
902
1027
  def new_for expr, var, body
903
1028
  result = s(:for, expr, var).line(var.line)
904
1029
  result << body if body
@@ -908,7 +1033,47 @@ module RubyParserStuff
908
1033
  def new_hash val
909
1034
  _, line, assocs = val
910
1035
 
911
- s(:hash).line(line).concat assocs.values
1036
+ s(:hash).line(line).concat assocs.sexp_body
1037
+ end
1038
+
1039
+ def new_hash_pattern const, hash_pat, loc
1040
+ _, pat, kw_args, kw_rest_arg = hash_pat
1041
+
1042
+ line = (const||hash_pat).line
1043
+
1044
+ result = s(:hash_pat, const).line line
1045
+ result.concat pat.sexp_body if pat
1046
+ result << kw_args if kw_args
1047
+ result << kw_rest_arg if kw_rest_arg
1048
+ result
1049
+ end
1050
+
1051
+ def new_hash_pattern_tail kw_args, kw_rest_arg, line # TODO: remove line arg
1052
+ # kw_rest_arg = assignable(kw_rest_arg, nil).line line if kw_rest_arg
1053
+
1054
+ result = s(:hash_pat).line line
1055
+ result << kw_args
1056
+
1057
+ if kw_rest_arg then
1058
+ name = kw_rest_arg.value
1059
+ # TODO: I _hate_ this:
1060
+ assignable [name, kw_rest_arg.line] if name != :**
1061
+ result << kw_rest_arg
1062
+ end
1063
+
1064
+ result
1065
+ end
1066
+
1067
+ def push_pktbl
1068
+ end
1069
+
1070
+ def pop_pktbl
1071
+ end
1072
+
1073
+ def push_pvtbl
1074
+ end
1075
+
1076
+ def pop_pvtbl
912
1077
  end
913
1078
 
914
1079
  def new_if c, t, f
@@ -985,9 +1150,12 @@ module RubyParserStuff
985
1150
  end
986
1151
 
987
1152
  def new_module val
1153
+ # TODO: get line from module keyword
988
1154
  line, path, body = val[1], val[2], val[4]
989
1155
 
990
- result = s(:module, path)
1156
+ path = path.first if path.instance_of? Array
1157
+
1158
+ result = s(:module, path).line line
991
1159
 
992
1160
  if body then # REFACTOR?
993
1161
  if body.sexp_type == :block then
@@ -997,32 +1165,33 @@ module RubyParserStuff
997
1165
  end
998
1166
  end
999
1167
 
1000
- result.line = line
1001
1168
  result.comments = self.comments.pop
1002
1169
  result
1003
1170
  end
1004
1171
 
1005
1172
  def new_op_asgn val
1006
- lhs, asgn_op, arg = val[0], val[1].to_sym, val[2]
1007
- name = gettable(lhs.value).line lhs.line
1008
- arg = remove_begin(arg)
1009
- result = case asgn_op # REFACTOR
1173
+ lhs, (op, _line), rhs = val
1174
+ op = op.to_sym
1175
+
1176
+ name = gettable(lhs.last).line lhs.line
1177
+ arg = remove_begin rhs
1178
+ result = case op # REFACTOR
1010
1179
  when :"||" then
1011
1180
  lhs << arg
1012
- s(:op_asgn_or, name, lhs)
1181
+ s(:op_asgn_or, name, lhs).line lhs.line
1013
1182
  when :"&&" then
1014
1183
  lhs << arg
1015
- s(:op_asgn_and, name, lhs)
1184
+ s(:op_asgn_and, name, lhs).line lhs.line
1016
1185
  else
1017
- lhs << new_call(name, asgn_op, argl(arg))
1186
+ lhs << new_call(name, op, argl(arg))
1018
1187
  lhs
1019
1188
  end
1020
- result.line = lhs.line
1189
+
1021
1190
  result
1022
1191
  end
1023
1192
 
1024
1193
  def new_op_asgn1 val
1025
- lhs, _, args, _, op, rhs = val
1194
+ lhs, _, args, _, (op, _), rhs = val
1026
1195
 
1027
1196
  args.sexp_type = :arglist if args
1028
1197
 
@@ -1032,7 +1201,7 @@ module RubyParserStuff
1032
1201
  end
1033
1202
 
1034
1203
  def new_op_asgn2 val
1035
- recv, call_op, meth, op, arg = val
1204
+ recv, (call_op, _), (meth, _), (op, _), arg = val
1036
1205
  meth = :"#{meth}="
1037
1206
 
1038
1207
  result = case call_op.to_sym
@@ -1049,36 +1218,28 @@ module RubyParserStuff
1049
1218
  end
1050
1219
 
1051
1220
  def new_qsym_list
1052
- result = s(:array).line lexer.lineno
1053
- self.lexer.fixup_lineno
1054
- result
1221
+ s(:array).line lexer.lineno
1055
1222
  end
1056
1223
 
1057
1224
  def new_qsym_list_entry val
1058
- _, str, _ = val
1059
- result = s(:lit, str.to_sym).line lexer.lineno
1060
- self.lexer.fixup_lineno
1061
- result
1225
+ _, (str, line), _ = val
1226
+ s(:lit, str.to_sym).line line
1062
1227
  end
1063
1228
 
1064
1229
  def new_qword_list
1065
- result = s(:array).line lexer.lineno
1066
- self.lexer.fixup_lineno
1067
- result
1230
+ s(:array).line lexer.lineno
1068
1231
  end
1069
1232
 
1070
1233
  def new_qword_list_entry val
1071
- _, str, _ = val
1234
+ _, (str, line), _ = val
1072
1235
  str.force_encoding("ASCII-8BIT") unless str.valid_encoding?
1073
- result = s(:str, str).line lexer.lineno # TODO: problematic? grab from parser
1074
- self.lexer.fixup_lineno
1075
- result
1236
+ s(:str, str).line line
1076
1237
  end
1077
1238
 
1078
1239
  def new_regexp val
1079
- _, node, options = val
1240
+ (_, line), node, (options, _) = val
1080
1241
 
1081
- node ||= s(:str, "").line lexer.lineno
1242
+ node ||= s(:str, "").line line
1082
1243
 
1083
1244
  o, k = 0, nil
1084
1245
  options.split(//).uniq.each do |c| # FIX: this has a better home
@@ -1105,12 +1266,12 @@ module RubyParserStuff
1105
1266
  begin
1106
1267
  Regexp.new(node[1], o)
1107
1268
  rescue RegexpError => e
1108
- warn "WA\RNING: #{e.message} for #{node[1].inspect} #{options.inspect}"
1269
+ warn "WARNING: #{e.message} for #{node[1].inspect} #{options.inspect}"
1109
1270
  begin
1110
- warn "WA\RNING: trying to recover with ENC_UTF8"
1271
+ warn "WARNING: trying to recover with ENC_UTF8"
1111
1272
  Regexp.new(node[1], Regexp::ENC_UTF8)
1112
1273
  rescue RegexpError => e
1113
- warn "WA\RNING: trying to recover with ENC_NONE"
1274
+ warn "WARNING: trying to recover with ENC_NONE"
1114
1275
  Regexp.new(node[1], Regexp::ENC_NONE)
1115
1276
  end
1116
1277
  end
@@ -1123,7 +1284,7 @@ module RubyParserStuff
1123
1284
  end
1124
1285
  node << o if o and o != 0
1125
1286
  else
1126
- node = s(:dregx, "", node).line node.line
1287
+ node = s(:dregx, "", node).line line
1127
1288
  node.sexp_type = :dregx_once if options =~ /o/
1128
1289
  node << o if o and o != 0
1129
1290
  end
@@ -1165,17 +1326,16 @@ module RubyParserStuff
1165
1326
  end
1166
1327
 
1167
1328
  def new_string val
1168
- str, = val
1329
+ (str, line), = val
1330
+
1169
1331
  str.force_encoding("UTF-8")
1170
1332
  # TODO: remove:
1171
1333
  str.force_encoding("ASCII-8BIT") unless str.valid_encoding?
1172
- result = s(:str, str).line lexer.lineno
1173
- self.lexer.fixup_lineno str.count("\n")
1174
- result
1334
+ s(:str, str).line line
1175
1335
  end
1176
1336
 
1177
1337
  def new_super args
1178
- if args && args.node_type == :block_pass then
1338
+ if args && args.sexp_type == :block_pass then
1179
1339
  s(:super, args).line args.line
1180
1340
  else
1181
1341
  args ||= s(:arglist).line lexer.lineno
@@ -1183,32 +1343,30 @@ module RubyParserStuff
1183
1343
  end
1184
1344
  end
1185
1345
 
1346
+ def new_symbol val
1347
+ name = val.last
1348
+ s(:lit, name.to_sym).line lexer.lineno
1349
+ end
1350
+
1186
1351
  def new_symbol_list
1187
- result = s(:array).line lexer.lineno
1188
- self.lexer.fixup_lineno
1189
- result
1352
+ # TODO: hunt down and try to remove ALL lexer.lineno usage!
1353
+ s(:array).line lexer.lineno
1190
1354
  end
1191
1355
 
1192
1356
  def new_symbol_list_entry val
1193
1357
  _, sym, _ = val
1194
1358
 
1195
- sym ||= s(:str, "")
1196
-
1197
- line = lexer.lineno
1359
+ sym ||= s(:str, "").line lexer.lineno
1198
1360
 
1199
1361
  case sym.sexp_type
1200
1362
  when :dstr then
1201
1363
  sym.sexp_type = :dsym
1202
1364
  when :str then
1203
- sym = s(:lit, sym.last.to_sym)
1365
+ sym = s(:lit, sym.last.to_sym).line sym.line
1204
1366
  else
1205
- sym = s(:dsym, "", sym || s(:str, "").line(line))
1367
+ sym = s(:dsym, "", sym).line sym.line
1206
1368
  end
1207
1369
 
1208
- sym.line line
1209
-
1210
- self.lexer.fixup_lineno
1211
-
1212
1370
  sym
1213
1371
  end
1214
1372
 
@@ -1250,16 +1408,12 @@ module RubyParserStuff
1250
1408
  end
1251
1409
 
1252
1410
  def new_word_list
1253
- result = s(:array).line lexer.lineno
1254
- self.lexer.fixup_lineno
1255
- result
1411
+ s(:array).line lexer.lineno
1256
1412
  end
1257
1413
 
1258
1414
  def new_word_list_entry val
1259
1415
  _, word, _ = val
1260
- result = word.sexp_type == :evstr ? s(:dstr, "", word).line(word.line) : word
1261
- self.lexer.fixup_lineno
1262
- result
1416
+ word.sexp_type == :evstr ? s(:dstr, "", word).line(word.line) : word
1263
1417
  end
1264
1418
 
1265
1419
  def new_xstring val
@@ -1283,9 +1437,9 @@ module RubyParserStuff
1283
1437
 
1284
1438
  def new_yield args = nil
1285
1439
  # TODO: raise args.inspect unless [:arglist].include? args.first # HACK
1286
- raise "write a test 4" if args && args.node_type == :block_pass
1440
+ raise "write a test 4" if args && args.sexp_type == :block_pass
1287
1441
  raise SyntaxError, "Block argument should not be given." if
1288
- args && args.node_type == :block_pass
1442
+ args && args.sexp_type == :block_pass
1289
1443
 
1290
1444
  args ||= s(:arglist).line lexer.lineno
1291
1445
 
@@ -1295,18 +1449,30 @@ module RubyParserStuff
1295
1449
  s(:yield, *args.sexp_body).line args.line
1296
1450
  end
1297
1451
 
1452
+ def prev_value_to_lineno v
1453
+ s, n = v
1454
+ if String === s then
1455
+ n
1456
+ else
1457
+ lexer.lineno
1458
+ end
1459
+ end
1460
+
1298
1461
  def next_token
1299
1462
  token = self.lexer.next_token
1300
1463
 
1301
1464
  if token and token.first != RubyLexer::EOF then
1302
1465
  self.last_token_type = token
1303
1466
  return token
1467
+ elsif !token
1468
+ return self.lexer.next_token
1304
1469
  else
1305
1470
  return [false, false]
1306
1471
  end
1307
1472
  end
1308
1473
 
1309
1474
  def on_error(et, ev, values)
1475
+ ev = ev.first if ev.instance_of?(Array) && ev.size == 2 && ev.last.is_a?(Integer)
1310
1476
  super
1311
1477
  rescue Racc::ParseError => e
1312
1478
  # I don't like how the exception obscures the error message
@@ -1320,18 +1486,17 @@ module RubyParserStuff
1320
1486
  # Timeout::Error if it runs for more than +time+ seconds.
1321
1487
 
1322
1488
  def process(str, file = "(string)", time = 10)
1489
+ str.freeze
1490
+
1323
1491
  Timeout.timeout time do
1324
1492
  raise "bad val: #{str.inspect}" unless String === str
1325
1493
 
1326
- str = handle_encoding str
1494
+ self.lexer.string = handle_encoding str
1327
1495
 
1328
1496
  self.file = file.dup
1329
1497
 
1330
1498
  @yydebug = ENV.has_key? "DEBUG"
1331
1499
 
1332
- # HACK -- need to get tests passing more than have graceful code
1333
- self.lexer.ss = RPStringScanner.new str
1334
-
1335
1500
  do_parse
1336
1501
  end
1337
1502
  end
@@ -1387,6 +1552,14 @@ module RubyParserStuff
1387
1552
  result
1388
1553
  end
1389
1554
 
1555
+ def debug n
1556
+ if ENV["PRY"] then
1557
+ require "pry"; binding.pry
1558
+ end
1559
+
1560
+ raise RubyParser::SyntaxError, "debug #{n}"
1561
+ end
1562
+
1390
1563
  def syntax_error msg
1391
1564
  raise RubyParser::SyntaxError, msg
1392
1565
  end
@@ -1431,6 +1604,8 @@ module RubyParserStuff
1431
1604
 
1432
1605
  if remove_width then
1433
1606
  line[idx..-1]
1607
+ elsif line[idx].nil?
1608
+ nil
1434
1609
  else
1435
1610
  col
1436
1611
  end