prism 0.21.0 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b4d054a1268bf7f8b5947f30ad244c4713c850911e79c1ba469eca0ac36bc47c
4
- data.tar.gz: b77e29c93584b79759381d75cfb5ad0753fe8d5f92863cada81895bb67f17572
3
+ metadata.gz: 407353660e25fcada7fe3b7e7c79d58584bf3bc1c4d9ffad8f74d178a0fbe2b7
4
+ data.tar.gz: a23b28dada65ba503b2d2c6cb74e9389386bb9c59a504820ea46bdeddcc16169
5
5
  SHA512:
6
- metadata.gz: 00fa781d854c4f9b716b238c392e48f3bd946b52a5ea100c8fa98bd909bd7d2fcd116b80c7877cbfff59bb991d7c78158ded3ff4154d7d3362df3b8c00fd4d08
7
- data.tar.gz: cfea37b3aa825f0bb91a0bd19dec1ec72187790aca39a2b8d560a483d83c1f4604346320d071c93cd605f39c1fd975b1b508395d9673d7bf95c16feaeeee52e6
6
+ metadata.gz: aa848ed878d8fbc2b83b04789748d7d228226a5ca0963601c3dadfa901bc5b6c528667791d220e187399a91f6b1d8c2edcaee2c65721473683c349a7c8e4cebc
7
+ data.tar.gz: 6c7c4671fc9f53ca898fdce09de14eb4a79bf2ace45f88efff8302f99d6ae871c0336730d143c5bd87a8a8698a558a3d008fa68e9797c4502c7515fc67cc3099
data/CHANGELOG.md CHANGED
@@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.22.0] - 2024-02-07
10
+
11
+ ### Added
12
+
13
+ - More support for `Prism::RipperCompat` is added.
14
+ - Support for Ruby 2.7 has been added, and the minimum Ruby requirement has been lowered to 2.7.
15
+
16
+ ### Changed
17
+
18
+ - The error for an invalid source encoding has a new `:argument` level to indicate it raises an argument error.
19
+ - `BeginNode` nodes that are used when a class, singleton class, module, method definition, or block have an inline `rescue`/`ensure`/`else` now have their opening locations set to the beginning of the respective keyword.
20
+ - Improved error messages for invalid characters.
21
+ - `Prism.parse_file` and similar APIs will raise more appropriate errors when the file does not exist or cannot be mapped.
22
+ - Correctly handle the `recover` parameter for `Prism::Translation::Parser`.
23
+
9
24
  ## [0.21.0] - 2024-02-05
10
25
 
11
26
  ### Added
@@ -341,7 +356,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
341
356
 
342
357
  - 🎉 Initial release! 🎉
343
358
 
344
- [unreleased]: https://github.com/ruby/prism/compare/v0.21.0...HEAD
359
+ [unreleased]: https://github.com/ruby/prism/compare/v0.22.0...HEAD
360
+ [0.22.0]: https://github.com/ruby/prism/compare/v0.21.0...v0.22.0
345
361
  [0.21.0]: https://github.com/ruby/prism/compare/v0.20.0...v0.21.0
346
362
  [0.20.0]: https://github.com/ruby/prism/compare/v0.19.0...v0.20.0
347
363
  [0.19.0]: https://github.com/ruby/prism/compare/v0.18.0...v0.19.0
data/docs/releasing.md CHANGED
@@ -18,6 +18,24 @@ To release a new version of Prism, perform the following steps:
18
18
  * `templates/javascript/src/deserialize.js.erb` in the version constants
19
19
  * `templates/lib/prism/serialize.rb.erb` in the version constants
20
20
  * Run `bundle install` to update the `Gemfile.lock` file.
