parser 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -7
  2. data/.gitignore +0 -1
  3. data/README.md +4 -2
  4. data/bin/{parse → ruby-parse} +2 -2
  5. data/bin/ruby-rewrite +6 -0
  6. data/{AST_FORMAT.md → doc/AST_FORMAT.md} +45 -29
  7. data/doc/CUSTOMIZATION.md +37 -0
  8. data/doc/INTERNALS.md +21 -0
  9. data/lib/parser.rb +14 -3
  10. data/lib/parser/ast/node.rb +6 -0
  11. data/lib/parser/ast/processor.rb +216 -0
  12. data/lib/parser/builders/default.rb +613 -215
  13. data/lib/parser/compatibility/slop.rb +12 -0
  14. data/lib/parser/lexer.rl +30 -10
  15. data/lib/parser/lexer/explanation.rb +1 -1
  16. data/lib/parser/lexer/literal.rb +5 -6
  17. data/lib/parser/ruby18.y +31 -24
  18. data/lib/parser/ruby19.y +26 -19
  19. data/lib/parser/ruby20.y +27 -20
  20. data/lib/parser/ruby21.y +27 -20
  21. data/lib/parser/runner.rb +198 -0
  22. data/lib/parser/runner/ruby_parse.rb +87 -0
  23. data/lib/parser/runner/ruby_rewrite.rb +13 -0
  24. data/lib/parser/source/buffer.rb +1 -0
  25. data/lib/parser/source/map.rb +20 -0
  26. data/lib/parser/source/map/block.rb +16 -0
  27. data/lib/parser/source/map/collection.rb +16 -0
  28. data/lib/parser/source/map/condition.rb +19 -0
  29. data/lib/parser/source/map/constant.rb +27 -0
  30. data/lib/parser/source/map/definition.rb +21 -0
  31. data/lib/parser/source/map/for.rb +17 -0
  32. data/lib/parser/source/map/keyword.rb +18 -0
  33. data/lib/parser/source/map/rescue_body.rb +19 -0
  34. data/lib/parser/source/map/send.rb +29 -0
  35. data/lib/parser/source/map/ternary.rb +16 -0
  36. data/lib/parser/source/map/variable.rb +26 -0
  37. data/lib/parser/source/range.rb +25 -24
  38. data/lib/parser/version.rb +3 -0
  39. data/parser.gemspec +4 -2
  40. data/test/parse_helper.rb +13 -10
  41. data/test/test_lexer.rb +32 -11
  42. data/test/test_parse_helper.rb +1 -0
  43. data/test/test_parser.rb +176 -128
  44. data/test/test_source_range.rb +18 -6
  45. metadata +161 -91
  46. data/bin/benchmark +0 -47
  47. data/bin/explain-parse +0 -14
  48. data/lib/parser/source/map/variable_assignment.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
- ---
2
- SHA512:
3
- metadata.gz: 9770aa1a6462f5becb021dd1273bb992ce984aa07f4d2ab3184f909b4c9d5b7bf207c62e1c2d1f6684dfbde36c2e12cad77824d9b2343c86569b8d37d8b40259
4
- data.tar.gz: c84a8295a37621c885de2618f8fc514469c239b564ca29ca75a576e0a1133f396707382aeccc1b4d73347671b081c0162b84bed32546796ea1fae02d66968aad
5
- SHA1:
6
- metadata.gz: 4a29479081e4085c756ccbfe0841c4b8244ce7ac
7
- data.tar.gz: b2bdbd92ecf63102deafdfe71be38930d2c33930
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 16e6e6480aa89b565b60ceca67280519331836c0
4
+ data.tar.gz: 023823bcfbdf9f66858ed4de49d738cd94587891
5
+ SHA512:
6
+ metadata.gz: 999557fa55073dbd6077d224409d740b6ec68b9f0198906db4e5bd20276adfb3eab75aa9e2823369f5db8bcf474c7e37d709354c9bf8ffdd1200ffe7ddcdaa45
7
+ data.tar.gz: af1727c35cd4bdb1aea2735c9613c517ad363e9f3511a78d5287802b80fcfdbcf81bf6ce875d61e5f4e0fe8ff793adfde7692e882ac877519f51c7c53a177bf1
data/.gitignore CHANGED
@@ -7,7 +7,6 @@ Gemfile.lock
7
7
  InstalledFiles
8
8
  _yardoc
9
9
  coverage
10
- doc/
11
10
  lib/bundler/man
12
11
  pkg
