prism 1.8.1 → 2.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +90 -2
  3. data/Makefile +41 -12
  4. data/README.md +35 -97
  5. data/config.yml +174 -163
  6. data/docs/build_system.md +2 -2
  7. data/docs/configuration.md +5 -4
  8. data/docs/encoding.md +2 -2
  9. data/docs/fuzzing.md +4 -11
  10. data/docs/javascript.md +19 -4
  11. data/docs/mapping.md +1 -1
  12. data/docs/releasing.md +77 -5
  13. data/docs/relocation.md +2 -4
  14. data/docs/ripper_translation.md +8 -17
  15. data/docs/serialization.md +21 -24
  16. data/docs/testing.md +46 -29
  17. data/ext/prism/api_node.c +1461 -1401
  18. data/ext/prism/extconf.rb +3 -4
  19. data/ext/prism/extension.c +778 -422
  20. data/ext/prism/extension.h +3 -3
  21. data/include/prism/arena.h +37 -0
  22. data/include/prism/ast.h +2729 -612
  23. data/include/prism/buffer.h +52 -0
  24. data/include/prism/comments.h +55 -0
  25. data/include/prism/compiler/accel.h +24 -0
  26. data/include/prism/compiler/align.h +36 -0
  27. data/include/prism/compiler/assume.h +25 -0
  28. data/include/prism/compiler/exported.h +24 -0
  29. data/include/prism/compiler/fallthrough.h +22 -0
  30. data/include/prism/compiler/filesystem.h +32 -0
  31. data/include/prism/compiler/flex_array.h +19 -0
  32. data/include/prism/compiler/force_inline.h +21 -0
  33. data/include/prism/compiler/format.h +25 -0
  34. data/include/prism/compiler/inline.h +17 -0
  35. data/include/prism/compiler/nodiscard.h +22 -0
  36. data/include/prism/compiler/nonnull.h +18 -0
  37. data/include/prism/compiler/unused.h +18 -0
  38. data/include/prism/constant_pool.h +81 -0
  39. data/include/prism/diagnostic.h +38 -405
  40. data/include/prism/errors_format.h +53 -0
  41. data/include/prism/excludes.h +29 -0
  42. data/include/prism/integer.h +41 -0
  43. data/include/prism/internal/allocator.h +68 -0
  44. data/include/prism/internal/allocator_debug.h +88 -0
  45. data/include/prism/internal/arena.h +108 -0
  46. data/include/prism/internal/bit.h +42 -0
  47. data/include/prism/internal/buffer.h +91 -0
  48. data/include/prism/internal/char.h +145 -0
  49. data/include/prism/internal/comments.h +53 -0
  50. data/include/prism/internal/constant_pool.h +152 -0
  51. data/include/prism/internal/diagnostic.h +389 -0
  52. data/include/prism/{encoding.h → internal/encoding.h} +27 -68
  53. data/include/prism/internal/integer.h +68 -0
  54. data/include/prism/internal/isinf.h +16 -0
  55. data/include/prism/internal/line_offset_list.h +34 -0
  56. data/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  57. data/include/prism/internal/magic_comments.h +23 -0
  58. data/include/prism/internal/memchr.h +15 -0
  59. data/include/prism/internal/node.h +38 -0
  60. data/include/prism/internal/options.h +232 -0
  61. data/include/prism/internal/parser.h +984 -0
  62. data/include/prism/internal/regexp.h +26 -0
  63. data/include/prism/internal/serialize.h +39 -0
  64. data/include/prism/internal/source.h +72 -0
  65. data/include/prism/{static_literals.h → internal/static_literals.h} +26 -47
  66. data/include/prism/internal/stringy.h +35 -0
  67. data/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  68. data/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  69. data/include/prism/internal/tokens.h +11 -0
  70. data/include/prism/json.h +32 -0
  71. data/include/prism/line_offset_list.h +61 -0
  72. data/include/prism/magic_comments.h +35 -0
  73. data/include/prism/node.h +18 -53
  74. data/include/prism/options.h +146 -280
  75. data/include/prism/parser.h +336 -868
  76. data/include/prism/prettyprint.h +6 -9
  77. data/include/prism/serialize.h +115 -0
  78. data/include/prism/source.h +155 -0
  79. data/include/prism/stream.h +28 -0
  80. data/include/prism/string_query.h +63 -0
  81. data/include/prism/stringy.h +72 -0
  82. data/include/prism/version.h +13 -4
  83. data/include/prism.h +43 -320
  84. data/lib/prism/compiler.rb +319 -305
  85. data/lib/prism/desugar_compiler.rb +105 -34
  86. data/lib/prism/dispatcher.rb +646 -473
  87. data/lib/prism/dot_visitor.rb +592 -511
  88. data/lib/prism/dsl.rb +391 -25
  89. data/lib/prism/ffi.rb +252 -90
  90. data/lib/prism/inspect_visitor.rb +357 -325
  91. data/lib/prism/lex_compat.rb +311 -228
  92. data/lib/prism/mutation_compiler.rb +313 -305
  93. data/lib/prism/node.rb +20284 -7038
  94. data/lib/prism/node_ext.rb +180 -187
  95. data/lib/prism/node_find.rb +215 -0
  96. data/lib/prism/parse_result/errors.rb +7 -1
  97. data/lib/prism/parse_result/newlines.rb +276 -8
  98. data/lib/prism/parse_result.rb +462 -139
  99. data/lib/prism/pattern.rb +65 -20
  100. data/lib/prism/reflection.rb +23 -12
  101. data/lib/prism/relocation.rb +149 -87
  102. data/lib/prism/serialize.rb +3442 -536
  103. data/lib/prism/string_query.rb +16 -1
  104. data/lib/prism/translation/parser/builder.rb +10 -2
  105. data/lib/prism/translation/parser/compiler.rb +44 -52
  106. data/lib/prism/translation/parser/lexer.rb +41 -92
  107. data/lib/prism/translation/parser.rb +1 -1
  108. data/lib/prism/translation/parser_current.rb +1 -1
  109. data/lib/prism/translation/ripper/filter.rb +53 -0
  110. data/lib/prism/translation/ripper/lexer.rb +92 -5
  111. data/lib/prism/translation/ripper/sexp.rb +2 -10
  112. data/lib/prism/translation/ripper/shim.rb +2 -0
  113. data/lib/prism/translation/ripper.rb +1005 -224
  114. data/lib/prism/translation/ruby_parser.rb +73 -316
  115. data/lib/prism/translation.rb +2 -0
  116. data/lib/prism/visitor.rb +632 -5
  117. data/lib/prism.rb +79 -22
  118. data/prism.gemspec +123 -61
  119. data/rbi/generated/prism/compiler.rbi +489 -0
  120. data/rbi/generated/prism/desugar_compiler.rbi +306 -0
  121. data/rbi/generated/prism/dispatcher.rbi +1138 -0
  122. data/rbi/generated/prism/dot_visitor.rbi +618 -0
  123. data/rbi/generated/prism/dsl.rbi +751 -0
  124. data/rbi/generated/prism/inspect_visitor.rbi +503 -0
  125. data/rbi/generated/prism/lex_compat.rbi +162 -0
  126. data/rbi/generated/prism/mutation_compiler.rbi +464 -0
  127. data/rbi/generated/prism/node.rbi +13681 -0
  128. data/rbi/generated/prism/node_ext.rbi +259 -0
  129. data/rbi/generated/prism/node_find.rbi +79 -0
  130. data/rbi/generated/prism/parse_result/errors.rbi +21 -0
  131. data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
  132. data/rbi/generated/prism/parse_result.rbi +764 -0
  133. data/rbi/generated/prism/pattern.rbi +134 -0
  134. data/rbi/generated/prism/reflection.rbi +89 -0
  135. data/rbi/generated/prism/relocation.rbi +329 -0
  136. data/rbi/generated/prism/serialize.rbi +181 -0
  137. data/rbi/generated/prism/string_query.rbi +36 -0
  138. data/rbi/generated/prism/translation.rbi +7 -0
  139. data/rbi/generated/prism/visitor.rbi +650 -0
  140. data/rbi/generated/prism.rbi +86 -0
  141. data/rbi/prism/translation/parser_versions.rbi +5 -0
  142. data/rbi/rubyvm/node_find.rbi +14 -0
  143. data/sig/generated/prism/compiler.rbs +492 -0
  144. data/sig/generated/prism/desugar_compiler.rbs +305 -0
  145. data/sig/generated/prism/dispatcher.rbs +1292 -0
  146. data/sig/generated/prism/dot_visitor.rbs +635 -0
  147. data/sig/generated/prism/dsl.rbs +928 -0
  148. data/sig/generated/prism/inspect_visitor.rbs +509 -0
  149. data/sig/generated/prism/lex_compat.rbs +166 -0
  150. data/sig/{prism → generated/prism}/mutation_compiler.rbs +309 -4
  151. data/sig/generated/prism/node.rbs +20160 -0
  152. data/sig/generated/prism/node_ext.rbs +290 -0
  153. data/sig/generated/prism/node_find.rbs +90 -0
  154. data/sig/generated/prism/parse_result/errors.rbs +22 -0
  155. data/sig/generated/prism/parse_result/newlines.rbs +223 -0
  156. data/sig/generated/prism/parse_result.rbs +859 -0
  157. data/sig/generated/prism/pattern.rbs +156 -0
  158. data/sig/generated/prism/reflection.rbs +101 -0
  159. data/sig/generated/prism/relocation.rbs +428 -0
  160. data/sig/generated/prism/serialize.rbs +195 -0
  161. data/sig/generated/prism/string_query.rbs +36 -0
  162. data/sig/generated/prism/translation.rbs +8 -0
  163. data/sig/generated/prism/visitor.rbs +1111 -0
  164. data/sig/generated/prism.rbs +84 -0
  165. data/sig/manifest.yaml +2 -0
  166. data/src/arena.c +117 -0
  167. data/src/{util/pm_buffer.c → buffer.c} +44 -21
  168. data/src/{util/pm_char.c → char.c} +28 -57
  169. data/src/comments.c +454 -0
  170. data/src/constant_pool.c +406 -0
  171. data/src/diagnostic.c +93 -65
  172. data/src/encoding.c +8 -3
  173. data/src/errors_format.c +519 -0
  174. data/src/{util/pm_integer.c → integer.c} +33 -22
  175. data/src/json.c +5733 -0
  176. data/src/line_offset_list.c +100 -0
  177. data/src/list.c +24 -0
  178. data/src/{util/pm_memchr.c → memchr.c} +8 -6
  179. data/src/node.c +3504 -7674
  180. data/src/options.c +162 -49
  181. data/src/parser.c +349 -0
  182. data/src/prettyprint.c +421 -354
  183. data/src/prism.c +8035 -7019
  184. data/src/regexp.c +961 -45
  185. data/src/serialize.c +459 -424
  186. data/src/source.c +518 -0
  187. data/src/static_literals.c +111 -43
  188. data/src/string_query.c +166 -0
  189. data/src/stringy.c +91 -0
  190. data/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  191. data/src/strpbrk.c +447 -0
  192. data/src/{token_type.c → tokens.c} +39 -18
  193. metadata +123 -62
  194. data/ext/prism/api_pack.c +0 -276
  195. data/include/prism/defines.h +0 -260
  196. data/include/prism/pack.h +0 -163
  197. data/include/prism/regexp.h +0 -43
  198. data/include/prism/util/pm_buffer.h +0 -236
  199. data/include/prism/util/pm_char.h +0 -204
  200. data/include/prism/util/pm_constant_pool.h +0 -218
  201. data/include/prism/util/pm_integer.h +0 -130
  202. data/include/prism/util/pm_memchr.h +0 -29
  203. data/include/prism/util/pm_newline_list.h +0 -113
  204. data/include/prism/util/pm_string.h +0 -200
  205. data/lib/prism/lex_ripper.rb +0 -64
  206. data/lib/prism/pack.rb +0 -230
  207. data/lib/prism/parse_result/comments.rb +0 -188
  208. data/rbi/prism/compiler.rbi +0 -12
  209. data/rbi/prism/dsl.rbi +0 -524
  210. data/rbi/prism/inspect_visitor.rbi +0 -12
  211. data/rbi/prism/node.rbi +0 -8747
  212. data/rbi/prism/node_ext.rbi +0 -107
  213. data/rbi/prism/parse_result.rbi +0 -404
  214. data/rbi/prism/reflection.rbi +0 -58
  215. data/rbi/prism/string_query.rbi +0 -12
  216. data/rbi/prism/visitor.rbi +0 -473
  217. data/rbi/prism.rbi +0 -66
  218. data/sig/prism/compiler.rbs +0 -9
  219. data/sig/prism/dispatcher.rbs +0 -19
  220. data/sig/prism/dot_visitor.rbs +0 -6
  221. data/sig/prism/dsl.rbs +0 -351
  222. data/sig/prism/inspect_visitor.rbs +0 -22
  223. data/sig/prism/lex_compat.rbs +0 -10
  224. data/sig/prism/node.rbs +0 -4039
  225. data/sig/prism/node_ext.rbs +0 -149
  226. data/sig/prism/pack.rbs +0 -43
  227. data/sig/prism/parse_result/comments.rbs +0 -38
  228. data/sig/prism/parse_result.rbs +0 -196
  229. data/sig/prism/pattern.rbs +0 -13
  230. data/sig/prism/reflection.rbs +0 -50
  231. data/sig/prism/relocation.rbs +0 -185
  232. data/sig/prism/serialize.rbs +0 -8
  233. data/sig/prism/string_query.rbs +0 -11
  234. data/sig/prism/visitor.rbs +0 -169
  235. data/sig/prism.rbs +0 -258
  236. data/src/pack.c +0 -509
  237. data/src/util/pm_constant_pool.c +0 -342
  238. data/src/util/pm_list.c +0 -49
  239. data/src/util/pm_newline_list.c +0 -125
  240. data/src/util/pm_string.c +0 -381
  241. data/src/util/pm_strpbrk.c +0 -206