21
+
22
+ ```sh
23
+ bundle install
24
+ ```
25
+
26
+ * Run `bundle install` with the various other gemfiles:
27
+
28
+ ```sh
29
+ chruby ruby-2.7.8 && BUNDLE_GEMFILE=gemfiles/2.7/Gemfile bundle install
30
+ chruby ruby-3.0.6 && BUNDLE_GEMFILE=gemfiles/3.0/Gemfile bundle install
31
+ chruby ruby-3.1.4 && BUNDLE_GEMFILE=gemfiles/3.1/Gemfile bundle install
32
+ chruby ruby-3.2.3 && BUNDLE_GEMFILE=gemfiles/3.2/Gemfile bundle install
33
+ chruby ruby-3.3.0 && BUNDLE_GEMFILE=gemfiles/3.3/Gemfile bundle install
34
+ chruby ruby-3.4.0-dev && BUNDLE_GEMFILE=gemfiles/3.4/Gemfile bundle install
35
+ chruby jruby-9.4.5.0 && BUNDLE_GEMFILE=gemfiles/jruby/Gemfile bundle install
36
+ chruby truffleruby-23.1.2 && BUNDLE_GEMFILE=gemfiles/truffleruby/Gemfile bundle install
37
+ ```
38
+
21
39
  * Update `rust/ruby-prism-sys/Cargo.toml` to match the new version and run `cargo build`
22
40
  * Update `rust/ruby-prism/Cargo.toml` to match the new version and run `cargo build`
23
41
  * Commit all of the updated files.
@@ -1,5 +1,9 @@
1
1
  #include "prism/extension.h"
2
2
 
3
+ #ifdef _WIN32
4
+ #include <ruby/win32.h>
5
+ #endif
6
+
3
7
  // NOTE: this file should contain only bindings. All non-trivial logic should be
4
8
  // in libprism so it can be shared its the various callers.
5
9
 
@@ -212,20 +216,29 @@ string_options(int argc, VALUE *argv, pm_string_t *input, pm_options_t *options)
212
216
  /**
213
217
  * Read options for methods that look like (filepath, **options).
214
218
  */
215
- static bool
219
+ static void
216
220
  file_options(int argc, VALUE *argv, pm_string_t *input, pm_options_t *options) {
217
221
  VALUE filepath;
218
222
  VALUE keywords;
219
223
  rb_scan_args(argc, argv, "1:", &filepath, &keywords);
220
224
 
225
+ Check_Type(filepath, T_STRING);
226
+
221
227
  extract_options(options, filepath, keywords);
222
228
 
223
- if (!pm_string_mapped_init(input, (const char *) pm_string_source(&options->filepath))) {
229
+ const char * string_source = (const char *) pm_string_source(&options->filepath);
230
+
231
+ if (!pm_string_mapped_init(input, string_source)) {
224
232
  pm_options_free(options);
225
- return false;
226
- }
227
233
 
228
- return true;
234
+ #ifdef _WIN32
235
+ int e = rb_w32_map_errno(GetLastError());
236
+ #else
237
+ int e = errno;
238
+ #endif
239
+
240
+ rb_syserr_fail(e, string_source);
241
+ }
229
242
  }
230
243
 
231
244
  /******************************************************************************/