13
12
  rdoc
data/README.md CHANGED
@@ -41,10 +41,12 @@ p parser.parse(buffer)
41
41
  # (send nil :bar)))
42
42
  ```
43
43
 
44
+ If you reuse the same parser object for multiple `#parse` runs, you need to `#reset` it.
45
+
44
46
  ## Features
45
47
 
46
- * Precise source location reporting (WIP, no, not really yet).
47
- * [Documented](AST_FORMAT.md) AST format which is convenient to work with.
48
+ * Precise source location reporting.
49
+ * [Documented](doc/AST_FORMAT.md) AST format which is convenient to work with.
48
50
  * A simple interface and a powerful, tweakable one.
49
51
  * Parses 1.8, 1.9, 2.0 and 2.1 (preliminary) syntax with backwards-compatible AST formats.
50
52
  * Parsing error recovery.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
4
- require 'parser/all'
4
+ require 'parser/runner/ruby_parse'
5
5
 
6
- p Parser::Ruby20.parse(ARGF.read)
6
+ Parser::Runner::RubyParse.go(ARGV)
data/bin/ruby-rewrite ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
4
+ require 'parser/runner/ruby_rewrite'
5
+
6
+ Parser::Runner::RubyRewrite.go(ARGV)
@@ -296,6 +296,7 @@ Format:
296
296
  (const (cbase) :Foo)
297
297
  "::Foo"
298
298
  ~~~ name
299
+ ~~ double_colon
299
300
  ~~~~~ expression
300
301
  ```
301
302
 
@@ -306,6 +307,7 @@ Format:
306
307
  (const (lvar :a) :Foo)
307
308
  "a::Foo"
308
309
  ~~~ name
310
+ ~~ double_colon
309
311
  ~~~~~~ expression
310
312
  ```
311
313
 
@@ -590,7 +592,7 @@ s(:op_asgn1, s(:ivar, :@foo), s(:arglist, s(:int, 0)), :"||", s(:int, 1))
590
592
 
591
593
  Format:
592
594
  ```
593
- (module (const nil :Foo) (begin))
595
+ (module (const nil :Foo) (nil))
594
596
  "module Foo; end"
595
597
  ~~~~~~ keyword
596
598
  ~~~ end
@@ -600,25 +602,29 @@ Format:
600
602
 
601
603
  Format:
602
604
  ```
603
- (class (const nil :Foo) (const nil :Bar) (begin))
605
+ (class (const nil :Foo) (const nil :Bar) (nil))
604
606
  "class Foo < Bar; end"
605
607
  ~~~~~ keyword ~~~ end
608
+ ~ operator
609
+ ~~~~~~~~~~~~~~~~~~~~ expression
606
610
 
607
- (class (const nil :Foo) nil (begin))
611
+ (class (const nil :Foo) nil (nil))
608
612
  "class Foo; end"
609
613
  ~~~~~ keyword
610
614
  ~~~ end
615
+ ~~~~~~~~~~~~~~ expression
611
616
  ```
612
617
 
613
618
  ### Singleton class
614
619
 
615
620
  Format:
616
621
  ```
617
- (sclass (lvar :a) (begin))
622
+ (sclass (lvar :a) (nil))
618
623
  "class << a; end"
619
624
  ~~~~~ keyword
620
625
  ~~ operator
621
626
  ~~~ end
627
+ ~~~~~~~~~~~~~~~ expression
622
628
  ```
623
629
 
624
630
  ## Method (un)definition
@@ -834,6 +840,8 @@ Format:
834
840
  (send nil :foo (lvar :bar))
835
841
  "foo(bar)"
836
842
  ~~~ selector
843
+ ^ begin
844
+ ^ end
837
845
  ~~~~~~~~ expression
838
846
  ```
839
847
 
@@ -844,6 +852,8 @@ Format:
844
852
  (send (lvar :foo) :bar (int 1))
845
853
  "foo.bar(1)"
846
854
  ~~~ selector
855
+ ^ begin
856
+ ^ end
847
857
  ~~~~~~~~~~ expression
848
858
 
849
859
  (send (lvar :foo) :+ (int 1))
@@ -858,22 +868,18 @@ Format:
858
868
 
859
869
  (send (lvar :foo) :a= (int 1))
860
870
  "foo.a = 1"
861
- ~~~ selector
871
+ ~ selector
862
872
  ^ operator
863
873
  ~~~~~~~~~ expression
864
874
 
865
875
  (send (lvar :foo) :[] (int 1))