data/src/diagnostic.c CHANGED
@@ -1,5 +1,3 @@
1
- /* :markup: markdown */
2
-
3
1
  /*----------------------------------------------------------------------------*/
4
2
  /* This file is generated by the templates/template.rb script and should not */
5
3
  /* be modified manually. See */
@@ -8,9 +6,22 @@
8
6
  /* template */
9
7
  /*----------------------------------------------------------------------------*/
10
8
 
11
- #include "prism/diagnostic.h"
9
+ #include "prism/internal/diagnostic.h"
10
+
11
+ #include "prism/compiler/assume.h"
12
+ #include "prism/compiler/inline.h"
13
+
14
+ #include "prism/internal/allocator.h"
15
+ #include "prism/internal/arena.h"
16
+ #include "prism/internal/list.h"
12
17
 
13
- #define PM_DIAGNOSTIC_ID_MAX 326
18
+ #include <assert.h>
19
+ #include <inttypes.h>
20
+ #include <stdarg.h>
21
+ #include <stdio.h>
22
+ #include <stdlib.h>
23
+
24
+ #define PM_DIAGNOSTIC_ID_MAX 327
14
25
 
15
26
  /** This struct holds the data for each diagnostic. */
16
27
  typedef struct {
@@ -85,16 +96,16 @@ typedef struct {
85
96
  * * `PM_WARNING_LEVEL_VERBOSE` - Warnings that appear with `-w`, as in `ruby -w -c -e 'code'`.
86
97
  */
87
98
  static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
88
- // Special error that can be replaced
99
+ /* Special error that can be replaced */
89
100
  [PM_ERR_CANNOT_PARSE_EXPRESSION] = { "cannot parse the expression", PM_ERROR_LEVEL_SYNTAX },
90
101
 
91
- // Errors that should raise argument errors
102
+ /* Errors that should raise argument errors */
92
103
  [PM_ERR_INVALID_ENCODING_MAGIC_COMMENT] = { "unknown or invalid encoding in the magic comment", PM_ERROR_LEVEL_ARGUMENT },
93
104
 
94
- // Errors that should raise load errors
105
+ /* Errors that should raise load errors */
95
106
  [PM_ERR_SCRIPT_NOT_FOUND] = { "no Ruby script found in input", PM_ERROR_LEVEL_LOAD },
96
107
 
97
- // Errors that should raise syntax errors
108
+ /* Errors that should raise syntax errors */
98
109
  [PM_ERR_ALIAS_ARGUMENT] = { "invalid argument being passed to `alias`; expected a bare word, symbol, constant, or global variable", PM_ERROR_LEVEL_SYNTAX },
99
110
  [PM_ERR_ALIAS_ARGUMENT_NUMBERED_REFERENCE] = { "invalid argument being passed to `alias`; can't make alias for the number variables", PM_ERROR_LEVEL_SYNTAX },
100
111
  [PM_ERR_AMPAMPEQ_MULTI_ASSIGN] = { "unexpected `&&=` in a multiple assignment", PM_ERROR_LEVEL_SYNTAX },
@@ -158,6 +169,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
158
169
  [PM_ERR_DEF_ENDLESS] = { "could not parse the endless method body", PM_ERROR_LEVEL_SYNTAX },
159
170
  [PM_ERR_DEF_ENDLESS_PARAMETERS] = { "could not parse the endless method parameters", PM_ERROR_LEVEL_SYNTAX },
160
171
  [PM_ERR_DEF_ENDLESS_SETTER] = { "invalid method name; a setter method cannot be defined in an endless method definition", PM_ERROR_LEVEL_SYNTAX },
172
+ [PM_ERR_DEF_ENDLESS_DO_BLOCK] = { "unexpected `do` for block in an endless method definition", PM_ERROR_LEVEL_SYNTAX },
161
173
  [PM_ERR_DEF_NAME] = { "unexpected %s; expected a method name", PM_ERROR_LEVEL_SYNTAX },
162
174
  [PM_ERR_DEF_PARAMS_TERM] = { "expected a delimiter to close the parameters", PM_ERROR_LEVEL_SYNTAX },
163
175
  [PM_ERR_DEF_PARAMS_TERM_PAREN] = { "unexpected %s; expected a `)` to close the parameters", PM_ERROR_LEVEL_SYNTAX },
@@ -339,13 +351,15 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
339
351
  [PM_ERR_PATTERN_TERM_PAREN] = { "expected a `)` to close the pattern expression", PM_ERROR_LEVEL_SYNTAX },
340
352
  [PM_ERR_PIPEPIPEEQ_MULTI_ASSIGN] = { "unexpected `||=` in a multiple assignment", PM_ERROR_LEVEL_SYNTAX },
341
353
  [PM_ERR_REGEXP_ENCODING_OPTION_MISMATCH] = { "regexp encoding option '%c' differs from source encoding '%s'", PM_ERROR_LEVEL_SYNTAX },
354
+ [PM_ERR_REGEXP_ESCAPED_NON_ASCII_IN_UTF8] = { "escaped non ASCII character in UTF-8 regexp: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
342
355
  [PM_ERR_REGEXP_INCOMPAT_CHAR_ENCODING] = { "incompatible character encoding: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
343
- [PM_ERR_REGEXP_NON_ESCAPED_MBC] = { "/.../n has a non escaped non ASCII character in non ASCII-8BIT script: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
356
+ [PM_ERR_REGEXP_INVALID_CHAR_PROPERTY] = { "invalid character property name {%.*s}: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
344
357
  [PM_ERR_REGEXP_INVALID_UNICODE_RANGE] = { "invalid Unicode range: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
358
+ [PM_ERR_REGEXP_NON_ESCAPED_MBC] = { "/.../n has a non escaped non ASCII character in non ASCII-8BIT script: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
345
359
  [PM_ERR_REGEXP_PARSE_ERROR] = { "%s", PM_ERROR_LEVEL_SYNTAX },
346
360
  [PM_ERR_REGEXP_UNKNOWN_OPTIONS] = { "unknown regexp %s - %.*s", PM_ERROR_LEVEL_SYNTAX },
347
361
  [PM_ERR_REGEXP_TERM] = { "unterminated regexp meets end of file; expected a closing delimiter", PM_ERROR_LEVEL_SYNTAX },
348
- [PM_ERR_REGEXP_UTF8_CHAR_NON_UTF8_REGEXP] = { "UTF-8 character in non UTF-8 regexp: /%s/", PM_ERROR_LEVEL_SYNTAX },
362
+ [PM_ERR_REGEXP_UTF8_CHAR_NON_UTF8_REGEXP] = { "UTF-8 character in non UTF-8 regexp: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
349
363
  [PM_ERR_RESCUE_EXPRESSION] = { "expected a rescued expression", PM_ERROR_LEVEL_SYNTAX },
350
364
  [PM_ERR_RESCUE_MODIFIER_VALUE] = { "expected a value after the `rescue` modifier", PM_ERROR_LEVEL_SYNTAX },
351
365
  [PM_ERR_RESCUE_TERM] = { "expected a closing delimiter for the `rescue` clause", PM_ERROR_LEVEL_SYNTAX },
@@ -360,7 +374,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
360
374
  [PM_ERR_STRING_INTERPOLATED_TERM] = { "unterminated string; expected a closing delimiter for the interpolated string", PM_ERROR_LEVEL_SYNTAX },
361
375
  [PM_ERR_STRING_LITERAL_EOF] = { "unterminated string meets end of file", PM_ERROR_LEVEL_SYNTAX },
362
376
  [PM_ERR_STRING_LITERAL_TERM] = { "unexpected %s, expected a string literal terminator", PM_ERROR_LEVEL_SYNTAX },
363
- [PM_ERR_SYMBOL_INVALID] = { "invalid symbol", PM_ERROR_LEVEL_SYNTAX }, // TODO expected symbol? prism.c ~9719
377
+ [PM_ERR_SYMBOL_INVALID] = { "invalid symbol", PM_ERROR_LEVEL_SYNTAX }, /* TODO expected symbol? prism.c ~9719 */
364
378
  [PM_ERR_SYMBOL_TERM_DYNAMIC] = { "unterminated quoted string; expected a closing delimiter for the dynamic symbol", PM_ERROR_LEVEL_SYNTAX },
365
379
  [PM_ERR_SYMBOL_TERM_INTERPOLATED] = { "unterminated symbol; expected a closing delimiter for the interpolated symbol", PM_ERROR_LEVEL_SYNTAX },
366
380
  [PM_ERR_TERNARY_COLON] = { "expected a `:` after the true expression of a ternary operator", PM_ERROR_LEVEL_SYNTAX },
@@ -387,7 +401,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
387
401
  [PM_ERR_WRITE_TARGET_UNEXPECTED] = { "unexpected write target", PM_ERROR_LEVEL_SYNTAX },
388
402
  [PM_ERR_XSTRING_TERM] = { "expected a closing delimiter for the `%x` or backtick string", PM_ERROR_LEVEL_SYNTAX },
389
403
 
390
- // Warnings
404
+ /* Warnings */
391
405
  [PM_WARN_AMBIGUOUS_BINARY_OPERATOR] = { "'%s' after local variable or literal is interpreted as binary operator even though it seems like %s", PM_WARNING_LEVEL_VERBOSE },
392
406
  [PM_WARN_AMBIGUOUS_FIRST_ARGUMENT_MINUS] = { "ambiguous first argument; put parentheses or a space even after `-` operator", PM_WARNING_LEVEL_VERBOSE },
393
407
  [PM_WARN_AMBIGUOUS_FIRST_ARGUMENT_PLUS] = { "ambiguous first argument; put parentheses or a space even after `+` operator", PM_WARNING_LEVEL_VERBOSE },
@@ -423,8 +437,8 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
423
437
  /**
424
438
  * Get the human-readable name of the given diagnostic ID.
425
439
  */
426
- const char *
427
- pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
440
+ static const char *
441
+ pm_diagnostic_id_name(pm_diagnostic_id_t diag_id) {
428
442
  switch (diag_id) {
429
443
  case PM_ERR_ALIAS_ARGUMENT: return "alias_argument";
430
444
  case PM_ERR_ALIAS_ARGUMENT_NUMBERED_REFERENCE: return "alias_argument_numbered_reference";
@@ -432,7 +446,6 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
432
446
  case PM_ERR_ARGUMENT_AFTER_BLOCK: return "argument_after_block";
433
447
  case PM_ERR_ARGUMENT_AFTER_FORWARDING_ELLIPSES: return "argument_after_forwarding_ellipses";
434
448
  case PM_ERR_ARGUMENT_BARE_HASH: return "argument_bare_hash";
435
- case PM_ERR_ARGUMENT_BLOCK_FORWARDING: return "argument_block_forwarding";
436
449
  case PM_ERR_ARGUMENT_BLOCK_MULTI: return "argument_block_multi";
437
450
  case PM_ERR_ARGUMENT_CONFLICT_AMPERSAND: return "argument_conflict_ampersand";
438
451
  case PM_ERR_ARGUMENT_CONFLICT_STAR: return "argument_conflict_star";
@@ -491,6 +504,7 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
491
504
  case PM_ERR_DEF_ENDLESS: return "def_endless";
492
505
  case PM_ERR_DEF_ENDLESS_PARAMETERS: return "def_endless_parameters";
493
506
  case PM_ERR_DEF_ENDLESS_SETTER: return "def_endless_setter";
507
+ case PM_ERR_DEF_ENDLESS_DO_BLOCK: return "def_endless_do_block";
494
508
  case PM_ERR_DEF_NAME: return "def_name";
495
509
  case PM_ERR_DEF_PARAMS_TERM: return "def_params_term";
496
510
  case PM_ERR_DEF_PARAMS_TERM_PAREN: return "def_params_term_paren";
@@ -524,7 +538,6 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
524
538
  case PM_ERR_EXPECT_EXPRESSION_AFTER_LPAREN: return "expect_expression_after_lparen";
525
539
  case PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR: return "expect_expression_after_operator";
526
540
  case PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ: return "expect_expression_after_pipepipeeq";
527
- case PM_ERR_EXPECT_EXPRESSION_AFTER_QUESTION: return "expect_expression_after_question";
528
541
  case PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT: return "expect_expression_after_splat";
529
542
  case PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH: return "expect_expression_after_splat_hash";
530
543
  case PM_ERR_EXPECT_EXPRESSION_AFTER_STAR: return "expect_expression_after_star";
@@ -674,7 +687,9 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
674
687
  case PM_ERR_PATTERN_TERM_PAREN: return "pattern_term_paren";
675
688
  case PM_ERR_PIPEPIPEEQ_MULTI_ASSIGN: return "pipepipeeq_multi_assign";
676
689
  case PM_ERR_REGEXP_ENCODING_OPTION_MISMATCH: return "regexp_encoding_option_mismatch";
690
+ case PM_ERR_REGEXP_ESCAPED_NON_ASCII_IN_UTF8: return "regexp_escaped_non_ascii_in_utf8";
677
691
  case PM_ERR_REGEXP_INCOMPAT_CHAR_ENCODING: return "regexp_incompat_char_encoding";
692
+ case PM_ERR_REGEXP_INVALID_CHAR_PROPERTY: return "regexp_invalid_char_property";
678
693
  case PM_ERR_REGEXP_INVALID_UNICODE_RANGE: return "regexp_invalid_unicode_range";
679
694
  case PM_ERR_REGEXP_NON_ESCAPED_MBC: return "regexp_non_escaped_mbc";
680
695
  case PM_ERR_REGEXP_PARSE_ERROR: return "regexp_parse_error";
@@ -758,9 +773,10 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
758
773
  return "";
759
774
  }
760
775
 
761
- static inline const char *
762
- pm_diagnostic_message(pm_diagnostic_id_t diag_id) {
776
+ static PRISM_INLINE const char *
777
+ pm_diagnostic_id_message(pm_diagnostic_id_t diag_id) {
763
778
  assert(diag_id < PM_DIAGNOSTIC_ID_MAX);
779
+ PRISM_ASSUME(diag_id < PM_DIAGNOSTIC_ID_MAX);
764
780
 
765
781
  const char *message = diagnostic_messages[diag_id].message;
766
782
  assert(message);
@@ -768,91 +784,103 @@ pm_diagnostic_message(pm_diagnostic_id_t diag_id) {
768
784
  return message;
769
785
  }
770
786
 
771
- static inline uint8_t
772
- pm_diagnostic_level(pm_diagnostic_id_t diag_id) {
787
+ static PRISM_INLINE uint8_t
788
+ pm_diagnostic_id_level(pm_diagnostic_id_t diag_id) {
773
789
  assert(diag_id < PM_DIAGNOSTIC_ID_MAX);
790
+ PRISM_ASSUME(diag_id < PM_DIAGNOSTIC_ID_MAX);
774
791
 
775
792
  return (uint8_t) diagnostic_messages[diag_id].level;
776
793
  }
777
794
 
795
+ /**
796
+ * Get the type of the given diagnostic.
797
+ */
798
+ const char *
799
+ pm_diagnostic_type(const pm_diagnostic_t *diagnostic) {
800
+ return pm_diagnostic_id_name(diagnostic->diag_id);
801
+ }
802
+
803
+ /**
804
+ * Get the location of the given diagnostic.
805
+ */
806
+ pm_location_t
807
+ pm_diagnostic_location(const pm_diagnostic_t *diagnostic) {
808
+ return diagnostic->location;
809
+ }
810
+
811
+ /**
812
+ * Get the message of the given diagnostic.
813
+ */
814
+ const char *
815
+ pm_diagnostic_message(const pm_diagnostic_t *diagnostic) {
816
+ return diagnostic->message;
817
+ }
818
+
819
+ /**
820
+ * Get the error level associated with the given diagnostic.
821
+ */
822
+ pm_error_level_t
823
+ pm_diagnostic_error_level(const pm_diagnostic_t *diagnostic) {
824
+ return (pm_error_level_t) pm_diagnostic_id_level(diagnostic->diag_id);
825
+ }
826
+
827
+ /**
828
+ * Get the warning level associated with the given diagnostic.
829
+ */
830
+ pm_warning_level_t
831
+ pm_diagnostic_warning_level(const pm_diagnostic_t *diagnostic) {
832
+ return (pm_warning_level_t) pm_diagnostic_id_level(diagnostic->diag_id);
833
+ }
834
+
778
835
  /**
779
836
  * Append an error to the given list of diagnostic.
780
837
  */
781
- bool
782
- pm_diagnostic_list_append(pm_list_t *list, const uint8_t *start, const uint8_t *end, pm_diagnostic_id_t diag_id) {
783
- pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) xcalloc(1, sizeof(pm_diagnostic_t));
784
- if (diagnostic == NULL) return false;
838
+ void
839
+ pm_diagnostic_list_append(pm_arena_t *arena, pm_list_t *list, uint32_t start, uint32_t length, pm_diagnostic_id_t diag_id) {
840
+ pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) pm_arena_zalloc(arena, sizeof(pm_diagnostic_t), PRISM_ALIGNOF(pm_diagnostic_t));
785
841
 
786
842
  *diagnostic = (pm_diagnostic_t) {
787
- .location = { start, end },
843
+ .location = { .start = start, .length = length },
788
844
  .diag_id = diag_id,
789
- .message = pm_diagnostic_message(diag_id),
790
- .owned = false,
791
- .level = pm_diagnostic_level(diag_id)
845
+ .message = pm_diagnostic_id_message(diag_id),
846
+ .level = pm_diagnostic_id_level(diag_id)
792
847
  };
793
848
 
794
849
  pm_list_append(list, (pm_list_node_t *) diagnostic);
795
- return true;
796
850
  }
797
851
 
798
852
  /**
799
853
  * Append a diagnostic to the given list of diagnostics that is using a format
800
854
  * string for its message.
801
855
  */
802
- bool
803
- pm_diagnostic_list_append_format(pm_list_t *list, const uint8_t *start, const uint8_t *end, pm_diagnostic_id_t diag_id, ...) {
856
+ void
857
+ pm_diagnostic_list_append_format(pm_arena_t *arena, pm_list_t *list, uint32_t start, uint32_t length, pm_diagnostic_id_t diag_id, ...) {
804
858
  va_list arguments;
805
859
  va_start(arguments, diag_id);
806
860
 
807
- const char *format = pm_diagnostic_message(diag_id);
861
+ const char *format = pm_diagnostic_id_message(diag_id);
808
862
  int result = vsnprintf(NULL, 0, format, arguments);
809
863
  va_end(arguments);
810
864
 
811
865
  if (result < 0) {
812
- return false;
866
+ return;
813
867
  }
814
868
 
815
- pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) xcalloc(1, sizeof(pm_diagnostic_t));
816
- if (diagnostic == NULL) {
817
- return false;
818
- }
869
+ pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) pm_arena_zalloc(arena, sizeof(pm_diagnostic_t), PRISM_ALIGNOF(pm_diagnostic_t));
819
870
 
820
- size_t length = (size_t) (result + 1);
821
- char *message = (char *) xmalloc(length);
822
- if (message == NULL) {
823
- xfree(diagnostic);
824
- return false;
825
- }
871
+ size_t message_length = (size_t) (result + 1);
872
+ char *message = (char *) pm_arena_alloc(arena, message_length, 1);
826
873
 
827
874
  va_start(arguments, diag_id);
828
- vsnprintf(message, length, format, arguments);
875
+ vsnprintf(message, message_length, format, arguments);
829
876
  va_end(arguments);
830
877
 
831
878
  *diagnostic = (pm_diagnostic_t) {
832
- .location = { start, end },
879
+ .location = { .start = start, .length = length },
833
880
  .diag_id = diag_id,
834
881
  .message = message,
835
- .owned = true,
836
- .level = pm_diagnostic_level(diag_id)
882
+ .level = pm_diagnostic_id_level(diag_id)
837
883
  };
838
884
 
839
885
  pm_list_append(list, (pm_list_node_t *) diagnostic);
840
- return true;
841
- }
842
-
843
- /**
844
- * Deallocate the internal state of the given diagnostic list.
845
- */
846
- void
847
- pm_diagnostic_list_free(pm_list_t *list) {
848
- pm_diagnostic_t *node = (pm_diagnostic_t *) list->head;
849
-
850
- while (node != NULL) {
851
- pm_diagnostic_t *next = (pm_diagnostic_t *) node->node.next;
852
-
853
- if (node->owned) xfree((void *) node->message);
854
- xfree(node);
855
-
856
- node = next;
857
- }
858
886
  }
data/src/encoding.c CHANGED
@@ -1,4 +1,9 @@
1
- #include "prism/encoding.h"
1
+ #include "prism/internal/encoding.h"
2
+
3
+ #include "prism/compiler/unused.h"
4
+ #include "prism/internal/strncasecmp.h"
5
+
6
+ #include <assert.h>
2
7
 
3
8
  typedef uint32_t pm_unicode_codepoint_t;
4
9
 
@@ -4089,7 +4094,7 @@ pm_encoding_ascii_isupper_char(const uint8_t *b, ptrdiff_t n) {
4089
4094
  * matter what the codepoint, so this function is shared between them.
4090
4095
  */
4091
4096
  static size_t
4092
- pm_encoding_single_char_width(PRISM_ATTRIBUTE_UNUSED const uint8_t *b, PRISM_ATTRIBUTE_UNUSED ptrdiff_t n) {
4097
+ pm_encoding_single_char_width(PRISM_UNUSED const uint8_t *b, PRISM_UNUSED ptrdiff_t n) {
4093
4098
  return 1;
4094
4099
  }
4095
4100
 
@@ -4110,7 +4115,7 @@ pm_encoding_euc_jp_char_width(const uint8_t *b, ptrdiff_t n) {
4110
4115
  }
4111
4116
 
4112
4117
  // These are the triple byte characters.
4113
- if ((n > 2) && (b[0] == 0x8F) && (b[1] >= 0xA1 && b[2] <= 0xFE) && (b[2] >= 0xA1 && b[2] <= 0xFE)) {
4118
+ if ((n > 2) && (b[0] == 0x8F) && (b[1] >= 0xA1 && b[1] <= 0xFE) && (b[2] >= 0xA1 && b[2] <= 0xFE)) {
4114
4119
  return 3;
4115
4120
  }
4116
4121