opal 0.9.4 → 0.10.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.gitignore +2 -3
  4. data/.gitmodules +5 -2
  5. data/.jshintrc +1 -8
  6. data/.rspec +1 -1
  7. data/.travis.yml +15 -23
  8. data/CHANGELOG.md +511 -326
  9. data/CODE_OF_CONDUCT.md +13 -15
  10. data/CONTRIBUTING.md +26 -216
  11. data/Gemfile +20 -12
  12. data/Guardfile +2 -2
  13. data/HACKING.md +230 -0
  14. data/README.md +6 -7
  15. data/bin/opal-mspec +1 -1
  16. data/config.ru +2 -2
  17. data/docs/faq.md +1 -1
  18. data/docs/source_maps.md +1 -1
  19. data/lib/opal.rb +1 -0
  20. data/lib/opal/builder.rb +1 -1
  21. data/lib/opal/cli.rb +30 -28
  22. data/lib/opal/cli_options.rb +3 -0
  23. data/lib/opal/cli_runners.rb +14 -1
  24. data/lib/opal/cli_runners/{apple_script.rb → applescript.rb} +3 -3
  25. data/lib/opal/cli_runners/nashorn.rb +2 -2
  26. data/lib/opal/cli_runners/nodejs.rb +2 -2
  27. data/lib/opal/cli_runners/phantom.js +24 -0
  28. data/lib/opal/cli_runners/phantomjs.rb +10 -10
  29. data/lib/opal/cli_runners/server.rb +3 -3
  30. data/lib/opal/compiler.rb +43 -4
  31. data/lib/opal/config.rb +3 -1
  32. data/lib/opal/errors.rb +13 -0
  33. data/lib/opal/fragment.rb +0 -13
  34. data/lib/opal/nodes.rb +10 -0
  35. data/lib/opal/nodes/args/initialize_kwargs.rb +28 -0
  36. data/lib/opal/nodes/args/kwarg.rb +29 -0
  37. data/lib/opal/nodes/args/kwoptarg.rb +29 -0
  38. data/lib/opal/nodes/args/kwrestarg.rb +39 -0
  39. data/lib/opal/nodes/args/mlhsarg.rb +79 -0
  40. data/lib/opal/nodes/args/normarg.rb +26 -0
  41. data/lib/opal/nodes/args/optarg.rb +27 -0
  42. data/lib/opal/nodes/args/post_args.rb +200 -0
  43. data/lib/opal/nodes/args/post_kwargs.rb +31 -0
  44. data/lib/opal/nodes/args/restarg.rb +33 -0
  45. data/lib/opal/nodes/base.rb +12 -0
  46. data/lib/opal/nodes/call.rb +92 -33
  47. data/lib/opal/nodes/def.rb +26 -169
  48. data/lib/opal/nodes/hash.rb +10 -4
  49. data/lib/opal/nodes/helpers.rb +6 -3
  50. data/lib/opal/nodes/inline_args.rb +61 -0
  51. data/lib/opal/nodes/iter.rb +73 -82
  52. data/lib/opal/nodes/logic.rb +12 -2
  53. data/lib/opal/nodes/masgn.rb +1 -2
  54. data/lib/opal/nodes/node_with_args.rb +141 -0
  55. data/lib/opal/nodes/rescue.rb +121 -43
  56. data/lib/opal/nodes/scope.rb +24 -5
  57. data/lib/opal/nodes/super.rb +122 -54
  58. data/lib/opal/nodes/top.rb +0 -12
  59. data/lib/opal/nodes/yield.rb +2 -13
  60. data/lib/opal/parser.rb +67 -39
  61. data/lib/opal/parser/grammar.rb +3319 -2961
  62. data/lib/opal/parser/grammar.y +234 -46
  63. data/lib/opal/parser/lexer.rb +105 -17
  64. data/lib/opal/parser/sexp.rb +4 -0
  65. data/lib/opal/paths.rb +4 -0
  66. data/lib/opal/regexp_anchors.rb +19 -1
  67. data/lib/opal/sprockets.rb +21 -18
  68. data/lib/opal/sprockets/environment.rb +0 -8
  69. data/lib/opal/sprockets/processor.rb +13 -16
  70. data/lib/opal/sprockets/server.rb +6 -12
  71. data/lib/opal/version.rb +1 -1
  72. data/opal.gemspec +1 -0
  73. data/opal/corelib/array.rb +209 -131
  74. data/opal/corelib/basic_object.rb +7 -3
  75. data/opal/corelib/class.rb +11 -17
  76. data/opal/corelib/constants.rb +2 -2
  77. data/opal/corelib/enumerable.rb +178 -355
  78. data/opal/corelib/enumerator.rb +3 -46
  79. data/opal/corelib/error.rb +2 -2
  80. data/opal/corelib/file.rb +13 -1
  81. data/opal/corelib/hash.rb +26 -56
  82. data/opal/corelib/helpers.rb +10 -0
  83. data/opal/corelib/kernel.rb +6 -3
  84. data/opal/corelib/module.rb +62 -31
  85. data/opal/corelib/number.rb +7 -16
  86. data/opal/corelib/proc.rb +24 -9
  87. data/opal/corelib/range.rb +4 -13
  88. data/opal/corelib/runtime.js +515 -378
  89. data/opal/corelib/string.rb +21 -49
  90. data/opal/corelib/struct.rb +50 -35
  91. data/opal/corelib/unsupported.rb +18 -30
  92. data/opal/opal.rb +0 -1
  93. data/opal/opal/mini.rb +1 -0
  94. data/spec/README.md +6 -4
  95. data/spec/filters/bugs/array.rb +0 -42
  96. data/spec/filters/bugs/basicobject.rb +0 -2
  97. data/spec/filters/bugs/bigdecimal.rb +160 -0
  98. data/spec/filters/bugs/class.rb +0 -5
  99. data/spec/filters/bugs/date.rb +1 -48
  100. data/spec/filters/bugs/enumerable.rb +4 -12
  101. data/spec/filters/bugs/enumerator.rb +0 -1
  102. data/spec/filters/bugs/exception.rb +4 -3
  103. data/spec/filters/bugs/float.rb +4 -2
  104. data/spec/filters/bugs/kernel.rb +25 -10
  105. data/spec/filters/bugs/language.rb +119 -68
  106. data/spec/filters/bugs/method.rb +135 -0
  107. data/spec/filters/bugs/module.rb +13 -28
  108. data/spec/filters/bugs/proc.rb +18 -8
  109. data/spec/filters/bugs/range.rb +0 -3
  110. data/spec/filters/bugs/rational.rb +4 -0
  111. data/spec/filters/bugs/regexp.rb +68 -36
  112. data/spec/filters/bugs/string.rb +1 -1
  113. data/spec/filters/bugs/struct.rb +0 -12
  114. data/spec/filters/bugs/time.rb +1 -0
  115. data/spec/filters/bugs/unboundmethod.rb +2 -1
  116. data/spec/filters/unsupported/freeze.rb +3 -1
  117. data/spec/filters/unsupported/language.rb +0 -7
  118. data/spec/filters/unsupported/privacy.rb +7 -6
  119. data/spec/filters/unsupported/string.rb +10 -0
  120. data/spec/filters/unsupported/struct.rb +3 -0
  121. data/spec/filters/unsupported/symbol.rb +9 -0
  122. data/spec/filters/unsupported/taint.rb +0 -3
  123. data/spec/filters/unsupported/thread.rb +1 -0
  124. data/spec/lib/cli_runners/phantomjs_spec.rb +39 -0
  125. data/spec/lib/cli_spec.rb +42 -1
  126. data/spec/lib/compiler/call_spec.rb +700 -0
  127. data/spec/lib/compiler_spec.rb +46 -28
  128. data/spec/lib/config_spec.rb +13 -0
  129. data/spec/lib/parser/call_spec.rb +18 -0
  130. data/spec/lib/parser/def_spec.rb +29 -0
  131. data/spec/lib/parser/iter_spec.rb +15 -15
  132. data/spec/lib/parser/lambda_spec.rb +153 -12
  133. data/spec/lib/parser/string_spec.rb +5 -0
  134. data/spec/lib/parser/undef_spec.rb +1 -1
  135. data/spec/lib/parser/variables_spec.rb +24 -0
  136. data/spec/lib/paths_spec.rb +12 -5
  137. data/spec/lib/spec_helper.rb +5 -0
  138. data/spec/lib/sprockets/processor_spec.rb +6 -5
  139. data/spec/lib/sprockets_spec.rb +8 -0
  140. data/spec/mspec-opal/formatters.rb +188 -0
  141. data/spec/mspec-opal/runner.rb +193 -0
  142. data/spec/opal/core/enumerator/with_index_spec.rb +6 -0
  143. data/spec/opal/core/kernel/define_singleton_method_spec.rb +1 -1
  144. data/spec/opal/core/kernel/instance_variables_spec.rb +14 -0
  145. data/spec/opal/core/kernel/loop_spec.rb +1 -1
  146. data/spec/opal/core/kernel/raise_spec.rb +1 -1
  147. data/spec/opal/core/language/heredoc_spec.rb +42 -0
  148. data/spec/opal/core/language/rescue_spec.rb +18 -0
  149. data/spec/opal/core/language_spec.rb +22 -0
  150. data/spec/opal/core/module/const_defined_spec.rb +1 -2
  151. data/spec/opal/core/module/name_spec.rb +6 -0
  152. data/spec/opal/core/runtime/bridged_classes_spec.rb +14 -2
  153. data/spec/opal/core/runtime/rescue_spec.rb +12 -2
  154. data/spec/opal/core/runtime/super_spec.rb +1 -0
  155. data/spec/opal/core/string_spec.rb +21 -0
  156. data/spec/opal/stdlib/js_spec.rb +1 -1
  157. data/spec/opal/stdlib/native/hash_spec.rb +7 -0
  158. data/spec/opal/stdlib/promise/always_spec.rb +24 -5
  159. data/spec/opal/stdlib/promise/rescue_spec.rb +15 -6
  160. data/spec/opal/stdlib/promise/then_spec.rb +13 -5
  161. data/spec/opal/stdlib/promise/trace_spec.rb +5 -6
  162. data/spec/opal/stdlib/strscan/scan_spec.rb +1 -1
  163. data/spec/ruby_specs +122 -0
  164. data/spec/spec_helper.rb +3 -15
  165. data/stdlib/base64.rb +51 -121
  166. data/stdlib/bigdecimal.rb +231 -0
  167. data/stdlib/bigdecimal/bignumber.js.rb +11 -0
  168. data/stdlib/bigdecimal/kernel.rb +5 -0
  169. data/stdlib/date.rb +252 -10
  170. data/stdlib/native.rb +38 -38
  171. data/stdlib/nodejs/dir.rb +8 -6
  172. data/stdlib/nodejs/file.rb +28 -3
  173. data/stdlib/nodejs/node_modules/.bin/js-yaml +1 -0
  174. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +1 -0
  175. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +1 -0
  176. data/stdlib/nodejs/require.rb +1 -1
  177. data/stdlib/nodejs/yaml.rb +3 -2
  178. data/stdlib/opal-parser.rb +7 -2
  179. data/stdlib/pathname.rb +23 -1
  180. data/stdlib/phantomjs.rb +10 -0
  181. data/stdlib/promise.rb +38 -23
  182. data/tasks/building.rake +3 -3
  183. data/tasks/testing.rake +27 -14
  184. data/tasks/testing/mspec_special_calls.rb +1 -1
  185. data/tasks/testing/sprockets-phantomjs.js +4 -0
  186. data/test/opal/test_keyword.rb +110 -110
  187. data/test/opal/unsupported_and_bugs.rb +30 -0
  188. data/vendored-minitest/minitest/assertions.rb +1 -1
  189. metadata +65 -15
  190. data/.spectator +0 -2
  191. data/.spectator-mspec +0 -3
  192. data/opal/corelib/array/inheritance.rb +0 -127
  193. data/spec/rubyspecs +0 -139