866
876
  "foo[i]"
867
877
  ~~~ selector
868
- ^ begin
869
- ^ end
870
878
  ~~~~~~ expression
871
879
 
872
880
  (send (lvar :bar) :[]= (int 1) (int 2) (lvar :baz))
873
881
  "bar[1, 2] = baz"
874
- ~~~~~~~~ selector
875
- ^ begin
876
- ^ end
882
+ ~~~~~~ selector
877
883
  ^ operator
878
884
  ~~~~~~~~~~~~~~~ expression
879
885
 
@@ -1066,9 +1072,10 @@ Format:
1066
1072
  Format:
1067
1073
  ```
1068
1074
  (when (regexp "foo" (regopt)) (begin (lvar :bar)))
1069
- "when /foo/; bar"
1075
+ "when /foo/ then bar"
1070
1076
  ~~~~ keyword
1071
- ~~~~~~~~~~ expression
1077
+ ~~~~ begin
1078
+ ~~~~~~~~~~~~~~~~~~~ expression
1072
1079
 
1073
1080
  (when (int 1) (int 2) (send nil :meth))
1074
1081
  "when 1, 2; meth"
@@ -1242,8 +1249,6 @@ Format:
1242
1249
  (return (lvar :foo))
1243
1250
  "return(foo)"
1244
1251
  ~~~~~~ keyword
1245
- ^ begin
1246
- ^ end
1247
1252
  ~~~~~~~~~~~ expression
1248
1253
  ```
1249
1254
 
@@ -1255,20 +1260,21 @@ Format:
1255
1260
  ```
1256
1261
  (resbody (array (const nil :Exception) (const nil :A)) (lvasgn :bar) (int 1))
1257
1262
  "rescue Exception, A => bar; 1"
1258
- ~~~~~~ keyword ~~ operator
1263
+ ~~~~~~ keyword ~~ assoc
1264
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1259
1265
 
1260
1266
  "rescue Exception, A => bar then 1"
1261
- ~~~~~~ keyword ~~ operator
1267
+ ~~~~~~ keyword ~~ assoc
1262
1268
  ~~~~ begin
1263
1269
 
1264
1270
  (resbody (array (const nil :Exception)) (ivasgn :bar) (int 1))
1265
1271
  "rescue Exception => @bar; 1"
1266
- ~~~~~~ keyword ~~ operator
1272
+ ~~~~~~ keyword ~~ assoc
1267
1273
 
1268
1274
  (resbody nil (lvasgn :bar) (int 1))
1269
1275
  "rescue => bar; 1"
1270
1276
  ~~~~~~ keyword
1271
- ~~ operator
1277
+ ~~ assoc
1272
1278
 
1273
1279
  (resbody nil nil (int 1))
1274
1280
  "rescue; 1"
@@ -1281,27 +1287,34 @@ Format:
1281
1287
 
1282
1288
  Format:
1283
1289
  ```
1284
- (rescue (send nil :foo) (resbody ...) (resbody ...) nil)
1290
+ (begin
1291
+ (rescue (send nil :foo) (resbody ...) (resbody ...) nil))
1285
1292
  "begin; foo; rescue Exception; rescue; end"
1286
1293
  ~~~~~ begin ~~~ end
1294
+ ~~~~~~~~~~~~~~~~~ expression (rescue.resbody/1)
1295
+ ~~~~~~~ expression (rescue.resbody/2)
1296
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)
1287
1297
  ```
1288
1298
 
1289
1299
  ##### With else
1290
1300
 
1291
1301
  Format:
1292
1302
  ```
1293
- (rescue (send nil :foo) (resbody ...) (resbody ...) (true))
1303
+ (begin
1304
+ (rescue (send nil :foo) (resbody ...) (resbody ...) (true)))
1294
1305
  "begin; foo; rescue Exception; rescue; else true end"
1295
- ~~~~~ begin ~~~~ else ~~~ end
1306
+ ~~~~~ begin ~~~~ else (rescue)
1307
+ ~~~ end
1296
1308
  ```
1297
1309
 
1298
1310
  #### Ensure statement
1299
1311
 
1300
1312
  Format:
1301
1313
  ```
