prism 0.30.0 → 1.0.0
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 +31 -1
- data/README.md +3 -1
- data/config.yml +185 -126
- data/docs/serialization.md +3 -0
- data/ext/prism/api_node.c +2843 -2085
- data/ext/prism/extconf.rb +1 -1
- data/ext/prism/extension.c +35 -25
- data/ext/prism/extension.h +2 -2
- data/include/prism/ast.h +1048 -69
- data/include/prism/defines.h +9 -0
- data/include/prism/diagnostic.h +11 -3
- data/include/prism/options.h +55 -1
- data/include/prism/parser.h +27 -3
- data/include/prism/regexp.h +2 -1
- data/include/prism/util/pm_integer.h +6 -6
- data/include/prism/util/pm_newline_list.h +11 -0
- data/include/prism/util/pm_string.h +1 -0
- data/include/prism/version.h +3 -3
- data/lib/prism/desugar_compiler.rb +111 -74
- data/lib/prism/dispatcher.rb +2 -1
- data/lib/prism/dot_visitor.rb +21 -31
- data/lib/prism/dsl.rb +656 -471
- data/lib/prism/ffi.rb +3 -0
- data/lib/prism/inspect_visitor.rb +285 -57
- data/lib/prism/mutation_compiler.rb +5 -5
- data/lib/prism/node.rb +2282 -4754
- data/lib/prism/node_ext.rb +72 -11
- data/lib/prism/parse_result/errors.rb +65 -0
- data/lib/prism/parse_result/newlines.rb +28 -28
- data/lib/prism/parse_result.rb +25 -2
- data/lib/prism/reflection.rb +7 -7
- data/lib/prism/serialize.rb +468 -610
- data/lib/prism/translation/parser/compiler.rb +18 -18
- data/lib/prism/translation/parser/lexer.rb +1 -1
- data/lib/prism/translation/parser.rb +3 -3
- data/lib/prism/translation/ripper.rb +14 -14
- data/lib/prism/translation/ruby_parser.rb +43 -7
- data/prism.gemspec +3 -1
- data/rbi/prism/dsl.rbi +521 -0
- data/rbi/prism/node.rbi +1456 -5616
- data/rbi/prism.rbi +16 -16
- data/sig/prism/dsl.rbs +189 -305
- data/sig/prism/node.rbs +702 -603
- data/sig/prism/parse_result.rbs +2 -0
- data/src/diagnostic.c +22 -6
- data/src/node.c +277 -284
- data/src/options.c +18 -0
- data/src/prettyprint.c +99 -108
- data/src/prism.c +1282 -760
- data/src/regexp.c +72 -4
- data/src/serialize.c +165 -50
- data/src/token_type.c +2 -2
- data/src/util/pm_integer.c +14 -14
- data/src/util/pm_newline_list.c +29 -0
- data/src/util/pm_string.c +9 -5
- metadata +4 -2
data/src/token_type.c
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
|
1
|
+
/*----------------------------------------------------------------------------*/
|
2
2
|
/* This file is generated by the templates/template.rb script and should not */
|
3
3
|
/* be modified manually. See */
|
4
4
|
/* templates/src/token_type.c.erb */
|
5
5
|
/* if you are looking to modify the */
|
6
6
|
/* template */
|
7
|
-
|
7
|
+
/*----------------------------------------------------------------------------*/
|
8
8
|
|
9
9
|
#include <string.h>
|
10
10
|
|
data/src/util/pm_integer.c
CHANGED
@@ -43,7 +43,7 @@ big_add(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *right, uint
|
|
43
43
|
length++;
|
44
44
|
}
|
45
45
|
|
46
|
-
*destination = (pm_integer_t) {
|
46
|
+
*destination = (pm_integer_t) { length, values, 0, false };
|
47
47
|
}
|
48
48
|
|
49
49
|
/**
|
@@ -87,7 +87,7 @@ big_sub2(pm_integer_t *destination, pm_integer_t *a, pm_integer_t *b, pm_integer
|
|
87
87
|
}
|
88
88
|
|
89
89
|
while (a_length > 1 && values[a_length - 1] == 0) a_length--;
|
90
|
-
*destination = (pm_integer_t) {
|
90
|
+
*destination = (pm_integer_t) { a_length, values, 0, false };
|
91
91
|
}
|
92
92
|
|
93
93
|
/**
|
@@ -130,7 +130,7 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
|
|
130
130
|
}
|
131
131
|
|
132
132
|
while (length > 1 && values[length - 1] == 0) length--;
|
133
|
-
*destination = (pm_integer_t) {
|
133
|
+
*destination = (pm_integer_t) { length, values, 0, false };
|
134
134
|
return;
|
135
135
|
}
|
136
136
|
|
@@ -142,16 +142,16 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
|
|
142
142
|
if (end_offset > right_length) end_offset = right_length;
|
143
143
|
|
144
144
|
pm_integer_t sliced_left = {
|
145
|
-
.value = 0,
|
146
145
|
.length = left_length,
|
147
146
|
.values = left_values,
|
147
|
+
.value = 0,
|
148
148
|
.negative = false
|
149
149
|
};
|
150
150
|
|
151
151
|
pm_integer_t sliced_right = {
|
152
|
-
.value = 0,
|
153
152
|
.length = end_offset - start_offset,
|
154
153
|
.values = right_values + start_offset,
|
154
|
+
.value = 0,
|
155
155
|
.negative = false
|
156
156
|
};
|
157
157
|
|
@@ -169,15 +169,15 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
|
|
169
169
|
pm_integer_free(&product);
|
170
170
|
}
|
171
171
|
|
172
|
-
*destination = (pm_integer_t) {
|
172
|
+
*destination = (pm_integer_t) { left_length + right_length, values, 0, false };
|
173
173
|
return;
|
174
174
|
}
|
175
175
|
|
176
176
|
size_t half = left_length / 2;
|
177
|
-
pm_integer_t x0 = {
|
178
|
-
pm_integer_t x1 = {
|
179
|
-
pm_integer_t y0 = {
|
180
|
-
pm_integer_t y1 = {
|
177
|
+
pm_integer_t x0 = { half, left_values, 0, false };
|
178
|
+
pm_integer_t x1 = { left_length - half, left_values + half, 0, false };
|
179
|
+
pm_integer_t y0 = { half, right_values, 0, false };
|
180
|
+
pm_integer_t y1 = { right_length - half, right_values + half, 0, false };
|
181
181
|
|
182
182
|
pm_integer_t z0 = { 0 };
|
183
183
|
karatsuba_multiply(&z0, &x0, &y0, base);
|
@@ -229,7 +229,7 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
|
|
229
229
|
pm_integer_free(&y01);
|
230
230
|
pm_integer_free(&xy);
|
231
231
|
|
232
|
-
*destination = (pm_integer_t) {
|
232
|
+
*destination = (pm_integer_t) { length, values, 0, false };
|
233
233
|
}
|
234
234
|
|
235
235
|
/**
|
@@ -323,7 +323,7 @@ pm_integer_normalize(pm_integer_t *integer) {
|
|
323
323
|
bool negative = integer->negative && value != 0;
|
324
324
|
|
325
325
|
pm_integer_free(integer);
|
326
|
-
*integer = (pm_integer_t) { .
|
326
|
+
*integer = (pm_integer_t) { .values = NULL, .value = value, .length = 0, .negative = negative };
|
327
327
|
}
|
328
328
|
|
329
329
|
/**
|
@@ -412,7 +412,7 @@ pm_integer_parse_powof2(pm_integer_t *integer, uint32_t base, const uint8_t *dig
|
|
412
412
|
}
|
413
413
|
|
414
414
|
while (length > 1 && values[length - 1] == 0) length--;
|
415
|
-
*integer = (pm_integer_t) { .
|
415
|
+
*integer = (pm_integer_t) { .length = length, .values = values, .value = 0, .negative = false };
|
416
416
|
pm_integer_normalize(integer);
|
417
417
|
}
|
418
418
|
|
@@ -438,7 +438,7 @@ pm_integer_parse_decimal(pm_integer_t *integer, const uint8_t *digits, size_t di
|
|
438
438
|
}
|
439
439
|
|
440
440
|
// Convert base from 10**9 to 1<<32.
|
441
|
-
pm_integer_convert_base(integer, &((pm_integer_t) { .
|
441
|
+
pm_integer_convert_base(integer, &((pm_integer_t) { .length = length, .values = values, .value = 0, .negative = false }), 1000000000, ((uint64_t) 1 << 32));
|
442
442
|
xfree(values);
|
443
443
|
}
|
444
444
|
|
data/src/util/pm_newline_list.c
CHANGED
@@ -54,6 +54,35 @@ pm_newline_list_append(pm_newline_list_t *list, const uint8_t *cursor) {
|
|
54
54
|
return true;
|
55
55
|
}
|
56
56
|
|
57
|
+
/**
|
58
|
+
* Returns the line of the given offset. If the offset is not in the list, the
|
59
|
+
* line of the closest offset less than the given offset is returned.
|
60
|
+
*/
|
61
|
+
int32_t
|
62
|
+
pm_newline_list_line(const pm_newline_list_t *list, const uint8_t *cursor, int32_t start_line) {
|
63
|
+
assert(cursor >= list->start);
|
64
|
+
size_t offset = (size_t) (cursor - list->start);
|
65
|
+
|
66
|
+
size_t left = 0;
|
67
|
+
size_t right = list->size - 1;
|
68
|
+
|
69
|
+
while (left <= right) {
|
70
|
+
size_t mid = left + (right - left) / 2;
|
71
|
+
|
72
|
+
if (list->offsets[mid] == offset) {
|
73
|
+
return ((int32_t) mid) + start_line;
|
74
|
+
}
|
75
|
+
|
76
|
+
if (list->offsets[mid] < offset) {
|
77
|
+
left = mid + 1;
|
78
|
+
} else {
|
79
|
+
right = mid - 1;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
return ((int32_t) left) + start_line - 1;
|
84
|
+
}
|
85
|
+
|
57
86
|
/**
|
58
87
|
* Returns the line and column of the given offset. If the offset is not in the
|
59
88
|
* list, the line and column of the closest offset less than the given offset
|
data/src/util/pm_string.c
CHANGED
@@ -116,6 +116,13 @@ pm_string_mapped_init(pm_string_t *string, const char *filepath) {
|
|
116
116
|
return false;
|
117
117
|
}
|
118
118
|
|
119
|
+
// Ensure it is a file and not a directory
|
120
|
+
if (S_ISDIR(sb.st_mode)) {
|
121
|
+
errno = EISDIR;
|
122
|
+
close(fd);
|
123
|
+
return false;
|
124
|
+
}
|
125
|
+
|
119
126
|
// mmap the file descriptor to virtually get the contents
|
120
127
|
size_t size = (size_t) sb.st_size;
|
121
128
|
uint8_t *source = NULL;
|
@@ -136,10 +143,7 @@ pm_string_mapped_init(pm_string_t *string, const char *filepath) {
|
|
136
143
|
*string = (pm_string_t) { .type = PM_STRING_MAPPED, .source = source, .length = size };
|
137
144
|
return true;
|
138
145
|
#else
|
139
|
-
(
|
140
|
-
(void) filepath;
|
141
|
-
perror("pm_string_mapped_init is not implemented for this platform");
|
142
|
-
return false;
|
146
|
+
return pm_string_file_init(string, filepath);
|
143
147
|
#endif
|
144
148
|
}
|
145
149
|
|
@@ -198,7 +202,7 @@ pm_string_file_init(pm_string_t *string, const char *filepath) {
|
|
198
202
|
CloseHandle(file);
|
199
203
|
*string = (pm_string_t) { .type = PM_STRING_OWNED, .source = source, .length = (size_t) file_size };
|
200
204
|
return true;
|
201
|
-
#elif defined(
|
205
|
+
#elif defined(PRISM_HAS_FILESYSTEM)
|
202
206
|
FILE *file = fopen(filepath, "rb");
|
203
207
|
if (file == NULL) {
|
204
208
|
return false;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prism
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- lib/prism/pack.rb
|
88
88
|
- lib/prism/parse_result.rb
|
89
89
|
- lib/prism/parse_result/comments.rb
|
90
|
+
- lib/prism/parse_result/errors.rb
|
90
91
|
- lib/prism/parse_result/newlines.rb
|
91
92
|
- lib/prism/pattern.rb
|
92
93
|
- lib/prism/polyfill/byteindex.rb
|
@@ -108,6 +109,7 @@ files:
|
|
108
109
|
- prism.gemspec
|
109
110
|
- rbi/prism.rbi
|
110
111
|
- rbi/prism/compiler.rbi
|
112
|
+
- rbi/prism/dsl.rbi
|
111
113
|
- rbi/prism/inspect_visitor.rbi
|
112
114
|
- rbi/prism/node.rbi
|
113
115
|
- rbi/prism/node_ext.rbi
|