PageRenderTime 45ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 1ms

/Languages/Ruby/Tests/Libraries/ParseTreeTests/pt_testcase.rb

http://github.com/IronLanguages/main
Ruby | 4417 lines | 4031 code | 367 blank | 19 comment | 50 complexity | 0dabc318eca4f3b643847b08c718de70 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. $TESTING = true
  2. require 'minitest/unit'
  3. require 'sexp_processor' # for deep_clone
  4. # key:
  5. # wwtt = what were they thinking?
  6. # TODO: <ko1_> 1.8.7 support {|&b|} syntax
  7. class Examples
  8. attr_reader :reader
  9. attr_writer :writer
  10. def a_method(x); x+1; end
  11. alias an_alias a_method
  12. define_method(:bmethod_noargs) do
  13. x + 1
  14. end
  15. define_method(:unsplatted) do |x|
  16. x + 1
  17. end
  18. define_method :splatted do |*args|
  19. y = args.first
  20. y + 42
  21. end
  22. define_method :dmethod_added, instance_method(:a_method) if
  23. RUBY_VERSION < "1.9"
  24. end
  25. class ParseTreeTestCase < MiniTest::Unit::TestCase
  26. attr_accessor :processor # to be defined by subclass
  27. def setup
  28. super
  29. @processor = nil
  30. end
  31. def after_process_hook klass, node, data, input_name, output_name
  32. end
  33. def before_process_hook klass, node, data, input_name, output_name
  34. end
  35. def self.add_test name, data, klass = self.name[4..-1]
  36. name = name.to_s
  37. klass = klass.to_s
  38. if testcases.has_key? name then
  39. if testcases[name].has_key? klass then
  40. warn "testcase #{klass}##{name} already has data"
  41. else
  42. testcases[name][klass] = data
  43. end
  44. else
  45. warn "testcase #{name} does not exist"
  46. end
  47. end
  48. def self.add_tests name, hash
  49. name = name.to_s
  50. hash.each do |klass, data|
  51. warn "testcase #{klass}##{name} already has data" if
  52. testcases[name].has_key? klass
  53. testcases[name][klass] = data
  54. end
  55. end
  56. def self.clone_same
  57. @@testcases.each do |node, data|
  58. data.each do |key, val|
  59. if val == :same then
  60. prev_key = self.previous(key)
  61. data[key] = data[prev_key].deep_clone
  62. end
  63. end
  64. end
  65. end
  66. def self.copy_test_case nonverbose, klass
  67. verbose = nonverbose + "_mri_verbose_flag"
  68. testcases[verbose][klass] = testcases[nonverbose][klass]
  69. end
  70. def self.generate_test klass, node, data, input_name, output_name
  71. klass.send(:define_method, "test_#{node}".to_sym) do
  72. flunk "Processor is nil" if processor.nil?
  73. assert data.has_key?(input_name), "Unknown input data"
  74. assert data.has_key?(output_name), "Missing test data"
  75. $missing[node] << output_name unless data.has_key? output_name
  76. input = data[input_name].deep_clone
  77. expected = data[output_name].deep_clone
  78. case expected
  79. when :unsupported then
  80. assert_raises(UnsupportedNodeError) do
  81. processor.process(input)
  82. end
  83. else
  84. extra_expected = []
  85. extra_input = []
  86. _, expected, extra_expected = *expected if
  87. Array === expected and expected.first == :defx
  88. _, input, extra_input = *input if
  89. Array === input and input.first == :defx
  90. # OMG... I can't believe I have to do this this way. these
  91. # hooks are here instead of refactoring this define_method
  92. # body into an assertion. It'll allow subclasses to hook in
  93. # and add behavior before or after the processor does it's
  94. # thing. If you go the body refactor route, some of the
  95. # RawParseTree test casese fail for completely bogus reasons.
  96. before_process_hook klass, node, data, input_name, output_name
  97. refute_nil data[input_name], "testcase does not exist?"
  98. @result = processor.process input
  99. assert_equal(expected, @result,
  100. "failed on input: #{data[input_name].inspect}")
  101. after_process_hook klass, node, data, input_name, output_name
  102. extra_input.each do |extra|
  103. processor.process(extra)
  104. end
  105. extra = processor.extra_methods rescue []
  106. assert_equal extra_expected, extra
  107. end
  108. end
  109. end
  110. def self.generate_tests klass
  111. install_missing_reporter
  112. clone_same
  113. output_name = klass.name.to_s.sub(/^Test/, '')
  114. input_name = self.previous(output_name)
  115. @@testcases.each do |node, data|
  116. next if [:skip, :unsupported].include? data[input_name]
  117. next if data[output_name] == :skip
  118. generate_test klass, node, data, input_name, output_name
  119. end
  120. end
  121. def self.inherited klass
  122. super
  123. generate_tests klass unless klass.name =~ /TestCase/
  124. end
  125. def self.install_missing_reporter
  126. unless defined? $missing then
  127. $missing = Hash.new { |h,k| h[k] = [] }
  128. at_exit {
  129. at_exit {
  130. warn ""
  131. $missing.sort.each do |name, klasses|
  132. warn "add_tests(#{name.inspect},"
  133. klasses.map! { |klass| " #{klass.inspect} => :same" }
  134. warn klasses.join("\n") + ")"
  135. end
  136. warn ""
  137. }
  138. }
  139. end
  140. end
  141. def self.previous(key, extra=0) # FIX: remove R2C code
  142. idx = @@testcase_order.index(key)
  143. raise "Unknown class #{key} in @@testcase_order" if idx.nil?
  144. case key
  145. when "RubyToRubyC" then
  146. idx -= 1
  147. end
  148. @@testcase_order[idx - 1 - extra]
  149. end
  150. def self.testcase_order; @@testcase_order; end
  151. def self.testcases; @@testcases; end
  152. def self.unsupported_tests *tests
  153. tests.flatten.each do |name|
  154. add_test name, :unsupported
  155. end
  156. end
  157. ############################################################
  158. # Shared TestCases:
  159. @@testcase_order = %w(Ruby RawParseTree ParseTree)
  160. @@testcases = Hash.new { |h,k| h[k] = {} }
  161. add_tests("alias",
  162. "Ruby" => "class X\n alias :y :x\nend",
  163. "RawParseTree" => [:class, :X, nil,
  164. [:scope, [:alias, [:lit, :y], [:lit, :x]]]],
  165. "ParseTree" => s(:class, :X, nil,
  166. s(:scope, s(:alias, s(:lit, :y), s(:lit, :x)))))
  167. add_tests("alias_ugh",
  168. "Ruby" => "class X\n alias y x\nend",
  169. "RawParseTree" => [:class, :X, nil,
  170. [:scope, [:alias, [:lit, :y], [:lit, :x]]]],
  171. "ParseTree" => s(:class, :X, nil,
  172. s(:scope, s(:alias, s(:lit, :y), s(:lit, :x)))),
  173. "Ruby2Ruby" => "class X\n alias :y :x\nend")
  174. add_tests("and",
  175. "Ruby" => "(a and b)",
  176. "RawParseTree" => [:and, [:vcall, :a], [:vcall, :b]],
  177. "ParseTree" => s(:and,
  178. s(:call, nil, :a, s(:arglist)),
  179. s(:call, nil, :b, s(:arglist))))
  180. add_tests("argscat_inside",
  181. "Ruby" => "a = [b, *c]",
  182. "RawParseTree" => [:lasgn, :a,
  183. [:argscat,
  184. [:array, [:vcall, :b]], [:vcall, :c]]],
  185. "ParseTree" => s(:lasgn, :a,
  186. s(:array,
  187. s(:call, nil, :b, s(:arglist)),
  188. s(:splat, s(:call, nil, :c, s(:arglist))))))
  189. add_tests("argscat_svalue",
  190. "Ruby" => "a = b, c, *d",
  191. "RawParseTree" => [:lasgn, :a,
  192. [:svalue,
  193. [:argscat,
  194. [:array, [:vcall, :b], [:vcall, :c]],
  195. [:vcall, :d]]]],
  196. "ParseTree" => s(:lasgn, :a,
  197. s(:svalue,
  198. s(:array,
  199. s(:call, nil, :b, s(:arglist)),
  200. s(:call, nil, :c, s(:arglist)),
  201. s(:splat,
  202. s(:call, nil, :d, s(:arglist)))))))
  203. add_tests("argspush",
  204. "Ruby" => "a[*b] = c",
  205. "RawParseTree" => [:attrasgn,
  206. [:vcall, :a],
  207. :[]=,
  208. [:argspush,
  209. [:splat,
  210. [:vcall, :b]],
  211. [:vcall, :c]]],
  212. "ParseTree" => s(:attrasgn,
  213. s(:call, nil, :a, s(:arglist)),
  214. :[]=,
  215. s(:arglist,
  216. s(:splat,
  217. s(:call, nil, :b, s(:arglist))),
  218. s(:call, nil, :c, s(:arglist)))))
  219. add_tests("array",
  220. "Ruby" => "[1, :b, \"c\"]",
  221. "RawParseTree" => [:array, [:lit, 1], [:lit, :b], [:str, "c"]],
  222. "ParseTree" => s(:array, s(:lit, 1), s(:lit, :b), s(:str, "c")))
  223. add_tests("array_pct_W",
  224. "Ruby" => "%W[a b c]",
  225. "RawParseTree" => [:array, [:str, "a"], [:str, "b"], [:str, "c"]],
  226. "ParseTree" => s(:array,
  227. s(:str, "a"), s(:str, "b"), s(:str, "c")),
  228. "Ruby2Ruby" => "[\"a\", \"b\", \"c\"]")
  229. add_tests("array_pct_W_dstr",
  230. "Ruby" => "%W[a #\{@b} c]",
  231. "RawParseTree" => [:array,
  232. [:str, "a"],
  233. [:dstr, "", [:evstr, [:ivar, :@b]]],
  234. [:str, "c"]],
  235. "ParseTree" => s(:array,
  236. s(:str, "a"),
  237. s(:dstr, "", s(:evstr, s(:ivar, :@b))),
  238. s(:str, "c")),
  239. "Ruby2Ruby" => "[\"a\", \"#\{@b}\", \"c\"]")
  240. add_tests("array_pct_w",
  241. "Ruby" => "%w[a b c]",
  242. "RawParseTree" => [:array, [:str, "a"], [:str, "b"], [:str, "c"]],
  243. "ParseTree" => s(:array,
  244. s(:str, "a"), s(:str, "b"), s(:str, "c")),
  245. "Ruby2Ruby" => "[\"a\", \"b\", \"c\"]")
  246. add_tests("array_pct_w_dstr",
  247. "Ruby" => "%w[a #\{@b} c]",
  248. "RawParseTree" => [:array,
  249. [:str, "a"],
  250. [:str, "#\{@b}"],
  251. [:str, "c"]],
  252. "ParseTree" => s(:array,
  253. s(:str, "a"),
  254. s(:str, "#\{@b}"),
  255. s(:str, "c")),
  256. "Ruby2Ruby" => "[\"a\", \"\\\#{@b}\", \"c\"]") # TODO: huh?
  257. add_tests("attrasgn",
  258. "Ruby" => "y = 0\n42.method = y\n",
  259. "RawParseTree" => [:block,
  260. [:lasgn, :y, [:lit, 0]],
  261. [:attrasgn, [:lit, 42], :method=,
  262. [:array, [:lvar, :y]]]],
  263. "ParseTree" => s(:block,
  264. s(:lasgn, :y, s(:lit, 0)),
  265. s(:attrasgn, s(:lit, 42), :method=,
  266. s(:arglist, s(:lvar, :y)))))
  267. add_tests("attrasgn_index_equals",
  268. "Ruby" => "a[42] = 24",
  269. "RawParseTree" => [:attrasgn, [:vcall, :a], :[]=,
  270. [:array, [:lit, 42], [:lit, 24]]],
  271. "ParseTree" => s(:attrasgn,
  272. s(:call, nil, :a, s(:arglist)),
  273. :[]=,
  274. s(:arglist, s(:lit, 42), s(:lit, 24))))
  275. add_tests("attrasgn_index_equals_space",
  276. "Ruby" => "a = []; a [42] = 24",
  277. "RawParseTree" => [:block,
  278. [:lasgn, :a, [:zarray]],
  279. [:attrasgn, [:lvar, :a], :[]=,
  280. [:array, [:lit, 42], [:lit, 24]]]],
  281. "ParseTree" => s(:block,
  282. s(:lasgn, :a, s(:array)),
  283. s(:attrasgn, s(:lvar, :a), :[]=,
  284. s(:arglist, s(:lit, 42), s(:lit, 24)))),
  285. "Ruby2Ruby" => "a = []\na[42] = 24\n")
  286. add_tests("attrset",
  287. "Ruby" => [Examples, :writer=],
  288. "RawParseTree" => [:defn, :writer=, [:attrset, :@writer]],
  289. "ParseTree" => s(:defn, :writer=,
  290. s(:args, :arg),
  291. s(:attrset, :@writer)),
  292. "Ruby2Ruby" => "attr_writer :writer")
  293. add_tests("back_ref",
  294. "Ruby" => "[$&, $`, $', $+]",
  295. "RawParseTree" => [:array,
  296. [:back_ref, :&],
  297. [:back_ref, :"`"],
  298. [:back_ref, :"'"],
  299. [:back_ref, :+]],
  300. "ParseTree" => s(:array,
  301. s(:back_ref, :&),
  302. s(:back_ref, :"`"),
  303. s(:back_ref, :"'"),
  304. s(:back_ref, :+)))
  305. add_tests("begin",
  306. "Ruby" => "begin\n (1 + 1)\nend",
  307. "RawParseTree" => [:call, [:lit, 1], :+, [:array, [:lit, 1]]],
  308. "ParseTree" => s(:call, s(:lit, 1), :+,
  309. s(:arglist, s(:lit, 1))),
  310. "Ruby2Ruby" => "(1 + 1)")
  311. add_tests("begin_def",
  312. "Ruby" => "def m\n begin\n\n end\nend",
  313. "RawParseTree" => [:defn, :m, [:scope, [:block, [:args], [:nil]]]],
  314. "ParseTree" => s(:defn, :m, s(:args),
  315. s(:scope, s(:block, s(:nil)))),
  316. "Ruby2Ruby" => "def m\n # do nothing\nend")
  317. add_tests("begin_rescue_ensure",
  318. "Ruby" => "begin\n a\nrescue\n # do nothing\nensure\n # do nothing\nend",
  319. "RawParseTree" => [:ensure,
  320. [:rescue,
  321. [:vcall, :a],
  322. [:resbody, nil]],
  323. [:nil]],
  324. "ParseTree" => s(:ensure,
  325. s(:rescue,
  326. s(:call, nil, :a, s(:arglist)),
  327. s(:resbody, s(:array), nil)),
  328. s(:nil)))
  329. add_tests("begin_rescue_ensure_all_empty",
  330. "Ruby" => "begin\n # do nothing\nrescue\n # do nothing\nensure\n # do nothing\nend",
  331. "RawParseTree" => [:ensure,
  332. [:rescue,
  333. [:resbody, nil]],
  334. [:nil]],
  335. "ParseTree" => s(:ensure,
  336. s(:rescue,
  337. s(:resbody, s(:array), nil)),
  338. s(:nil)))
  339. add_tests("begin_rescue_twice",
  340. "Ruby" => "begin\n a\nrescue => mes\n # do nothing\nend\nbegin\n b\nrescue => mes\n # do nothing\nend\n",
  341. "RawParseTree" => [:block,
  342. [:rescue,
  343. [:vcall, :a],
  344. [:resbody, nil,
  345. [:lasgn, :mes, [:gvar, :$!]]]],
  346. [:rescue,
  347. [:vcall, :b],
  348. [:resbody, nil,
  349. [:lasgn, :mes, [:gvar, :$!]]]]],
  350. "ParseTree" => s(:block,
  351. s(:rescue,
  352. s(:call, nil, :a, s(:arglist)),
  353. s(:resbody,
  354. s(:array, s(:lasgn, :mes, s(:gvar, :$!))),
  355. nil)),
  356. s(:rescue,
  357. s(:call, nil, :b, s(:arglist)),
  358. s(:resbody,
  359. s(:array,
  360. s(:lasgn, :mes, s(:gvar, :$!))),
  361. nil))))
  362. add_tests("begin_rescue_twice_mri_verbose_flag",
  363. "RawParseTree" => [:block,
  364. [:rescue, # no begin
  365. [:vcall, :a],
  366. [:resbody, nil,
  367. [:lasgn, :mes, [:gvar, :$!]]]],
  368. [:rescue,
  369. [:vcall, :b],
  370. [:resbody, nil,
  371. [:lasgn, :mes, [:gvar, :$!]]]]])
  372. copy_test_case "begin_rescue_twice", "Ruby"
  373. copy_test_case "begin_rescue_twice", "ParseTree"
  374. add_tests("block_attrasgn",
  375. "Ruby" => "def self.setup(ctx)\n bind = allocate\n bind.context = ctx\n return bind\nend",
  376. "RawParseTree" => [:defs, [:self], :setup,
  377. [:scope,
  378. [:block,
  379. [:args, :ctx],
  380. [:lasgn, :bind, [:vcall, :allocate]],
  381. [:attrasgn, [:lvar, :bind], :context=,
  382. [:array, [:lvar, :ctx]]],
  383. [:return, [:lvar, :bind]]]]],
  384. "ParseTree" => s(:defs, s(:self), :setup,
  385. s(:args, :ctx),
  386. s(:scope,
  387. s(:block,
  388. s(:lasgn, :bind,
  389. s(:call, nil, :allocate, s(:arglist))),
  390. s(:attrasgn, s(:lvar, :bind), :context=,
  391. s(:arglist, s(:lvar, :ctx))),
  392. s(:return, s(:lvar, :bind))))))
  393. add_tests("block_lasgn",
  394. "Ruby" => "x = (y = 1\n(y + 2))",
  395. "RawParseTree" => [:lasgn, :x,
  396. [:block,
  397. [:lasgn, :y, [:lit, 1]],
  398. [:call, [:lvar, :y], :+, [:array, [:lit, 2]]]]],
  399. "ParseTree" => s(:lasgn, :x,
  400. s(:block,
  401. s(:lasgn, :y, s(:lit, 1)),
  402. s(:call, s(:lvar, :y), :+,
  403. s(:arglist, s(:lit, 2))))))
  404. add_tests("block_mystery_block",
  405. "Ruby" => "a(b) do\n if b then\n true\n else\n c = false\n d { |x| c = true }\n c\n end\nend",
  406. "RawParseTree" => [:iter,
  407. [:fcall, :a, [:array, [:vcall, :b]]],
  408. nil,
  409. [:if,
  410. [:vcall, :b],
  411. [:true],
  412. [:block,
  413. [:dasgn_curr, :c, [:false]],
  414. [:iter,
  415. [:fcall, :d],
  416. [:dasgn_curr, :x],
  417. [:dasgn, :c, [:true]]],
  418. [:dvar, :c]]]],
  419. "ParseTree" => s(:iter,
  420. s(:call, nil, :a,
  421. s(:arglist, s(:call, nil, :b, s(:arglist)))),
  422. nil,
  423. s(:if,
  424. s(:call, nil, :b, s(:arglist)),
  425. s(:true),
  426. s(:block,
  427. s(:lasgn, :c, s(:false)),
  428. s(:iter,
  429. s(:call, nil, :d, s(:arglist)),
  430. s(:lasgn, :x),
  431. s(:lasgn, :c, s(:true))),
  432. s(:lvar, :c)))))
  433. add_tests("block_pass_args_and_splat",
  434. "Ruby" => "def blah(*args, &block)\n other(42, *args, &block)\nend",
  435. "RawParseTree" => [:defn, :blah,
  436. [:scope,
  437. [:block,
  438. [:args, :"*args"],
  439. [:block_arg, :block],
  440. [:block_pass,
  441. [:lvar, :block],
  442. [:fcall, :other,
  443. [:argscat,
  444. [:array, [:lit, 42]], [:lvar, :args]]]]]]],
  445. "ParseTree" => s(:defn, :blah,
  446. s(:args, :"*args", :"&block"),
  447. s(:scope,
  448. s(:block,
  449. s(:call, nil, :other,
  450. s(:arglist,
  451. s(:lit, 42),
  452. s(:splat, s(:lvar, :args)),
  453. s(:block_pass, s(:lvar, :block))))))))
  454. add_tests("block_pass_call_0",
  455. "Ruby" => "a.b(&c)",
  456. "RawParseTree" => [:block_pass,
  457. [:vcall, :c], [:call, [:vcall, :a], :b]],
  458. "ParseTree" => s(:call,
  459. s(:call, nil, :a, s(:arglist)),
  460. :b,
  461. s(:arglist,
  462. s(:block_pass,
  463. s(:call, nil, :c, s(:arglist))))))
  464. add_tests("block_pass_call_1",
  465. "Ruby" => "a.b(4, &c)",
  466. "RawParseTree" => [:block_pass,
  467. [:vcall, :c],
  468. [:call, [:vcall, :a], :b, [:array, [:lit, 4]]]],
  469. "ParseTree" => s(:call,
  470. s(:call, nil, :a, s(:arglist)),
  471. :b,
  472. s(:arglist,
  473. s(:lit, 4),
  474. s(:block_pass,
  475. s(:call, nil, :c, s(:arglist))))))
  476. add_tests("block_pass_call_n",
  477. "Ruby" => "a.b(1, 2, 3, &c)",
  478. "RawParseTree" => [:block_pass,
  479. [:vcall, :c],
  480. [:call, [:vcall, :a], :b,
  481. [:array, [:lit, 1], [:lit, 2], [:lit, 3]]]],
  482. "ParseTree" => s(:call,
  483. s(:call, nil, :a, s(:arglist)),
  484. :b,
  485. s(:arglist,
  486. s(:lit, 1), s(:lit, 2), s(:lit, 3),
  487. s(:block_pass,
  488. s(:call, nil, :c, s(:arglist))))))
  489. add_tests("block_pass_fcall_0",
  490. "Ruby" => "a(&b)",
  491. "RawParseTree" => [:block_pass, [:vcall, :b], [:fcall, :a]],
  492. "ParseTree" => s(:call, nil, :a,
  493. s(:arglist,
  494. s(:block_pass,
  495. s(:call, nil, :b, s(:arglist))))))
  496. add_tests("block_pass_fcall_1",
  497. "Ruby" => "a(4, &b)",
  498. "RawParseTree" => [:block_pass,
  499. [:vcall, :b],
  500. [:fcall, :a, [:array, [:lit, 4]]]],
  501. "ParseTree" => s(:call, nil, :a,
  502. s(:arglist,
  503. s(:lit, 4),
  504. s(:block_pass,
  505. s(:call, nil, :b, s(:arglist))))))
  506. add_tests("block_pass_fcall_n",
  507. "Ruby" => "a(1, 2, 3, &b)",
  508. "RawParseTree" => [:block_pass,
  509. [:vcall, :b],
  510. [:fcall, :a,
  511. [:array, [:lit, 1], [:lit, 2], [:lit, 3]]]],
  512. "ParseTree" => s(:call, nil, :a,
  513. s(:arglist,
  514. s(:lit, 1), s(:lit, 2), s(:lit, 3),
  515. s(:block_pass,
  516. s(:call, nil, :b, s(:arglist))))))
  517. add_tests("block_pass_omgwtf",
  518. "Ruby" => "define_attr_method(:x, :sequence_name, &Proc.new { |*args| nil })",
  519. "RawParseTree" => [:block_pass,
  520. [:iter,
  521. [:call, [:const, :Proc], :new],
  522. [:masgn, nil, [:dasgn_curr, :args], nil],
  523. [:nil]],
  524. [:fcall, :define_attr_method,
  525. [:array, [:lit, :x], [:lit, :sequence_name]]]],
  526. "ParseTree" => s(:call, nil, :define_attr_method,
  527. s(:arglist,
  528. s(:lit, :x),
  529. s(:lit, :sequence_name),
  530. s(:block_pass,
  531. s(:iter,
  532. s(:call, s(:const, :Proc), :new,
  533. s(:arglist)),
  534. s(:masgn,
  535. s(:array, s(:splat, s(:lasgn, :args)))),
  536. s(:nil))))))
  537. add_tests("block_pass_splat",
  538. "Ruby" => "def blah(*args, &block)\n other(*args, &block)\nend",
  539. "RawParseTree" => [:defn, :blah,
  540. [:scope,
  541. [:block,
  542. [:args, :"*args"],
  543. [:block_arg, :block],
  544. [:block_pass,
  545. [:lvar, :block],
  546. [:fcall, :other,
  547. [:splat, [:lvar, :args]]]]]]],
  548. "ParseTree" => s(:defn, :blah,
  549. s(:args, :"*args", :"&block"),
  550. s(:scope,
  551. s(:block,
  552. s(:call, nil, :other,
  553. s(:arglist,
  554. s(:splat, s(:lvar, :args)),
  555. s(:block_pass, s(:lvar, :block))))))))
  556. add_tests("block_pass_thingy",
  557. "Ruby" => "r.read_body(dest, &block)",
  558. "RawParseTree" => [:block_pass,
  559. [:vcall, :block],
  560. [:call, [:vcall, :r], :read_body,
  561. [:array, [:vcall, :dest]]]],
  562. "ParseTree" => s(:call,
  563. s(:call, nil, :r, s(:arglist)),
  564. :read_body,
  565. s(:arglist,
  566. s(:call, nil, :dest, s(:arglist)),
  567. s(:block_pass,
  568. s(:call, nil, :block, s(:arglist))))))
  569. add_tests("block_stmt_after",
  570. "Ruby" => "def f\n begin\n b\n rescue\n c\n end\n\n d\nend",
  571. "RawParseTree" => [:defn, :f,
  572. [:scope,
  573. [:block,
  574. [:args],
  575. [:rescue,
  576. [:vcall, :b],
  577. [:resbody, nil, [:vcall, :c]]],
  578. [:vcall, :d]]]],
  579. "ParseTree" => s(:defn, :f,
  580. s(:args),
  581. s(:scope,
  582. s(:block,
  583. s(:rescue,
  584. s(:call, nil, :b, s(:arglist)),
  585. s(:resbody,
  586. s(:array),
  587. s(:call, nil, :c, s(:arglist)))),
  588. s(:call, nil, :d, s(:arglist))))),
  589. "Ruby2Ruby" => "def f\n b rescue c\n d\nend")
  590. add_tests("block_stmt_after_mri_verbose_flag",
  591. "RawParseTree" => [:defn, :f,
  592. [:scope,
  593. [:block,
  594. [:args],
  595. [:rescue, # no begin
  596. [:vcall, :b],
  597. [:resbody, nil, [:vcall, :c]]],
  598. [:vcall, :d]]]])
  599. copy_test_case "block_stmt_after", "Ruby"
  600. copy_test_case "block_stmt_after", "ParseTree"
  601. copy_test_case "block_stmt_after", "Ruby2Ruby"
  602. add_tests("block_stmt_before",
  603. "Ruby" => "def f\n a\n begin\n b\n rescue\n c\n end\nend",
  604. "RawParseTree" => [:defn, :f,
  605. [:scope,
  606. [:block,
  607. [:args],
  608. [:vcall, :a],
  609. [:rescue, [:vcall, :b],
  610. [:resbody, nil, [:vcall, :c]]]]]],
  611. "ParseTree" => s(:defn, :f,
  612. s(:args),
  613. s(:scope,
  614. s(:block,
  615. s(:call, nil, :a, s(:arglist)),
  616. s(:rescue, s(:call, nil, :b, s(:arglist)),
  617. s(:resbody,
  618. s(:array),
  619. s(:call, nil, :c, s(:arglist))))))),
  620. "Ruby2Ruby" => "def f\n a\n b rescue c\nend")
  621. # oddly... this one doesn't HAVE any differences when verbose... new?
  622. copy_test_case "block_stmt_before", "Ruby"
  623. copy_test_case "block_stmt_before", "ParseTree"
  624. copy_test_case "block_stmt_before", "RawParseTree"
  625. copy_test_case "block_stmt_before", "Ruby2Ruby"
  626. add_tests("block_stmt_both",
  627. "Ruby" => "def f\n a\n begin\n b\n rescue\n c\n end\n d\nend",
  628. "RawParseTree" => [:defn, :f,
  629. [:scope,
  630. [:block,
  631. [:args],
  632. [:vcall, :a],
  633. [:rescue,
  634. [:vcall, :b],
  635. [:resbody,
  636. nil,
  637. [:vcall, :c]]],
  638. [:vcall, :d]]]],
  639. "ParseTree" => s(:defn, :f, s(:args),
  640. s(:scope,
  641. s(:block,
  642. s(:call, nil, :a, s(:arglist)),
  643. s(:rescue,
  644. s(:call, nil, :b, s(:arglist)),
  645. s(:resbody,
  646. s(:array),
  647. s(:call, nil, :c, s(:arglist)))),
  648. s(:call, nil, :d, s(:arglist))))),
  649. "Ruby2Ruby" => "def f\n a\n b rescue c\n d\nend")
  650. add_tests("block_stmt_both_mri_verbose_flag",
  651. "RawParseTree" => [:defn, :f,
  652. [:scope,
  653. [:block,
  654. [:args],
  655. [:vcall, :a],
  656. [:rescue, # no begin
  657. [:vcall, :b],
  658. [:resbody,
  659. nil,
  660. [:vcall, :c]]],
  661. [:vcall, :d]]]])
  662. copy_test_case "block_stmt_both", "Ruby"
  663. copy_test_case "block_stmt_both", "ParseTree"
  664. copy_test_case "block_stmt_both", "Ruby2Ruby"
  665. add_tests("bmethod",
  666. "Ruby" => [Examples, :unsplatted],
  667. "RawParseTree" => [:defn, :unsplatted,
  668. [:bmethod,
  669. [:dasgn_curr, :x],
  670. [:call, [:dvar, :x], :+, [:array, [:lit, 1]]]]],
  671. "ParseTree" => s(:defn, :unsplatted,
  672. s(:args, :x),
  673. s(:scope,
  674. s(:block,
  675. s(:call,
  676. s(:lvar, :x),
  677. :+,
  678. s(:arglist, s(:lit, 1)))))),
  679. "Ruby2Ruby" => "def unsplatted(x)\n (x + 1)\nend")
  680. add_tests("bmethod_noargs",
  681. "Ruby" => [Examples, :bmethod_noargs],
  682. "RawParseTree" => [:defn, :bmethod_noargs,
  683. [:bmethod,
  684. nil,
  685. [:call,
  686. [:vcall, :x], :"+", [:array, [:lit, 1]]]]],
  687. "ParseTree" => s(:defn, :bmethod_noargs,
  688. s(:args),
  689. s(:scope,
  690. s(:block,
  691. s(:call,
  692. s(:call, nil, :x, s(:arglist)),
  693. :"+",
  694. s(:arglist, s(:lit, 1)))))),
  695. "Ruby2Ruby" => "def bmethod_noargs\n (x + 1)\nend")
  696. add_tests("bmethod_splat",
  697. "Ruby" => [Examples, :splatted],
  698. "RawParseTree" => [:defn, :splatted,
  699. [:bmethod,
  700. [:masgn, nil, [:dasgn_curr, :args], nil],
  701. [:block,
  702. [:dasgn_curr, :y,
  703. [:call, [:dvar, :args], :first]],
  704. [:call, [:dvar, :y], :+,
  705. [:array, [:lit, 42]]]]]],
  706. "ParseTree" => s(:defn, :splatted,
  707. s(:args, :"*args"),
  708. s(:scope,
  709. s(:block,
  710. s(:lasgn, :y,
  711. s(:call, s(:lvar, :args), :first,
  712. s(:arglist))),
  713. s(:call, s(:lvar, :y), :+,
  714. s(:arglist, s(:lit, 42)))))),
  715. "Ruby2Ruby" => "def splatted(*args)\n y = args.first\n (y + 42)\nend")
  716. add_tests("break",
  717. "Ruby" => "loop { break if true }",
  718. "RawParseTree" => [:iter,
  719. [:fcall, :loop], nil,
  720. [:if, [:true], [:break], nil]],
  721. "ParseTree" => s(:iter,
  722. s(:call, nil, :loop, s(:arglist)), nil,
  723. s(:if, s(:true), s(:break), nil)))
  724. add_tests("break_arg",
  725. "Ruby" => "loop { break 42 if true }",
  726. "RawParseTree" => [:iter,
  727. [:fcall, :loop], nil,
  728. [:if, [:true], [:break, [:lit, 42]], nil]],
  729. "ParseTree" => s(:iter,
  730. s(:call, nil, :loop, s(:arglist)), nil,
  731. s(:if, s(:true), s(:break, s(:lit, 42)), nil)))
  732. add_tests("call",
  733. "Ruby" => "self.method",
  734. "RawParseTree" => [:call, [:self], :method],
  735. "ParseTree" => s(:call, s(:self), :method, s(:arglist)))
  736. add_tests("call_arglist",
  737. "Ruby" => "o.puts(42)",
  738. "RawParseTree" => [:call, [:vcall, :o], :puts,
  739. [:array, [:lit, 42]]],
  740. "ParseTree" => s(:call, s(:call, nil, :o, s(:arglist)), :puts,
  741. s(:arglist, s(:lit, 42))))
  742. add_tests("call_arglist_hash",
  743. "Ruby" => "o.m(:a => 1, :b => 2)",
  744. "RawParseTree" => [:call,
  745. [:vcall, :o], :m,
  746. [:array,
  747. [:hash,
  748. [:lit, :a], [:lit, 1],
  749. [:lit, :b], [:lit, 2]]]],
  750. "ParseTree" => s(:call,
  751. s(:call, nil, :o, s(:arglist)), :m,
  752. s(:arglist,
  753. s(:hash,
  754. s(:lit, :a), s(:lit, 1),
  755. s(:lit, :b), s(:lit, 2)))))
  756. add_tests("call_arglist_norm_hash",
  757. "Ruby" => "o.m(42, :a => 1, :b => 2)",
  758. "RawParseTree" => [:call,
  759. [:vcall, :o], :m,
  760. [:array,
  761. [:lit, 42],
  762. [:hash,
  763. [:lit, :a], [:lit, 1],
  764. [:lit, :b], [:lit, 2]]]],
  765. "ParseTree" => s(:call,
  766. s(:call, nil, :o, s(:arglist)), :m,
  767. s(:arglist,
  768. s(:lit, 42),
  769. s(:hash,
  770. s(:lit, :a), s(:lit, 1),
  771. s(:lit, :b), s(:lit, 2)))))
  772. add_tests("call_arglist_norm_hash_splat",
  773. "Ruby" => "o.m(42, :a => 1, :b => 2, *c)",
  774. "RawParseTree" => [:call,
  775. [:vcall, :o], :m,
  776. [:argscat,
  777. [:array,
  778. [:lit, 42],
  779. [:hash,
  780. [:lit, :a], [:lit, 1],
  781. [:lit, :b], [:lit, 2]]],
  782. [:vcall, :c]]],
  783. "ParseTree" => s(:call,
  784. s(:call, nil, :o, s(:arglist)), :m,
  785. s(:arglist,
  786. s(:lit, 42),
  787. s(:hash,
  788. s(:lit, :a), s(:lit, 1),
  789. s(:lit, :b), s(:lit, 2)),
  790. s(:splat, s(:call, nil, :c, s(:arglist))))))
  791. add_tests("call_arglist_space",
  792. "Ruby" => "a (1,2,3)",
  793. "RawParseTree" => [:fcall, :a,
  794. [:array, [:lit, 1], [:lit, 2], [:lit, 3]]],
  795. "ParseTree" => s(:call, nil, :a,
  796. s(:arglist,
  797. s(:lit, 1), s(:lit, 2), s(:lit, 3))),
  798. "Ruby2Ruby" => "a(1, 2, 3)")
  799. add_tests("call_command",
  800. "Ruby" => "1.b(c)",
  801. "RawParseTree" => [:call, [:lit, 1], :b, [:array, [:vcall, :c]]],
  802. "ParseTree" => s(:call,
  803. s(:lit, 1),
  804. :b,
  805. s(:arglist, s(:call, nil, :c, s(:arglist)))))
  806. add_tests("call_expr",
  807. "Ruby" => "(v = (1 + 1)).zero?",
  808. "RawParseTree" => [:call,
  809. [:lasgn, :v,
  810. [:call, [:lit, 1], :+, [:array, [:lit, 1]]]],
  811. :zero?],
  812. "ParseTree" => s(:call,
  813. s(:lasgn, :v,
  814. s(:call, s(:lit, 1), :+,
  815. s(:arglist, s(:lit, 1)))),
  816. :zero?, s(:arglist)))
  817. add_tests("call_index",
  818. "Ruby" => "a = []\na[42]\n",
  819. "RawParseTree" => [:block,
  820. [:lasgn, :a, [:zarray]],
  821. [:call, [:lvar, :a], :[], [:array, [:lit, 42]]]],
  822. "ParseTree" => s(:block,
  823. s(:lasgn, :a, s(:array)),
  824. s(:call, s(:lvar, :a), :[],
  825. s(:arglist, s(:lit, 42)))))
  826. add_tests("call_index_no_args",
  827. "Ruby" => "a[]",
  828. "RawParseTree" => [:call, [:vcall, :a], :[]],
  829. "ParseTree" => s(:call, s(:call, nil, :a, s(:arglist)),
  830. :[], s(:arglist)))
  831. add_tests("call_index_space",
  832. "Ruby" => "a = []\na [42]\n",
  833. "RawParseTree" => [:block,
  834. [:lasgn, :a, [:zarray]],
  835. [:call, [:lvar, :a], :[], [:array, [:lit, 42]]]],
  836. "ParseTree" => s(:block,
  837. s(:lasgn, :a, s(:array)),
  838. s(:call, s(:lvar, :a), :[],
  839. s(:arglist, s(:lit, 42)))),
  840. "Ruby2Ruby" => "a = []\na[42]\n")
  841. add_tests("call_unary_neg",
  842. "Ruby" => "-2**31",
  843. "RawParseTree" => [:call,
  844. [:call, [:lit, 2], :**, [:array, [:lit, 31]]],
  845. :-@],
  846. "ParseTree" => s(:call,
  847. s(:call,
  848. s(:lit, 2),
  849. :**,
  850. s(:arglist, s(:lit, 31))),
  851. :-@, s(:arglist)),
  852. "Ruby2Ruby" => "-(2 ** 31)")
  853. add_tests("case",
  854. "Ruby" => "var = 2\nresult = \"\"\ncase var\nwhen 1 then\n puts(\"something\")\n result = \"red\"\nwhen 2, 3 then\n result = \"yellow\"\nwhen 4 then\n # do nothing\nelse\n result = \"green\"\nend\ncase result\nwhen \"red\" then\n var = 1\nwhen \"yellow\" then\n var = 2\nwhen \"green\" then\n var = 3\nelse\n # do nothing\nend\n",
  855. "RawParseTree" => [:block,
  856. [:lasgn, :var, [:lit, 2]],
  857. [:lasgn, :result, [:str, ""]],
  858. [:case,
  859. [:lvar, :var],
  860. [:when,
  861. [:array, [:lit, 1]],
  862. [:block,
  863. [:fcall, :puts,
  864. [:array, [:str, "something"]]],
  865. [:lasgn, :result, [:str, "red"]]]],
  866. [:when,
  867. [:array, [:lit, 2], [:lit, 3]],
  868. [:lasgn, :result, [:str, "yellow"]]],
  869. [:when, [:array, [:lit, 4]], nil],
  870. [:lasgn, :result, [:str, "green"]]],
  871. [:case,
  872. [:lvar, :result],
  873. [:when, [:array, [:str, "red"]],
  874. [:lasgn, :var, [:lit, 1]]],
  875. [:when, [:array, [:str, "yellow"]],
  876. [:lasgn, :var, [:lit, 2]]],
  877. [:when, [:array, [:str, "green"]],
  878. [:lasgn, :var, [:lit, 3]]],
  879. nil]],
  880. "ParseTree" => s(:block,
  881. s(:lasgn, :var, s(:lit, 2)),
  882. s(:lasgn, :result, s(:str, "")),
  883. s(:case,
  884. s(:lvar, :var),
  885. s(:when,
  886. s(:array, s(:lit, 1)),
  887. s(:block,
  888. s(:call, nil, :puts,
  889. s(:arglist, s(:str, "something"))),
  890. s(:lasgn, :result, s(:str, "red")))),
  891. s(:when,
  892. s(:array, s(:lit, 2), s(:lit, 3)),
  893. s(:lasgn, :result, s(:str, "yellow"))),
  894. s(:when, s(:array, s(:lit, 4)), nil),
  895. s(:lasgn, :result, s(:str, "green"))),
  896. s(:case,
  897. s(:lvar, :result),
  898. s(:when, s(:array, s(:str, "red")),
  899. s(:lasgn, :var, s(:lit, 1))),
  900. s(:when, s(:array, s(:str, "yellow")),
  901. s(:lasgn, :var, s(:lit, 2))),
  902. s(:when, s(:array, s(:str, "green")),
  903. s(:lasgn, :var, s(:lit, 3))),
  904. nil)))
  905. add_tests("case_nested",
  906. "Ruby" => "var1 = 1\nvar2 = 2\nresult = nil\ncase var1\nwhen 1 then\n case var2\n when 1 then\n result = 1\n when 2 then\n result = 2\n else\n result = 3\n end\nwhen 2 then\n case var2\n when 1 then\n result = 4\n when 2 then\n result = 5\n else\n result = 6\n end\nelse\n result = 7\nend\n",
  907. "RawParseTree" => [:block,
  908. [:lasgn, :var1, [:lit, 1]],
  909. [:lasgn, :var2, [:lit, 2]],
  910. [:lasgn, :result, [:nil]],
  911. [:case,
  912. [:lvar, :var1],
  913. [:when, [:array, [:lit, 1]],
  914. [:case,
  915. [:lvar, :var2],
  916. [:when, [:array, [:lit, 1]],
  917. [:lasgn, :result, [:lit, 1]]],
  918. [:when, [:array, [:lit, 2]],
  919. [:lasgn, :result, [:lit, 2]]],
  920. [:lasgn, :result, [:lit, 3]]]],
  921. [:when, [:array, [:lit, 2]],
  922. [:case,
  923. [:lvar, :var2],
  924. [:when, [:array, [:lit, 1]],
  925. [:lasgn, :result, [:lit, 4]]],
  926. [:when, [:array, [:lit, 2]],
  927. [:lasgn, :result, [:lit, 5]]],
  928. [:lasgn, :result, [:lit, 6]]]],
  929. [:lasgn, :result, [:lit, 7]]]],
  930. "ParseTree" => s(:block,
  931. s(:lasgn, :var1, s(:lit, 1)),
  932. s(:lasgn, :var2, s(:lit, 2)),
  933. s(:lasgn, :result, s(:nil)),
  934. s(:case,
  935. s(:lvar, :var1),
  936. s(:when, s(:array, s(:lit, 1)),
  937. s(:case,
  938. s(:lvar, :var2),
  939. s(:when, s(:array, s(:lit, 1)),
  940. s(:lasgn, :result, s(:lit, 1))),
  941. s(:when, s(:array, s(:lit, 2)),
  942. s(:lasgn, :result, s(:lit, 2))),
  943. s(:lasgn, :result, s(:lit, 3)))),
  944. s(:when, s(:array, s(:lit, 2)),
  945. s(:case,
  946. s(:lvar, :var2),
  947. s(:when, s(:array, s(:lit, 1)),
  948. s(:lasgn, :result, s(:lit, 4))),
  949. s(:when, s(:array, s(:lit, 2)),
  950. s(:lasgn, :result, s(:lit, 5))),
  951. s(:lasgn, :result, s(:lit, 6)))),
  952. s(:lasgn, :result, s(:lit, 7)))))
  953. add_tests("case_nested_inner_no_expr",
  954. "Ruby" => "case a\nwhen b then\n case\n when (d and e) then\n f\n else\n # do nothing\n end\nelse\n # do nothing\nend",
  955. "RawParseTree" => [:case, [:vcall, :a],
  956. [:when, [:array, [:vcall, :b]],
  957. [:case, nil,
  958. [:when,
  959. [:array, [:and, [:vcall, :d], [:vcall, :e]]],
  960. [:vcall, :f]],
  961. nil]],
  962. nil],
  963. "ParseTree" => s(:case, s(:call, nil, :a, s(:arglist)),
  964. s(:when,
  965. s(:array, s(:call, nil, :b, s(:arglist))),
  966. s(:case, nil,
  967. s(:when,
  968. s(:array,
  969. s(:and,
  970. s(:call, nil, :d, s(:arglist)),
  971. s(:call, nil, :e, s(:arglist)))),
  972. s(:call, nil, :f, s(:arglist))),
  973. nil)),
  974. nil))
  975. add_tests("case_no_expr",
  976. "Ruby" => "case\nwhen (a == 1) then\n :a\nwhen (a == 2) then\n :b\nelse\n :c\nend",
  977. "RawParseTree" => [:case, nil,
  978. [:when,
  979. [:array,
  980. [:call, [:vcall, :a], :==,
  981. [:array, [:lit, 1]]]],
  982. [:lit, :a]],
  983. [:when,
  984. [:array,
  985. [:call, [:vcall, :a], :==,
  986. [:array, [:lit, 2]]]],
  987. [:lit, :b]],
  988. [:lit, :c]],
  989. "ParseTree" => s(:case, nil,
  990. s(:when,
  991. s(:array,
  992. s(:call,
  993. s(:call, nil, :a, s(:arglist)),
  994. :==,
  995. s(:arglist, s(:lit, 1)))),
  996. s(:lit, :a)),
  997. s(:when,
  998. s(:array,
  999. s(:call,
  1000. s(:call, nil, :a, s(:arglist)),
  1001. :==,
  1002. s(:arglist, s(:lit, 2)))),
  1003. s(:lit, :b)),
  1004. s(:lit, :c)))
  1005. add_tests("case_splat",
  1006. "Ruby" => "case a\nwhen :b, *c then\n d\nelse\n e\nend",
  1007. "RawParseTree" => [:case, [:vcall, :a],
  1008. [:when,
  1009. [:array,
  1010. [:lit, :b], [:when, [:vcall, :c], nil]], # wtf?
  1011. [:vcall, :d]],
  1012. [:vcall, :e]],
  1013. "ParseTree" => s(:case, s(:call, nil, :a, s(:arglist)),
  1014. s(:when,
  1015. s(:array,
  1016. s(:lit, :b),
  1017. s(:when,
  1018. s(:call, nil, :c, s(:arglist)),
  1019. nil)), # wtf?
  1020. s(:call, nil, :d, s(:arglist))),
  1021. s(:call, nil, :e, s(:arglist))))
  1022. add_tests("cdecl",
  1023. "Ruby" => "X = 42",
  1024. "RawParseTree" => [:cdecl, :X, [:lit, 42]],
  1025. "ParseTree" => s(:cdecl, :X, s(:lit, 42)))
  1026. add_tests("class_plain",
  1027. "Ruby" => "class X\n puts((1 + 1))\n def blah\n puts(\"hello\")\n end\nend",
  1028. "RawParseTree" => [:class,
  1029. :X,
  1030. nil,
  1031. [:scope,
  1032. [:block,
  1033. [:fcall, :puts,
  1034. [:array,
  1035. [:call, [:lit, 1], :+,
  1036. [:array, [:lit, 1]]]]],
  1037. [:defn, :blah,
  1038. [:scope,
  1039. [:block,
  1040. [:args],
  1041. [:fcall, :puts,
  1042. [:array, [:str, "hello"]]]]]]]]],
  1043. "ParseTree" => s(:class,
  1044. :X,
  1045. nil,
  1046. s(:scope,
  1047. s(:block,
  1048. s(:call, nil, :puts,
  1049. s(:arglist,
  1050. s(:call, s(:lit, 1), :+,
  1051. s(:arglist, s(:lit, 1))))),
  1052. s(:defn, :blah,
  1053. s(:args),
  1054. s(:scope,
  1055. s(:block,
  1056. s(:call, nil, :puts,
  1057. s(:arglist,
  1058. s(:str, "hello"))))))))))
  1059. add_tests("class_scoped",
  1060. "Ruby" => "class X::Y\n c\nend",
  1061. "RawParseTree" => [:class, [:colon2, [:const, :X], :Y], nil,
  1062. [:scope, [:vcall, :c]]],
  1063. "ParseTree" => s(:class, s(:colon2, s(:const, :X), :Y), nil,
  1064. s(:scope, s(:call, nil, :c, s(:arglist)))))
  1065. add_tests("class_scoped3",
  1066. "Ruby" => "class ::Y\n c\nend",
  1067. "RawParseTree" => [:class, [:colon3, :Y], nil,
  1068. [:scope, [:vcall, :c]]],
  1069. "ParseTree" => s(:class, s(:colon3, :Y), nil,
  1070. s(:scope, s(:call, nil, :c, s(:arglist)))))
  1071. add_tests("class_super_array",
  1072. "Ruby" => "class X < Array\nend",
  1073. "RawParseTree" => [:class,
  1074. :X,
  1075. [:const, :Array],
  1076. [:scope]],
  1077. "ParseTree" => s(:class,
  1078. :X,
  1079. s(:const, :Array),
  1080. s(:scope)))
  1081. add_tests("class_super_expr",
  1082. "Ruby" => "class X < expr\nend",
  1083. "RawParseTree" => [:class,
  1084. :X,
  1085. [:vcall, :expr],
  1086. [:scope]],
  1087. "ParseTree" => s(:class,
  1088. :X,
  1089. s(:call, nil, :expr, s(:arglist)),
  1090. s(:scope)))
  1091. add_tests("class_super_object",
  1092. "Ruby" => "class X < Object\nend",
  1093. "RawParseTree" => [:class,
  1094. :X,
  1095. [:const, :Object],
  1096. [:scope]],
  1097. "ParseTree" => s(:class,
  1098. :X,
  1099. s(:const, :Object),
  1100. s(:scope)))
  1101. add_tests("colon2",
  1102. "Ruby" => "X::Y",
  1103. "RawParseTree" => [:colon2, [:const, :X], :Y],
  1104. "ParseTree" => s(:colon2, s(:const, :X), :Y))
  1105. add_tests("colon3",
  1106. "Ruby" => "::X",
  1107. "RawParseTree" => [:colon3, :X],
  1108. "ParseTree" => s(:colon3, :X))
  1109. add_tests("const",
  1110. "Ruby" => "X",
  1111. "RawParseTree" => [:const, :X],
  1112. "ParseTree" => s(:const, :X))
  1113. add_tests("constX",
  1114. "Ruby" => "X = 1",
  1115. "RawParseTree" => [:cdecl, :X, [:lit, 1]],
  1116. "ParseTree" => s(:cdecl, :X, s(:lit, 1)))
  1117. add_tests("constY",
  1118. "Ruby" => "::X = 1",
  1119. "RawParseTree" => [:cdecl, [:colon3, :X], [:lit, 1]],
  1120. "ParseTree" => s(:cdecl, s(:colon3, :X), s(:lit, 1)))
  1121. add_tests("constZ",
  1122. "Ruby" => "X::Y = 1",
  1123. "RawParseTree" => [:cdecl, [:colon2, [:const, :X], :Y], [:lit, 1]],
  1124. "ParseTree" => s(:cdecl,
  1125. s(:colon2, s(:const, :X), :Y),
  1126. s(:lit, 1)))
  1127. add_tests("cvar",
  1128. "Ruby" => "@@x",
  1129. "RawParseTree" => [:cvar, :@@x],
  1130. "ParseTree" => s(:cvar, :@@x))
  1131. add_tests("cvasgn",
  1132. "Ruby" => "def x\n @@blah = 1\nend",
  1133. "RawParseTree" => [:defn, :x,
  1134. [:scope,
  1135. [:block, [:args],
  1136. [:cvasgn, :@@blah, [:lit, 1]]]]],
  1137. "ParseTree" => s(:defn, :x,
  1138. s(:args),
  1139. s(:scope,
  1140. s(:block,
  1141. s(:cvasgn, :@@blah, s(:lit, 1))))))
  1142. add_tests("cvasgn_cls_method",
  1143. "Ruby" => "def self.quiet_mode=(boolean)\n @@quiet_mode = boolean\nend",
  1144. "RawParseTree" => [:defs, [:self], :quiet_mode=,
  1145. [:scope,
  1146. [:block,
  1147. [:args, :boolean],
  1148. [:cvasgn, :@@quiet_mode, [:lvar, :boolean]]]]],
  1149. "ParseTree" => s(:defs, s(:self), :quiet_mode=,
  1150. s(:args, :boolean),
  1151. s(:scope,
  1152. s(:block,
  1153. s(:cvasgn, :@@quiet_mode,
  1154. s(:lvar, :boolean))))))
  1155. add_tests("cvdecl",
  1156. "Ruby" => "class X\n @@blah = 1\nend",
  1157. "RawParseTree" => [:class, :X, nil,
  1158. [:scope, [:cvdecl, :@@blah, [:lit, 1]]]],
  1159. "ParseTree" => s(:class, :X, nil,
  1160. s(:scope, s(:cvdecl, :@@blah, s(:lit, 1)))))
  1161. add_tests("dasgn_0",
  1162. "Ruby" => "a.each { |x| b.each { |y| x = (x + 1) } if true }",
  1163. "RawParseTree" => [:iter,
  1164. [:call, [:vcall, :a], :each],
  1165. [:dasgn_curr, :x],
  1166. [:if, [:true],
  1167. [:iter,
  1168. [:call, [:vcall, :b], :each],
  1169. [:dasgn_curr, :y],
  1170. [:dasgn, :x,
  1171. [:call, [:dvar, :x], :+,
  1172. [:array, [:lit, 1]]]]],
  1173. nil]],
  1174. "ParseTree" => s(:iter,
  1175. s(:call, s(:call, nil, :a, s(:arglist)), :each,
  1176. s(:arglist)),
  1177. s(:lasgn, :x),
  1178. s(:if, s(:true),
  1179. s(:iter,
  1180. s(:call, s(:call, nil, :b, s(:arglist)),
  1181. :each,
  1182. s(:arglist)),
  1183. s(:lasgn, :y),
  1184. s(:lasgn, :x,
  1185. s(:call, s(:lvar, :x), :+,
  1186. s(:arglist, s(:lit, 1))))),
  1187. nil)))
  1188. add_tests("dasgn_1",
  1189. "Ruby" => "a.each { |x| b.each { |y| c = (c + 1) } if true }",
  1190. "RawParseTree" => [:iter,
  1191. [:call, [:vcall, :a], :each],
  1192. [:dasgn_curr, :x],
  1193. [:if, [:true],
  1194. [:iter,
  1195. [:call, [:vcall, :b], :each],
  1196. [:dasgn_curr, :y],
  1197. [:dasgn_curr, :c,
  1198. [:call, [:dvar, :c], :+,
  1199. [:array, [:lit, 1]]]]],
  1200. nil]],
  1201. "ParseTree" => s(:iter,
  1202. s(:call, s(:call, nil, :a, s(:arglist)), :each,
  1203. s(:arglist)),
  1204. s(:lasgn, :x),
  1205. s(:if, s(:true),
  1206. s(:iter,
  1207. s(:call, s(:call, nil, :b, s(:arglist)),
  1208. :each,
  1209. s(:arglist)),
  1210. s(:lasgn, :y),
  1211. s(:lasgn, :c,
  1212. s(:call, s(:lvar, :c), :+,
  1213. s(:arglist, s(:lit, 1))))),
  1214. nil)))
  1215. add_tests("dasgn_2",
  1216. "Ruby" => "a.each do |x|\n if true then\n c = 0\n b.each { |y| c = (c + 1) }\n end\nend", # FIX: hate that extra newline!
  1217. "RawParseTree" => [:iter,
  1218. [:call, [:vcall, :a], :each],
  1219. [:dasgn_curr, :x],
  1220. [:if, [:true],
  1221. [:block,
  1222. [:dasgn_curr, :c, [:lit, 0]],
  1223. [:iter,
  1224. [:call, [:vcall, :b], :each],
  1225. [:dasgn_curr, :y],
  1226. [:dasgn, :c,
  1227. [:call, [:dvar, :c], :+,
  1228. [:array, [:lit, 1]]]]]],
  1229. nil]],
  1230. "ParseTree" => s(:iter,
  1231. s(:call, s(:call, nil, :a, s(:arglist)), :each,
  1232. s(:arglist)),
  1233. s(:lasgn, :x),
  1234. s(:if, s(:true),
  1235. s(:block,
  1236. s(:lasgn, :c, s(:lit, 0)),
  1237. s(:iter,
  1238. s(:call, s(:call, nil, :b, s(:arglist)),
  1239. :each,
  1240. s(:arglist)),
  1241. s(:lasgn, :y),
  1242. s(:lasgn, :c,
  1243. s(:call, s(:lvar, :c), :+,
  1244. s(:arglist, s(:lit, 1)))))),
  1245. nil)))
  1246. add_tests("dasgn_curr",
  1247. "Ruby" => "data.each do |x, y|\n a = 1\n b = a\n b = a = x\nend",
  1248. "RawParseTree" => [:iter,
  1249. [:call, [:vcall, :data], :each],
  1250. [:masgn,
  1251. [:array, [:dasgn_curr, :x], [:dasgn_curr, :y]],
  1252. nil, nil],
  1253. [:block,
  1254. [:dasgn_curr, :a, [:lit, 1]],
  1255. [:dasgn_curr, :b, [:dvar, :a]],
  1256. [:dasgn_curr, :b,
  1257. [:dasgn_curr, :a, [:dvar, :x]]]]],
  1258. "ParseTree" => s(:iter,
  1259. s(:call, s(:call, nil, :data,
  1260. s(:arglist)), :each, s(:arglist)),
  1261. s(:masgn,
  1262. s(:array, s(:lasgn, :x), s(:lasgn, :y))),
  1263. s(:block,
  1264. s(:lasgn, :a, s(:lit, 1)),
  1265. s(:lasgn, :b, s(:lvar, :a)),
  1266. s(:lasgn, :b, s(:lasgn, :a, s(:lvar, :x))))))
  1267. add_tests("dasgn_icky",
  1268. "Ruby" => "a do\n v = nil\n assert_block(full_message) do\n begin\n yield\n rescue Exception => v\n break\n end\n end\nend",
  1269. "RawParseTree" => [:iter,
  1270. [:fcall, :a],
  1271. nil,
  1272. [:block,
  1273. [:dasgn_curr, :v, [:nil]],
  1274. [:iter,
  1275. [:fcall, :assert_block,
  1276. [:array, [:vcall, :full_message]]],
  1277. nil,
  1278. [:rescue,
  1279. [:yield],
  1280. [:resbody,
  1281. [:array, [:const, :Exception]],
  1282. [:block,
  1283. [:dasgn, :v,
  1284. [:gvar, :$!]], [:break]]]]]]],
  1285. "ParseTree" => s(:iter,
  1286. s(:call, nil, :a, s(:arglist)),
  1287. nil,
  1288. s(:block,
  1289. s(:lasgn, :v, s(:nil)),
  1290. s(:iter,
  1291. s(:call, nil, :assert_block,
  1292. s(:arglist,
  1293. s(:call, nil, :full_message,
  1294. s(:arglist)))),
  1295. nil,
  1296. s(:rescue,
  1297. s(:yield),
  1298. s(:resbody,
  1299. s(:array,
  1300. s(:const, :Exception),
  1301. s(:lasgn, :v, s(:gvar, :$!))),
  1302. s(:break)))))))
  1303. add_tests("dasgn_mixed",
  1304. "Ruby" => "t = 0\nns.each { |n| t += n }\n",
  1305. "RawParseTree" => [:block,
  1306. [:lasgn, :t, [:lit, 0]],
  1307. [:iter,
  1308. [:call, [:vcall, :ns], :each],
  1309. [:dasgn_curr, :n],
  1310. [:lasgn, :t,
  1311. [:call, [:lvar, :t], :+,
  1312. [:array, [:dvar, :n]]]]]],
  1313. "ParseTree" => s(:block,
  1314. s(:lasgn, :t, s(:lit, 0)),
  1315. s(:iter,
  1316. s(:call, s(:call, nil, :ns,
  1317. s(:arglist)), :each, s(:arglist)),
  1318. s(:lasgn, :n),
  1319. s(:lasgn, :t,
  1320. s(:call, s(:lvar, :t), :+,
  1321. s(:arglist, s(:lvar, :n)))))),
  1322. "Ruby2Ruby" => "t = 0\nns.each { |n| t = (t + n) }\n")
  1323. add_tests("defined",
  1324. "Ruby" => "defined? $x",
  1325. "RawParseTree" => [:defined, [:gvar, :$x]],
  1326. "ParseTree" => s(:defined, s(:gvar, :$x)))
  1327. # TODO: make all the defn_args* p their arglist
  1328. add_tests("defn_args_block",
  1329. "Ruby" => "def f(&block)\n # do nothing\nend",
  1330. "RawParseTree" => [:defn, :f,
  1331. [:scope,
  1332. [:block,
  1333. [:args],
  1334. [:block_arg, :block],
  1335. [:nil]]]],
  1336. "ParseTree" => s(:defn, :f,
  1337. s(:args, :"&block"),
  1338. s(:scope, s(:block, s(:nil)))))
  1339. add_tests("defn_args_mand",
  1340. "Ruby" => "def f(mand)\n # do nothing\nend",
  1341. "RawParseTree" => [:defn, :f,
  1342. [:scope,
  1343. [:block,
  1344. [:args, :mand],
  1345. [:nil]]]],
  1346. "ParseTree" => s(:defn, :f,
  1347. s(:args, :mand),
  1348. s(:scope, s(:block, s(:nil)))))
  1349. add_tests("defn_args_mand_block",
  1350. "Ruby" => "def f(mand, &block)\n # do nothing\nend",
  1351. "RawParseTree" => [:defn, :f,
  1352. [:scope,
  1353. [:block,
  1354. [:args, :mand],
  1355. [:block_arg, :block],
  1356. [:nil]]]],
  1357. "ParseTree" => s(:defn, :f,
  1358. s(:args, :mand, :"&block"),
  1359. s(:scope, s(:block, s(:nil)))))
  1360. add_tests("defn_args_mand_opt",
  1361. "Ruby" => "def f(mand, opt = 42)\n # do nothing\nend",
  1362. "RawParseTree" => [:defn, :f,
  1363. [:scope,
  1364. [:block,
  1365. [:args, :mand, :opt,
  1366. [:block,
  1367. [:lasgn, :opt, [:lit, 42]]]],
  1368. [:nil]]]],
  1369. "ParseTree" => s(:defn, :f,
  1370. s(:args, :mand, :opt,
  1371. s(:block,
  1372. s(:lasgn, :opt, s(:lit, 42)))),
  1373. s(:scope, s(:block, s(:nil)))))
  1374. add_tests("defn_args_mand_opt_block",
  1375. "Ruby" => "def f(mand, opt = 42, &block)\n # do nothing\nend",
  1376. "RawParseTree" => [:defn, :f,
  1377. [:scope,
  1378. [:block,
  1379. [:args, :mand, :opt,
  1380. [:block,
  1381. [:lasgn, :opt, [:lit, 42]]]],
  1382. [:block_arg, :block],
  1383. [:nil]]]],
  1384. "ParseTree" => s(:defn, :f,
  1385. s(:args, :mand, :opt, :"&block",
  1386. s(:block,
  1387. s(:lasgn, :opt, s(:lit, 42)))),
  1388. s(:scope, s(:block, s(:nil)))))
  1389. add_tests("defn_args_mand_opt_splat",
  1390. "Ruby" => "def f(mand, opt = 42, *rest)\n # do nothing\nend",
  1391. "RawParseTree" => [:defn, :f,
  1392. [:scope,
  1393. [:block,
  1394. [:args, :mand, :opt, :"*rest",
  1395. [:block,
  1396. [:lasgn, :opt, [:lit, 42]]]],
  1397. [:nil]]]],
  1398. "ParseTree" => s(:defn, :f,
  1399. s(:args, :mand, :opt, :"*rest",
  1400. s(:block,
  1401. s(:lasgn, :opt, s(:lit, 42)))),
  1402. s(:scope, s(:block, s(:nil)))))
  1403. add_tests("defn_args_mand_opt_splat_block",
  1404. "Ruby" => "def f(mand, opt = 42, *rest, &block)\n # do nothing\nend",
  1405. "RawParseTree" => [:defn, :f,
  1406. [:scope,
  1407. [:block,
  1408. [:args, :mand, :opt, :"*rest",
  1409. [:block,
  1410. [:lasgn, :opt, [:lit, 42]]]],
  1411. [:block_arg, :block],
  1412. [:nil]]]],
  1413. "ParseTree" => s(:defn, :f,
  1414. s(:args, :mand, :opt, :"*rest", :"&block",
  1415. s(:block,
  1416. s(:lasgn, :opt, s(:lit, 42)))),
  1417. s(:scope, s(:block, s(:nil)))))
  1418. add_tests("defn_args_mand_opt_splat_no_name",
  1419. "Ruby" => "def x(a, b = 42, *)\n # do nothing\nend",
  1420. "RawParseTree" => [:defn, :x,
  1421. [:scope,
  1422. [:block,
  1423. [:args, :a, :b, :"*",
  1424. [:block, [:lasgn, :b, [:lit, 42]]]],
  1425. [:nil]]]],
  1426. "ParseTree" => s(:defn, :x,
  1427. s(:args, :a, :b, :"*",
  1428. s(:block, s(:lasgn, :b, s(:lit, 42)))),
  1429. s(:scope,
  1430. s(:block,
  1431. s(:nil)))))
  1432. add_tests("defn_args_mand_splat",
  1433. "Ruby" => "def f(mand, *rest)\n # do nothing\nend",
  1434. "RawParseTree" => [:defn, :f,
  1435. [:scope,
  1436. [:block,
  1437. [:args, :mand, :"*rest"],
  1438. [:nil]]]],
  1439. "ParseTree" => s(:defn, :f,
  1440. s(:args, :mand, :"*rest"),
  1441. s(:scope, s(:block, s(:nil)))))
  1442. add_tests("defn_args_mand_splat_block",
  1443. "Ruby" => "def f(mand, *rest, &block)\n # do nothing\nend",
  1444. "RawParseTree" => [:defn, :f,
  1445. [:scope,
  1446. [:block,
  1447. [:args, :mand, :"*rest"],
  1448. [:block_arg, :block],
  1449. [:nil]]]],
  1450. "ParseTree" => s(:defn, :f,
  1451. s(:args, :mand, :"*rest", :"&block"),
  1452. s(:scope, s(:block, s(:nil)))))
  1453. add_tests("defn_args_mand_splat_no_name",
  1454. "Ruby" => "def x(a, *args)\n p(a, args)\nend",
  1455. "RawParseTree" => [:defn, :x,
  1456. [:scope,
  1457. [:block,
  1458. [:args, :a, :"*args"],
  1459. [:fcall, :p,
  1460. [:array, [:lvar, :a], [:lvar, :args]]]]]],
  1461. "ParseTree" => s(:defn, :x,
  1462. s(:args, :a, :"*args"),
  1463. s(:scope,
  1464. s(:block,
  1465. s(:call, nil, :p,
  1466. s(:arglist, s(:lvar, :a), s(:lvar, :args)))))))
  1467. add_tests("defn_args_none",
  1468. "Ruby" => "def empty\n # do nothing\nend",
  1469. "RawParseTree" => [:defn, :empty,
  1470. [:scope, [:block, [:args], [:nil]]]],
  1471. "ParseTree" => s(:defn, :empty,
  1472. s(:args),
  1473. s(:scope, s(:block, s(:nil)))))
  1474. add_tests("defn_args_opt",
  1475. "Ruby" => "def f(opt = 42)\n # do nothing\nend",
  1476. "RawParseTree" => [:defn, :f,
  1477. [:scope,
  1478. [:block,
  1479. [:args, :opt,
  1480. [:block,
  1481. [:lasgn, :opt, [:lit, 42]]]],
  1482. [:nil]]]],
  1483. "ParseTree" => s(:defn, :f,
  1484. s(:args, :opt,
  1485. s(:block,
  1486. s(:lasgn, :opt, s(:lit, 42)))),
  1487. s(:scope, s(:block, s(:nil)))))
  1488. add_tests("defn_args_opt_block",
  1489. "Ruby" => "def f(opt = 42, &block)\n # do nothing\nend",
  1490. "RawParseTree" => [:defn, :f,
  1491. [:scope,
  1492. [:block,
  1493. [:args, :opt,
  1494. [:block,
  1495. [:lasgn, :opt, [:lit, 42]]]],
  1496. [:block_arg, :block],
  1497. [:nil]]]],
  1498. "ParseTree" => s(:defn, :f,
  1499. s(:args, :opt, :"&block",
  1500. s(:block,
  1501. s(:lasgn, :opt, s(:lit, 42)))),
  1502. s(:scope, s(:block, s(:nil)))))
  1503. add_tests("defn_args_opt_splat",
  1504. "Ruby" => "def f(opt = 42, *rest)\n # do nothing\nend",
  1505. "RawParseTree" => [:defn, :f,
  1506. [:scope,
  1507. [:block,
  1508. [:args, :opt, :"*rest",
  1509. [:block,
  1510. [:lasgn, :opt, [:lit, 42]]]],
  1511. [:nil]]]],
  1512. "ParseTree" => s(:defn, :f,
  1513. s(:args, :opt, :"*rest",
  1514. s(:block,
  1515. s(:lasgn, :opt, s(:lit, 42)))),
  1516. s(:scope, s(:block, s(:nil)))))
  1517. add_tests("defn_args_opt_splat_block",
  1518. "Ruby" => "def f(opt = 42, *rest, &block)\n # do nothing\nend",
  1519. "RawParseTree" => [:defn, :f,
  1520. [:scope,
  1521. [:block,
  1522. [:args, :opt, :"*rest",
  1523. [:block,
  1524. [:lasgn, :opt, [:lit, 42]]]],
  1525. [:block_arg, :block],
  1526. [:nil]]]],
  1527. "ParseTree" => s(:defn, :f,
  1528. s(:args, :opt, :"*rest", :"&block",
  1529. s(:block,
  1530. s(:lasgn, :opt, s(:lit, 42)))),
  1531. s(:scope, s(:block, s(:nil)))))
  1532. add_tests("defn_args_opt_splat_no_name",
  1533. "Ruby" => "def x(b = 42, *)\n # do nothing\nend",
  1534. "RawParseTree" => [:defn, :x,
  1535. [:scope,
  1536. [:block,
  1537. [:args, :b, :"*",
  1538. [:block, [:lasgn, :b, [:lit, 42]]]],
  1539. [:nil]]]],
  1540. "ParseTree" => s(:defn, :x,
  1541. s(:args, :b, :"*",
  1542. s(:block, s(:lasgn, :b, s(:lit, 42)))),
  1543. s(:scope,
  1544. s(:block,
  1545. s(:nil)))))
  1546. add_tests("defn_args_splat",
  1547. "Ruby" => "def f(*rest)\n # do nothing\nend",
  1548. "RawParseTree" => [:defn, :f,
  1549. [:scope,
  1550. [:block,
  1551. [:args, :"*rest"],
  1552. [:nil]]]],
  1553. "ParseTree" => s(:defn, :f,
  1554. s(:args, :"*rest"),
  1555. s(:scope, s(:block, s(:nil)))))
  1556. add_tests("defn_args_splat_no_name",
  1557. "Ruby" => "def x(*)\n # do nothing\nend",
  1558. "RawParseTree" => [:defn, :x,
  1559. [:scope,
  1560. [:block,
  1561. [:args, :"*"],
  1562. [:nil]]]],
  1563. "ParseTree" => s(:defn, :x,
  1564. s(:args, :"*"),
  1565. s(:scope,
  1566. s(:block,
  1567. s(:nil)))))
  1568. add_tests("defn_or",
  1569. "Ruby" => "def |(o)\n # do nothing\nend",
  1570. "RawParseTree" => [:defn, :|,
  1571. [:scope, [:block, [:args, :o], [:nil]]]],
  1572. "ParseTree" => s(:defn, :|,
  1573. s(:args, :o),
  1574. s(:scope, s(:block, s(:nil)))))
  1575. add_tests("defn_rescue",
  1576. "Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid)\nrescue\n false\nend",
  1577. "RawParseTree" => [:defn, :eql?,
  1578. [:scope,
  1579. [:block,
  1580. [:args, :resource],
  1581. [:rescue,
  1582. [:call,
  1583. [:call, [:self], :uuid],
  1584. :==,
  1585. [:array,
  1586. [:call, [:lvar, :resource], :uuid]]],
  1587. [:resbody, nil, [:false]]]]]],
  1588. "ParseTree" => s(:defn, :eql?,
  1589. s(:args, :resource),
  1590. s(:scope,
  1591. s(:block,
  1592. s(:rescue,
  1593. s(:call,
  1594. s(:call, s(:self), :uuid, s(:arglist)),
  1595. :==,
  1596. s(:arglist,
  1597. s(:call, s(:lvar, :resource),
  1598. :uuid, s(:arglist)))),
  1599. s(:resbody, s(:array), s(:false)))))),
  1600. "Ruby2Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid) rescue false\nend")
  1601. add_tests("defn_rescue_mri_verbose_flag",
  1602. "Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid)\nrescue\n false\nend",
  1603. "RawParseTree" => [:defn, :eql?,
  1604. [:scope,
  1605. [:block,
  1606. [:args, :resource],
  1607. [:rescue,
  1608. [:call,
  1609. [:call, [:self], :uuid],
  1610. :==,
  1611. [:array,
  1612. [:call, [:lvar, :resource], :uuid]]],
  1613. [:resbody, nil, [:false]]]]]],
  1614. "ParseTree" => s(:defn, :eql?,
  1615. s(:args, :resource),
  1616. s(:scope,
  1617. s(:block,
  1618. s(:rescue,
  1619. s(:call,
  1620. s(:call, s(:self), :uuid, s(:arglist)),
  1621. :==,
  1622. s(:arglist,
  1623. s(:call, s(:lvar, :resource),
  1624. :uuid, s(:arglist)))),
  1625. s(:resbody, s(:array), s(:false)))))),
  1626. "Ruby2Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid) rescue false\nend")
  1627. add_tests("defn_something_eh",
  1628. "Ruby" => "def something?\n # do nothing\nend",
  1629. "RawParseTree" => [:defn, :something?,
  1630. [:scope, [:block, [:args], [:nil]]]],
  1631. "ParseTree" => s(:defn, :something?,
  1632. s(:args),
  1633. s(:scope, s(:block, s(:nil)))))
  1634. add_tests("defn_splat_no_name",
  1635. "Ruby" => "def x(a, *)\n p(a)\nend",
  1636. "RawParseTree" => [:defn, :x,
  1637. [:scope,
  1638. [:block,
  1639. [:args, :a, :"*"],
  1640. [:fcall, :p,
  1641. [:array, [:lvar, :a]]]]]],
  1642. "ParseTree" => s(:defn, :x,
  1643. s(:args, :a, :"*"),
  1644. s(:scope,
  1645. s(:block,
  1646. s(:call, nil, :p,
  1647. s(:arglist, s(:lvar, :a)))))))
  1648. add_tests("defn_zarray",
  1649. "Ruby" => "def zarray\n a = []\n return a\nend",
  1650. "RawParseTree" => [:defn, :zarray,
  1651. [:scope,
  1652. [:block, [:args],
  1653. [:lasgn, :a, [:zarray]],
  1654. [:return, [:lvar, :a]]]]],
  1655. "ParseTree" => s(:defn, :zarray,
  1656. s(:args),
  1657. s(:scope,
  1658. s(:block,
  1659. s(:lasgn, :a, s(:array)),
  1660. s(:return, s(:lvar, :a))))))
  1661. add_tests("defs",
  1662. "Ruby" => "def self.x(y)\n (y + 1)\nend",
  1663. "RawParseTree" => [:defs, [:self], :x,
  1664. [:scope,
  1665. [:block,
  1666. [:args, :y],
  1667. [:call, [:lvar, :y], :+,
  1668. [:array, [:lit, 1]]]]]],
  1669. "ParseTree" => s(:defs, s(:self), :x,
  1670. s(:args, :y),
  1671. s(:scope,
  1672. s(:block,
  1673. s(:call, s(:lvar, :y), :+,
  1674. s(:arglist, s(:lit, 1)))))))
  1675. add_tests("defs_empty",
  1676. "Ruby" => "def self.empty\n # do nothing\nend",
  1677. "RawParseTree" => [:defs, [:self], :empty,
  1678. [:scope, [:args]]],
  1679. "ParseTree" => s(:defs, s(:self), :empty,
  1680. s(:args),
  1681. s(:scope, s(:block))))
  1682. add_tests("defs_empty_args",
  1683. "Ruby" => "def self.empty(*)\n # do nothing\nend",
  1684. "RawParseTree" => [:defs, [:self], :empty,
  1685. [:scope, [:args, :*]]],
  1686. "ParseTree" => s(:defs, s(:self), :empty,
  1687. s(:args, :*),
  1688. s(:scope, s(:block))))
  1689. add_tests("defs_expr_wtf",
  1690. "Ruby" => "def (a.b).empty(*)\n # do nothing\nend",
  1691. "RawParseTree" => [:defs,
  1692. [:call, [:vcall, :a], :b],
  1693. :empty,
  1694. [:scope, [:args, :*]]],
  1695. "ParseTree" => s(:defs,
  1696. s(:call,
  1697. s(:call, nil, :a, s(:arglist)),
  1698. :b, s(:arglist)),
  1699. :empty,
  1700. s(:args, :*),
  1701. s(:scope, s(:block))))
  1702. add_tests("dmethod",
  1703. "Ruby" => [Examples, :dmethod_added],
  1704. "RawParseTree" => [:defn, :dmethod_added,
  1705. [:dmethod,
  1706. :a_method,
  1707. [:scope,
  1708. [:block,
  1709. [:args, :x],
  1710. [:call, [:lvar, :x], :+,
  1711. [:array, [:lit, 1]]]]]]],
  1712. "ParseTree" => s(:defn, :dmethod_added,
  1713. s(:args, :x),
  1714. s(:scope,
  1715. s(:block,
  1716. s(:call, s(:lvar, :x), :+,
  1717. s(:arglist, s(:lit, 1)))))),
  1718. "Ruby2Ruby" => "def dmethod_added(x)\n (x + 1)\nend")
  1719. add_tests("dot2",
  1720. "Ruby" => "(a..b)",
  1721. "RawParseTree" => [:dot2, [:vcall, :a], [:vcall, :b]],
  1722. "ParseTree" => s(:dot2,
  1723. s(:call, nil, :a, s(:arglist)),
  1724. s(:call, nil, :b, s(:arglist))))
  1725. add_tests("dot3",
  1726. "Ruby" => "(a...b)",
  1727. "RawParseTree" => [:dot3, [:vcall, :a], [:vcall, :b]],
  1728. "ParseTree" => s(:dot3,
  1729. s(:call, nil, :a, s(:arglist)),
  1730. s(:call, nil, :b, s(:arglist))))
  1731. add_tests("dregx",
  1732. "Ruby" => "/x#\{(1 + 1)}y/",
  1733. "RawParseTree" => [:dregx, "x",
  1734. [:evstr,
  1735. [:call, [:lit, 1], :+, [:array, [:lit, 1]]]],
  1736. [:str, "y"]],
  1737. "ParseTree" => s(:dregx, "x",
  1738. s(:evstr,
  1739. s(:call, s(:lit, 1), :+,
  1740. s(:arglist, s(:lit, 1)))),
  1741. s(:str, "y")))
  1742. add_tests("dregx_interp",
  1743. "Ruby" => "/#\{@rakefile}/",
  1744. "RawParseTree" => [:dregx, '', [:evstr, [:ivar, :@rakefile]]],
  1745. "ParseTree" => s(:dregx, '', s(:evstr, s(:ivar, :@rakefile))))
  1746. add_tests("dregx_interp_empty",
  1747. "Ruby" => "/a#\{}b/",
  1748. "RawParseTree" => [:dregx, 'a', [:evstr], [:str, "b"]],
  1749. "ParseTree" => s(:dregx, 'a', s(:evstr), s(:str, "b")))
  1750. add_tests("dregx_n",
  1751. "Ruby" => '/#{1}/n',
  1752. "RawParseTree" => [:dregx, '', [:evstr, [:lit, 1]], /x/n.options],
  1753. "ParseTree" => s(:dregx, '',
  1754. s(:evstr, s(:lit, 1)), /x/n.options),
  1755. "Ruby2Ruby" => "/#\{1}/") # HACK - need to support regexp flag
  1756. add_tests("dregx_once",
  1757. "Ruby" => "/x#\{(1 + 1)}y/o",
  1758. "RawParseTree" => [:dregx_once, "x",
  1759. [:evstr,
  1760. [:call, [:lit, 1], :+, [:array, [:lit, 1]]]],
  1761. [:str, "y"]],
  1762. "ParseTree" => s(:dregx_once, "x",
  1763. s(:evstr,
  1764. s(:call, s(:lit, 1), :+,
  1765. s(:arglist, s(:lit, 1)))),
  1766. s(:str, "y")))
  1767. add_tests("dregx_once_n_interp",
  1768. "Ruby" => "/#\{IAC}#\{SB}/no",
  1769. "RawParseTree" => [:dregx_once, '',
  1770. [:evstr, [:const, :IAC]],
  1771. [:evstr, [:const, :SB]], /x/n.options],
  1772. "ParseTree" => s(:dregx_once, '',
  1773. s(:evstr, s(:const, :IAC)),
  1774. s(:evstr, s(:const, :SB)), /x/n.options),
  1775. "Ruby2Ruby" => "/#\{IAC}#\{SB}/o") # HACK
  1776. add_tests("dstr",
  1777. "Ruby" => "argl = 1\n\"x#\{argl}y\"\n",
  1778. "RawParseTree" => [:block,
  1779. [:lasgn, :argl, [:lit, 1]],
  1780. [:dstr, "x", [:evstr, [:lvar, :argl]],
  1781. [:str, "y"]]],
  1782. "ParseTree" => s(:block,
  1783. s(:lasgn, :argl, s(:lit, 1)),
  1784. s(:dstr, "x", s(:evstr, s(:lvar, :argl)),
  1785. s(:str, "y"))))
  1786. add_tests("dstr_2",
  1787. "Ruby" => "argl = 1\n\"x#\{(\"%.2f\" % 3.14159)}y\"\n",
  1788. "RawParseTree" => [:block,
  1789. [:lasgn, :argl, [:lit, 1]],
  1790. [:dstr,
  1791. "x",
  1792. [:evstr,
  1793. [:call, [:str, "%.2f"], :%,
  1794. [:array, [:lit, 3.14159]]]],
  1795. [:str, "y"]]],
  1796. "ParseTree" => s(:block,
  1797. s(:lasgn, :argl, s(:lit, 1)),
  1798. s(:dstr,
  1799. "x",
  1800. s(:evstr,
  1801. s(:call, s(:str, "%.2f"), :%,
  1802. s(:arglist, s(:lit, 3.14159)))),
  1803. s(:str, "y"))))
  1804. add_tests("dstr_3",
  1805. "Ruby" => "max = 2\nargl = 1\n\"x#\{(\"%.#\{max}f\" % 3.14159)}y\"\n",
  1806. "RawParseTree" => [:block,
  1807. [:lasgn, :max, [:lit, 2]],
  1808. [:lasgn, :argl, [:lit, 1]],
  1809. [:dstr, "x",
  1810. [:evstr,
  1811. [:call,
  1812. [:dstr, "%.",
  1813. [:evstr, [:lvar, :max]],
  1814. [:str, "f"]],
  1815. :%,
  1816. [:array, [:lit, 3.14159]]]],
  1817. [:str, "y"]]],
  1818. "ParseTree" => s(:block,
  1819. s(:lasgn, :max, s(:lit, 2)),
  1820. s(:lasgn, :argl, s(:lit, 1)),
  1821. s(:dstr, "x",
  1822. s(:evstr,
  1823. s(:call,
  1824. s(:dstr, "%.",
  1825. s(:evstr, s(:lvar, :max)),
  1826. s(:str, "f")),
  1827. :%,
  1828. s(:arglist, s(:lit, 3.14159)))),
  1829. s(:str, "y"))))
  1830. add_tests("dstr_concat",
  1831. "Ruby" => '"#{22}aa" "cd#{44}" "55" "#{66}"',
  1832. "RawParseTree" => [:dstr,
  1833. "",
  1834. [:evstr, [:lit, 22]],
  1835. [:str, "aa"],
  1836. [:str, "cd"],
  1837. [:evstr, [:lit, 44]],
  1838. [:str, "55"],
  1839. [:evstr, [:lit, 66]]],
  1840. "ParseTree" => s(:dstr,
  1841. "",
  1842. s(:evstr, s(:lit, 22)),
  1843. s(:str, "aa"),
  1844. s(:str, "cd"),
  1845. s(:evstr, s(:lit, 44)),
  1846. s(:str, "55"),
  1847. s(:evstr, s(:lit, 66))),
  1848. "Ruby2Ruby" => '"#{22}aacd#{44}55#{66}"')
  1849. add_tests("dstr_gross",
  1850. "Ruby" => '"a #$global b #@ivar c #@@cvar d"',
  1851. "RawParseTree" => [:dstr, "a ",
  1852. [:evstr, [:gvar, :$global]],
  1853. [:str, " b "],
  1854. [:evstr, [:ivar, :@ivar]],
  1855. [:str, " c "],
  1856. [:evstr, [:cvar, :@@cvar]],
  1857. [:str, " d"]],
  1858. "ParseTree" => s(:dstr, "a ",
  1859. s(:evstr, s(:gvar, :$global)),
  1860. s(:str, " b "),
  1861. s(:evstr, s(:ivar, :@ivar)),
  1862. s(:str, " c "),
  1863. s(:evstr, s(:cvar, :@@cvar)),
  1864. s(:str, " d")),
  1865. "Ruby2Ruby" => '"a #{$global} b #{@ivar} c #{@@cvar} d"')
  1866. add_tests("dstr_heredoc_expand",
  1867. "Ruby" => "<<EOM\n blah\n#\{1 + 1}blah\nEOM\n",
  1868. "RawParseTree" => [:dstr, " blah\n",
  1869. [:evstr, [:call, [:lit, 1], :+,
  1870. [:array, [:lit, 1]]]],
  1871. [:str, "blah\n"]],
  1872. "ParseTree" => s(:dstr, " blah\n",
  1873. s(:evstr, s(:call, s(:lit, 1), :+,
  1874. s(:arglist, s(:lit, 1)))),
  1875. s(:str, "blah\n")),
  1876. "Ruby2Ruby" => "\" blah\\n#\{(1 + 1)}blah\\n\"")
  1877. add_tests("dstr_heredoc_windoze_sucks",
  1878. "Ruby" => "<<-EOF\r\ndef test_#\{action}_valid_feed\r\n EOF\r\n",
  1879. "RawParseTree" => [:dstr,
  1880. 'def test_',
  1881. [:evstr, [:vcall, :action]],
  1882. [:str, "_valid_feed\n"]],
  1883. "ParseTree" => s(:dstr,
  1884. 'def test_',
  1885. s(:evstr, s(:call, nil, :action, s(:arglist))),
  1886. s(:str, "_valid_feed\n")),
  1887. "Ruby2Ruby" => "\"def test_#\{action}_valid_feed\\n\"")
  1888. add_tests("dstr_heredoc_yet_again",
  1889. "Ruby" => "<<-EOF\ns1 '#\{RUBY_PLATFORM}' s2\n#\{__FILE__}\n EOF\n",
  1890. "RawParseTree" => [:dstr, "s1 '",
  1891. [:evstr, [:const, :RUBY_PLATFORM]],
  1892. [:str, "' s2\n"],
  1893. [:str, "(string)"],
  1894. [:str, "\n"]],
  1895. "ParseTree" => s(:dstr, "s1 '",
  1896. s(:evstr, s(:const, :RUBY_PLATFORM)),
  1897. s(:str, "' s2\n"),
  1898. s(:str, "(string)"),
  1899. s(:str, "\n")),
  1900. "Ruby2Ruby" => "\"s1 '#\{RUBY_PLATFORM}' s2\\n(string)\\n\"")
  1901. add_tests("dstr_nest",
  1902. "Ruby" => "%Q[before [#\{nest}] after]",
  1903. "RawParseTree" => [:dstr, "before [",
  1904. [:evstr, [:vcall, :nest]], [:str, "] after"]],
  1905. "ParseTree" => s(:dstr, "before [",
  1906. s(:evstr, s(:call, nil, :nest, s(:arglist))),
  1907. s(:str, "] after")),
  1908. "Ruby2Ruby" => "\"before [#\{nest}] after\"")
  1909. add_tests("dstr_str_lit_start",
  1910. "Ruby" => '"#{"blah"}#{__FILE__}:#{__LINE__}: warning: #{$!.message} (#{$!.class})"',
  1911. "RawParseTree" => [:dstr,
  1912. "blah(string):",
  1913. [:evstr, [:lit, 1]],
  1914. [:str, ": warning: "],
  1915. [:evstr, [:call, [:gvar, :$!], :message]],
  1916. [:str, " ("],
  1917. [:evstr, [:call, [:gvar, :$!], :class]],
  1918. [:str, ")"]],
  1919. "ParseTree" => s(:dstr,
  1920. "blah(string):",
  1921. s(:evstr, s(:lit, 1)),
  1922. s(:str, ": warning: "),
  1923. s(:evstr, s(:call, s(:gvar, :$!), :message,
  1924. s(:arglist))),
  1925. s(:str, " ("),
  1926. s(:evstr, s(:call, s(:gvar, :$!), :class,
  1927. s(:arglist))),
  1928. s(:str, ")")),
  1929. "Ruby2Ruby" => '"blah(string):#{1}: warning: #{$!.message} (#{$!.class})"')
  1930. add_tests("dstr_the_revenge",
  1931. "Ruby" => '"before #{from} middle #{to} (#{__FILE__}:#{__LINE__})"',
  1932. "RawParseTree" => [:dstr,
  1933. "before ",
  1934. [:evstr, [:vcall, :from]],
  1935. [:str, " middle "],
  1936. [:evstr, [:vcall, :to]],
  1937. [:str, " ("],
  1938. [:str, "(string)"],
  1939. [:str, ":"],
  1940. [:evstr, [:lit, 1]],
  1941. [:str, ")"]],
  1942. "ParseTree" => s(:dstr,
  1943. "before ",
  1944. s(:evstr, s(:call, nil, :from, s(:arglist))),
  1945. s(:str, " middle "),
  1946. s(:evstr, s(:call, nil, :to, s(:arglist))),
  1947. s(:str, " ("),
  1948. s(:str, "(string)"),
  1949. s(:str, ":"),
  1950. s(:evstr, s(:lit, 1)),
  1951. s(:str, ")")),
  1952. "Ruby2Ruby" => '"before #{from} middle #{to} ((string):#{1})"')
  1953. add_tests("dsym",
  1954. "Ruby" => ":\"x#\{(1 + 1)}y\"",
  1955. "RawParseTree" => [:dsym, "x",
  1956. [:evstr, [:call, [:lit, 1], :+,
  1957. [:array, [:lit, 1]]]], [:str, "y"]],
  1958. "ParseTree" => s(:dsym, "x",
  1959. s(:evstr, s(:call, s(:lit, 1), :+,
  1960. s(:arglist, s(:lit, 1)))), s(:str, "y")))
  1961. add_tests("dxstr",
  1962. "Ruby" => "t = 5\n`touch #\{t}`\n",
  1963. "RawParseTree" => [:block,
  1964. [:lasgn, :t, [:lit, 5]],
  1965. [:dxstr, 'touch ', [:evstr, [:lvar, :t]]]],
  1966. "ParseTree" => s(:block,
  1967. s(:lasgn, :t, s(:lit, 5)),
  1968. s(:dxstr, 'touch ', s(:evstr, s(:lvar, :t)))))
  1969. add_tests("ensure",
  1970. "Ruby" => "begin\n (1 + 1)\nrescue SyntaxError => e1\n 2\nrescue Exception => e2\n 3\nelse\n 4\nensure\n 5\nend",
  1971. "RawParseTree" => [:ensure,
  1972. [:rescue,
  1973. [:call, [:lit, 1], :+, [:array, [:lit, 1]]],
  1974. [:resbody,
  1975. [:array, [:const, :SyntaxError]],
  1976. [:block,
  1977. [:lasgn, :e1, [:gvar, :$!]], [:lit, 2]],
  1978. [:resbody,
  1979. [:array, [:const, :Exception]],
  1980. [:block,
  1981. [:lasgn, :e2, [:gvar, :$!]], [:lit, 3]]]],
  1982. [:lit, 4]],
  1983. [:lit, 5]],
  1984. "ParseTree" => s(:ensure,
  1985. s(:rescue,
  1986. s(:call, s(:lit, 1), :+,
  1987. s(:arglist, s(:lit, 1))),
  1988. s(:resbody,
  1989. s(:array,
  1990. s(:const, :SyntaxError),
  1991. s(:lasgn, :e1, s(:gvar, :$!))),
  1992. s(:lit, 2)),
  1993. s(:resbody,
  1994. s(:array,
  1995. s(:const, :Exception),
  1996. s(:lasgn, :e2, s(:gvar, :$!))),
  1997. s(:lit, 3)),
  1998. s(:lit, 4)),
  1999. s(:lit, 5)))
  2000. add_tests("false",
  2001. "Ruby" => "false",
  2002. "RawParseTree" => [:false],
  2003. "ParseTree" => s(:false))
  2004. add_tests("fbody",
  2005. "Ruby" => [Examples, :an_alias],
  2006. "RawParseTree" => [:defn, :an_alias,
  2007. [:fbody,
  2008. [:scope,
  2009. [:block,
  2010. [:args, :x],
  2011. [:call, [:lvar, :x], :+,
  2012. [:array, [:lit, 1]]]]]]],
  2013. "ParseTree" => s(:defn, :an_alias,
  2014. s(:args, :x),
  2015. s(:scope,
  2016. s(:block,
  2017. s(:call, s(:lvar, :x), :+,
  2018. s(:arglist, s(:lit, 1)))))),
  2019. "Ruby2Ruby" => "def an_alias(x)\n (x + 1)\nend")
  2020. add_tests("fcall_arglist",
  2021. "Ruby" => "m(42)",
  2022. "RawParseTree" => [:fcall, :m, [:array, [:lit, 42]]],
  2023. "ParseTree" => s(:call, nil, :m, s(:arglist, s(:lit, 42))))
  2024. add_tests("fcall_arglist_hash",
  2025. "Ruby" => "m(:a => 1, :b => 2)",
  2026. "RawParseTree" => [:fcall, :m,
  2027. [:array,
  2028. [:hash,
  2029. [:lit, :a], [:lit, 1],
  2030. [:lit, :b], [:lit, 2]]]],
  2031. "ParseTree" => s(:call, nil, :m,
  2032. s(:arglist,
  2033. s(:hash,
  2034. s(:lit, :a), s(:lit, 1),
  2035. s(:lit, :b), s(:lit, 2)))))
  2036. add_tests("fcall_arglist_norm_hash",
  2037. "Ruby" => "m(42, :a => 1, :b => 2)",
  2038. "RawParseTree" => [:fcall, :m,
  2039. [:array,
  2040. [:lit, 42],
  2041. [:hash,
  2042. [:lit, :a], [:lit, 1],
  2043. [:lit, :b], [:lit, 2]]]],
  2044. "ParseTree" => s(:call, nil, :m,
  2045. s(:arglist,
  2046. s(:lit, 42),
  2047. s(:hash,
  2048. s(:lit, :a), s(:lit, 1),
  2049. s(:lit, :b), s(:lit, 2)))))
  2050. add_tests("fcall_arglist_norm_hash_splat",
  2051. "Ruby" => "m(42, :a => 1, :b => 2, *c)",
  2052. "RawParseTree" => [:fcall, :m,
  2053. [:argscat,
  2054. [:array,
  2055. [:lit, 42],
  2056. [:hash,
  2057. [:lit, :a], [:lit, 1],
  2058. [:lit, :b], [:lit, 2]]],
  2059. [:vcall, :c]]],
  2060. "ParseTree" => s(:call, nil, :m,
  2061. s(:arglist,
  2062. s(:lit, 42),
  2063. s(:hash,
  2064. s(:lit, :a), s(:lit, 1),
  2065. s(:lit, :b), s(:lit, 2)),
  2066. s(:splat, s(:call, nil, :c, s(:arglist))))))
  2067. add_tests("fcall_block",
  2068. "Ruby" => "a(:b) { :c }",
  2069. "RawParseTree" => [:iter,
  2070. [:fcall, :a, [:array, [:lit, :b]]], nil,
  2071. [:lit, :c]],
  2072. "ParseTree" => s(:iter,
  2073. s(:call, nil, :a,
  2074. s(:arglist, s(:lit, :b))), nil,
  2075. s(:lit, :c)))
  2076. add_tests("fcall_index_space",
  2077. "Ruby" => "a [42]",
  2078. "RawParseTree" => [:fcall, :a, [:array, [:array, [:lit, 42]]]],
  2079. "ParseTree" => s(:call, nil, :a,
  2080. s(:arglist, s(:array, s(:lit, 42)))),
  2081. "Ruby2Ruby" => "a([42])")
  2082. add_tests("fcall_keyword",
  2083. "Ruby" => "42 if block_given?",
  2084. "RawParseTree" => [:if, [:fcall, :block_given?], [:lit, 42], nil],
  2085. "ParseTree" => s(:if,
  2086. s(:call, nil, :block_given?, s(:arglist)),
  2087. s(:lit, 42), nil))
  2088. add_tests("flip2",
  2089. "Ruby" => "x = if ((i % 4) == 0)..((i % 3) == 0) then\n i\nelse\n nil\nend",
  2090. "RawParseTree" => [:lasgn,
  2091. :x,
  2092. [:if,
  2093. [:flip2,
  2094. [:call,
  2095. [:call, [:vcall, :i], :%,
  2096. [:array, [:lit, 4]]],
  2097. :==,
  2098. [:array, [:lit, 0]]],
  2099. [:call,
  2100. [:call, [:vcall, :i], :%,
  2101. [:array, [:lit, 3]]],
  2102. :==,
  2103. [:array, [:lit, 0]]]],
  2104. [:vcall, :i],
  2105. [:nil]]],
  2106. "ParseTree" => s(:lasgn,
  2107. :x,
  2108. s(:if,
  2109. s(:flip2,
  2110. s(:call,
  2111. s(:call, s(:call, nil, :i, s(:arglist)),
  2112. :%,
  2113. s(:arglist, s(:lit, 4))),
  2114. :==,
  2115. s(:arglist, s(:lit, 0))),
  2116. s(:call,
  2117. s(:call, s(:call, nil, :i, s(:arglist)),
  2118. :%,
  2119. s(:arglist, s(:lit, 3))),
  2120. :==,
  2121. s(:arglist, s(:lit, 0)))),
  2122. s(:call, nil, :i, s(:arglist)),
  2123. s(:nil))))
  2124. add_tests("flip2_method",
  2125. "Ruby" => "if 1..2.a?(b) then\n nil\nend",
  2126. "RawParseTree" => [:if,
  2127. [:flip2,
  2128. [:call, [:lit, 1], :==,
  2129. [:array, [:gvar, :$.]]],
  2130. [:call, [:lit, 2], :a?,
  2131. [:array, [:vcall, :b]]]],
  2132. [:nil],
  2133. nil],
  2134. "ParseTree" => s(:if,
  2135. s(:flip2,
  2136. s(:lit, 1),
  2137. s(:call, s(:lit, 2), :a?,
  2138. s(:arglist,
  2139. s(:call, nil, :b, s(:arglist))))),
  2140. s(:nil),
  2141. nil))
  2142. add_tests("flip3",
  2143. "Ruby" => "x = if ((i % 4) == 0)...((i % 3) == 0) then\n i\nelse\n nil\nend",
  2144. "RawParseTree" => [:lasgn,
  2145. :x,
  2146. [:if,
  2147. [:flip3,
  2148. [:call,
  2149. [:call, [:vcall, :i], :%,
  2150. [:array, [:lit, 4]]],
  2151. :==,
  2152. [:array, [:lit, 0]]],
  2153. [:call,
  2154. [:call, [:vcall, :i], :%,
  2155. [:array, [:lit, 3]]],
  2156. :==,
  2157. [:array, [:lit, 0]]]],
  2158. [:vcall, :i],
  2159. [:nil]]],
  2160. "ParseTree" => s(:lasgn,
  2161. :x,
  2162. s(:if,
  2163. s(:flip3,
  2164. s(:call,
  2165. s(:call, s(:call, nil, :i, s(:arglist)),
  2166. :%,
  2167. s(:arglist, s(:lit, 4))),
  2168. :==,
  2169. s(:arglist, s(:lit, 0))),
  2170. s(:call,
  2171. s(:call, s(:call, nil, :i, s(:arglist)),
  2172. :%,
  2173. s(:arglist, s(:lit, 3))),
  2174. :==,
  2175. s(:arglist, s(:lit, 0)))),
  2176. s(:call, nil, :i, s(:arglist)),
  2177. s(:nil))))
  2178. add_tests("for",
  2179. "Ruby" => "for o in ary do\n puts(o)\nend",
  2180. "RawParseTree" => [:for,
  2181. [:vcall, :ary],
  2182. [:lasgn, :o],
  2183. [:fcall, :puts, [:array, [:lvar, :o]]]],
  2184. "ParseTree" => s(:for,
  2185. s(:call, nil, :ary, s(:arglist)),
  2186. s(:lasgn, :o),
  2187. s(:call, nil, :puts,
  2188. s(:arglist, s(:lvar, :o)))))
  2189. add_tests("for_no_body",
  2190. "Ruby" => "for i in (0..max) do\n # do nothing\nend",
  2191. "RawParseTree" => [:for,
  2192. [:dot2, [:lit, 0], [:vcall, :max]],
  2193. [:lasgn, :i]],
  2194. "ParseTree" => s(:for,
  2195. s(:dot2,
  2196. s(:lit, 0),
  2197. s(:call, nil, :max, s(:arglist))),
  2198. s(:lasgn, :i)))
  2199. add_tests("gasgn",
  2200. "Ruby" => "$x = 42",
  2201. "RawParseTree" => [:gasgn, :$x, [:lit, 42]],
  2202. "ParseTree" => s(:gasgn, :$x, s(:lit, 42)))
  2203. add_tests("global",
  2204. "Ruby" => "$stderr",
  2205. "RawParseTree" => [:gvar, :$stderr],
  2206. "ParseTree" => s(:gvar, :$stderr))
  2207. add_tests("gvar",
  2208. "Ruby" => "$x",
  2209. "RawParseTree" => [:gvar, :$x],
  2210. "ParseTree" => s(:gvar, :$x))
  2211. add_tests("gvar_underscore",
  2212. "Ruby" => "$_",
  2213. "RawParseTree" => [:gvar, :$_],
  2214. "ParseTree" => s(:gvar, :$_))
  2215. add_tests("gvar_underscore_blah",
  2216. "Ruby" => "$__blah",
  2217. "RawParseTree" => [:gvar, :$__blah],
  2218. "ParseTree" => s(:gvar, :$__blah))
  2219. add_tests("hash",
  2220. "Ruby" => "{ 1 => 2, 3 => 4 }",
  2221. "RawParseTree" => [:hash,
  2222. [:lit, 1], [:lit, 2],
  2223. [:lit, 3], [:lit, 4]],
  2224. "ParseTree" => s(:hash,
  2225. s(:lit, 1), s(:lit, 2),
  2226. s(:lit, 3), s(:lit, 4)))
  2227. add_tests("hash_rescue",
  2228. "Ruby" => "{ 1 => (2 rescue 3) }",
  2229. "RawParseTree" => [:hash,
  2230. [:lit, 1],
  2231. [:rescue,
  2232. [:lit, 2],
  2233. [:resbody, nil, [:lit, 3]]]],
  2234. "ParseTree" => s(:hash,
  2235. s(:lit, 1),
  2236. s(:rescue,
  2237. s(:lit, 2),
  2238. s(:resbody, s(:array), s(:lit, 3)))))
  2239. add_tests("iasgn",
  2240. "Ruby" => "@a = 4",
  2241. "RawParseTree" => [:iasgn, :@a, [:lit, 4]],
  2242. "ParseTree" => s(:iasgn, :@a, s(:lit, 4)))
  2243. add_tests("if_block_condition",
  2244. "Ruby" => "if (x = 5\n(x + 1)) then\n nil\nend",
  2245. "RawParseTree" => [:if,
  2246. [:block,
  2247. [:lasgn, :x, [:lit, 5]],
  2248. [:call,
  2249. [:lvar, :x],
  2250. :+,
  2251. [:array, [:lit, 1]]]],
  2252. [:nil],
  2253. nil],
  2254. "ParseTree" => s(:if,
  2255. s(:block,
  2256. s(:lasgn, :x, s(:lit, 5)),
  2257. s(:call,
  2258. s(:lvar, :x),
  2259. :+,
  2260. s(:arglist, s(:lit, 1)))),
  2261. s(:nil),
  2262. nil))
  2263. add_tests("if_lasgn_short",
  2264. "Ruby" => "if x = obj.x then\n x.do_it\nend",
  2265. "RawParseTree" => [:if,
  2266. [:lasgn, :x,
  2267. [:call, [:vcall, :obj], :x]],
  2268. [:call,
  2269. [:lvar, :x], :do_it],
  2270. nil],
  2271. "ParseTree" => s(:if,
  2272. s(:lasgn, :x,
  2273. s(:call,
  2274. s(:call, nil, :obj, s(:arglist)),
  2275. :x, s(:arglist))),
  2276. s(:call, s(:lvar, :x), :do_it, s(:arglist)),
  2277. nil))
  2278. add_tests("if_nested",
  2279. "Ruby" => "return if false unless true",
  2280. "RawParseTree" => [:if, [:true], nil,
  2281. [:if, [:false], [:return], nil]],
  2282. "ParseTree" => s(:if, s(:true), nil,
  2283. s(:if, s(:false), s(:return), nil)))
  2284. add_tests("if_post",
  2285. "Ruby" => "a if b",
  2286. "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil],
  2287. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)),
  2288. s(:call, nil, :a, s(:arglist)), nil))
  2289. add_tests("if_post_not",
  2290. "Ruby" => "a if not b",
  2291. "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]],
  2292. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil,
  2293. s(:call, nil, :a, s(:arglist))),
  2294. "Ruby2Ruby" => "a unless b")
  2295. add_tests("if_pre",
  2296. "Ruby" => "if b then a end",
  2297. "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil],
  2298. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)),
  2299. s(:call, nil, :a, s(:arglist)), nil),
  2300. "Ruby2Ruby" => "a if b")
  2301. add_tests("if_pre_not",
  2302. "Ruby" => "if not b then a end",
  2303. "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]],
  2304. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil,
  2305. s(:call, nil, :a, s(:arglist))),
  2306. "Ruby2Ruby" => "a unless b")
  2307. add_tests("iter_call_arglist_space",
  2308. "Ruby" => "a (1) {|c|d}",
  2309. "RawParseTree" => [:iter,
  2310. [:fcall, :a, [:array, [:lit, 1]]],
  2311. [:dasgn_curr, :c],
  2312. [:vcall, :d]],
  2313. "ParseTree" => s(:iter,
  2314. s(:call, nil, :a, s(:arglist, s(:lit, 1))),
  2315. s(:lasgn, :c),
  2316. s(:call, nil, :d, s(:arglist))),
  2317. "Ruby2Ruby" => "a(1) { |c| d }")
  2318. add_tests("iter_dasgn_curr_dasgn_madness",
  2319. "Ruby" => "as.each { |a|\n b += a.b(false) }",
  2320. "RawParseTree" => [:iter,
  2321. [:call, [:vcall, :as], :each],
  2322. [:dasgn_curr, :a],
  2323. [:dasgn_curr,
  2324. :b,
  2325. [:call,
  2326. [:dvar, :b],
  2327. :+,
  2328. [:array,
  2329. [:call, [:dvar, :a], :b,
  2330. [:array, [:false]]]]]]],
  2331. "ParseTree" => s(:iter,
  2332. s(:call,
  2333. s(:call, nil, :as, s(:arglist)),
  2334. :each, s(:arglist)),
  2335. s(:lasgn, :a),
  2336. s(:lasgn, :b,
  2337. s(:call,
  2338. s(:lvar, :b),
  2339. :+,
  2340. s(:arglist,
  2341. s(:call, s(:lvar, :a), :b,
  2342. s(:arglist, s(:false))))))),
  2343. "Ruby2Ruby" => "as.each { |a| b = (b + a.b(false)) }")
  2344. add_tests("iter_downto",
  2345. "Ruby" => "3.downto(1) { |n| puts(n.to_s) }",
  2346. "RawParseTree" => [:iter,
  2347. [:call, [:lit, 3], :downto, [:array, [:lit, 1]]],
  2348. [:dasgn_curr, :n],
  2349. [:fcall, :puts,
  2350. [:array, [:call, [:dvar, :n], :to_s]]]],
  2351. "ParseTree" => s(:iter,
  2352. s(:call, s(:lit, 3), :downto,
  2353. s(:arglist, s(:lit, 1))),
  2354. s(:lasgn, :n),
  2355. s(:call, nil, :puts,
  2356. s(:arglist,
  2357. s(:call, s(:lvar, :n),
  2358. :to_s, s(:arglist))))))
  2359. add_tests("iter_each_lvar",
  2360. "Ruby" => "array = [1, 2, 3]\narray.each { |x| puts(x.to_s) }\n",
  2361. "RawParseTree" => [:block,
  2362. [:lasgn, :array,
  2363. [:array, [:lit, 1], [:lit, 2], [:lit, 3]]],
  2364. [:iter,
  2365. [:call, [:lvar, :array], :each],
  2366. [:dasgn_curr, :x],
  2367. [:fcall, :puts,
  2368. [:array, [:call, [:dvar, :x], :to_s]]]]],
  2369. "ParseTree" => s(:block,
  2370. s(:lasgn, :array,
  2371. s(:array,
  2372. s(:lit, 1), s(:lit, 2), s(:lit, 3))),
  2373. s(:iter,
  2374. s(:call, s(:lvar, :array), :each,
  2375. s(:arglist)),
  2376. s(:lasgn, :x),
  2377. s(:call, nil, :puts,
  2378. s(:arglist, s(:call, s(:lvar, :x),
  2379. :to_s, s(:arglist)))))))
  2380. add_tests("iter_each_nested",
  2381. "Ruby" => "array1 = [1, 2, 3]\narray2 = [4, 5, 6, 7]\narray1.each do |x|\n array2.each do |y|\n puts(x.to_s)\n puts(y.to_s)\n end\nend\n",
  2382. "RawParseTree" => [:block,
  2383. [:lasgn, :array1,
  2384. [:array, [:lit, 1], [:lit, 2], [:lit, 3]]],
  2385. [:lasgn, :array2,
  2386. [:array,
  2387. [:lit, 4], [:lit, 5], [:lit, 6], [:lit, 7]]],
  2388. [:iter,
  2389. [:call,
  2390. [:lvar, :array1], :each],
  2391. [:dasgn_curr, :x],
  2392. [:iter,
  2393. [:call,
  2394. [:lvar, :array2], :each],
  2395. [:dasgn_curr, :y],
  2396. [:block,
  2397. [:fcall, :puts,
  2398. [:array, [:call, [:dvar, :x], :to_s]]],
  2399. [:fcall, :puts,
  2400. [:array, [:call, [:dvar, :y], :to_s]]]]]]],
  2401. "ParseTree" => s(:block,
  2402. s(:lasgn, :array1,
  2403. s(:array,
  2404. s(:lit, 1), s(:lit, 2), s(:lit, 3))),
  2405. s(:lasgn, :array2,
  2406. s(:array,
  2407. s(:lit, 4), s(:lit, 5),
  2408. s(:lit, 6), s(:lit, 7))),
  2409. s(:iter,
  2410. s(:call,
  2411. s(:lvar, :array1), :each, s(:arglist)),
  2412. s(:lasgn, :x),
  2413. s(:iter,
  2414. s(:call,
  2415. s(:lvar, :array2), :each, s(:arglist)),
  2416. s(:lasgn, :y),
  2417. s(:block,
  2418. s(:call, nil, :puts,
  2419. s(:arglist,
  2420. s(:call, s(:lvar, :x),
  2421. :to_s, s(:arglist)))),
  2422. s(:call, nil, :puts,
  2423. s(:arglist,
  2424. s(:call, s(:lvar, :y),
  2425. :to_s, s(:arglist)))))))))
  2426. add_tests("iter_loop_empty",
  2427. "Ruby" => "loop { }",
  2428. "RawParseTree" => [:iter, [:fcall, :loop], nil],
  2429. "ParseTree" => s(:iter, s(:call, nil, :loop, s(:arglist)), nil))
  2430. add_tests("iter_masgn_2",
  2431. "Ruby" => "a { |b, c| p(c) }",
  2432. "RawParseTree" => [:iter,
  2433. [:fcall, :a],
  2434. [:masgn,
  2435. [:array, [:dasgn_curr, :b], [:dasgn_curr, :c]],
  2436. nil, nil],
  2437. [:fcall, :p, [:array, [:dvar, :c]]]],
  2438. "ParseTree" => s(:iter,
  2439. s(:call, nil, :a, s(:arglist)),
  2440. s(:masgn,
  2441. s(:array, s(:lasgn, :b), s(:lasgn, :c))),
  2442. s(:call, nil, :p, s(:arglist, s(:lvar, :c)))))
  2443. add_tests("iter_masgn_args_splat",
  2444. "Ruby" => "a { |b, c, *d| p(c) }",
  2445. "RawParseTree" => [:iter,
  2446. [:fcall, :a],
  2447. [:masgn,
  2448. [:array, [:dasgn_curr, :b], [:dasgn_curr, :c]],
  2449. [:dasgn_curr, :d], nil],
  2450. [:fcall, :p, [:array, [:dvar, :c]]]],
  2451. "ParseTree" => s(:iter,
  2452. s(:call, nil, :a, s(:arglist)),
  2453. s(:masgn,
  2454. s(:array,
  2455. s(:lasgn, :b),
  2456. s(:lasgn, :c),
  2457. s(:splat, s(:lasgn, :d)))),
  2458. s(:call, nil, :p, s(:arglist, s(:lvar, :c)))))
  2459. add_tests("iter_masgn_args_splat_no_name",
  2460. "Ruby" => "a { |b, c, *| p(c) }",
  2461. "RawParseTree" => [:iter,
  2462. [:fcall, :a],
  2463. [:masgn,
  2464. [:array, [:dasgn_curr, :b], [:dasgn_curr, :c]],
  2465. [:splat], nil],
  2466. [:fcall, :p, [:array, [:dvar, :c]]]],
  2467. "ParseTree" => s(:iter,
  2468. s(:call, nil, :a, s(:arglist)),
  2469. s(:masgn,
  2470. s(:array,
  2471. s(:lasgn, :b),
  2472. s(:lasgn, :c),
  2473. s(:splat))),
  2474. s(:call, nil, :p, s(:arglist, s(:lvar, :c)))))
  2475. add_tests("iter_masgn_splat",
  2476. "Ruby" => "a { |*c| p(c) }",
  2477. "RawParseTree" => [:iter,
  2478. [:fcall, :a],
  2479. [:masgn, nil, [:dasgn_curr, :c], nil],
  2480. [:fcall, :p, [:array, [:dvar, :c]]]],
  2481. "ParseTree" => s(:iter,
  2482. s(:call, nil, :a, s(:arglist)),
  2483. s(:masgn, s(:array, s(:splat, s(:lasgn, :c)))),
  2484. s(:call, nil, :p, s(:arglist, s(:lvar, :c)))))
  2485. add_tests("iter_masgn_splat_no_name",
  2486. "Ruby" => "a { |*| p(c) }",
  2487. "RawParseTree" => [:iter,
  2488. [:fcall, :a],
  2489. [:masgn, nil, [:splat], nil],
  2490. [:fcall, :p, [:array, [:vcall, :c]]]],
  2491. "ParseTree" => s(:iter,
  2492. s(:call, nil, :a, s(:arglist)),
  2493. s(:masgn, s(:array, s(:splat))),
  2494. s(:call, nil, :p,
  2495. s(:arglist, s(:call, nil, :c, s(:arglist))))))
  2496. add_tests("iter_shadowed_var",
  2497. "Ruby" => "a do |x|\n b do |x|\n puts x\n end\nend",
  2498. "RawParseTree" => [:iter,
  2499. [:fcall, :a],
  2500. [:dasgn_curr, :x],
  2501. [:iter,
  2502. [:fcall, :b],
  2503. [:dasgn, :x],
  2504. [:fcall, :puts, [:array, [:dvar, :x]]]]],
  2505. "ParseTree" => s(:iter,
  2506. s(:call, nil, :a, s(:arglist)),
  2507. s(:lasgn, :x),
  2508. s(:iter,
  2509. s(:call, nil, :b, s(:arglist)),
  2510. s(:lasgn, :x),
  2511. s(:call, nil, :puts,
  2512. s(:arglist, s(:lvar, :x))))),
  2513. "Ruby2Ruby" => "a { |x| b { |x| puts(x) } }")
  2514. add_tests("iter_upto",
  2515. "Ruby" => "1.upto(3) { |n| puts(n.to_s) }",
  2516. "RawParseTree" => [:iter,
  2517. [:call, [:lit, 1], :upto, [:array, [:lit, 3]]],
  2518. [:dasgn_curr, :n],
  2519. [:fcall, :puts,
  2520. [:array, [:call, [:dvar, :n], :to_s]]]],
  2521. "ParseTree" => s(:iter,
  2522. s(:call, s(:lit, 1), :upto,
  2523. s(:arglist, s(:lit, 3))),
  2524. s(:lasgn, :n),
  2525. s(:call, nil, :puts,
  2526. s(:arglist,
  2527. s(:call, s(:lvar, :n), :to_s,
  2528. s(:arglist))))))
  2529. add_tests("iter_while",
  2530. "Ruby" => "argl = 10\nwhile (argl >= 1) do\n puts(\"hello\")\n argl = (argl - 1)\nend\n",
  2531. "RawParseTree" => [:block,
  2532. [:lasgn, :argl, [:lit, 10]],
  2533. [:while,
  2534. [:call, [:lvar, :argl], :">=",
  2535. [:array, [:lit, 1]]],
  2536. [:block,
  2537. [:fcall, :puts, [:array, [:str, "hello"]]],
  2538. [:lasgn,
  2539. :argl,
  2540. [:call, [:lvar, :argl],
  2541. :"-", [:array, [:lit, 1]]]]], true]],
  2542. "ParseTree" => s(:block,
  2543. s(:lasgn, :argl, s(:lit, 10)),
  2544. s(:while,
  2545. s(:call, s(:lvar, :argl), :">=",
  2546. s(:arglist, s(:lit, 1))),
  2547. s(:block,
  2548. s(:call, nil, :puts,
  2549. s(:arglist, s(:str, "hello"))),
  2550. s(:lasgn,
  2551. :argl,
  2552. s(:call, s(:lvar, :argl), :"-",
  2553. s(:arglist, s(:lit, 1))))), true)))
  2554. add_tests("ivar",
  2555. "Ruby" => [Examples, :reader],
  2556. "RawParseTree" => [:defn, :reader, [:ivar, :@reader]],
  2557. "ParseTree" => s(:defn, :reader, # FIX should be unified?
  2558. s(:args),
  2559. s(:ivar, :@reader)),
  2560. "Ruby2Ruby" => "attr_reader :reader")
  2561. add_tests("lasgn_array",
  2562. "Ruby" => "var = [\"foo\", \"bar\"]",
  2563. "RawParseTree" => [:lasgn, :var,
  2564. [:array,
  2565. [:str, "foo"],
  2566. [:str, "bar"]]],
  2567. "ParseTree" => s(:lasgn, :var,
  2568. s(:array,
  2569. s(:str, "foo"),
  2570. s(:str, "bar"))))
  2571. add_tests("lasgn_call",
  2572. "Ruby" => "c = (2 + 3)",
  2573. "RawParseTree" => [:lasgn, :c, [:call, [:lit, 2], :+,
  2574. [:array, [:lit, 3]]]],
  2575. "ParseTree" => s(:lasgn, :c, s(:call, s(:lit, 2), :+,
  2576. s(:arglist, s(:lit, 3)))))
  2577. add_tests("lit_bool_false",
  2578. "Ruby" => "false",
  2579. "RawParseTree" => [:false],
  2580. "ParseTree" => s(:false))
  2581. add_tests("lit_bool_true",
  2582. "Ruby" => "true",
  2583. "RawParseTree" => [:true],
  2584. "ParseTree" => s(:true))
  2585. add_tests("lit_float",
  2586. "Ruby" => "1.1",
  2587. "RawParseTree" => [:lit, 1.1],
  2588. "ParseTree" => s(:lit, 1.1))
  2589. add_tests("lit_long",
  2590. "Ruby" => "1",
  2591. "RawParseTree" => [:lit, 1],
  2592. "ParseTree" => s(:lit, 1))
  2593. add_tests("lit_long_negative",
  2594. "Ruby" => "-1",
  2595. "RawParseTree" => [:lit, -1],
  2596. "ParseTree" => s(:lit, -1))
  2597. add_tests("lit_range2",
  2598. "Ruby" => "(1..10)",
  2599. "RawParseTree" => [:lit, 1..10],
  2600. "ParseTree" => s(:lit, 1..10))
  2601. add_tests("lit_range3",
  2602. "Ruby" => "(1...10)",
  2603. "RawParseTree" => [:lit, 1...10],
  2604. "ParseTree" => s(:lit, 1...10))
  2605. # TODO: discuss and decide which lit we like
  2606. # it "converts a regexp to an sexp" do
  2607. # "/blah/".to_sexp.should == s(:regex, "blah", 0)
  2608. # "/blah/i".to_sexp.should == s(:regex, "blah", 1)
  2609. # "/blah/u".to_sexp.should == s(:regex, "blah", 64)
  2610. # end
  2611. add_tests("lit_regexp",
  2612. "Ruby" => "/x/",
  2613. "RawParseTree" => [:lit, /x/],
  2614. "ParseTree" => s(:lit, /x/))
  2615. add_tests("lit_regexp_i_wwtt",
  2616. "Ruby" => 'str.split(//i)',
  2617. "RawParseTree" => [:call, [:vcall, :str], :split,
  2618. [:array, [:lit, //i]]],
  2619. "ParseTree" => s(:call, s(:call, nil, :str, s(:arglist)), :split,
  2620. s(:arglist, s(:lit, //i))))
  2621. add_tests("lit_regexp_n",
  2622. "Ruby" => "/x/n", # HACK differs on 1.9 - this is easiest
  2623. "RawParseTree" => [:lit, /x/n],
  2624. "ParseTree" => s(:lit, /x/n),
  2625. "Ruby2Ruby" => /x/n.inspect)
  2626. add_tests("lit_regexp_once",
  2627. "Ruby" => "/x/o",
  2628. "RawParseTree" => [:lit, /x/],
  2629. "ParseTree" => s(:lit, /x/),
  2630. "Ruby2Ruby" => "/x/")
  2631. add_tests("lit_sym",
  2632. "Ruby" => ":x",
  2633. "RawParseTree" => [:lit, :x],
  2634. "ParseTree" => s(:lit, :x))
  2635. add_tests("lit_sym_splat",
  2636. "Ruby" => ":\"*args\"",
  2637. "RawParseTree" => [:lit, :"*args"],
  2638. "ParseTree" => s(:lit, :"*args"))
  2639. add_tests("lvar_def_boundary",
  2640. "Ruby" => "b = 42\ndef a\n c do\n begin\n do_stuff\n rescue RuntimeError => b\n puts(b)\n end\n end\nend\n",
  2641. "RawParseTree" => [:block,
  2642. [:lasgn, :b, [:lit, 42]],
  2643. [:defn, :a,
  2644. [:scope,
  2645. [:block,
  2646. [:args],
  2647. [:iter,
  2648. [:fcall, :c],
  2649. nil,
  2650. [:rescue,
  2651. [:vcall, :do_stuff],
  2652. [:resbody,
  2653. [:array, [:const, :RuntimeError]],
  2654. [:block,
  2655. [:dasgn_curr, :b, [:gvar, :$!]],
  2656. [:fcall, :puts,
  2657. [:array, [:dvar, :b]]]]]]]]]]],
  2658. "ParseTree" => s(:block,
  2659. s(:lasgn, :b, s(:lit, 42)),
  2660. s(:defn, :a,
  2661. s(:args),
  2662. s(:scope,
  2663. s(:block,
  2664. s(:iter,
  2665. s(:call, nil, :c, s(:arglist)),
  2666. nil,
  2667. s(:rescue,
  2668. s(:call, nil, :do_stuff, s(:arglist)),
  2669. s(:resbody,
  2670. s(:array,
  2671. s(:const, :RuntimeError),
  2672. s(:lasgn, :b, s(:gvar, :$!))),
  2673. s(:call, nil, :puts,
  2674. s(:arglist,
  2675. s(:lvar, :b)))))))))))
  2676. add_tests("masgn",
  2677. "Ruby" => "a, b = c, d",
  2678. "RawParseTree" => [:masgn,
  2679. [:array, [:lasgn, :a], [:lasgn, :b]], nil,
  2680. [:array, [:vcall, :c], [:vcall, :d]]],
  2681. "ParseTree" => s(:masgn,
  2682. s(:array, s(:lasgn, :a), s(:lasgn, :b)),
  2683. s(:array, s(:call, nil, :c, s(:arglist)),
  2684. s(:call, nil, :d, s(:arglist)))))
  2685. add_tests("masgn_argscat",
  2686. "Ruby" => "a, b, *c = 1, 2, *[3, 4]",
  2687. "RawParseTree" => [:masgn,
  2688. [:array, [:lasgn, :a], [:lasgn, :b]],
  2689. [:lasgn, :c],
  2690. [:argscat,
  2691. [:array, [:lit, 1], [:lit, 2]],
  2692. [:array, [:lit, 3], [:lit, 4]]]],
  2693. "ParseTree" => s(:masgn,
  2694. s(:array,
  2695. s(:lasgn, :a),
  2696. s(:lasgn, :b),
  2697. s(:splat, s(:lasgn, :c))),
  2698. s(:array,
  2699. s(:lit, 1), s(:lit, 2),
  2700. s(:splat,
  2701. s(:array, s(:lit, 3), s(:lit, 4))))))
  2702. add_tests("masgn_attrasgn",
  2703. "Ruby" => "a, b.c = d, e",
  2704. "RawParseTree" => [:masgn,
  2705. [:array, [:lasgn, :a],
  2706. [:attrasgn, [:vcall, :b], :c=]], nil,
  2707. [:array, [:vcall, :d], [:vcall, :e]]],
  2708. "ParseTree" => s(:masgn,
  2709. s(:array,
  2710. s(:lasgn, :a),
  2711. s(:attrasgn,
  2712. s(:call, nil, :b, s(:arglist)),
  2713. :c=, s(:arglist))),
  2714. s(:array,
  2715. s(:call, nil, :d, s(:arglist)),
  2716. s(:call, nil, :e, s(:arglist)))))
  2717. add_tests("masgn_attrasgn_array_rhs",
  2718. "Ruby" => "a.b, a.c, _ = q",
  2719. "RawParseTree" => [:masgn,
  2720. [:array,
  2721. [:attrasgn, [:vcall, :a], :b=],
  2722. [:attrasgn, [:vcall, :a], :c=],
  2723. [:lasgn, :_]], nil,
  2724. [:to_ary, [:vcall, :q]]],
  2725. "ParseTree" => s(:masgn,
  2726. s(:array,
  2727. s(:attrasgn,
  2728. s(:call, nil, :a, s(:arglist)),
  2729. :b=, s(:arglist)),
  2730. s(:attrasgn,
  2731. s(:call, nil, :a, s(:arglist)),
  2732. :c=, s(:arglist)),
  2733. s(:lasgn, :_)),
  2734. s(:to_ary,
  2735. s(:call, nil, :q, s(:arglist)))))
  2736. add_tests("masgn_attrasgn_idx",
  2737. "Ruby" => "a, i, j = [], 1, 2\na[i], a[j] = a[j], a[i]\n",
  2738. "RawParseTree" => [:block,
  2739. [:masgn,
  2740. [:array,
  2741. [:lasgn, :a], [:lasgn, :i], [:lasgn, :j]], nil,
  2742. [:array, [:zarray], [:lit, 1], [:lit, 2]]],
  2743. [:masgn,
  2744. [:array,
  2745. [:attrasgn,
  2746. [:lvar, :a], :[]=, [:array, [:lvar, :i]]],
  2747. [:attrasgn,
  2748. [:lvar, :a], :[]=, [:array, [:lvar, :j]]]],
  2749. nil,
  2750. [:array,
  2751. [:call, [:lvar, :a], :[],
  2752. [:array, [:lvar, :j]]],
  2753. [:call, [:lvar, :a], :[],
  2754. [:array, [:lvar, :i]]]]]],
  2755. "ParseTree" => s(:block,
  2756. s(:masgn,
  2757. s(:array,
  2758. s(:lasgn, :a),
  2759. s(:lasgn, :i), s(:lasgn, :j)),
  2760. s(:array, s(:array), s(:lit, 1), s(:lit, 2))),
  2761. s(:masgn,
  2762. s(:array,
  2763. s(:attrasgn, s(:lvar, :a), :[]=,
  2764. s(:arglist, s(:lvar, :i))),
  2765. s(:attrasgn, s(:lvar, :a), :[]=,
  2766. s(:arglist, s(:lvar, :j)))),
  2767. s(:array,
  2768. s(:call, s(:lvar, :a), :[],
  2769. s(:arglist, s(:lvar, :j))),
  2770. s(:call, s(:lvar, :a), :[],
  2771. s(:arglist, s(:lvar, :i)))))))
  2772. add_tests("masgn_cdecl",
  2773. "Ruby" => "A, B, C = 1, 2, 3",
  2774. "RawParseTree" => [:masgn,
  2775. [:array, [:cdecl, :A], [:cdecl, :B],
  2776. [:cdecl, :C]], nil,
  2777. [:array, [:lit, 1], [:lit, 2], [:lit, 3]]],
  2778. "ParseTree" => s(:masgn,
  2779. s(:array, s(:cdecl, :A), s(:cdecl, :B),
  2780. s(:cdecl, :C)),
  2781. s(:array, s(:lit, 1), s(:lit, 2), s(:lit, 3))))
  2782. add_tests("masgn_iasgn",
  2783. "Ruby" => "a, @b = c, d",
  2784. "RawParseTree" => [:masgn,
  2785. [:array, [:lasgn, :a], [:iasgn, :"@b"]], nil,
  2786. [:array, [:vcall, :c], [:vcall, :d]]],
  2787. "ParseTree" => s(:masgn,
  2788. s(:array, s(:lasgn, :a), s(:iasgn, :"@b")),
  2789. s(:array,
  2790. s(:call, nil, :c, s(:arglist)),
  2791. s(:call, nil, :d, s(:arglist)))))
  2792. add_tests("masgn_masgn",
  2793. "Ruby" => "a, (b, c) = [1, [2, 3]]",
  2794. "RawParseTree" => [:masgn,
  2795. [:array,
  2796. [:lasgn, :a],
  2797. [:masgn,
  2798. [:array,
  2799. [:lasgn, :b],
  2800. [:lasgn, :c]], nil, nil]],
  2801. nil,
  2802. [:to_ary,
  2803. [:array,
  2804. [:lit, 1],
  2805. [:array,
  2806. [:lit, 2],
  2807. [:lit, 3]]]]],
  2808. "ParseTree" => s(:masgn,
  2809. s(:array,
  2810. s(:lasgn, :a),
  2811. s(:masgn,
  2812. s(:array,
  2813. s(:lasgn, :b),
  2814. s(:lasgn, :c)))),
  2815. s(:to_ary,
  2816. s(:array,
  2817. s(:lit, 1),
  2818. s(:array,
  2819. s(:lit, 2),
  2820. s(:lit, 3))))))
  2821. add_tests("masgn_splat_lhs",
  2822. "Ruby" => "a, b, *c = d, e, f, g",
  2823. "RawParseTree" => [:masgn,
  2824. [:array, [:lasgn, :a], [:lasgn, :b]],
  2825. [:lasgn, :c],
  2826. [:array,
  2827. [:vcall, :d], [:vcall, :e],
  2828. [:vcall, :f], [:vcall, :g]]],
  2829. "ParseTree" => s(:masgn,
  2830. s(:array,
  2831. s(:lasgn, :a),
  2832. s(:lasgn, :b),
  2833. s(:splat, s(:lasgn, :c))),
  2834. s(:array,
  2835. s(:call, nil, :d, s(:arglist)),
  2836. s(:call, nil, :e, s(:arglist)),
  2837. s(:call, nil, :f, s(:arglist)),
  2838. s(:call, nil, :g, s(:arglist)))))
  2839. add_tests("masgn_splat_rhs_1",
  2840. "Ruby" => "a, b = *c",
  2841. "RawParseTree" => [:masgn,
  2842. [:array, [:lasgn, :a], [:lasgn, :b]],
  2843. nil,
  2844. [:splat, [:vcall, :c]]],
  2845. "ParseTree" => s(:masgn,
  2846. s(:array,
  2847. s(:lasgn, :a),
  2848. s(:lasgn, :b)),
  2849. s(:splat, s(:call, nil, :c, s(:arglist)))))
  2850. add_tests("masgn_splat_rhs_n",
  2851. "Ruby" => "a, b = c, d, *e",
  2852. "RawParseTree" => [:masgn,
  2853. [:array, [:lasgn, :a], [:lasgn, :b]],
  2854. nil,
  2855. [:argscat,
  2856. [:array, [:vcall, :c], [:vcall, :d]],
  2857. [:vcall, :e]]],
  2858. "ParseTree" => s(:masgn,
  2859. s(:array,
  2860. s(:lasgn, :a),
  2861. s(:lasgn, :b)),
  2862. s(:array,
  2863. s(:call, nil, :c, s(:arglist)),
  2864. s(:call, nil, :d, s(:arglist)),
  2865. s(:splat, s(:call, nil, :e, s(:arglist))))))
  2866. add_tests("masgn_splat_no_name_to_ary",
  2867. "Ruby" => "a, b, * = c",
  2868. "RawParseTree" => [:masgn,
  2869. [:array, [:lasgn, :a], [:lasgn, :b]],
  2870. [:splat],
  2871. [:to_ary, [:vcall, :c]]],
  2872. "ParseTree" => s(:masgn,
  2873. s(:array,
  2874. s(:lasgn, :a),
  2875. s(:lasgn, :b),
  2876. s(:splat)),
  2877. s(:to_ary, s(:call, nil, :c, s(:arglist)))))
  2878. add_tests("masgn_splat_no_name_trailing",
  2879. "Ruby" => "a, b, = c",
  2880. "RawParseTree" => [:masgn,
  2881. [:array, [:lasgn, :a], [:lasgn, :b]], nil,
  2882. [:to_ary, [:vcall, :c]]],
  2883. "ParseTree" => s(:masgn,
  2884. s(:array, s(:lasgn, :a), s(:lasgn, :b)),
  2885. s(:to_ary, s(:call, nil, :c, s(:arglist)))),
  2886. "Ruby2Ruby" => "a, b = c") # TODO: check this is right
  2887. add_tests("masgn_splat_to_ary",
  2888. "Ruby" => "a, b, *c = d",
  2889. "RawParseTree" => [:masgn,
  2890. [:array, [:lasgn, :a], [:lasgn, :b]],
  2891. [:lasgn, :c],
  2892. [:to_ary, [:vcall, :d]]],
  2893. "ParseTree" => s(:masgn,
  2894. s(:array,
  2895. s(:lasgn, :a),
  2896. s(:lasgn, :b),
  2897. s(:splat, s(:lasgn, :c))),
  2898. s(:to_ary, s(:call, nil, :d, s(:arglist)))))
  2899. add_tests("masgn_splat_to_ary2",
  2900. "Ruby" => "a, b, *c = d.e(\"f\")",
  2901. "RawParseTree" => [:masgn,
  2902. [:array, [:lasgn, :a], [:lasgn, :b]],
  2903. [:lasgn, :c],
  2904. [:to_ary,
  2905. [:call, [:vcall, :d], :e,
  2906. [:array, [:str, 'f']]]]],
  2907. "ParseTree" => s(:masgn,
  2908. s(:array,
  2909. s(:lasgn, :a),
  2910. s(:lasgn, :b),
  2911. s(:splat, s(:lasgn, :c))),
  2912. s(:to_ary,
  2913. s(:call,
  2914. s(:call, nil, :d, s(:arglist)),
  2915. :e,
  2916. s(:arglist, s(:str, 'f'))))))
  2917. add_tests("match",
  2918. "Ruby" => "1 if /x/",
  2919. "RawParseTree" => [:if, [:match, [:lit, /x/]], [:lit, 1], nil],
  2920. "ParseTree" => s(:if, s(:match, s(:lit, /x/)), s(:lit, 1), nil))
  2921. add_tests("match2",
  2922. "Ruby" => "/x/ =~ \"blah\"",
  2923. "RawParseTree" => [:match2, [:lit, /x/], [:str, "blah"]],
  2924. "ParseTree" => s(:match2, s(:lit, /x/), s(:str, "blah")))
  2925. add_tests("match3",
  2926. "Ruby" => "\"blah\" =~ /x/",
  2927. "RawParseTree" => [:match3, [:lit, /x/], [:str, "blah"]],
  2928. "ParseTree" => s(:match3, s(:lit, /x/), s(:str, "blah")))
  2929. add_tests("module",
  2930. "Ruby" => "module X\n def y\n # do nothing\n end\nend",
  2931. "RawParseTree" => [:module, :X,
  2932. [:scope,
  2933. [:defn, :y,
  2934. [:scope, [:block, [:args], [:nil]]]]]],
  2935. "ParseTree" => s(:module, :X,
  2936. s(:scope,
  2937. s(:defn, :y,
  2938. s(:args),
  2939. s(:scope, s(:block, s(:nil)))))))
  2940. add_tests("module_scoped",
  2941. "Ruby" => "module X::Y\n c\nend",
  2942. "RawParseTree" => [:module, [:colon2, [:const, :X], :Y],
  2943. [:scope, [:vcall, :c]]],
  2944. "ParseTree" => s(:module, s(:colon2, s(:const, :X), :Y),
  2945. s(:scope, s(:call, nil, :c, s(:arglist)))))
  2946. add_tests("module_scoped3",
  2947. "Ruby" => "module ::Y\n c\nend",
  2948. "RawParseTree" => [:module, [:colon3, :Y], [:scope, [:vcall, :c]]],
  2949. "ParseTree" => s(:module,
  2950. s(:colon3, :Y),
  2951. s(:scope, s(:call, nil, :c, s(:arglist)))))
  2952. add_tests("next",
  2953. "Ruby" => "loop { next if false }",
  2954. "RawParseTree" => [:iter,
  2955. [:fcall, :loop],
  2956. nil,
  2957. [:if, [:false], [:next], nil]],
  2958. "ParseTree" => s(:iter,
  2959. s(:call, nil, :loop, s(:arglist)),
  2960. nil,
  2961. s(:if, s(:false), s(:next), nil)))
  2962. add_tests("next_arg",
  2963. "Ruby" => "loop { next 42 if false }",
  2964. "RawParseTree" => [:iter,
  2965. [:fcall, :loop],
  2966. nil,
  2967. [:if, [:false], [:next, [:lit, 42]], nil]],
  2968. "ParseTree" => s(:iter,
  2969. s(:call, nil, :loop, s(:arglist)),
  2970. nil,
  2971. s(:if, s(:false), s(:next, s(:lit, 42)), nil)))
  2972. add_tests("not",
  2973. "Ruby" => "(not true)",
  2974. "RawParseTree" => [:not, [:true]],
  2975. "ParseTree" => s(:not, s(:true)))
  2976. add_tests("nth_ref",
  2977. "Ruby" => "$1",
  2978. "RawParseTree" => [:nth_ref, 1],
  2979. "ParseTree" => s(:nth_ref, 1))
  2980. add_tests("op_asgn1",
  2981. "Ruby" => "b = []\nb[1] ||= 10\nb[2] &&= 11\nb[3] += 12\n",
  2982. "RawParseTree" => [:block,
  2983. [:lasgn, :b, [:zarray]],
  2984. [:op_asgn1, [:lvar, :b],
  2985. [:array, [:lit, 1]], :"||", [:lit, 10]],
  2986. [:op_asgn1, [:lvar, :b],
  2987. [:array, [:lit, 2]], :"&&", [:lit, 11]],
  2988. [:op_asgn1, [:lvar, :b],
  2989. [:array, [:lit, 3]], :+, [:lit, 12]]],
  2990. "ParseTree" => s(:block,
  2991. s(:lasgn, :b, s(:array)),
  2992. s(:op_asgn1, s(:lvar, :b),
  2993. s(:arglist, s(:lit, 1)), :"||", s(:lit, 10)),
  2994. s(:op_asgn1, s(:lvar, :b),
  2995. s(:arglist, s(:lit, 2)), :"&&", s(:lit, 11)),
  2996. s(:op_asgn1, s(:lvar, :b),
  2997. s(:arglist, s(:lit, 3)), :+, s(:lit, 12))))
  2998. add_tests("op_asgn1_ivar",
  2999. "Ruby" => "@b = []\n@b[1] ||= 10\n@b[2] &&= 11\n@b[3] += 12\n",
  3000. "RawParseTree" => [:block,
  3001. [:iasgn, :@b, [:zarray]],
  3002. [:op_asgn1, [:ivar, :@b],
  3003. [:array, [:lit, 1]], :"||", [:lit, 10]],
  3004. [:op_asgn1, [:ivar, :@b],
  3005. [:array, [:lit, 2]], :"&&", [:lit, 11]],
  3006. [:op_asgn1, [:ivar, :@b],
  3007. [:array, [:lit, 3]], :+, [:lit, 12]]],
  3008. "ParseTree" => s(:block,
  3009. s(:iasgn, :@b, s(:array)),
  3010. s(:op_asgn1, s(:ivar, :@b),
  3011. s(:arglist, s(:lit, 1)), :"||", s(:lit, 10)),
  3012. s(:op_asgn1, s(:ivar, :@b),
  3013. s(:arglist, s(:lit, 2)), :"&&", s(:lit, 11)),
  3014. s(:op_asgn1, s(:ivar, :@b),
  3015. s(:arglist, s(:lit, 3)), :+, s(:lit, 12))))
  3016. add_tests("op_asgn2",
  3017. "Ruby" => "s = Struct.new(:var)\nc = s.new(nil)\nc.var ||= 20\nc.var &&= 21\nc.var += 22\nc.d.e.f ||= 42\n",
  3018. "RawParseTree" => [:block,
  3019. [:lasgn, :s,
  3020. [:call, [:const, :Struct],
  3021. :new, [:array, [:lit, :var]]]],
  3022. [:lasgn, :c,
  3023. [:call, [:lvar, :s], :new, [:array, [:nil]]]],
  3024. [:op_asgn2, [:lvar, :c], :var=, :"||",
  3025. [:lit, 20]],
  3026. [:op_asgn2, [:lvar, :c], :var=, :"&&",
  3027. [:lit, 21]],
  3028. [:op_asgn2, [:lvar, :c], :var=, :+, [:lit, 22]],
  3029. [:op_asgn2,
  3030. [:call,
  3031. [:call, [:lvar, :c], :d], :e], :f=, :"||",
  3032. [:lit, 42]]],
  3033. "ParseTree" => s(:block,
  3034. s(:lasgn, :s,
  3035. s(:call, s(:const, :Struct),
  3036. :new, s(:arglist, s(:lit, :var)))),
  3037. s(:lasgn, :c,
  3038. s(:call, s(:lvar, :s),
  3039. :new, s(:arglist, s(:nil)))),
  3040. s(:op_asgn2, s(:lvar, :c),
  3041. :var=, :"||", s(:lit, 20)),
  3042. s(:op_asgn2, s(:lvar, :c),
  3043. :var=, :"&&", s(:lit, 21)),
  3044. s(:op_asgn2, s(:lvar, :c),
  3045. :var=, :+, s(:lit, 22)),
  3046. s(:op_asgn2,
  3047. s(:call,
  3048. s(:call, s(:lvar, :c), :d, s(:arglist)),
  3049. :e, s(:arglist)),
  3050. :f=, :"||", s(:lit, 42))))
  3051. add_tests("op_asgn2_self",
  3052. "Ruby" => "self.Bag ||= Bag.new",
  3053. "RawParseTree" => [:op_asgn2, [:self], :"Bag=", :"||",
  3054. [:call, [:const, :Bag], :new]],
  3055. "ParseTree" => s(:op_asgn2, s(:self), :"Bag=", :"||",
  3056. s(:call, s(:const, :Bag), :new, s(:arglist))))
  3057. add_tests("op_asgn_and",
  3058. "Ruby" => "a = 0\na &&= 2\n",
  3059. "RawParseTree" => [:block,
  3060. [:lasgn, :a, [:lit, 0]],
  3061. [:op_asgn_and,
  3062. [:lvar, :a], [:lasgn, :a, [:lit, 2]]]],
  3063. "ParseTree" => s(:block,
  3064. s(:lasgn, :a, s(:lit, 0)),
  3065. s(:op_asgn_and,
  3066. s(:lvar, :a), s(:lasgn, :a, s(:lit, 2)))))
  3067. add_tests("op_asgn_and_ivar2",
  3068. "Ruby" => "@fetcher &&= new(Gem.configuration[:http_proxy])",
  3069. "RawParseTree" => [:op_asgn_and,
  3070. [:ivar, :@fetcher],
  3071. [:iasgn,
  3072. :@fetcher,
  3073. [:fcall,
  3074. :new,
  3075. [:array,
  3076. [:call,
  3077. [:call, [:const, :Gem], :configuration],
  3078. :[],
  3079. [:array, [:lit, :http_proxy]]]]]]],
  3080. "ParseTree" => s(:op_asgn_and,
  3081. s(:ivar, :@fetcher),
  3082. s(:iasgn,
  3083. :@fetcher,
  3084. s(:call, nil,
  3085. :new,
  3086. s(:arglist,
  3087. s(:call,
  3088. s(:call, s(:const, :Gem),
  3089. :configuration,
  3090. s(:arglist)),
  3091. :[],
  3092. s(:arglist, s(:lit, :http_proxy))))))))
  3093. add_tests("op_asgn_or",
  3094. "Ruby" => "a = 0\na ||= 1\n",
  3095. "RawParseTree" => [:block,
  3096. [:lasgn, :a, [:lit, 0]],
  3097. [:op_asgn_or,
  3098. [:lvar, :a], [:lasgn, :a, [:lit, 1]]]],
  3099. "ParseTree" => s(:block,
  3100. s(:lasgn, :a, s(:lit, 0)),
  3101. s(:op_asgn_or,
  3102. s(:lvar, :a), s(:lasgn, :a, s(:lit, 1)))))
  3103. add_tests("op_asgn_or_block",
  3104. "Ruby" => "a ||= begin\n b\n rescue\n c\n end",
  3105. "RawParseTree" => [:op_asgn_or,
  3106. [:lvar, :a],
  3107. [:lasgn, :a,
  3108. [:rescue,
  3109. [:vcall, :b],
  3110. [:resbody, nil, [:vcall, :c]]]]],
  3111. "ParseTree" => s(:op_asgn_or,
  3112. s(:lvar, :a),
  3113. s(:lasgn, :a,
  3114. s(:rescue,
  3115. s(:call, nil, :b, s(:arglist)),
  3116. s(:resbody, s(:array),
  3117. s(:call, nil, :c, s(:arglist)))))),
  3118. "Ruby2Ruby" => "a ||= b rescue c")
  3119. add_tests("op_asgn_or_ivar",
  3120. "Ruby" => "@v ||= { }",
  3121. "RawParseTree" => [:op_asgn_or,
  3122. [:ivar, :@v],
  3123. [:iasgn, :@v, [:hash]]],
  3124. "ParseTree" => s(:op_asgn_or,
  3125. s(:ivar, :@v),
  3126. s(:iasgn, :@v, s(:hash))))
  3127. add_tests("op_asgn_or_ivar2",
  3128. "Ruby" => "@fetcher ||= new(Gem.configuration[:http_proxy])",
  3129. "RawParseTree" => [:op_asgn_or,
  3130. [:ivar, :@fetcher],
  3131. [:iasgn,
  3132. :@fetcher,
  3133. [:fcall,
  3134. :new,
  3135. [:array,
  3136. [:call,
  3137. [:call, [:const, :Gem], :configuration],
  3138. :[],
  3139. [:array, [:lit, :http_proxy]]]]]]],
  3140. "ParseTree" => s(:op_asgn_or,
  3141. s(:ivar, :@fetcher),
  3142. s(:iasgn,
  3143. :@fetcher,
  3144. s(:call, nil, :new,
  3145. s(:arglist,
  3146. s(:call,
  3147. s(:call, s(:const, :Gem),
  3148. :configuration,
  3149. s(:arglist)),
  3150. :[],
  3151. s(:arglist, s(:lit, :http_proxy))))))))
  3152. add_tests("or",
  3153. "Ruby" => "(a or b)",
  3154. "RawParseTree" => [:or, [:vcall, :a], [:vcall, :b]],
  3155. "ParseTree" => s(:or,
  3156. s(:call, nil, :a, s(:arglist)),
  3157. s(:call, nil, :b, s(:arglist))))
  3158. add_tests("or_big",
  3159. "Ruby" => "((a or b) or (c and d))",
  3160. "RawParseTree" => [:or,
  3161. [:or, [:vcall, :a], [:vcall, :b]],
  3162. [:and, [:vcall, :c], [:vcall, :d]]],
  3163. "ParseTree" => s(:or,
  3164. s(:or,
  3165. s(:call, nil, :a, s(:arglist)),
  3166. s(:call, nil, :b, s(:arglist))),
  3167. s(:and,
  3168. s(:call, nil, :c, s(:arglist)),
  3169. s(:call, nil, :d, s(:arglist)))))
  3170. add_tests("or_big2",
  3171. "Ruby" => "((a || b) || (c && d))",
  3172. "RawParseTree" => [:or,
  3173. [:or, [:vcall, :a], [:vcall, :b]],
  3174. [:and, [:vcall, :c], [:vcall, :d]]],
  3175. "ParseTree" => s(:or,
  3176. s(:or,
  3177. s(:call, nil, :a, s(:arglist)),
  3178. s(:call, nil, :b, s(:arglist))),
  3179. s(:and,
  3180. s(:call, nil, :c, s(:arglist)),
  3181. s(:call, nil, :d, s(:arglist)))),
  3182. "Ruby2Ruby" => "((a or b) or (c and d))")
  3183. add_tests("parse_floats_as_args",
  3184. "Ruby" => "def x(a=0.0,b=0.0)\n a+b\nend",
  3185. "RawParseTree" => [:defn, :x,
  3186. [:scope,
  3187. [:block,
  3188. [:args, :a, :b,
  3189. [:block,
  3190. [:lasgn, :a, [:lit, 0.0]],
  3191. [:lasgn, :b, [:lit, 0.0]]]],
  3192. [:call, [:lvar, :a], :+,
  3193. [:array, [:lvar, :b]]]]]],
  3194. "ParseTree" => s(:defn, :x,
  3195. s(:args, :a, :b,
  3196. s(:block,
  3197. s(:lasgn, :a, s(:lit, 0.0)),
  3198. s(:lasgn, :b, s(:lit, 0.0)))),
  3199. s(:scope,
  3200. s(:block,
  3201. s(:call, s(:lvar, :a), :+,
  3202. s(:arglist, s(:lvar, :b)))))),
  3203. "Ruby2Ruby" => "def x(a = 0.0, b = 0.0)\n (a + b)\nend")
  3204. add_tests("postexe",
  3205. "Ruby" => "END { 1 }",
  3206. "RawParseTree" => [:iter, [:postexe], nil, [:lit, 1]],
  3207. "ParseTree" => s(:iter, s(:postexe), nil, s(:lit, 1)))
  3208. add_tests("proc_args_0",
  3209. "Ruby" => "proc { || (x + 1) }",
  3210. "RawParseTree" => [:iter,
  3211. [:fcall, :proc],
  3212. 0,
  3213. [:call, [:vcall, :x], :+, [:array, [:lit, 1]]]],
  3214. "ParseTree" => s(:iter,
  3215. s(:call, nil, :proc, s(:arglist)),
  3216. 0,
  3217. s(:call,
  3218. s(:call, nil, :x, s(:arglist)),
  3219. :+,
  3220. s(:arglist, s(:lit, 1)))))
  3221. add_tests("proc_args_1",
  3222. "Ruby" => "proc { |x| (x + 1) }",
  3223. "RawParseTree" => [:iter,
  3224. [:fcall, :proc],
  3225. [:dasgn_curr, :x],
  3226. [:call, [:dvar, :x], :+, [:array, [:lit, 1]]]],
  3227. "ParseTree" => s(:iter,
  3228. s(:call, nil, :proc, s(:arglist)),
  3229. s(:lasgn, :x),
  3230. s(:call, s(:lvar, :x), :+,
  3231. s(:arglist, s(:lit, 1)))))
  3232. add_tests("proc_args_2",
  3233. "Ruby" => "proc { |x, y| (x + y) }",
  3234. "RawParseTree" => [:iter,
  3235. [:fcall, :proc],
  3236. [:masgn, [:array,
  3237. [:dasgn_curr, :x],
  3238. [:dasgn_curr, :y]], nil, nil],
  3239. [:call, [:dvar, :x], :+, [:array, [:dvar, :y]]]],
  3240. "ParseTree" => s(:iter,
  3241. s(:call, nil, :proc, s(:arglist)),
  3242. s(:masgn,
  3243. s(:array,
  3244. s(:lasgn, :x),
  3245. s(:lasgn, :y))),
  3246. s(:call, s(:lvar, :x), :+,
  3247. s(:arglist, s(:lvar, :y)))))
  3248. add_tests("proc_args_no",
  3249. "Ruby" => "proc { (x + 1) }",
  3250. "RawParseTree" => [:iter,
  3251. [:fcall, :proc],
  3252. nil,
  3253. [:call, [:vcall, :x], :+, [:array, [:lit, 1]]]],
  3254. "ParseTree" => s(:iter,
  3255. s(:call, nil, :proc, s(:arglist)),
  3256. nil,
  3257. s(:call, s(:call, nil, :x, s(:arglist)),
  3258. :+, s(:arglist, s(:lit, 1)))))
  3259. add_tests("redo",
  3260. "Ruby" => "loop { redo if false }",
  3261. "RawParseTree" => [:iter,
  3262. [:fcall, :loop], nil,
  3263. [:if, [:false], [:redo], nil]],
  3264. "ParseTree" => s(:iter,
  3265. s(:call, nil, :loop, s(:arglist)),
  3266. nil,
  3267. s(:if, s(:false), s(:redo), nil)))
  3268. # TODO: need a resbody w/ multiple classes and a splat
  3269. add_tests("rescue",
  3270. "Ruby" => "blah rescue nil",
  3271. "RawParseTree" => [:rescue,
  3272. [:vcall, :blah], [:resbody, nil, [:nil]]],
  3273. "ParseTree" => s(:rescue,
  3274. s(:call, nil, :blah, s(:arglist)),
  3275. s(:resbody, s(:array), s(:nil))))
  3276. add_tests("rescue_block_body",
  3277. "Ruby" => "begin\n a\nrescue => e\n c\n d\nend",
  3278. "RawParseTree" => [:rescue,
  3279. [:vcall, :a],
  3280. [:resbody, nil,
  3281. [:block,
  3282. [:lasgn, :e, [:gvar, :$!]],
  3283. [:vcall, :c],
  3284. [:vcall, :d]]]],
  3285. "ParseTree" => s(:rescue,
  3286. s(:call, nil, :a, s(:arglist)),
  3287. s(:resbody,
  3288. s(:array, s(:lasgn, :e, s(:gvar, :$!))),
  3289. s(:block,
  3290. s(:call, nil, :c, s(:arglist)),
  3291. s(:call, nil, :d, s(:arglist))))))
  3292. add_tests("rescue_block_body_3",
  3293. "Ruby" => "begin\n a\nrescue A\n b\nrescue B\n c\nrescue C\n d\nend",
  3294. "RawParseTree" => [:rescue,
  3295. [:vcall, :a],
  3296. [:resbody, [:array, [:const, :A]],
  3297. [:vcall, :b],
  3298. [:resbody, [:array, [:const, :B]],
  3299. [:vcall, :c],
  3300. [:resbody, [:array, [:const, :C]],
  3301. [:vcall, :d]]]]],
  3302. "ParseTree" => s(:rescue,
  3303. s(:call, nil, :a, s(:arglist)),
  3304. s(:resbody, s(:array, s(:const, :A)),
  3305. s(:call, nil, :b, s(:arglist))),
  3306. s(:resbody, s(:array, s(:const, :B)),
  3307. s(:call, nil, :c, s(:arglist))),
  3308. s(:resbody, s(:array, s(:const, :C)),
  3309. s(:call, nil, :d, s(:arglist)))))
  3310. add_tests("rescue_block_body_ivar",
  3311. "Ruby" => "begin\n a\nrescue => @e\n c\n d\nend",
  3312. "RawParseTree" => [:rescue,
  3313. [:vcall, :a],
  3314. [:resbody, nil,
  3315. [:block,
  3316. [:iasgn, :@e, [:gvar, :$!]],
  3317. [:vcall, :c],
  3318. [:vcall, :d]]]],
  3319. "ParseTree" => s(:rescue,
  3320. s(:call, nil, :a, s(:arglist)),
  3321. s(:resbody,
  3322. s(:array, s(:iasgn, :@e, s(:gvar, :$!))),
  3323. s(:block,
  3324. s(:call, nil, :c, s(:arglist)),
  3325. s(:call, nil, :d, s(:arglist))))))
  3326. add_tests("rescue_block_nada",
  3327. "Ruby" => "begin\n blah\nrescue\n # do nothing\nend",
  3328. "RawParseTree" => [:rescue, [:vcall, :blah], [:resbody, nil]],
  3329. "ParseTree" => s(:rescue,
  3330. s(:call, nil, :blah, s(:arglist)),
  3331. s(:resbody, s(:array), nil)))
  3332. add_tests("rescue_exceptions",
  3333. "Ruby" => "begin\n blah\nrescue RuntimeError => r\n # do nothing\nend",
  3334. "RawParseTree" => [:rescue,
  3335. [:vcall, :blah],
  3336. [:resbody,
  3337. [:array, [:const, :RuntimeError]],
  3338. [:lasgn, :r, [:gvar, :$!]]]],
  3339. "ParseTree" => s(:rescue,
  3340. s(:call, nil, :blah, s(:arglist)),
  3341. s(:resbody,
  3342. s(:array,
  3343. s(:const, :RuntimeError),
  3344. s(:lasgn, :r, s(:gvar, :$!))),
  3345. nil)))
  3346. add_tests("rescue_iasgn_var_empty",
  3347. "Ruby" => "begin\n 1\nrescue => @e\n # do nothing\nend",
  3348. "RawParseTree" => [:rescue,
  3349. [:lit, 1],
  3350. [:resbody, nil, [:iasgn, :@e, [:gvar, :$!]]]],
  3351. "ParseTree" => s(:rescue,
  3352. s(:lit, 1),
  3353. s(:resbody,
  3354. s(:array, s(:iasgn, :@e, s(:gvar, :$!))),
  3355. nil)))
  3356. add_tests("rescue_lasgn",
  3357. "Ruby" => "begin\n 1\nrescue\n var = 2\nend",
  3358. "RawParseTree" => [:rescue,
  3359. [:lit, 1],
  3360. [:resbody, nil, [:lasgn, :var, [:lit, 2]]]],
  3361. "ParseTree" => s(:rescue,
  3362. s(:lit, 1),
  3363. s(:resbody,
  3364. s(:array),
  3365. s(:lasgn, :var, s(:lit, 2)))),
  3366. "Ruby2Ruby" => "1 rescue var = 2")
  3367. add_tests("rescue_lasgn_var",
  3368. "Ruby" => "begin\n 1\nrescue => e\n var = 2\nend",
  3369. "RawParseTree" => [:rescue,
  3370. [:lit, 1],
  3371. [:resbody, nil,
  3372. [:block,
  3373. [:lasgn, :e, [:gvar, :$!]],
  3374. [:lasgn, :var, [:lit, 2]]]]],
  3375. "ParseTree" => s(:rescue,
  3376. s(:lit, 1),
  3377. s(:resbody,
  3378. s(:array, s(:lasgn, :e, s(:gvar, :$!))),
  3379. s(:lasgn, :var, s(:lit, 2)))))
  3380. add_tests("rescue_lasgn_var_empty",
  3381. "Ruby" => "begin\n 1\nrescue => e\n # do nothing\nend",
  3382. "RawParseTree" => [:rescue,
  3383. [:lit, 1],
  3384. [:resbody, nil, [:lasgn, :e, [:gvar, :$!]]]],
  3385. "ParseTree" => s(:rescue,
  3386. s(:lit, 1),
  3387. s(:resbody,
  3388. s(:array, s(:lasgn, :e, s(:gvar, :$!))),
  3389. nil)))
  3390. add_tests("retry",
  3391. "Ruby" => "retry",
  3392. "RawParseTree" => [:retry],
  3393. "ParseTree" => s(:retry))
  3394. add_tests("return_0",
  3395. "Ruby" => "return",
  3396. "RawParseTree" => [:return],
  3397. "ParseTree" => s(:return))
  3398. add_tests("return_1",
  3399. "Ruby" => "return 1",
  3400. "RawParseTree" => [:return, [:lit, 1]],
  3401. "ParseTree" => s(:return, s(:lit, 1)))
  3402. add_tests("return_1_splatted",
  3403. "Ruby" => "return *1",
  3404. "RawParseTree" => [:return, [:svalue, [:splat, [:lit, 1]]]],
  3405. "ParseTree" => s(:return, s(:svalue, s(:splat, s(:lit, 1)))))
  3406. add_tests("return_n",
  3407. "Ruby" => "return 1, 2, 3",
  3408. "RawParseTree" => [:return, [:array,
  3409. [:lit, 1], [:lit, 2], [:lit, 3]]],
  3410. "ParseTree" => s(:return, s(:array,
  3411. s(:lit, 1), s(:lit, 2), s(:lit, 3))),
  3412. "Ruby2Ruby" => "return [1, 2, 3]")
  3413. add_tests("sclass",
  3414. "Ruby" => "class << self\n 42\nend",
  3415. "RawParseTree" => [:sclass, [:self], [:scope, [:lit, 42]]],
  3416. "ParseTree" => s(:sclass, s(:self), s(:scope, s(:lit, 42))))
  3417. add_tests("sclass_trailing_class",
  3418. "Ruby" => "class A\n class << self\n a\n end\n class B\n end\nend",
  3419. "RawParseTree" => [:class, :A, nil,
  3420. [:scope,
  3421. [:block,
  3422. [:sclass, [:self], [:scope, [:vcall, :a]]],
  3423. [:class, :B, nil, [:scope]]]]],
  3424. "ParseTree" => s(:class, :A, nil,
  3425. s(:scope,
  3426. s(:block,
  3427. s(:sclass, s(:self),
  3428. s(:scope,
  3429. s(:call, nil, :a, s(:arglist)))),
  3430. s(:class, :B, nil, s(:scope))))))
  3431. add_tests("splat",
  3432. "Ruby" => "def x(*b)\n a(*b)\nend",
  3433. "RawParseTree" => [:defn, :x,
  3434. [:scope,
  3435. [:block,
  3436. [:args, :"*b"],
  3437. [:fcall, :a, [:splat, [:lvar, :b]]]]]],
  3438. "ParseTree" => s(:defn, :x,
  3439. s(:args, :"*b"),
  3440. s(:scope,
  3441. s(:block,
  3442. s(:call, nil, :a,
  3443. s(:arglist, s(:splat, s(:lvar, :b))))))))
  3444. add_tests("splat_array",
  3445. "Ruby" => "[*[1]]",
  3446. "RawParseTree" => [:splat, [:array, [:lit, 1]]],
  3447. "ParseTree" => s(:array, s(:splat, s(:array, s(:lit, 1)))))
  3448. add_tests("splat_break",
  3449. "Ruby" => "break *[1]",
  3450. "RawParseTree" => [:break, [:svalue, [:splat, [:array, [:lit, 1]]]]],
  3451. "ParseTree" => s(:break, s(:svalue, s(:splat, s(:array, s(:lit, 1))))))
  3452. add_tests("splat_break_array",
  3453. "Ruby" => "break [*[1]]",
  3454. "RawParseTree" => [:break, [:splat, [:array, [:lit, 1]]]],
  3455. "ParseTree" => s(:break, s(:array, s(:splat, s(:array, s(:lit, 1))))))
  3456. add_tests("splat_fcall",
  3457. "Ruby" => "meth(*[1])",
  3458. "RawParseTree" => [:fcall, :meth,
  3459. [:splat, [:array, [:lit, 1]]]],
  3460. "ParseTree" => s(:call, nil, :meth,
  3461. s(:arglist, s(:splat, s(:array, s(:lit, 1))))))
  3462. add_tests("splat_fcall_array",
  3463. "Ruby" => "meth([*[1]])",
  3464. "RawParseTree" => [:fcall, :meth,
  3465. [:array, [:splat, [:array, [:lit, 1]]]]],
  3466. "ParseTree" => s(:call, nil, :meth,
  3467. s(:arglist,
  3468. s(:array, s(:splat, s(:array, s(:lit, 1)))))))
  3469. add_tests("splat_lasgn",
  3470. "Ruby" => "x = *[1]",
  3471. "RawParseTree" => [:lasgn, :x, [:svalue, [:splat, [:array, [:lit, 1]]]]],
  3472. "ParseTree" => s(:lasgn, :x, s(:svalue, s(:splat, s(:array, s(:lit, 1))))))
  3473. add_tests("splat_lasgn_array",
  3474. "Ruby" => "x = [*[1]]",
  3475. "RawParseTree" => [:lasgn, :x, [:splat, [:array, [:lit, 1]]]],
  3476. "ParseTree" => s(:lasgn, :x, s(:array, s(:splat, s(:array, s(:lit, 1))))))
  3477. add_tests("splat_lit_1",
  3478. "Ruby" => "[*1]",
  3479. "RawParseTree" => [:splat, [:lit, 1]], # UGH - damn MRI
  3480. "ParseTree" => s(:array, s(:splat, s(:lit, 1))))
  3481. add_tests("splat_lit_n",
  3482. "Ruby" => "[1, *2]",
  3483. "RawParseTree" => [:argscat, [:array, [:lit, 1]], [:lit, 2]],
  3484. "ParseTree" => s(:array, s(:lit, 1), s(:splat, s(:lit, 2))))
  3485. add_tests("splat_next",
  3486. "Ruby" => "next *[1]",
  3487. "RawParseTree" => [:next, [:svalue, [:splat, [:array, [:lit, 1]]]]],
  3488. "ParseTree" => s(:next, s(:svalue, s(:splat, s(:array, s(:lit, 1))))))
  3489. add_tests("splat_next_array",
  3490. "Ruby" => "next [*[1]]",
  3491. "RawParseTree" => [:next, [:splat, [:array, [:lit, 1]]]],
  3492. "ParseTree" => s(:next, s(:array, s(:splat, s(:array, s(:lit, 1))))))
  3493. add_tests("splat_return",
  3494. "Ruby" => "return *[1]",
  3495. "RawParseTree" => [:return, [:svalue, [:splat, [:array, [:lit, 1]]]]],
  3496. "ParseTree" => s(:return, s(:svalue, s(:splat, s(:array, s(:lit, 1))))))
  3497. add_tests("splat_return_array",
  3498. "Ruby" => "return [*[1]]",
  3499. "RawParseTree" => [:return, [:splat, [:array, [:lit, 1]]]],
  3500. "ParseTree" => s(:return, s(:array, s(:splat, s(:array, s(:lit, 1))))))
  3501. add_tests("splat_super",
  3502. "Ruby" => "super(*[1])",
  3503. "RawParseTree" => [:super, [:splat, [:array, [:lit, 1]]]],
  3504. "ParseTree" => s(:super, s(:splat, s(:array, s(:lit, 1)))))
  3505. add_tests("splat_super_array",
  3506. "Ruby" => "super([*[1]])",
  3507. "RawParseTree" => [:super, [:array, [:splat, [:array, [:lit, 1]]]]],
  3508. "ParseTree" => s(:super, s(:array, s(:splat, s(:array, s(:lit, 1))))))
  3509. add_tests("splat_yield",
  3510. "Ruby" => "yield(*[1])",
  3511. "RawParseTree" => [:yield, [:splat, [:array, [:lit, 1]]]],
  3512. "ParseTree" => s(:yield, s(:splat, s(:array, s(:lit, 1)))))
  3513. add_tests("splat_yield_array",
  3514. "Ruby" => "yield([*[1]])",
  3515. "RawParseTree" => [:yield, [:splat, [:array, [:lit, 1]]], true],
  3516. "ParseTree" => s(:yield, s(:array, s(:splat, s(:array, s(:lit, 1))))))
  3517. add_tests("str",
  3518. "Ruby" => '"x"',
  3519. "RawParseTree" => [:str, "x"],
  3520. "ParseTree" => s(:str, "x"))
  3521. add_tests("str_concat_newline", # FIX? make prettier? possible?
  3522. "Ruby" => '"before" \\
  3523. " after"',
  3524. "RawParseTree" => [:str, "before after"],
  3525. "ParseTree" => s(:str, "before after"),
  3526. "Ruby2Ruby" => '"before after"')
  3527. add_tests("str_concat_space",
  3528. "Ruby" => '"before" " after"',
  3529. "RawParseTree" => [:str, "before after"],
  3530. "ParseTree" => s(:str, "before after"),
  3531. "Ruby2Ruby" => '"before after"')
  3532. add_tests("str_heredoc",
  3533. "Ruby" => "<<'EOM'\n blah\nblah\nEOM",
  3534. "RawParseTree" => [:str, " blah\nblah\n"],
  3535. "ParseTree" => s(:str, " blah\nblah\n"),
  3536. "Ruby2Ruby" => "\" blah\\nblah\\n\"")
  3537. add_tests("str_heredoc_call",
  3538. "Ruby" => "<<'EOM'.strip\n blah\nblah\nEOM",
  3539. "RawParseTree" => [:call, [:str, " blah\nblah\n"], :strip],
  3540. "ParseTree" => s(:call, s(:str, " blah\nblah\n"),
  3541. :strip, s(:arglist)),
  3542. "Ruby2Ruby" => "\" blah\\nblah\\n\".strip")
  3543. add_tests("str_heredoc_double",
  3544. "Ruby" => "a += <<-H1 + b + <<-H2\n first\nH1\n second\nH2",
  3545. "RawParseTree" => [:lasgn, :a,
  3546. [:call,
  3547. [:lvar, :a],
  3548. :+,
  3549. [:array,
  3550. [:call,
  3551. [:call, [:str, " first\n"], :+,
  3552. [:array, [:vcall, :b]]],
  3553. :+,
  3554. [:array, [:str, " second\n"]]]]]],
  3555. "ParseTree" => s(:lasgn, :a,
  3556. s(:call,
  3557. s(:lvar, :a),
  3558. :+,
  3559. s(:arglist,
  3560. s(:call,
  3561. s(:call, s(:str, " first\n"), :+,
  3562. s(:arglist,
  3563. s(:call, nil, :b, s(:arglist)))),
  3564. :+,
  3565. s(:arglist, s(:str, " second\n")))))),
  3566. "Ruby2Ruby" => "a = (a + ((\" first\\n\" + b) + \" second\\n\"))")
  3567. add_tests("str_heredoc_empty", # yes... tarded
  3568. "Ruby" => "<<'EOM'\nEOM",
  3569. "RawParseTree" => [:str, ""],
  3570. "ParseTree" => s(:str, ""),
  3571. "Ruby2Ruby" => '""')
  3572. add_tests("str_heredoc_indent",
  3573. "Ruby" => "<<-EOM\n blah\nblah\n\n EOM",
  3574. "RawParseTree" => [:str, " blah\nblah\n\n"],
  3575. "ParseTree" => s(:str, " blah\nblah\n\n"),
  3576. "Ruby2Ruby" => "\" blah\\nblah\\n\\n\"")
  3577. add_tests("str_interp_file",
  3578. "Ruby" => '"file = #{__FILE__}\n"',
  3579. "RawParseTree" => [:str, "file = (string)\n"],
  3580. "ParseTree" => s(:str, "file = (string)\n"),
  3581. "Ruby2Ruby" => '"file = (string)\\n"')
  3582. add_tests("structure_extra_block_for_dvar_scoping",
  3583. "Ruby" => "a.b do |c, d|\n unless e.f(c) then\n g = false\n d.h { |x, i| g = true }\n end\nend",
  3584. "RawParseTree" => [:iter,
  3585. [:call, [:vcall, :a], :b],
  3586. [:masgn, [:array,
  3587. [:dasgn_curr, :c],
  3588. [:dasgn_curr, :d]], nil, nil],
  3589. [:if,
  3590. [:call, [:vcall, :e], :f,
  3591. [:array, [:dvar, :c]]],
  3592. nil,
  3593. [:block,
  3594. [:dasgn_curr, :g, [:false]],
  3595. [:iter,
  3596. [:call, [:dvar, :d], :h],
  3597. [:masgn, [:array,
  3598. [:dasgn_curr, :x],
  3599. [:dasgn_curr, :i]], nil, nil],
  3600. [:dasgn, :g, [:true]]]]]],
  3601. "ParseTree" => s(:iter,
  3602. s(:call,
  3603. s(:call, nil, :a, s(:arglist)),
  3604. :b, s(:arglist)),
  3605. s(:masgn, s(:array,
  3606. s(:lasgn, :c),
  3607. s(:lasgn, :d))),
  3608. s(:if,
  3609. s(:call, s(:call, nil, :e, s(:arglist)), :f,
  3610. s(:arglist, s(:lvar, :c))),
  3611. nil,
  3612. s(:block,
  3613. s(:lasgn, :g, s(:false)),
  3614. s(:iter,
  3615. s(:call, s(:lvar, :d), :h, s(:arglist)),
  3616. s(:masgn, s(:array,
  3617. s(:lasgn, :x),
  3618. s(:lasgn, :i))),
  3619. s(:lasgn, :g, s(:true)))))))
  3620. add_tests("structure_remove_begin_1",
  3621. "Ruby" => "a << begin\n b\n rescue\n c\n end",
  3622. "RawParseTree" => [:call, [:vcall, :a], :<<,
  3623. [:array, [:rescue, [:vcall, :b],
  3624. [:resbody, nil, [:vcall, :c]]]]],
  3625. "ParseTree" => s(:call, s(:call, nil, :a, s(:arglist)), :<<,
  3626. s(:arglist,
  3627. s(:rescue,
  3628. s(:call, nil, :b, s(:arglist)),
  3629. s(:resbody, s(:array),
  3630. s(:call, nil, :c, s(:arglist)))))),
  3631. "Ruby2Ruby" => "(a << b rescue c)")
  3632. add_tests("structure_remove_begin_2",
  3633. "Ruby" => "a = if c\n begin\n b\n rescue\n nil\n end\n end\na",
  3634. "RawParseTree" => [:block,
  3635. [:lasgn,
  3636. :a,
  3637. [:if, [:vcall, :c],
  3638. [:rescue,
  3639. [:vcall, :b],
  3640. [:resbody, nil, [:nil]]],
  3641. nil]],
  3642. [:lvar, :a]],
  3643. "ParseTree" => s(:block,
  3644. s(:lasgn,
  3645. :a,
  3646. s(:if, s(:call, nil, :c, s(:arglist)),
  3647. s(:rescue, s(:call, nil, :b, s(:arglist)),
  3648. s(:resbody,
  3649. s(:array), s(:nil))),
  3650. nil)),
  3651. s(:lvar, :a)),
  3652. "Ruby2Ruby" => "a = b rescue nil if c\na\n") # OMG that's awesome
  3653. add_tests("structure_unused_literal_wwtt",
  3654. "Ruby" => "\"prevent the above from infecting rdoc\"\n\nmodule Graffle\nend",
  3655. "RawParseTree" => [:module, :Graffle, [:scope]],
  3656. "ParseTree" => s(:module, :Graffle, s(:scope)),
  3657. "Ruby2Ruby" => "module Graffle\nend")
  3658. add_tests("super_0",
  3659. "Ruby" => "def x\n super()\nend",
  3660. "RawParseTree" => [:defn, :x,
  3661. [:scope,
  3662. [:block, [:args], [:super]]]],
  3663. "ParseTree" => s(:defn, :x,
  3664. s(:args),
  3665. s(:scope, s(:block, s(:super)))))
  3666. add_tests("super_1",
  3667. "Ruby" => "def x\n super(4)\nend",
  3668. "RawParseTree" => [:defn, :x,
  3669. [:scope,
  3670. [:block,
  3671. [:args],
  3672. [:super, [:array, [:lit, 4]]]]]],
  3673. "ParseTree" => s(:defn, :x,
  3674. s(:args),
  3675. s(:scope,
  3676. s(:block,
  3677. s(:super, s(:lit, 4))))))
  3678. add_tests("super_1_array",
  3679. "Ruby" => "def x\n super([24, 42])\nend",
  3680. "RawParseTree" => [:defn, :x,
  3681. [:scope,
  3682. [:block,
  3683. [:args],
  3684. [:super,
  3685. [:array,
  3686. [:array, [:lit, 24], [:lit, 42]]]]]]],
  3687. "ParseTree" => s(:defn, :x,
  3688. s(:args),
  3689. s(:scope,
  3690. s(:block,
  3691. s(:super, s(:array,
  3692. s(:lit, 24),
  3693. s(:lit, 42)))))))
  3694. add_tests("super_block_pass",
  3695. "Ruby" => "super(a, &b)",
  3696. "RawParseTree" => [:block_pass,
  3697. [:vcall, :b], [:super, [:array, [:vcall, :a]]]],
  3698. "ParseTree" => s(:super,
  3699. s(:call, nil, :a, s(:arglist)),
  3700. s(:block_pass,
  3701. s(:call, nil, :b, s(:arglist)))))
  3702. add_tests("super_block_splat",
  3703. "Ruby" => "super(a, *b)",
  3704. "RawParseTree" => [:super,
  3705. [:argscat,
  3706. [:array, [:vcall, :a]],
  3707. [:vcall, :b]]],
  3708. "ParseTree" => s(:super,
  3709. s(:call, nil, :a, s(:arglist)),
  3710. s(:splat, s(:call, nil, :b, s(:arglist)))))
  3711. add_tests("super_n",
  3712. "Ruby" => "def x\n super(24, 42)\nend",
  3713. "RawParseTree" => [:defn, :x,
  3714. [:scope,
  3715. [:block,
  3716. [:args],
  3717. [:super, [:array, [:lit, 24], [:lit, 42]]]]]],
  3718. "ParseTree" => s(:defn, :x,
  3719. s(:args),
  3720. s(:scope,
  3721. s(:block,
  3722. s(:super, s(:lit, 24), s(:lit, 42))))))
  3723. add_tests("svalue",
  3724. "Ruby" => "a = *b",
  3725. "RawParseTree" => [:lasgn, :a, [:svalue, [:splat, [:vcall, :b]]]],
  3726. "ParseTree" => s(:lasgn, :a,
  3727. s(:svalue,
  3728. s(:splat, s(:call, nil, :b, s(:arglist))))))
  3729. add_tests("to_ary",
  3730. "Ruby" => "a, b = c",
  3731. "RawParseTree" => [:masgn,
  3732. [:array, [:lasgn, :a], [:lasgn, :b]], nil,
  3733. [:to_ary, [:vcall, :c]]],
  3734. "ParseTree" => s(:masgn,
  3735. s(:array, s(:lasgn, :a), s(:lasgn, :b)),
  3736. s(:to_ary, s(:call, nil, :c, s(:arglist)))))
  3737. add_tests("true",
  3738. "Ruby" => "true",
  3739. "RawParseTree" => [:true],
  3740. "ParseTree" => s(:true))
  3741. add_tests("undef",
  3742. "Ruby" => "undef :x",
  3743. "RawParseTree" => [:undef, [:lit, :x]],
  3744. "ParseTree" => s(:undef, s(:lit, :x)))
  3745. add_tests("undef_2",
  3746. "Ruby" => "undef :x, :y",
  3747. "RawParseTree" => [:block,
  3748. [:undef, [:lit, :x]],
  3749. [:undef, [:lit, :y]]],
  3750. "ParseTree" => s(:block,
  3751. s(:undef, s(:lit, :x)),
  3752. s(:undef, s(:lit, :y))),
  3753. "Ruby2Ruby" => "undef :x\nundef :y\n")
  3754. add_tests("undef_3",
  3755. "Ruby" => "undef :x, :y, :z",
  3756. "RawParseTree" => [:block,
  3757. [:undef, [:lit, :x]],
  3758. [:undef, [:lit, :y]],
  3759. [:undef, [:lit, :z]]],
  3760. "ParseTree" => s(:block,
  3761. s(:undef, s(:lit, :x)),
  3762. s(:undef, s(:lit, :y)),
  3763. s(:undef, s(:lit, :z))),
  3764. "Ruby2Ruby" => "undef :x\nundef :y\nundef :z\n")
  3765. add_tests("undef_block_1",
  3766. "Ruby" => "f1\nundef :x\n", # TODO: don't like the extra return
  3767. "RawParseTree" => [:block,
  3768. [:vcall, :f1],
  3769. [:undef, [:lit, :x]]],
  3770. "ParseTree" => s(:block,
  3771. s(:call, nil, :f1, s(:arglist)),
  3772. s(:undef, s(:lit, :x))))
  3773. add_tests("undef_block_2",
  3774. "Ruby" => "f1\nundef :x, :y",
  3775. "RawParseTree" => [:block,
  3776. [:vcall, :f1],
  3777. [:block,
  3778. [:undef, [:lit, :x]],
  3779. [:undef, [:lit, :y]],
  3780. ]],
  3781. "ParseTree" => s(:block,
  3782. s(:call, nil, :f1, s(:arglist)),
  3783. s(:block,
  3784. s(:undef, s(:lit, :x)),
  3785. s(:undef, s(:lit, :y)))),
  3786. "Ruby2Ruby" => "f1\n(undef :x\nundef :y)\n")
  3787. add_tests("undef_block_3",
  3788. "Ruby" => "f1\nundef :x, :y, :z",
  3789. "RawParseTree" => [:block,
  3790. [:vcall, :f1],
  3791. [:block,
  3792. [:undef, [:lit, :x]],
  3793. [:undef, [:lit, :y]],
  3794. [:undef, [:lit, :z]],
  3795. ]],
  3796. "ParseTree" => s(:block,
  3797. s(:call, nil, :f1, s(:arglist)),
  3798. s(:block,
  3799. s(:undef, s(:lit, :x)),
  3800. s(:undef, s(:lit, :y)),
  3801. s(:undef, s(:lit, :z)))),
  3802. "Ruby2Ruby" => "f1\n(undef :x\nundef :y\nundef :z)\n")
  3803. add_tests("undef_block_3_post",
  3804. "Ruby" => "undef :x, :y, :z\nf2",
  3805. "RawParseTree" => [:block,
  3806. [:undef, [:lit, :x]],
  3807. [:undef, [:lit, :y]],
  3808. [:undef, [:lit, :z]],
  3809. [:vcall, :f2]],
  3810. "ParseTree" => s(:block,
  3811. s(:undef, s(:lit, :x)),
  3812. s(:undef, s(:lit, :y)),
  3813. s(:undef, s(:lit, :z)),
  3814. s(:call, nil, :f2, s(:arglist))),
  3815. "Ruby2Ruby" => "undef :x\nundef :y\nundef :z\nf2\n")
  3816. add_tests("undef_block_wtf",
  3817. "Ruby" => "f1\nundef :x, :y, :z\nf2",
  3818. "RawParseTree" => [:block,
  3819. [:vcall, :f1],
  3820. [:block,
  3821. [:undef, [:lit, :x]],
  3822. [:undef, [:lit, :y]],
  3823. [:undef, [:lit, :z]]],
  3824. [:vcall, :f2]],
  3825. "ParseTree" => s(:block,
  3826. s(:call, nil, :f1, s(:arglist)),
  3827. s(:block,
  3828. s(:undef, s(:lit, :x)),
  3829. s(:undef, s(:lit, :y)),
  3830. s(:undef, s(:lit, :z))),
  3831. s(:call, nil, :f2, s(:arglist))),
  3832. "Ruby2Ruby" => "f1\n(undef :x\nundef :y\nundef :z)\nf2\n")
  3833. add_tests("unless_post",
  3834. "Ruby" => "a unless b",
  3835. "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]],
  3836. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil,
  3837. s(:call, nil, :a, s(:arglist))))
  3838. add_tests("unless_post_not",
  3839. "Ruby" => "a unless not b",
  3840. "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil],
  3841. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)),
  3842. s(:call, nil, :a, s(:arglist)), nil),
  3843. "Ruby2Ruby" => "a if b")
  3844. add_tests("unless_pre",
  3845. "Ruby" => "unless b then a end",
  3846. "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]],
  3847. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil,
  3848. s(:call, nil, :a, s(:arglist))),
  3849. "Ruby2Ruby" => "a unless b")
  3850. add_tests("unless_pre_not",
  3851. "Ruby" => "unless not b then a end",
  3852. "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil],
  3853. "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)),
  3854. s(:call, nil, :a, s(:arglist)), nil),
  3855. "Ruby2Ruby" => "a if b")
  3856. add_tests("until_post",
  3857. "Ruby" => "begin\n (1 + 1)\nend until false",
  3858. "RawParseTree" => [:until, [:false],
  3859. [:call, [:lit, 1], :+,
  3860. [:array, [:lit, 1]]], false],
  3861. "ParseTree" => s(:until, s(:false),
  3862. s(:call, s(:lit, 1), :+,
  3863. s(:arglist, s(:lit, 1))), false))
  3864. add_tests("until_post_not",
  3865. "Ruby" => "begin\n (1 + 1)\nend until not true",
  3866. "RawParseTree" => [:while, [:true],
  3867. [:call, [:lit, 1], :+,
  3868. [:array, [:lit, 1]]], false],
  3869. "ParseTree" => s(:while, s(:true),
  3870. s(:call, s(:lit, 1), :+,
  3871. s(:arglist, s(:lit, 1))), false),
  3872. "Ruby2Ruby" => "begin\n (1 + 1)\nend while true")
  3873. add_tests("until_pre",
  3874. "Ruby" => "until false do\n (1 + 1)\nend",
  3875. "RawParseTree" => [:until, [:false],
  3876. [:call, [:lit, 1], :+,
  3877. [:array, [:lit, 1]]], true],
  3878. "ParseTree" => s(:until, s(:false),
  3879. s(:call, s(:lit, 1), :+,
  3880. s(:arglist, s(:lit, 1))), true))
  3881. add_tests("until_pre_mod",
  3882. "Ruby" => "(1 + 1) until false",
  3883. "RawParseTree" => [:until, [:false],
  3884. [:call, [:lit, 1], :+,
  3885. [:array, [:lit, 1]]], true],
  3886. "ParseTree" => s(:until, s(:false),
  3887. s(:call, s(:lit, 1), :+,
  3888. s(:arglist, s(:lit, 1))), true),
  3889. "Ruby2Ruby" => "until false do\n (1 + 1)\nend")
  3890. add_tests("until_pre_not",
  3891. "Ruby" => "until not true do\n (1 + 1)\nend",
  3892. "RawParseTree" => [:while, [:true],
  3893. [:call, [:lit, 1], :+,
  3894. [:array, [:lit, 1]]], true],
  3895. "ParseTree" => s(:while, s(:true),
  3896. s(:call, s(:lit, 1), :+,
  3897. s(:arglist, s(:lit, 1))), true),
  3898. "Ruby2Ruby" => "while true do\n (1 + 1)\nend")
  3899. add_tests("until_pre_not_mod",
  3900. "Ruby" => "(1 + 1) until not true",
  3901. "RawParseTree" => [:while, [:true],
  3902. [:call, [:lit, 1], :+,
  3903. [:array, [:lit, 1]]], true],
  3904. "ParseTree" => s(:while, s(:true),
  3905. s(:call, s(:lit, 1), :+,
  3906. s(:arglist, s(:lit, 1))), true),
  3907. "Ruby2Ruby" => "while true do\n (1 + 1)\nend")
  3908. add_tests("valias",
  3909. "Ruby" => "alias $y $x",
  3910. "RawParseTree" => [:valias, :$y, :$x],
  3911. "ParseTree" => s(:valias, :$y, :$x))
  3912. add_tests("vcall",
  3913. "Ruby" => "method",
  3914. "RawParseTree" => [:vcall, :method],
  3915. "ParseTree" => s(:call, nil, :method, s(:arglist)))
  3916. add_tests("while_post",
  3917. "Ruby" => "begin\n (1 + 1)\nend while false",
  3918. "RawParseTree" => [:while, [:false],
  3919. [:call, [:lit, 1], :+,
  3920. [:array, [:lit, 1]]], false],
  3921. "ParseTree" => s(:while, s(:false),
  3922. s(:call, s(:lit, 1), :+,
  3923. s(:arglist, s(:lit, 1))), false))
  3924. add_tests("while_post2",
  3925. "Ruby" => "begin\n (1 + 2)\n (3 + 4)\nend while false",
  3926. "RawParseTree" => [:while, [:false],
  3927. [:block,
  3928. [:call, [:lit, 1], :+, [:array, [:lit, 2]]],
  3929. [:call, [:lit, 3], :+, [:array, [:lit, 4]]]],
  3930. false],
  3931. "ParseTree" => s(:while, s(:false),
  3932. s(:block,
  3933. s(:call, s(:lit, 1), :+,
  3934. s(:arglist, s(:lit, 2))),
  3935. s(:call, s(:lit, 3), :+,
  3936. s(:arglist, s(:lit, 4)))),
  3937. false))
  3938. add_tests("while_post_not",
  3939. "Ruby" => "begin\n (1 + 1)\nend while not true",
  3940. "RawParseTree" => [:until, [:true],
  3941. [:call, [:lit, 1], :+,
  3942. [:array, [:lit, 1]]], false],
  3943. "ParseTree" => s(:until, s(:true),
  3944. s(:call, s(:lit, 1), :+,
  3945. s(:arglist, s(:lit, 1))), false),
  3946. "Ruby2Ruby" => "begin\n (1 + 1)\nend until true")
  3947. add_tests("while_pre",
  3948. "Ruby" => "while false do\n (1 + 1)\nend",
  3949. "RawParseTree" => [:while, [:false],
  3950. [:call, [:lit, 1], :+,
  3951. [:array, [:lit, 1]]], true],
  3952. "ParseTree" => s(:while, s(:false),
  3953. s(:call, s(:lit, 1), :+,
  3954. s(:arglist, s(:lit, 1))), true))
  3955. add_tests("while_pre_mod",
  3956. "Ruby" => "(1 + 1) while false",
  3957. "RawParseTree" => [:while, [:false],
  3958. [:call, [:lit, 1], :+,
  3959. [:array, [:lit, 1]]], true],
  3960. "ParseTree" => s(:while, s(:false),
  3961. s(:call, s(:lit, 1), :+,
  3962. s(:arglist, s(:lit, 1))), true),
  3963. "Ruby2Ruby" => "while false do\n (1 + 1)\nend") # FIX can be one liner
  3964. add_tests("while_pre_nil",
  3965. "Ruby" => "while false do\nend",
  3966. "RawParseTree" => [:while, [:false], nil, true],
  3967. "ParseTree" => s(:while, s(:false), nil, true))
  3968. add_tests("while_pre_not",
  3969. "Ruby" => "while not true do\n (1 + 1)\nend",
  3970. "RawParseTree" => [:until, [:true],
  3971. [:call, [:lit, 1], :+,
  3972. [:array, [:lit, 1]]], true],
  3973. "ParseTree" => s(:until, s(:true),
  3974. s(:call, s(:lit, 1), :+,
  3975. s(:arglist, s(:lit, 1))), true),
  3976. "Ruby2Ruby" => "until true do\n (1 + 1)\nend")
  3977. add_tests("while_pre_not_mod",
  3978. "Ruby" => "(1 + 1) while not true",
  3979. "RawParseTree" => [:until, [:true],
  3980. [:call, [:lit, 1], :+,
  3981. [:array, [:lit, 1]]], true],
  3982. "ParseTree" => s(:until, s(:true),
  3983. s(:call, s(:lit, 1), :+,
  3984. s(:arglist, s(:lit, 1))), true),
  3985. "Ruby2Ruby" => "until true do\n (1 + 1)\nend") # FIX
  3986. add_tests("xstr",
  3987. "Ruby" => "`touch 5`",
  3988. "RawParseTree" => [:xstr, 'touch 5'],
  3989. "ParseTree" => s(:xstr, 'touch 5'))
  3990. add_tests("yield_0",
  3991. "Ruby" => "yield",
  3992. "RawParseTree" => [:yield],
  3993. "ParseTree" => s(:yield))
  3994. add_tests("yield_1",
  3995. "Ruby" => "yield(42)",
  3996. "RawParseTree" => [:yield, [:lit, 42]],
  3997. "ParseTree" => s(:yield, s(:lit, 42)))
  3998. add_tests("yield_array_0",
  3999. "Ruby" => "yield([])",
  4000. "RawParseTree" => [:yield, [:zarray], true],
  4001. "ParseTree" => s(:yield, s(:array)))
  4002. add_tests("yield_array_1",
  4003. "Ruby" => "yield([42])",
  4004. "RawParseTree" => [:yield, [:array, [:lit, 42]], true],
  4005. "ParseTree" => s(:yield, s(:array, s(:lit, 42))))
  4006. add_tests("yield_array_n",
  4007. "Ruby" => "yield([42, 24])",
  4008. "RawParseTree" => [:yield, [:array, [:lit, 42], [:lit, 24]], true],
  4009. "ParseTree" => s(:yield, s(:array, s(:lit, 42), s(:lit, 24))))
  4010. add_tests("yield_n",
  4011. "Ruby" => "yield(42, 24)",
  4012. "RawParseTree" => [:yield, [:array, [:lit, 42], [:lit, 24]]],
  4013. "ParseTree" => s(:yield, s(:lit, 42), s(:lit, 24)))
  4014. add_tests("zarray",
  4015. "Ruby" => "a = []",
  4016. "RawParseTree" => [:lasgn, :a, [:zarray]],
  4017. "ParseTree" => s(:lasgn, :a, s(:array)))
  4018. add_tests("zsuper",
  4019. "Ruby" => "def x\n super\nend",
  4020. "RawParseTree" => [:defn, :x,
  4021. [:scope, [:block, [:args], [:zsuper]]]],
  4022. "ParseTree" => s(:defn, :x, s(:args),
  4023. s(:scope, s(:block, s(:zsuper)))))
  4024. end