@@ -299,7 +312,8 @@ static VALUE
299
312
  dump_file(int argc, VALUE *argv, VALUE self) {
300
313
  pm_string_t input;
301
314
  pm_options_t options = { 0 };
302
- if (!file_options(argc, argv, &input, &options)) return Qnil;
315
+
316
+ file_options(argc, argv, &input, &options);
303
317
 
304
318
  VALUE value = dump_input(&input, &options);
305
319
  pm_string_free(&input);
@@ -404,6 +418,9 @@ parser_errors(pm_parser_t *parser, rb_encoding *encoding, VALUE source) {
404
418
  case PM_ERROR_LEVEL_FATAL:
405
419
  level = ID2SYM(rb_intern("fatal"));
406
420
  break;
421
+ case PM_ERROR_LEVEL_ARGUMENT:
422
+ level = ID2SYM(rb_intern("argument"));
423
+ break;
407
424
  default:
408
425
  rb_raise(rb_eRuntimeError, "Unknown level: %" PRIu8, error->level);
409
426
  }
@@ -606,7 +623,8 @@ static VALUE
606
623
  lex_file(int argc, VALUE *argv, VALUE self) {
607
624
  pm_string_t input;
608
625
  pm_options_t options = { 0 };
609
- if (!file_options(argc, argv, &input, &options)) return Qnil;
626
+
627
+ file_options(argc, argv, &input, &options);
610
628
 
611
629
  VALUE value = parse_lex_input(&input, &options, false);
612
630
  pm_string_free(&input);
@@ -707,7 +725,8 @@ static VALUE
707
725
  parse_file(int argc, VALUE *argv, VALUE self) {
708
726
  pm_string_t input;
709
727
  pm_options_t options = { 0 };
710
- if (!file_options(argc, argv, &input, &options)) return Qnil;
728
+
729
+ file_options(argc, argv, &input, &options);
711
730
 
712
731
  VALUE value = parse_input(&input, &options);
713
732
  pm_string_free(&input);
@@ -767,7 +786,8 @@ static VALUE
767
786
  parse_file_comments(int argc, VALUE *argv, VALUE self) {
768
787
  pm_string_t input;
769
788
  pm_options_t options = { 0 };
770
- if (!file_options(argc, argv, &input, &options)) return Qnil;
789
+
790
+ file_options(argc, argv, &input, &options);
771
791
 
772
792
  VALUE value = parse_input_comments(&input, &options);
773
793
  pm_string_free(&input);
@@ -821,7 +841,8 @@ static VALUE
821
841
  parse_lex_file(int argc, VALUE *argv, VALUE self) {
822
842
  pm_string_t input;
823
843
  pm_options_t options = { 0 };
824
- if (!file_options(argc, argv, &input, &options)) return Qnil;
844
+
845
+ file_options(argc, argv, &input, &options);
825
846
 
826
847
  VALUE value = parse_lex_input(&input, &options, true);
827
848
  pm_string_free(&input);
@@ -878,7 +899,8 @@ static VALUE
878
899
  parse_file_success_p(int argc, VALUE *argv, VALUE self) {
879
900
  pm_string_t input;
880
901
  pm_options_t options = { 0 };
881
- if (!file_options(argc, argv, &input, &options)) return Qnil;
902
+
903
+ file_options(argc, argv, &input, &options);
882
904
 
883
905
  VALUE result = parse_input_success_p(&input, &options);
884
906
  pm_string_free(&input);
@@ -956,7 +978,17 @@ profile_file(VALUE self, VALUE filepath) {
956
978
  pm_string_t input;
957
979
 
958
980
  const char *checked = check_string(filepath);
959
- if (!pm_string_mapped_init(&input, checked)) return Qnil;
981
+ Check_Type(filepath, T_STRING);
982
+
983
+ if (!pm_string_mapped_init(&input, checked)) {
984
+ #ifdef _WIN32
985
+ int e = rb_w32_map_errno(GetLastError());
986
+ #else
987
+ int e = errno;
988
+ #endif
989
+
990
+ rb_syserr_fail(e, checked);
991
+ }
960
992
 
961
993
  pm_options_t options = { 0 };
962
994
  pm_options_filepath_set(&options, checked);
@@ -1,7 +1,7 @@
1
1
  #ifndef PRISM_EXT_NODE_H
2
2
  #define PRISM_EXT_NODE_H
3
3
 
4
- #define EXPECTED_PRISM_VERSION "0.21.0"
4
+ #define EXPECTED_PRISM_VERSION "0.22.0"
5
5
 
6
6
  #include <ruby.h>
7
7
  #include <ruby/encoding.h>
@@ -19,7 +19,10 @@
19
19
  */
20
20
  typedef enum {
21
21
  /** For errors that cannot be recovered from. */
22
- PM_ERROR_LEVEL_FATAL = 0
22
+ PM_ERROR_LEVEL_FATAL = 0,
23
+
24
+ /** For errors that should raise an argument error. */
25
+ PM_ERROR_LEVEL_ARGUMENT = 1
23
26
  } pm_error_level_t;
24
27
 
25
28
  /**
@@ -28,6 +31,7 @@ typedef enum {
28
31
  typedef enum {
29
32
  /** For warnings which should be emitted if $VERBOSE != nil. */
30
33
  PM_WARNING_LEVEL_DEFAULT = 0,
34
+
31
35
  /** For warnings which should be emitted if $VERBOSE == true. */
32
36
  PM_WARNING_LEVEL_VERBOSE = 1
33
37
  } pm_warning_level_t;
@@ -192,8 +196,10 @@ typedef enum {
192
196
  PM_ERR_INVALID_NUMBER_HEXADECIMAL,
193
197
  PM_ERR_INVALID_NUMBER_OCTAL,
194
198
  PM_ERR_INVALID_NUMBER_UNDERSCORE,
199
+ PM_ERR_INVALID_CHARACTER,
200
+ PM_ERR_INVALID_MULTIBYTE_CHARACTER,
201
+ PM_ERR_INVALID_PRINTABLE_CHARACTER,
195
202
  PM_ERR_INVALID_PERCENT,
196
- PM_ERR_INVALID_TOKEN,
197
203
  PM_ERR_INVALID_VARIABLE_GLOBAL,
198
204
  PM_ERR_IT_NOT_ALLOWED,
199
205
  PM_ERR_LAMBDA_OPEN,
@@ -14,7 +14,7 @@
14
14
  /**
15
15
  * The minor version of the Prism library as an int.
16
16
  */
17
- #define PRISM_VERSION_MINOR 21
17
+ #define PRISM_VERSION_MINOR 22
18
18
 
19
19
  /**
20
20
  * The patch version of the Prism library as an int.
@@ -24,6 +24,6 @@
24
24
  /**
25
25
  * The version of the Prism library as a constant string.
26
26
  */
27
- #define PRISM_VERSION "0.21.0"
27
+ #define PRISM_VERSION "0.22.0"
28
28
 
29
29
  #endif
data/lib/prism/ffi.rb CHANGED
@@ -160,8 +160,13 @@ module Prism
160
160
  pointer = FFI::MemoryPointer.new(SIZEOF)
161
161
 
162
162
  begin
163
- raise unless LibRubyParser.pm_string_mapped_init(pointer, filepath)
164
- yield new(pointer)
163
+ raise TypeError unless filepath.is_a?(String)
164
+
165
+ if LibRubyParser.pm_string_mapped_init(pointer, filepath)
166
+ yield new(pointer)
167
+ else
168
+ raise SystemCallError.new(filepath, FFI.errno)
169
+ end
165
170
  ensure
166
171
  LibRubyParser.pm_string_free(pointer)
167
172
  pointer.free
@@ -860,7 +860,7 @@ module Prism
860
860
  previous = []
861
861
  results = []
862
862
 
863
- Ripper.lex(source, raise_errors: true).each do |token|
863
+ lex(source).each do |token|
864
864
  case token[1]
865
865
  when :on_sp
866
866
  # skip
@@ -886,6 +886,21 @@ module Prism
886
886
 
887
887
  results
888
888
  end
889
+
890
+ private
891
+
892
+ if Ripper.method(:lex).parameters.assoc(:keyrest)
893
+ def lex(source)
894
+ Ripper.lex(source, raise_errors: true)
895
+ end
896
+ else
897
+ def lex(source)
898
+ ripper = Ripper::Lexer.new(source)
899
+ ripper.lex.tap do |result|
900
+ raise SyntaxError, ripper.errors.map(&:message).join(' ;') if ripper.errors.any?
901
+ end
902
+ end
903
+ end
889
904
  end
890
905
 
891
906
  private_constant :LexRipper