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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +90 -2
- data/Makefile +41 -12
- data/README.md +35 -97
- data/config.yml +174 -163
- data/docs/build_system.md +2 -2
- data/docs/configuration.md +5 -4
- data/docs/encoding.md +2 -2
- data/docs/fuzzing.md +4 -11
- data/docs/javascript.md +19 -4
- data/docs/mapping.md +1 -1
- data/docs/releasing.md +77 -5
- data/docs/relocation.md +2 -4
- data/docs/ripper_translation.md +8 -17
- data/docs/serialization.md +21 -24
- data/docs/testing.md +46 -29
- data/ext/prism/api_node.c +1461 -1401
- data/ext/prism/extconf.rb +3 -4
- data/ext/prism/extension.c +778 -422
- data/ext/prism/extension.h +3 -3
- data/include/prism/arena.h +37 -0
- data/include/prism/ast.h +2729 -612
- data/include/prism/buffer.h +52 -0
- data/include/prism/comments.h +55 -0
- data/include/prism/compiler/accel.h +24 -0
- data/include/prism/compiler/align.h +36 -0
- data/include/prism/compiler/assume.h +25 -0
- data/include/prism/compiler/exported.h +24 -0
- data/include/prism/compiler/fallthrough.h +22 -0
- data/include/prism/compiler/filesystem.h +32 -0
- data/include/prism/compiler/flex_array.h +19 -0
- data/include/prism/compiler/force_inline.h +21 -0
- data/include/prism/compiler/format.h +25 -0
- data/include/prism/compiler/inline.h +17 -0
- data/include/prism/compiler/nodiscard.h +22 -0
- data/include/prism/compiler/nonnull.h +18 -0
- data/include/prism/compiler/unused.h +18 -0
- data/include/prism/constant_pool.h +81 -0
- data/include/prism/diagnostic.h +38 -405
- data/include/prism/errors_format.h +53 -0
- data/include/prism/excludes.h +29 -0
- data/include/prism/integer.h +41 -0
- data/include/prism/internal/allocator.h +68 -0
- data/include/prism/internal/allocator_debug.h +88 -0
- data/include/prism/internal/arena.h +108 -0
- data/include/prism/internal/bit.h +42 -0
- data/include/prism/internal/buffer.h +91 -0
- data/include/prism/internal/char.h +145 -0
- data/include/prism/internal/comments.h +53 -0
- data/include/prism/internal/constant_pool.h +152 -0
- data/include/prism/internal/diagnostic.h +389 -0
- data/include/prism/{encoding.h → internal/encoding.h} +27 -68
- data/include/prism/internal/integer.h +68 -0
- data/include/prism/internal/isinf.h +16 -0
- data/include/prism/internal/line_offset_list.h +34 -0
- data/include/prism/{util/pm_list.h → internal/list.h} +11 -52
- data/include/prism/internal/magic_comments.h +23 -0
- data/include/prism/internal/memchr.h +15 -0
- data/include/prism/internal/node.h +38 -0
- data/include/prism/internal/options.h +232 -0
- data/include/prism/internal/parser.h +984 -0
- data/include/prism/internal/regexp.h +26 -0
- data/include/prism/internal/serialize.h +39 -0
- data/include/prism/internal/source.h +72 -0
- data/include/prism/{static_literals.h → internal/static_literals.h} +26 -47
- data/include/prism/internal/stringy.h +35 -0
- data/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
- data/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
- data/include/prism/internal/tokens.h +11 -0
- data/include/prism/json.h +32 -0
- data/include/prism/line_offset_list.h +61 -0
- data/include/prism/magic_comments.h +35 -0
- data/include/prism/node.h +18 -53
- data/include/prism/options.h +146 -280
- data/include/prism/parser.h +336 -868
- data/include/prism/prettyprint.h +6 -9
- data/include/prism/serialize.h +115 -0
- data/include/prism/source.h +155 -0
- data/include/prism/stream.h +28 -0
- data/include/prism/string_query.h +63 -0
- data/include/prism/stringy.h +72 -0
- data/include/prism/version.h +13 -4
- data/include/prism.h +43 -320
- data/lib/prism/compiler.rb +319 -305
- data/lib/prism/desugar_compiler.rb +105 -34
- data/lib/prism/dispatcher.rb +646 -473
- data/lib/prism/dot_visitor.rb +592 -511
- data/lib/prism/dsl.rb +391 -25
- data/lib/prism/ffi.rb +252 -90
- data/lib/prism/inspect_visitor.rb +357 -325
- data/lib/prism/lex_compat.rb +311 -228
- data/lib/prism/mutation_compiler.rb +313 -305
- data/lib/prism/node.rb +20284 -7038
- data/lib/prism/node_ext.rb +180 -187
- data/lib/prism/node_find.rb +215 -0
- data/lib/prism/parse_result/errors.rb +7 -1
- data/lib/prism/parse_result/newlines.rb +276 -8
- data/lib/prism/parse_result.rb +462 -139
- data/lib/prism/pattern.rb +65 -20
- data/lib/prism/reflection.rb +23 -12
- data/lib/prism/relocation.rb +149 -87
- data/lib/prism/serialize.rb +3442 -536
- data/lib/prism/string_query.rb +16 -1
- data/lib/prism/translation/parser/builder.rb +10 -2
- data/lib/prism/translation/parser/compiler.rb +44 -52
- data/lib/prism/translation/parser/lexer.rb +41 -92
- data/lib/prism/translation/parser.rb +1 -1
- data/lib/prism/translation/parser_current.rb +1 -1
- data/lib/prism/translation/ripper/filter.rb +53 -0
- data/lib/prism/translation/ripper/lexer.rb +92 -5
- data/lib/prism/translation/ripper/sexp.rb +2 -10
- data/lib/prism/translation/ripper/shim.rb +2 -0
- data/lib/prism/translation/ripper.rb +1005 -224
- data/lib/prism/translation/ruby_parser.rb +73 -316
- data/lib/prism/translation.rb +2 -0
- data/lib/prism/visitor.rb +632 -5
- data/lib/prism.rb +79 -22
- data/prism.gemspec +123 -61
- data/rbi/generated/prism/compiler.rbi +489 -0
- data/rbi/generated/prism/desugar_compiler.rbi +306 -0
- data/rbi/generated/prism/dispatcher.rbi +1138 -0
- data/rbi/generated/prism/dot_visitor.rbi +618 -0
- data/rbi/generated/prism/dsl.rbi +751 -0
- data/rbi/generated/prism/inspect_visitor.rbi +503 -0
- data/rbi/generated/prism/lex_compat.rbi +162 -0
- data/rbi/generated/prism/mutation_compiler.rbi +464 -0
- data/rbi/generated/prism/node.rbi +13681 -0
- data/rbi/generated/prism/node_ext.rbi +259 -0
- data/rbi/generated/prism/node_find.rbi +79 -0
- data/rbi/generated/prism/parse_result/errors.rbi +21 -0
- data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
- data/rbi/generated/prism/parse_result.rbi +764 -0
- data/rbi/generated/prism/pattern.rbi +134 -0
- data/rbi/generated/prism/reflection.rbi +89 -0
- data/rbi/generated/prism/relocation.rbi +329 -0
- data/rbi/generated/prism/serialize.rbi +181 -0
- data/rbi/generated/prism/string_query.rbi +36 -0
- data/rbi/generated/prism/translation.rbi +7 -0
- data/rbi/generated/prism/visitor.rbi +650 -0
- data/rbi/generated/prism.rbi +86 -0
- data/rbi/prism/translation/parser_versions.rbi +5 -0
- data/rbi/rubyvm/node_find.rbi +14 -0
- data/sig/generated/prism/compiler.rbs +492 -0
- data/sig/generated/prism/desugar_compiler.rbs +305 -0
- data/sig/generated/prism/dispatcher.rbs +1292 -0
- data/sig/generated/prism/dot_visitor.rbs +635 -0
- data/sig/generated/prism/dsl.rbs +928 -0
- data/sig/generated/prism/inspect_visitor.rbs +509 -0
- data/sig/generated/prism/lex_compat.rbs +166 -0
- data/sig/{prism → generated/prism}/mutation_compiler.rbs +309 -4
- data/sig/generated/prism/node.rbs +20160 -0
- data/sig/generated/prism/node_ext.rbs +290 -0
- data/sig/generated/prism/node_find.rbs +90 -0
- data/sig/generated/prism/parse_result/errors.rbs +22 -0
- data/sig/generated/prism/parse_result/newlines.rbs +223 -0
- data/sig/generated/prism/parse_result.rbs +859 -0
- data/sig/generated/prism/pattern.rbs +156 -0
- data/sig/generated/prism/reflection.rbs +101 -0
- data/sig/generated/prism/relocation.rbs +428 -0
- data/sig/generated/prism/serialize.rbs +195 -0
- data/sig/generated/prism/string_query.rbs +36 -0
- data/sig/generated/prism/translation.rbs +8 -0
- data/sig/generated/prism/visitor.rbs +1111 -0
- data/sig/generated/prism.rbs +84 -0
- data/sig/manifest.yaml +2 -0
- data/src/arena.c +117 -0
- data/src/{util/pm_buffer.c → buffer.c} +44 -21
- data/src/{util/pm_char.c → char.c} +28 -57
- data/src/comments.c +454 -0
- data/src/constant_pool.c +406 -0
- data/src/diagnostic.c +93 -65
- data/src/encoding.c +8 -3
- data/src/errors_format.c +519 -0
- data/src/{util/pm_integer.c → integer.c} +33 -22
- data/src/json.c +5733 -0
- data/src/line_offset_list.c +100 -0
- data/src/list.c +24 -0
- data/src/{util/pm_memchr.c → memchr.c} +8 -6
- data/src/node.c +3504 -7674
- data/src/options.c +162 -49
- data/src/parser.c +349 -0
- data/src/prettyprint.c +421 -354
- data/src/prism.c +8035 -7019
- data/src/regexp.c +961 -45
- data/src/serialize.c +459 -424
- data/src/source.c +518 -0
- data/src/static_literals.c +111 -43
- data/src/string_query.c +166 -0
- data/src/stringy.c +91 -0
- data/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
- data/src/strpbrk.c +447 -0
- data/src/{token_type.c → tokens.c} +39 -18
- metadata +123 -62
- data/ext/prism/api_pack.c +0 -276
- data/include/prism/defines.h +0 -260
- data/include/prism/pack.h +0 -163
- data/include/prism/regexp.h +0 -43
- data/include/prism/util/pm_buffer.h +0 -236
- data/include/prism/util/pm_char.h +0 -204
- data/include/prism/util/pm_constant_pool.h +0 -218
- data/include/prism/util/pm_integer.h +0 -130
- data/include/prism/util/pm_memchr.h +0 -29
- data/include/prism/util/pm_newline_list.h +0 -113
- data/include/prism/util/pm_string.h +0 -200
- data/lib/prism/lex_ripper.rb +0 -64
- data/lib/prism/pack.rb +0 -230
- data/lib/prism/parse_result/comments.rb +0 -188
- data/rbi/prism/compiler.rbi +0 -12
- data/rbi/prism/dsl.rbi +0 -524
- data/rbi/prism/inspect_visitor.rbi +0 -12
- data/rbi/prism/node.rbi +0 -8747
- data/rbi/prism/node_ext.rbi +0 -107
- data/rbi/prism/parse_result.rbi +0 -404
- data/rbi/prism/reflection.rbi +0 -58
- data/rbi/prism/string_query.rbi +0 -12
- data/rbi/prism/visitor.rbi +0 -473
- data/rbi/prism.rbi +0 -66
- data/sig/prism/compiler.rbs +0 -9
- data/sig/prism/dispatcher.rbs +0 -19
- data/sig/prism/dot_visitor.rbs +0 -6
- data/sig/prism/dsl.rbs +0 -351
- data/sig/prism/inspect_visitor.rbs +0 -22
- data/sig/prism/lex_compat.rbs +0 -10
- data/sig/prism/node.rbs +0 -4039
- data/sig/prism/node_ext.rbs +0 -149
- data/sig/prism/pack.rbs +0 -43
- data/sig/prism/parse_result/comments.rbs +0 -38
- data/sig/prism/parse_result.rbs +0 -196
- data/sig/prism/pattern.rbs +0 -13
- data/sig/prism/reflection.rbs +0 -50
- data/sig/prism/relocation.rbs +0 -185
- data/sig/prism/serialize.rbs +0 -8
- data/sig/prism/string_query.rbs +0 -11
- data/sig/prism/visitor.rbs +0 -169
- data/sig/prism.rbs +0 -258
- data/src/pack.c +0 -509
- data/src/util/pm_constant_pool.c +0 -342
- data/src/util/pm_list.c +0 -49
- data/src/util/pm_newline_list.c +0 -125
- data/src/util/pm_string.c +0 -381
- 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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
[
|
|
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:
|
|
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 },
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
762
|
-
|
|
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
|
|
772
|
-
|
|
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
|
-
|
|
782
|
-
pm_diagnostic_list_append(pm_list_t *list,
|
|
783
|
-
pm_diagnostic_t *diagnostic = (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,
|
|
843
|
+
.location = { .start = start, .length = length },
|
|
788
844
|
.diag_id = diag_id,
|
|
789
|
-
.message =
|
|
790
|
-
.
|
|
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
|
-
|
|
803
|
-
pm_diagnostic_list_append_format(pm_list_t *list,
|
|
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 =
|
|
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
|
|
866
|
+
return;
|
|
813
867
|
}
|
|
814
868
|
|
|
815
|
-
pm_diagnostic_t *diagnostic = (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
|
|
821
|
-
char *message = (char *)
|
|
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,
|
|
875
|
+
vsnprintf(message, message_length, format, arguments);
|
|
829
876
|
va_end(arguments);
|
|
830
877
|
|
|
831
878
|
*diagnostic = (pm_diagnostic_t) {
|
|
832
|
-
.location = { start,
|
|
879
|
+
.location = { .start = start, .length = length },
|
|
833
880
|
.diag_id = diag_id,
|
|
834
881
|
.message = message,
|
|
835
|
-
.
|
|
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(
|
|
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[
|
|
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
|
|