prism 1.9.0 → 2.0.0.rc2
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 +88 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/LICENSE.md +1 -1
- data/Makefile +41 -12
- data/README.md +35 -97
- data/config.yml +174 -161
- 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/serialization.md +22 -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 +796 -422
- data/ext/prism/extension.h +3 -3
- data/include/prism/arena.h +37 -0
- data/include/prism/ast.h +2727 -610
- data/include/prism/buffer.h +52 -0
- data/include/prism/comments.h +55 -0
- data/include/prism/compiler/accel.h +26 -0
- data/include/prism/compiler/align.h +36 -0
- data/include/prism/compiler/assume.h +25 -0
- data/include/prism/compiler/bswap.h +46 -0
- data/include/prism/compiler/endianness.h +34 -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 -403
- 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 +94 -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 +1004 -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/internal/xxh3.h +16 -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 +356 -867
- 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 +74 -0
- data/include/prism/stringy.h +72 -0
- data/include/prism/version.h +12 -3
- 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 +258 -90
- data/lib/prism/inspect_visitor.rb +357 -325
- data/lib/prism/lex_compat.rb +254 -212
- data/lib/prism/mutation_compiler.rb +313 -305
- data/lib/prism/node.rb +20966 -6992
- 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 +468 -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 +3460 -539
- data/lib/prism/string_query.rb +24 -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/lexer.rb +8 -10
- data/lib/prism/translation/ripper/sexp.rb +2 -10
- data/lib/prism/translation/ripper/shim.rb +2 -0
- data/lib/prism/translation/ripper.rb +967 -209
- 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 -9
- data/prism.gemspec +128 -62
- 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 +14407 -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 +776 -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 +184 -0
- data/rbi/generated/prism/string_query.rbi +43 -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 +20896 -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 +871 -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 +198 -0
- data/sig/generated/prism/string_query.rbs +43 -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} +53 -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 +97 -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 +367 -0
- data/src/prettyprint.c +421 -354
- data/src/prism.c +8402 -7161
- data/src/regexp.c +961 -45
- data/src/serialize.c +460 -424
- data/src/source.c +518 -0
- data/src/static_literals.c +111 -43
- data/src/string_query.c +180 -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
- data/src/xxh3.c +292 -0
- metadata +128 -63
- 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/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 -8750
- 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 -63
- 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 -4042
- 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 -197
- 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 -272
- 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 },
|
|
@@ -112,6 +123,8 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
|
|
112
123
|
[PM_ERR_ARGUMENT_FORWARDING_UNBOUND] = { "unexpected `...` in an non-parenthesized call", PM_ERROR_LEVEL_SYNTAX },
|
|
113
124
|
[PM_ERR_ARGUMENT_NO_FORWARDING_AMPERSAND] = { "unexpected `&`; no anonymous block parameter", PM_ERROR_LEVEL_SYNTAX },
|
|
114
125
|
[PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES] = { "unexpected ... when the parent method is not forwarding", PM_ERROR_LEVEL_SYNTAX },
|
|
126
|
+
[PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES_LAMBDA] = { "unexpected ... in lambda argument", PM_ERROR_LEVEL_SYNTAX },
|
|
127
|
+
[PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES_BLOCK] = { "unexpected ... in block argument", PM_ERROR_LEVEL_SYNTAX },
|
|
115
128
|
[PM_ERR_ARGUMENT_NO_FORWARDING_STAR] = { "unexpected `*`; no anonymous rest parameter", PM_ERROR_LEVEL_SYNTAX },
|
|
116
129
|
[PM_ERR_ARGUMENT_NO_FORWARDING_STAR_STAR] = { "unexpected `**`; no anonymous keyword rest parameter", PM_ERROR_LEVEL_SYNTAX },
|
|
117
130
|
[PM_ERR_ARGUMENT_SPLAT_AFTER_ASSOC_SPLAT] = { "unexpected `*` splat argument after a `**` keyword splat argument", PM_ERROR_LEVEL_SYNTAX },
|
|
@@ -156,6 +169,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
|
|
156
169
|
[PM_ERR_DEF_ENDLESS] = { "could not parse the endless method body", PM_ERROR_LEVEL_SYNTAX },
|
|
157
170
|
[PM_ERR_DEF_ENDLESS_PARAMETERS] = { "could not parse the endless method parameters", PM_ERROR_LEVEL_SYNTAX },
|
|
158
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 },
|
|
159
173
|
[PM_ERR_DEF_NAME] = { "unexpected %s; expected a method name", PM_ERROR_LEVEL_SYNTAX },
|
|
160
174
|
[PM_ERR_DEF_PARAMS_TERM] = { "expected a delimiter to close the parameters", PM_ERROR_LEVEL_SYNTAX },
|
|
161
175
|
[PM_ERR_DEF_PARAMS_TERM_PAREN] = { "unexpected %s; expected a `)` to close the parameters", PM_ERROR_LEVEL_SYNTAX },
|
|
@@ -337,13 +351,15 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
|
|
337
351
|
[PM_ERR_PATTERN_TERM_PAREN] = { "expected a `)` to close the pattern expression", PM_ERROR_LEVEL_SYNTAX },
|
|
338
352
|
[PM_ERR_PIPEPIPEEQ_MULTI_ASSIGN] = { "unexpected `||=` in a multiple assignment", PM_ERROR_LEVEL_SYNTAX },
|
|
339
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 },
|
|
340
355
|
[PM_ERR_REGEXP_INCOMPAT_CHAR_ENCODING] = { "incompatible character encoding: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
|
|
341
|
-
[
|
|
356
|
+
[PM_ERR_REGEXP_INVALID_CHAR_PROPERTY] = { "invalid character property name {%.*s}: /%.*s/", PM_ERROR_LEVEL_SYNTAX },
|
|
342
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 },
|
|
343
359
|
[PM_ERR_REGEXP_PARSE_ERROR] = { "%s", PM_ERROR_LEVEL_SYNTAX },
|
|
344
360
|
[PM_ERR_REGEXP_UNKNOWN_OPTIONS] = { "unknown regexp %s - %.*s", PM_ERROR_LEVEL_SYNTAX },
|
|
345
361
|
[PM_ERR_REGEXP_TERM] = { "unterminated regexp meets end of file; expected a closing delimiter", PM_ERROR_LEVEL_SYNTAX },
|
|
346
|
-
[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 },
|
|
347
363
|
[PM_ERR_RESCUE_EXPRESSION] = { "expected a rescued expression", PM_ERROR_LEVEL_SYNTAX },
|
|
348
364
|
[PM_ERR_RESCUE_MODIFIER_VALUE] = { "expected a value after the `rescue` modifier", PM_ERROR_LEVEL_SYNTAX },
|
|
349
365
|
[PM_ERR_RESCUE_TERM] = { "expected a closing delimiter for the `rescue` clause", PM_ERROR_LEVEL_SYNTAX },
|
|
@@ -358,7 +374,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
|
|
358
374
|
[PM_ERR_STRING_INTERPOLATED_TERM] = { "unterminated string; expected a closing delimiter for the interpolated string", PM_ERROR_LEVEL_SYNTAX },
|
|
359
375
|
[PM_ERR_STRING_LITERAL_EOF] = { "unterminated string meets end of file", PM_ERROR_LEVEL_SYNTAX },
|
|
360
376
|
[PM_ERR_STRING_LITERAL_TERM] = { "unexpected %s, expected a string literal terminator", PM_ERROR_LEVEL_SYNTAX },
|
|
361
|
-
[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 */
|
|
362
378
|
[PM_ERR_SYMBOL_TERM_DYNAMIC] = { "unterminated quoted string; expected a closing delimiter for the dynamic symbol", PM_ERROR_LEVEL_SYNTAX },
|
|
363
379
|
[PM_ERR_SYMBOL_TERM_INTERPOLATED] = { "unterminated symbol; expected a closing delimiter for the interpolated symbol", PM_ERROR_LEVEL_SYNTAX },
|
|
364
380
|
[PM_ERR_TERNARY_COLON] = { "expected a `:` after the true expression of a ternary operator", PM_ERROR_LEVEL_SYNTAX },
|
|
@@ -385,7 +401,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
|
|
385
401
|
[PM_ERR_WRITE_TARGET_UNEXPECTED] = { "unexpected write target", PM_ERROR_LEVEL_SYNTAX },
|
|
386
402
|
[PM_ERR_XSTRING_TERM] = { "expected a closing delimiter for the `%x` or backtick string", PM_ERROR_LEVEL_SYNTAX },
|
|
387
403
|
|
|
388
|
-
|
|
404
|
+
/* Warnings */
|
|
389
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 },
|
|
390
406
|
[PM_WARN_AMBIGUOUS_FIRST_ARGUMENT_MINUS] = { "ambiguous first argument; put parentheses or a space even after `-` operator", PM_WARNING_LEVEL_VERBOSE },
|
|
391
407
|
[PM_WARN_AMBIGUOUS_FIRST_ARGUMENT_PLUS] = { "ambiguous first argument; put parentheses or a space even after `+` operator", PM_WARNING_LEVEL_VERBOSE },
|
|
@@ -421,8 +437,8 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
|
|
421
437
|
/**
|
|
422
438
|
* Get the human-readable name of the given diagnostic ID.
|
|
423
439
|
*/
|
|
424
|
-
const char *
|
|
425
|
-
|
|
440
|
+
static const char *
|
|
441
|
+
pm_diagnostic_id_name(pm_diagnostic_id_t diag_id) {
|
|
426
442
|
switch (diag_id) {
|
|
427
443
|
case PM_ERR_ALIAS_ARGUMENT: return "alias_argument";
|
|
428
444
|
case PM_ERR_ALIAS_ARGUMENT_NUMBERED_REFERENCE: return "alias_argument_numbered_reference";
|
|
@@ -430,7 +446,6 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
|
|
|
430
446
|
case PM_ERR_ARGUMENT_AFTER_BLOCK: return "argument_after_block";
|
|
431
447
|
case PM_ERR_ARGUMENT_AFTER_FORWARDING_ELLIPSES: return "argument_after_forwarding_ellipses";
|
|
432
448
|
case PM_ERR_ARGUMENT_BARE_HASH: return "argument_bare_hash";
|
|
433
|
-
case PM_ERR_ARGUMENT_BLOCK_FORWARDING: return "argument_block_forwarding";
|
|
434
449
|
case PM_ERR_ARGUMENT_BLOCK_MULTI: return "argument_block_multi";
|
|
435
450
|
case PM_ERR_ARGUMENT_CONFLICT_AMPERSAND: return "argument_conflict_ampersand";
|
|
436
451
|
case PM_ERR_ARGUMENT_CONFLICT_STAR: return "argument_conflict_star";
|
|
@@ -442,6 +457,8 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
|
|
|
442
457
|
case PM_ERR_ARGUMENT_FORWARDING_UNBOUND: return "argument_forwarding_unbound";
|
|
443
458
|
case PM_ERR_ARGUMENT_NO_FORWARDING_AMPERSAND: return "argument_no_forwarding_ampersand";
|
|
444
459
|
case PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES: return "argument_no_forwarding_ellipses";
|
|
460
|
+
case PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES_LAMBDA: return "argument_no_forwarding_ellipses_lambda";
|
|
461
|
+
case PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES_BLOCK: return "argument_no_forwarding_ellipses_block";
|
|
445
462
|
case PM_ERR_ARGUMENT_NO_FORWARDING_STAR: return "argument_no_forwarding_star";
|
|
446
463
|
case PM_ERR_ARGUMENT_NO_FORWARDING_STAR_STAR: return "argument_no_forwarding_star_star";
|
|
447
464
|
case PM_ERR_ARGUMENT_SPLAT_AFTER_ASSOC_SPLAT: return "argument_splat_after_assoc_splat";
|
|
@@ -487,6 +504,7 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
|
|
|
487
504
|
case PM_ERR_DEF_ENDLESS: return "def_endless";
|
|
488
505
|
case PM_ERR_DEF_ENDLESS_PARAMETERS: return "def_endless_parameters";
|
|
489
506
|
case PM_ERR_DEF_ENDLESS_SETTER: return "def_endless_setter";
|
|
507
|
+
case PM_ERR_DEF_ENDLESS_DO_BLOCK: return "def_endless_do_block";
|
|
490
508
|
case PM_ERR_DEF_NAME: return "def_name";
|
|
491
509
|
case PM_ERR_DEF_PARAMS_TERM: return "def_params_term";
|
|
492
510
|
case PM_ERR_DEF_PARAMS_TERM_PAREN: return "def_params_term_paren";
|
|
@@ -520,7 +538,6 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
|
|
|
520
538
|
case PM_ERR_EXPECT_EXPRESSION_AFTER_LPAREN: return "expect_expression_after_lparen";
|
|
521
539
|
case PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR: return "expect_expression_after_operator";
|
|
522
540
|
case PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ: return "expect_expression_after_pipepipeeq";
|
|
523
|
-
case PM_ERR_EXPECT_EXPRESSION_AFTER_QUESTION: return "expect_expression_after_question";
|
|
524
541
|
case PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT: return "expect_expression_after_splat";
|
|
525
542
|
case PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH: return "expect_expression_after_splat_hash";
|
|
526
543
|
case PM_ERR_EXPECT_EXPRESSION_AFTER_STAR: return "expect_expression_after_star";
|
|
@@ -670,7 +687,9 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
|
|
|
670
687
|
case PM_ERR_PATTERN_TERM_PAREN: return "pattern_term_paren";
|
|
671
688
|
case PM_ERR_PIPEPIPEEQ_MULTI_ASSIGN: return "pipepipeeq_multi_assign";
|
|
672
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";
|
|
673
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";
|
|
674
693
|
case PM_ERR_REGEXP_INVALID_UNICODE_RANGE: return "regexp_invalid_unicode_range";
|
|
675
694
|
case PM_ERR_REGEXP_NON_ESCAPED_MBC: return "regexp_non_escaped_mbc";
|
|
676
695
|
case PM_ERR_REGEXP_PARSE_ERROR: return "regexp_parse_error";
|
|
@@ -754,9 +773,10 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
|
|
|
754
773
|
return "";
|
|
755
774
|
}
|
|
756
775
|
|
|
757
|
-
static
|
|
758
|
-
|
|
776
|
+
static PRISM_INLINE const char *
|
|
777
|
+
pm_diagnostic_id_message(pm_diagnostic_id_t diag_id) {
|
|
759
778
|
assert(diag_id < PM_DIAGNOSTIC_ID_MAX);
|
|
779
|
+
PRISM_ASSUME(diag_id < PM_DIAGNOSTIC_ID_MAX);
|
|
760
780
|
|
|
761
781
|
const char *message = diagnostic_messages[diag_id].message;
|
|
762
782
|
assert(message);
|
|
@@ -764,91 +784,103 @@ pm_diagnostic_message(pm_diagnostic_id_t diag_id) {
|
|
|
764
784
|
return message;
|
|
765
785
|
}
|
|
766
786
|
|
|
767
|
-
static
|
|
768
|
-
|
|
787
|
+
static PRISM_INLINE uint8_t
|
|
788
|
+
pm_diagnostic_id_level(pm_diagnostic_id_t diag_id) {
|
|
769
789
|
assert(diag_id < PM_DIAGNOSTIC_ID_MAX);
|
|
790
|
+
PRISM_ASSUME(diag_id < PM_DIAGNOSTIC_ID_MAX);
|
|
770
791
|
|
|
771
792
|
return (uint8_t) diagnostic_messages[diag_id].level;
|
|
772
793
|
}
|
|
773
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
|
+
|
|
774
835
|
/**
|
|
775
836
|
* Append an error to the given list of diagnostic.
|
|
776
837
|
*/
|
|
777
|
-
|
|
778
|
-
pm_diagnostic_list_append(pm_list_t *list,
|
|
779
|
-
pm_diagnostic_t *diagnostic = (pm_diagnostic_t *)
|
|
780
|
-
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));
|
|
781
841
|
|
|
782
842
|
*diagnostic = (pm_diagnostic_t) {
|
|
783
|
-
.location = { start,
|
|
843
|
+
.location = { .start = start, .length = length },
|
|
784
844
|
.diag_id = diag_id,
|
|
785
|
-
.message =
|
|
786
|
-
.
|
|
787
|
-
.level = pm_diagnostic_level(diag_id)
|
|
845
|
+
.message = pm_diagnostic_id_message(diag_id),
|
|
846
|
+
.level = pm_diagnostic_id_level(diag_id)
|
|
788
847
|
};
|
|
789
848
|
|
|
790
849
|
pm_list_append(list, (pm_list_node_t *) diagnostic);
|
|
791
|
-
return true;
|
|
792
850
|
}
|
|
793
851
|
|
|
794
852
|
/**
|
|
795
853
|
* Append a diagnostic to the given list of diagnostics that is using a format
|
|
796
854
|
* string for its message.
|
|
797
855
|
*/
|
|
798
|
-
|
|
799
|
-
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, ...) {
|
|
800
858
|
va_list arguments;
|
|
801
859
|
va_start(arguments, diag_id);
|
|
802
860
|
|
|
803
|
-
const char *format =
|
|
861
|
+
const char *format = pm_diagnostic_id_message(diag_id);
|
|
804
862
|
int result = vsnprintf(NULL, 0, format, arguments);
|
|
805
863
|
va_end(arguments);
|
|
806
864
|
|
|
807
865
|
if (result < 0) {
|
|
808
|
-
return
|
|
866
|
+
return;
|
|
809
867
|
}
|
|
810
868
|
|
|
811
|
-
pm_diagnostic_t *diagnostic = (pm_diagnostic_t *)
|
|
812
|
-
if (diagnostic == NULL) {
|
|
813
|
-
return false;
|
|
814
|
-
}
|
|
869
|
+
pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) pm_arena_zalloc(arena, sizeof(pm_diagnostic_t), PRISM_ALIGNOF(pm_diagnostic_t));
|
|
815
870
|
|
|
816
|
-
size_t
|
|
817
|
-
char *message = (char *)
|
|
818
|
-
if (message == NULL) {
|
|
819
|
-
xfree(diagnostic);
|
|
820
|
-
return false;
|
|
821
|
-
}
|
|
871
|
+
size_t message_length = (size_t) (result + 1);
|
|
872
|
+
char *message = (char *) pm_arena_alloc(arena, message_length, 1);
|
|
822
873
|
|
|
823
874
|
va_start(arguments, diag_id);
|
|
824
|
-
vsnprintf(message,
|
|
875
|
+
vsnprintf(message, message_length, format, arguments);
|
|
825
876
|
va_end(arguments);
|
|
826
877
|
|
|
827
878
|
*diagnostic = (pm_diagnostic_t) {
|
|
828
|
-
.location = { start,
|
|
879
|
+
.location = { .start = start, .length = length },
|
|
829
880
|
.diag_id = diag_id,
|
|
830
881
|
.message = message,
|
|
831
|
-
.
|
|
832
|
-
.level = pm_diagnostic_level(diag_id)
|
|
882
|
+
.level = pm_diagnostic_id_level(diag_id)
|
|
833
883
|
};
|
|
834
884
|
|
|
835
885
|
pm_list_append(list, (pm_list_node_t *) diagnostic);
|
|
836
|
-
return true;
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
/**
|
|
840
|
-
* Deallocate the internal state of the given diagnostic list.
|
|
841
|
-
*/
|
|
842
|
-
void
|
|
843
|
-
pm_diagnostic_list_free(pm_list_t *list) {
|
|
844
|
-
pm_diagnostic_t *node = (pm_diagnostic_t *) list->head;
|
|
845
|
-
|
|
846
|
-
while (node != NULL) {
|
|
847
|
-
pm_diagnostic_t *next = (pm_diagnostic_t *) node->node.next;
|
|
848
|
-
|
|
849
|
-
if (node->owned) xfree((void *) node->message);
|
|
850
|
-
xfree(node);
|
|
851
|
-
|
|
852
|
-
node = next;
|
|
853
|
-
}
|
|
854
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
|
|