@@ -137,10 +137,7 @@ rule
137
137
  result = new_rescue_mod(val[1], val[0], val[2])
138
138
  }
139
139
  | klEND tLCURLY compstmt tRCURLY
140
- | lhs tEQL command_call
141
- {
142
- result = new_assign(val[0], val[1], val[2])
143
- }
140
+ | command_asgn
144
141
  | mlhs tEQL command_call
145
142
  {
146
143
  result = s(:masgn, val[0], s(:to_ary, val[2]))
@@ -172,6 +169,15 @@ rule
172
169
  }
173
170
  | expr
174
171
 
172
+ command_asgn: lhs tEQL command_call
173
+ {
174
+ result = new_assign(val[0], val[1], val[2])
175
+ }
176
+ | lhs tEQL command_asgn
177
+ {
178
+ result = new_assign(val[0], val[1], val[2])
179
+ }
180
+
175
181
  expr: command_call
176
182
  | expr kAND expr
177
183
  {
@@ -195,18 +201,6 @@ rule
195
201
 
196
202
  command_call: command
197
203
  | block_command
198
- | kRETURN call_args
199
- {
200
- result = new_return(val[0], val[1])
201
- }
202
- | kBREAK call_args
203
- {
204
- result = new_break(val[0], val[1])
205
- }
206
- | kNEXT call_args
207
- {
208
- result = new_next(val[0], val[1])
209
- }
210
204
 
211
205
  block_command: block_call
212
206
  | block_call tJSDOT operation2 command_args
@@ -214,12 +208,18 @@ rule
214
208
  | block_call tCOLON2 operation2 command_args
215
209
 
216
210
  cmd_brace_block: tLBRACE_ARG opt_block_var compstmt tRCURLY
211
+ {
212
+ result = new_iter(val[1], val[2])
213
+ }
217
214
 
218
215
  command: operation command_args =tLOWEST
219
216
  {
220
217
  result = new_call(nil, val[0], val[1])
221
218
  }
222
219
  | operation command_args cmd_brace_block
220
+ {
221
+ result = new_call(nil, val[0], val[1]) << val[2]
222
+ }
223
223
  | primary_value tJSDOT operation2 command_args =tLOWEST
224
224
  {
225
225
  result = new_js_call(val[0], val[2], val[3])
@@ -243,6 +243,18 @@ rule
243
243
  {
244
244
  result = new_yield val[1]
245
245
  }
246
+ | kRETURN call_args
247
+ {
248
+ result = new_return(val[0], val[1])
249
+ }
250
+ | kBREAK call_args
251
+ {
252
+ result = new_break(val[0], val[1])
253
+ }
254
+ | kNEXT call_args
255
+ {
256
+ result = new_next(val[0], val[1])
257
+ }
246
258
 
247
259
  mlhs: mlhs_basic
248
260
  {
@@ -956,7 +968,6 @@ rule
956
968
  | kDEF fname
957
969
  {
958
970
  push_scope
959
- lexer.lex_state = :expr_endfn
960
971
  }
961
972
  f_arglist bodystmt kEND
962
973
  {
@@ -1002,6 +1013,31 @@ rule
1002
1013
  | tCOLON
1003
1014
  | kDO_COND
1004
1015
 
1016
+
1017
+ opt_bv_decl: opt_nl
1018
+ {
1019
+ result = []
1020
+ }
1021
+ | opt_nl tSEMI bv_decls opt_nl
1022
+ {
1023
+ result = val[2]
1024
+ }
1025
+
1026
+ bv_decls: bvar
1027
+ {
1028
+ result = [ val[0] ]
1029
+ }
1030
+ | bv_decls tCOMMA bvar
1031
+ {
1032
+ result = val[0] << val[2]
1033
+ }
1034
+
1035
+ bvar: tIDENTIFIER
1036
+ {
1037
+ result = new_shadowarg(val[0])
1038
+ }
1039
+ | f_bad_arg
1040
+
1005
1041
  lambda: f_larglist lambda_body
1006
1042
  {
1007
1043
  result = new_call nil, [:lambda, []], []
@@ -1010,13 +1046,16 @@ rule
1010
1046
 
1011
1047
  f_larglist: tLPAREN2 block_param tRPAREN
1012
1048
  {
1013
- result = val[1]
1049
+ result = new_block_args(*val[1])
1014
1050
  }
1015
1051
  | tLPAREN2 tRPAREN
1016
1052
  {
1017
1053
  result = nil
1018
1054
  }
1019
1055
  | block_param
1056
+ {
1057
+ result = new_block_args(*val[0])
1058
+ }
1020
1059
  | none
1021
1060
 
1022
1061
  lambda_body: tLAMBEG compstmt tRCURLY
@@ -1060,22 +1099,35 @@ rule
1060
1099
  }
1061
1100
 
1062
1101
  opt_block_var: none
1063
- | tPIPE tPIPE
1102
+ | tPIPE opt_bv_decl tPIPE
1064
1103
  {
1065
- result = nil
1104
+ result = new_block_args(nil, [val[1]])
1066
1105
  }
1067
1106
  | tOROP
1068
1107
  {
1069
1108
  result = nil
1070
1109
  }
1071
- | tPIPE block_param tPIPE
1110
+ | tPIPE block_param opt_bv_decl tPIPE
1072
1111
  {
1073
- result = val[1]
1112
+ val[1] << val[2]
1113
+ result = new_block_args(*val[1])
1074
1114
  }
1075
1115
 
1076
- block_args_tail: f_block_arg
1116
+ block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1077
1117
  {
1078
- result = val[0]
1118
+ result = [val[0], val[2], val[3]]
1119
+ }
1120
+ | f_block_kwarg opt_f_block_arg
1121
+ {
1122
+ result = [val[0], nil, val[1]]
1123
+ }
1124
+ | f_kwrest opt_f_block_arg
1125
+ {
1126
+ result = [nil, val[0], val[1]]
1127
+ }
1128
+ | f_block_arg
1129
+ {
1130
+ result = [nil, nil, val[0]]
1079
1131
  }
1080
1132
 
1081
1133
  opt_block_args_tail: tCOMMA block_args_tail
@@ -1089,39 +1141,79 @@ opt_block_args_tail: tCOMMA block_args_tail
1089
1141
 
1090
1142
  block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1091
1143
  {
1092
- result = new_block_args(val[0], val[2], val[4], val[5])
1144
+ optarg = new_optarg(val[2])
1145
+ restarg = new_restarg(val[4])
1146
+ result = [val[0] + optarg + restarg, val[5]]
1147
+ }
1148
+ | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1149
+ {
1150
+ optarg = new_optarg(val[2])
1151
+ restarg = new_restarg(val[4])
1152
+ result = [val[0] + optarg + restarg + val[6], val[7]]
1093
1153
  }
1094
1154
  | f_arg tCOMMA f_block_optarg opt_block_args_tail
1095
1155
  {
1096
- result = new_block_args(val[0], val[2], nil, val[3])
1156
+ optarg = new_optarg(val[2])
1157
+ result = [val[0] + optarg, val[3]]
1158
+ }
1159
+ | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1160
+ {
1161
+ optarg = new_optarg(val[2])
1162
+ result = [val[0] + optarg + val[4], val[5]]
1097
1163
  }
1098
1164
  | f_arg tCOMMA f_rest_arg opt_block_args_tail
1099
1165
  {
1100
- result = new_block_args(val[0], nil, val[2], val[3])
1166
+ restarg = new_restarg(val[2])
1167
+ result = [val[0] + restarg, val[3]]
1101
1168
  }
1102
1169
  | f_arg tCOMMA
1103
1170
  {
1104
- result = new_block_args(val[0], nil, nil, nil)
1171
+ result = [val[0], nil]
1172
+ }
1173
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1174
+ {
1175
+ restarg = new_restarg(val[2])
1176
+ result = [val[0] + restarg + val[4], val[5]]
1105
1177
  }
1106
1178
  | f_arg opt_block_args_tail
1107
1179
  {
1108
- result = new_block_args(val[0], nil, nil, val[1])
1180
+ result = [val[0], val[1]]
1109
1181
  }
1110
1182
  | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1111
1183
  {
1112
- result = new_block_args(nil, val[0], val[2], val[3])
1184
+ optarg = new_optarg(val[0])
1185
+ restarg = new_restarg(val[2])
1186
+ result = [optarg + restarg, val[3]]
1187
+ }
1188
+ | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1189
+ {
1190
+ optarg = new_optarg(val[0])
1191
+ restarg = new_restarg(val[2])
1192
+ result = [optarg + restarg + val[4], val[5]]
1113
1193
  }
1114
1194
  | f_block_optarg opt_block_args_tail
1115
1195
  {
1116
- result = new_block_args(nil, val[0], nil, val[1])
1196
+ optarg= new_optarg(val[0])
1197
+ result = [optarg, val[1]]
1198
+ }
1199
+ | f_block_optarg tCOMMA f_arg opt_block_args_tail
1200
+ {
1201
+ optarg = new_optarg(val[0])
1202
+ result = [optarg + val[2], val[3]]
1117
1203
  }
1118
1204
  | f_rest_arg opt_block_args_tail
1119
1205
  {
1120
- result = new_block_args(nil, nil, val[0], val[1])
1206
+ restarg = new_restarg(val[0])
1207
+ result = [restarg, val[1]]
1208
+ }
1209
+ | f_rest_arg tCOMMA f_arg opt_block_args_tail
1210
+ {
1211
+ restarg = new_restarg(val[0])
1212
+ result = [restarg + val[2], val[3]]
1121
1213
  }
1122
1214
  | block_args_tail
1123
1215
  {
1124
- result = new_block_args(nil, nil, nil, val[0])
1216
+ result = [nil, val[0]]
1125
1217
  }
1126
1218
 
1127
1219
  do_block: kDO_BLOCK
@@ -1512,7 +1604,7 @@ xstring_contents: none
1512
1604
  result = nil
1513
1605
  }
1514
1606
 
1515
- f_arglist: tLPAREN2 f_args opt_nl tRPAREN
1607
+ f_arglist: tLPAREN2 f_args opt_bv_decl tRPAREN
1516
1608
  {
1517
1609
  result = val[1]
1518
1610
  lexer.lex_state = :expr_beg
@@ -1549,6 +1641,25 @@ xstring_contents: none
1549
1641
  result = new_kwarg(val[0])
1550
1642
  }
1551
1643
 
1644
+ f_block_kw: f_label primary_value
1645
+ {
1646
+ result = new_kwoptarg(val[0], val[1])
1647
+ }
1648
+ | f_label
1649
+ {
1650
+ result = new_kwarg(val[0])
1651
+ }
1652
+
1653
+ f_block_kwarg: f_block_kw
1654
+ {
1655
+ result = [val[0]]
1656
+ }
1657
+ | f_block_kwarg tCOMMA f_block_kw
1658
+ {
1659
+ result = val[0]
1660
+ result << val[2]
1661
+ }
1662
+
1552
1663
  f_kwarg: f_kw
1553
1664
  {
1554
1665
  result = [val[0]]
@@ -1587,39 +1698,79 @@ xstring_contents: none
1587
1698
 
1588
1699
  f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
1589
1700
  {
1590
- result = new_args(val[0], val[2], val[4], val[5])
1701
+ optarg = new_optarg(val[2])
1702
+ restarg = new_restarg(val[4])
1703
+ result = new_args(val[0] + optarg + restarg, val[5])
1704
+ }
1705
+ | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
1706
+ {
1707
+ optarg = new_optarg(val[2])
1708
+ restarg = new_restarg(val[4])
1709
+ result = new_args(val[0] + optarg + restarg + val[6], val[7])
1591
1710
  }
1592
1711
  | f_arg tCOMMA f_optarg opt_args_tail
1593
1712
  {
1594
- result = new_args(val[0], val[2], nil, val[3])
1713
+ optarg = new_optarg(val[2])
1714
+ result = new_args(val[0] + optarg, val[3])
1715
+ }
1716
+ | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
1717
+ {
1718
+ optarg = new_optarg(val[2])
1719
+ result = new_args(val[0] + optarg + val[4], val[5])
1595
1720
  }
1596
1721
  | f_arg tCOMMA f_rest_arg opt_args_tail
1597
1722
  {
1598
- result = new_args(val[0], nil, val[2], val[3])
1723
+ restarg = new_restarg(val[2])
1724
+ result = new_args(val[0] + restarg, val[3])
1725
+ }
1726
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
1727
+ {
1728
+ restarg = new_restarg(val[2])
1729
+ result = new_args(val[0] + restarg + val[4], val[5])
1599
1730
  }
1600
1731
  | f_arg opt_args_tail
1601
1732
  {
1602
- result = new_args(val[0], nil, nil, val[1])
1733
+ result = new_args(val[0], val[1])
1603
1734
  }
1604
1735
  | f_optarg tCOMMA f_rest_arg opt_args_tail
1605
1736
  {
1606
- result = new_args(nil, val[0], val[2], val[3])
1737
+ optarg = new_optarg(val[0])
1738
+ restarg = new_restarg(val[2])
1739
+ result = new_args(optarg + restarg, val[3])
1740
+ }
1741
+ | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
1742
+ {
1743
+ optarg = new_optarg(val[0])
1744
+ restarg = new_restarg(val[2])
1745
+ result = new_args(optarg + restarg + val[4], val[5])
1607
1746
  }
1608
1747
  | f_optarg opt_args_tail
1609
1748
  {
1610
- result = new_args(nil, val[0], nil, val[1])
1749
+ optarg = new_optarg(val[0])
1750
+ result = new_args(optarg, val[1])
1751
+ }
1752
+ | f_optarg tCOMMA f_arg opt_args_tail
1753
+ {
1754
+ optarg = new_optarg(val[0])
1755
+ result = new_args(optarg + val[2], val[3])
1611
1756
  }
1612
1757
  | f_rest_arg opt_args_tail
1613
1758
  {
1614
- result = new_args(nil, nil, val[0], val[1])
1759
+ optarg = new_restarg(val[0])
1760
+ result = new_args(optarg, val[1])
1761
+ }
1762
+ | f_rest_arg tCOMMA f_arg opt_args_tail
1763
+ {
1764
+ restarg = new_restarg(val[0])
1765
+ result = new_args(restarg + val[2], val[3])
1615
1766
  }
1616
1767
  | args_tail
1617
1768
  {
1618
- result = new_args(nil, nil, nil, val[0])
1769
+ result = new_args(nil, val[0])
1619
1770
  }
1620
1771
  | # none
1621
1772
  {
1622
- result = new_args(nil, nil, nil, nil)
1773
+ result = new_args(nil, nil)
1623
1774
  }
1624
1775
 
1625
1776
  f_norm_arg: f_bad_arg
@@ -1660,13 +1811,16 @@ xstring_contents: none
1660
1811
 
1661
1812
  f_marg: f_norm_arg
1662
1813
  {
1663
- result = s(:lasgn, val[0])
1814
+ result = s(:arg, val[0])
1664
1815
  }
1665
1816
  | tLPAREN f_margs tRPAREN
1817
+ {
1818
+ result = val[1]
1819
+ }
1666
1820
 
1667
1821
  f_marg_list: f_marg
1668
1822
  {
1669
- result = s(:array, val[0])
1823
+ result = s(:mlhs, val[0])
1670
1824
  }
1671
1825
  | f_marg_list tCOMMA f_marg
1672
1826
  {
@@ -1676,9 +1830,39 @@ xstring_contents: none
1676
1830
 
1677
1831
  f_margs: f_marg_list
1678
1832
  | f_marg_list tCOMMA tSTAR f_norm_arg
1833
+ {
1834
+ result = val[0].push(s(:restarg, val[3]))
1835
+ }
1836
+ | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1837
+ {
1838
+ result = val[0].push(s(:restarg, val[3])).concat(val[5][1..-1])
1839
+ }
1679
1840
  | f_marg_list tCOMMA tSTAR
1841
+ {
1842
+ result = val[0].push(s(:restarg))
1843
+ }
1844
+ | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1845
+ {
1846
+ result = val[0].push(s(:restarg)).concat(val[4][1..-1])
1847
+ }
1680
1848
  | tSTAR f_norm_arg
1849
+ {
1850
+ result = s(:mlhs, s(:restarg, val[1]))
1851
+ }
1852
+ | tSTAR f_norm_arg tCOMMA f_marg_list
1853
+ {
1854
+ val[3].insert(1, s(:restarg, val[1]))
1855
+ result = val[3]
1856
+ }
1681
1857
  | tSTAR
1858
+ {
1859
+ result = s(:mlhs, s(:restarg))
1860
+ }
1861
+ | tSTAR tCOMMA f_marg_list
1862
+ {
1863
+ val[2].insert(1, s(:restarg))
1864
+ result = val[2]
1865
+ }
1682
1866
 
1683
1867
  f_arg: f_arg_item
1684
1868
  {
@@ -1758,7 +1942,7 @@ xstring_contents: none
1758
1942
  }
1759
1943
  | assocs tCOMMA assoc
1760
1944
  {
1761
- result = val[0].push(*val[2])
1945
+ result = val[0].concat(val[2])
1762
1946
  }
1763
1947
 
1764
1948
  assoc: arg_value tASSOC arg_value
@@ -1773,6 +1957,10 @@ xstring_contents: none
1773
1957
  {
1774
1958
  result = [s(:sym, source(val[1]).to_sym), val[3]]
1775
1959
  }
1960
+ | tDSTAR arg_value
1961
+ {
1962
+ result = [new_kwsplat(val[1])]
1963
+ }
1776
1964
 
1777
1965
  operation: tIDENTIFIER
1778
1966
  | tCONSTANT