1302
- (ensure (send nil :foo) (send nil :bar))
1314
+ (begin
1315
+ (ensure (send nil :foo) (send nil :bar))
1303
1316
  "begin; foo; ensure; bar; end"
1304
- ~~~~~ begin ~~~~~~ keyword
1317
+ ~~~~~ begin ~~~~~~ keyword (ensure)
1305
1318
  ~~~ end
1306
1319
  ```
1307
1320
 
@@ -1309,14 +1322,17 @@ Format:
1309
1322
 
1310
1323
  Format:
1311
1324
  ```
1312
- (ensure (rescue (send nil :foo) (resbody ...) (int 1)) (send nil :bar))
1325
+ (begin
1326
+ (ensure
1327
+ (rescue (send nil :foo) (resbody ...) (int 1))
1328
+ (send nil :bar))
1313
1329
  "begin; foo; rescue; nil; else; 1; ensure; bar; end"
1314
- ~~~~~ begin (rescue)
1315
- ~~~~~ begin (ensure)
1316
- ~~~~ else (rescue)
1330
+ ~~~~~ begin
1331
+ ~~~~ else (ensure.rescue)
1332
+ ~~~~~~~~~~~~~~~~~~~~~ expression (rescue)
1317
1333
  ~~~~~~ keyword (ensure)
1318
- ~~~ end (rescue)
1319
- ~~~ end (ensure)
1334
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (ensure)
1335
+ ~~~ end
1320
1336
  ```
1321
1337
 
1322
1338
  #### Retry
@@ -0,0 +1,37 @@
1
+ # Customizing Parsers
2
+
3
+ While the default setup of the parsers provided by this Gem should be suitable
4
+ for most some developers might want to change parts of it. An example would be
5
+ the use of a custom class for nodes instead of `Parser::AST::Node`.
6
+
7
+ Customizing the AST is done by creating a custom builder class and passing it
8
+ to the constructor method of a parser. The default setup comes down to the
9
+ following:
10
+
11
+ builder = Parser::Builders::Default.new
12
+ parser = Parser::Ruby19.new(builder)
13
+
14
+ When creating your own builder class it's best to subclass the default one so
15
+ that you don't have to redefine every used method again:
16
+
17
+ class MyBuilder < Parser::Builders::Default
18
+
19
+ end
20
+
21
+ builder = MyBuilder.new
22
+ parser = Parser::Ruby19.new(builder)
23
+
24
+ ## Custom Node Classes
25
+
26
+ To use a custom node class you have to override the method
27
+ `Parser::Builders::Default#n`:
28
+
29
+ class MyBuilder < Parser::Builders::Default
30
+ def n(type, children, source_map)
31
+ return MyNodeClass.new(type, children, :source_map => source_map)
32
+ end
33
+ end
34
+
35
+ Note that the used class (and corresponding instance) must be compatible with
36
+ `Parser::AST::Node` so it's best to subclass it and override/add code where
37
+ needed.
data/doc/INTERNALS.md ADDED
@@ -0,0 +1,21 @@
1
+ Entry points
2
+ ------------
3
+
4
+ Parser should be kept as slim as possible. This includes not loading
5
+ any potentially large files when they are likely to be unused in practice.
6
+
7
+ Parser has five main (classes of) `require` entry points:
8
+
9
+ * `require 'parser'`. Main entry point, requires all classes which
10
+ are used across the entire library.
11
+ * `require 'parser/rubyXX'`. Version-specific entry point. Can raise
12
+ a NotImplementedError if current Ruby runtime is unable to parse the
13
+ requested Ruby version.
14
+ * `require 'parser/all'`. Requires all available parsers for released
15
+ versions of Ruby. Can raise NotImplementedError.
16
+ * `require 'parser/runner'`. Requires all the stuff which is useful for
17
+ command-line tools but not otherwise.
18
+ * `require 'parser/runner/X'`. Runner-specific entry point.
19
+
20
+ All non-main entry points internally `require 'parser'`. Additionally, all
21
+ runner-specific entry points internally `requre 'parser/runner'`.
data/lib/parser.rb CHANGED
@@ -9,6 +9,8 @@ end
9
9
 
10
10
  # Library namespace
11
11
  module Parser
12
+ require 'parser/version'
13
+
12
14
  require 'parser/ast/node'
13
15
  require 'parser/ast/processor'
14
16
 
@@ -17,7 +19,17 @@ module Parser
17
19
 
18
20
  require 'parser/source/map'
19
21
  require 'parser/source/map/operator'
20
- require 'parser/source/map/variable_assignment'
22
+ require 'parser/source/map/collection'
23
+ require 'parser/source/map/constant'
24
+ require 'parser/source/map/variable'
25
+ require 'parser/source/map/keyword'
26
+ require 'parser/source/map/definition'
27
+ require 'parser/source/map/send'
28
+ require 'parser/source/map/block'
29
+ require 'parser/source/map/condition'
30
+ require 'parser/source/map/ternary'
31
+ require 'parser/source/map/for'
32
+ require 'parser/source/map/rescue_body'
21
33
 
22
34
  require 'parser/syntax_error'
23
35
  require 'parser/diagnostic'
@@ -28,7 +40,6 @@ module Parser
28
40
  require 'parser/lexer'
29
41
  require 'parser/lexer/literal'
30
42
  require 'parser/lexer/stack_state'
31
- require 'parser/lexer/explanation'
32
43
 
33
44
  module Builders
34
45
  require 'parser/builders/default'
@@ -55,7 +66,7 @@ module Parser
55
66
  :invalid_octal => "invalid octal digit",
56
67
  :no_dot_digit_literal => "no .<digit> floating literal anymore; put 0 before dot",
57
68
  :bare_backslash => "bare backslash only allowed before newline",
58
- :unexpected => "unexpected %{character}",
69
+ :unexpected => "unexpected `%{character}'",
59
70
  :embedded_document => "embedded document meats end of file (and they embark on a romantic journey)",
60
71
 
61
72
  # Lexer warnings
@@ -5,6 +5,12 @@ module Parser
5
5
  attr_reader :source_map
6
6
 
7
7
  alias src source_map
8
+
9
+ def assign_properties(properties)
10
+ if (source_map = properties[:source_map])
11
+ @source_map = source_map
12
+ end
13
+ end
8
14
  end
9
15
 
10
16
  end
@@ -2,6 +2,222 @@ module Parser
2
2
  module AST
3
3
 
4
4
  class Processor < ::AST::Processor
5
+ def process_regular_node(node)
6
+ node.updated(nil, process_all(node))
7
+ end
8
+
9
+ alias on_dstr process_regular_node
10
+ alias on_dsym process_regular_node
11
+ alias on_regexp process_regular_node
12
+ alias on_xstr process_regular_node
13
+ alias on_splat process_regular_node
14
+ alias on_array process_regular_node
15
+ alias on_pair process_regular_node
16
+ alias on_hash process_regular_node
17
+ alias on_irange process_regular_node
18
+ alias on_erange process_regular_node
19
+
20
+ def on_var(node)
21
+ name, = *node
22
+
23
+ node.updated
24
+ end
25
+
26
+ def process_variable_node(node)
27
+ on_var(node)
28
+ end
29
+
30
+ alias on_lvar process_variable_node
31
+ alias on_ivar process_variable_node
32
+ alias on_gvar process_variable_node
33
+ alias on_cvar process_variable_node
34
+ alias on_back_ref process_variable_node
35
+ alias on_nth_ref process_variable_node
36
+
37
+ def on_vasgn(node)
38
+ name, value_node = *node
39
+
40
+ value_node = process(value_node) if value_node
41
+ node.updated(nil, [ name, value_node ])
42
+ end
43
+
44
+ def process_var_asgn_node(node)
45
+ on_vasgn(node)
46
+ end
47
+
48
+ alias on_lvasgn process_var_asgn_node
49
+ alias on_ivasgn process_var_asgn_node
50
+ alias on_gvasgn process_var_asgn_node
51
+ alias on_cvdecl process_var_asgn_node
52
+ alias on_cvasgn process_var_asgn_node
53
+
54
+ alias on_and_asgn process_regular_node
55
+ alias on_or_asgn process_regular_node
56
+
57
+ def on_op_asgn(node)
58
+ var_node, method_name, value_node = *node
59
+
60
+ node.updated(nil, [
61
+ process(var_node), method_name, process(value_node)
62
+ ])
63
+ end
64
+
65
+ alias on_mlhs process_regular_node
66
+ alias on_masgn process_regular_node
67
+
68
+ def on_const(node)
69
+ scope_node, name = *node
70
+
71
+ scope_node = process(scope_node) if scope_node
72
+ node.updated(nil, [ scope_node, name ])
73
+ end
74
+
75
+ def on_cdecl(node)
76
+ scope_node, name, value_node = *node
77
+
78
+ scope_node = process(scope_node) if scope_node
79
+ value_node = process(value_node)
80
+ node.updated(nil, [ scope_node, name, value_node ])
81
+ end
82
+
83
+ alias on_args process_regular_node
84
+
85
+ def on_argument(node)
86
+ arg_name, value_node = *node
87
+
88
+ value_node = process(value_node) if value_node
89
+ node.updated(nil, [ arg_name, value_node ])
90
+ end
91
+
92
+ def process_argument_node(node)
93
+ on_argument(node)
94
+ end
95
+
96
+ alias on_arg process_argument_node
97
+ alias on_optarg process_argument_node
98
+ alias on_splatarg process_argument_node
99
+ alias on_blockarg process_argument_node
100
+ alias on_kwarg process_argument_node
101
+ alias on_kwoptarg process_argument_node
102
+ alias on_kwsplatarg process_argument_node
103
+
104
+ alias on_arg_expr process_regular_node
105
+ alias on_restarg_expr process_regular_node
106
+ alias on_blockarg_expr process_regular_node
107
+
108
+ alias on_module process_regular_node
109
+
110
+ def on_class(node)
111
+ name_node, superclass_node, body_node = *node
112
+
113
+ superclass_node = process(superclass_node) if superclass_node
114
+ node.updated(nil, [
115
+ name_node, superclass_node, process(body_node)
116
+ ])
117
+ end
118
+
119
+ alias on_sclass process_regular_node
120
+
121
+ def on_def(node)
122
+ name, args_node, body_node = *node
123
+
124
+ node.updated(nil, [
125
+ name,
126
+ process(args_node), process(body_node)
127
+ ])
128
+ end
129
+
130
+ def on_defs(node)
131
+ definee_node, name, args_node, body_node = *node
132
+
133
+ node.updated(nil, [
134
+ process(definee_node), name,
135
+ process(args_node), process(body_node)
136
+ ])
137
+ end
138
+
139
+ alias on_undef process_regular_node
140
+ alias on_alias process_regular_node
141
+
142
+ def on_send(node)
143
+ receiver_node, method_name, *arg_nodes = *node
144
+
145
+ receiver_node = process(receiver_node) if receiver_node
146
+ node.updated(nil, [
147
+ receiver_node, method_name, *process_all(arg_nodes)
148
+ ])
149
+ end
150
+
151
+ alias on_block process_regular_node
152
+
153
+ alias on_while process_regular_node
154
+ alias on_until process_regular_node
155
+ alias on_for process_regular_node
156
+
157
+ alias on_return process_regular_node
158
+ alias on_break process_regular_node
159
+ alias on_next process_regular_node
160
+ alias on_redo process_regular_node
161
+ alias on_retry process_regular_node
162
+ alias on_super process_regular_node
163
+ alias on_yield process_regular_node
164
+ alias on_defined? process_regular_node
165
+
166
+ alias on_not process_regular_node
167
+ alias on_and process_regular_node
168
+ alias on_or process_regular_node
169
+
170
+ def on_if(node)
171
+ cond_node, if_true_node, if_false_node = *node
172
+
173
+ if_true_node = process(if_true_node) if if_true_node
174
+ if_false_node = process(if_false_node) if if_false_node
175
+
176
+ node.updated(nil, [
177
+ process(cond_node),
178
+ if_true_node, if_false_node
179
+ ])
180
+ end
181
+
182
+ alias on_when process_regular_node
183
+
184
+ def on_case(node)
185
+ cond_node, *bodies = *node
186
+ when_nodes, else_node = bodies[0..-2], bodies[-1]
187
+
188
+ else_node = process(else_node) if else_node
189
+ node.updated(nil, [
190
+ process(cond_node),
191
+ *(process_all(when_nodes) << else_node)
192
+ ])
193
+ end
194
+
195
+ def on_resbody(node)
196
+ exc_list_node, exc_var_node, body_node = *node
197
+
198
+ exc_list_node = process(exc_list_node) if exc_list_node
199
+ exc_var_node = process(exc_var_node) if exc_var_node
200
+
201
+ node.updated(nil, [
202
+ exc_list_node, exc_var_node,
203
+ process(body_node)
204
+ ])
205
+ end
206
+
207
+ def on_rescue(node)
208
+ body_node, *handlers = *node
209
+ handler_nodes, else_node = handlers[0..-2], handlers[-1]
210
+
211
+ else_node = process(else_node) if else_node
212
+ node.updated(nil, [
213
+ process(body_node),
214
+ *(process_all(handler_nodes) << else_node)
215
+ ])
216
+ end
217
+
218
+ alias on_ensure process_regular_node
219
+
220
+ alias on_begin process_regular_node
5
221
  end
6
222
 
7
223
  end