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/lib/prism.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  # :markup: markdown
3
+ #--
4
+ # rbs_inline: enabled
3
5
 
4
6
  # The Prism Ruby parser.
5
7
  #
@@ -20,9 +22,8 @@ module Prism
20
22
  autoload :DSL, "prism/dsl"
21
23
  autoload :InspectVisitor, "prism/inspect_visitor"
22
24
  autoload :LexCompat, "prism/lex_compat"
23
- autoload :LexRipper, "prism/lex_ripper"
24
25
  autoload :MutationCompiler, "prism/mutation_compiler"
25
- autoload :Pack, "prism/pack"
26
+ autoload :NodeFind, "prism/node_find"
26
27
  autoload :Pattern, "prism/pattern"
27
28
  autoload :Reflection, "prism/reflection"
28
29
  autoload :Relocation, "prism/relocation"
@@ -34,20 +35,24 @@ module Prism
34
35
  # Some of these constants are not meant to be exposed, so marking them as
35
36
  # private here.
36
37
 
37
- private_constant :LexCompat
38
- private_constant :LexRipper
38
+ if RUBY_ENGINE != "jruby"
39
+ private_constant :LexCompat
40
+ private_constant :NodeFind
41
+ end
39
42
 
40
43
  # Raised when requested to parse as the currently running Ruby version but Prism has no support for it.
41
44
  class CurrentVersionError < ArgumentError
42
45
  # Initialize a new exception for the given ruby version string.
46
+ #
47
+ #: (String version) -> void
43
48
  def initialize(version)
44
49
  message = +"invalid version: Requested to parse as `version: 'current'`; "
45
- segments =
50
+ major, minor, =
46
51
  if version.match?(/\A\d+\.\d+.\d+\z/)
47
52
  version.split(".").map(&:to_i)
48
53
  end
49
54
 
50
- if segments && ((segments[0] < 3) || (segments[0] == 3 && segments[1] < 3))
55
+ if major && minor && ((major < 3) || (major == 3 && minor < 3))
51
56
  message << " #{version} is below the minimum supported syntax."
52
57
  else
53
58
  message << " #{version} is unknown. Please update the `prism` gem."
@@ -58,34 +63,63 @@ module Prism
58
63
  end
59
64
 
60
65
  # :call-seq:
61
- # Prism::lex_compat(source, **options) -> LexCompat::Result
66
+ # lex_compat(source, **options) -> LexCompat::Result
62
67
  #
63
68
  # Returns a parse result whose value is an array of tokens that closely
64
- # resembles the return value of Ripper::lex. The main difference is that the
65
- # `:on_sp` token is not emitted.
69
+ # resembles the return value of Ripper.lex.
70
+ #
71
+ # For supported options, see Prism.parse.
66
72
  #
67
- # For supported options, see Prism::parse.
73
+ #: (String source, **untyped options) -> LexCompat::Result
68
74
  def self.lex_compat(source, **options)
69
75
  LexCompat.new(source, **options).result # steep:ignore
70
76
  end
71
77
 
72
78
  # :call-seq:
73
- # Prism::lex_ripper(source) -> Array
74
- #
75
- # This lexes with the Ripper lex. It drops any space events but otherwise
76
- # returns the same tokens. Raises SyntaxError if the syntax in source is
77
- # invalid.
78
- def self.lex_ripper(source)
79
- LexRipper.new(source).result # steep:ignore
80
- end
81
-
82
- # :call-seq:
83
- # Prism::load(source, serialized, freeze) -> ParseResult
79
+ # load(source, serialized, freeze) -> ParseResult
84
80
  #
85
81
  # Load the serialized AST using the source as a reference into a tree.
82
+ #
83
+ #: (String source, String serialized, ?bool freeze) -> ParseResult
86
84
  def self.load(source, serialized, freeze = false)
87
85
  Serialize.load_parse(source, serialized, freeze)
88
86
  end
87
+
88
+ # Given a Method, UnboundMethod, Proc, or Thread::Backtrace::Location,
89
+ # returns the Prism node representing it. On CRuby, this uses node_id for
90
+ # an exact match. On other implementations, it falls back to best-effort
91
+ # matching by source location line number.
92
+ #
93
+ #: (Method | UnboundMethod | Proc | Thread::Backtrace::Location callable) -> Node?
94
+ def self.find(callable)
95
+ NodeFind.find(callable)
96
+ end
97
+
98
+ # @rbs!
99
+ # VERSION: String
100
+ # BACKEND: :CEXT | :FFI
101
+ #
102
+ # interface _Stream
103
+ # def gets: (?Integer integer) -> (String | nil)
104
+ # end
105
+ #
106
+ # def self.parse: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> ParseResult
107
+ # def self.profile: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> void
108
+ # def self.lex: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> LexResult
109
+ # def self.parse_lex: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> ParseLexResult
110
+ # def self.dump: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> String
111
+ # def self.parse_comments: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> Array[Comment]
112
+ # def self.parse_success?: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> bool
113
+ # def self.parse_failure?: (String source, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> bool
114
+ # def self.parse_stream: (_Stream stream, ?filepath: String, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> ParseResult
115
+ # def self.parse_file: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> ParseResult
116
+ # def self.profile_file: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> void
117
+ # def self.lex_file: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> LexResult
118
+ # def self.parse_lex_file: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> ParseLexResult
119
+ # def self.dump_file: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> String
120
+ # def self.parse_file_comments: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> Array[Comment]
121
+ # def self.parse_file_success?: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> bool
122
+ # def self.parse_file_failure?: (path filepath, ?attach_comments: bool, ?command_line: String, ?encoding: Encoding | false, ?freeze: bool, ?frozen_string_literal: bool, ?line: Integer, ?main_script: bool, ?partial_script: bool, ?raise_error: Symbol | true, ?scopes: Array[Array[Symbol]], ?version: String) -> bool
89
123
  end
90
124
 
91
125
  require_relative "prism/polyfill/byteindex"
@@ -102,7 +136,30 @@ if RUBY_ENGINE == "ruby" and !ENV["PRISM_FFI_BACKEND"]
102
136
  # The C extension is the default backend on CRuby.
103
137
  Prism::BACKEND = :CEXT
104
138
 
105
- require "prism/prism"
139
+ begin
140
+ # The precompiled native libraries are in <gem_dir>/lib/prism/<ruby_version>
141
+ require_relative "prism/#{RUBY_VERSION[/\d+\.\d+/]}/prism"
142
+ rescue LoadError => e
143
+ if e.message.include?("GLIBC")
144
+ warn(<<~EOM)
145
+
146
+ ERROR: It looks like you're trying to use Prism as a precompiled native gem on a system
147
+ with an unsupported version of glibc.
148
+
149
+ #{e.message}
150
+
151
+ If that's the case, then please install Prism via the `ruby` platform gem:
152
+ gem install prism --platform=ruby
153
+ or, in your Gemfile:
154
+ gem "prism", force_ruby_platform: true
155
+
156
+ EOM
157
+ raise e
158
+ end
159
+
160
+ # Precompiled library isn't available, fall back to the library compiled at installation time.
161
+ require "prism/prism"
162
+ end
106
163
  else
107
164
  # The FFI backend is used on other Ruby implementations.
108
165
  Prism::BACKEND = :FFI
data/prism.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "prism"
5
- spec.version = "1.8.1"
5
+ spec.version = "2.0.0.rc1"
6
6
  spec.authors = ["Shopify"]
7
7
  spec.email = ["ruby@shopify.com"]
8
8
 
@@ -42,31 +42,71 @@ Gem::Specification.new do |spec|
42
42
  "docs/serialization.md",
43
43
  "docs/testing.md",
44
44
  "ext/prism/api_node.c",
45
- "ext/prism/api_pack.c",
45
+ "ext/prism/extconf.rb",
46
46
  "ext/prism/extension.c",
47
47
  "ext/prism/extension.h",
48
48
  "include/prism.h",
49
+ "include/prism/compiler/accel.h",
50
+ "include/prism/compiler/align.h",
51
+ "include/prism/compiler/assume.h",
52
+ "include/prism/compiler/exported.h",
53
+ "include/prism/compiler/fallthrough.h",
54
+ "include/prism/compiler/filesystem.h",
55
+ "include/prism/compiler/flex_array.h",
56
+ "include/prism/compiler/force_inline.h",
57
+ "include/prism/compiler/format.h",
58
+ "include/prism/compiler/inline.h",
59
+ "include/prism/compiler/nodiscard.h",
60
+ "include/prism/compiler/nonnull.h",
61
+ "include/prism/compiler/unused.h",
62
+ "include/prism/internal/allocator.h",
63
+ "include/prism/internal/allocator_debug.h",
64
+ "include/prism/internal/arena.h",
65
+ "include/prism/internal/bit.h",
66
+ "include/prism/internal/buffer.h",
67
+ "include/prism/internal/char.h",
68
+ "include/prism/internal/comments.h",
69
+ "include/prism/internal/constant_pool.h",
70
+ "include/prism/internal/diagnostic.h",
71
+ "include/prism/internal/encoding.h",
72
+ "include/prism/internal/integer.h",
73
+ "include/prism/internal/isinf.h",
74
+ "include/prism/internal/line_offset_list.h",
75
+ "include/prism/internal/list.h",
76
+ "include/prism/internal/magic_comments.h",
77
+ "include/prism/internal/memchr.h",
78
+ "include/prism/internal/node.h",
79
+ "include/prism/internal/options.h",
80
+ "include/prism/internal/parser.h",
81
+ "include/prism/internal/regexp.h",
82
+ "include/prism/internal/serialize.h",
83
+ "include/prism/internal/source.h",
84
+ "include/prism/internal/static_literals.h",
85
+ "include/prism/internal/strncasecmp.h",
86
+ "include/prism/internal/stringy.h",
87
+ "include/prism/internal/strpbrk.h",
88
+ "include/prism/internal/tokens.h",
89
+ "include/prism/arena.h",
49
90
  "include/prism/ast.h",
50
- "include/prism/defines.h",
91
+ "include/prism/buffer.h",
92
+ "include/prism/comments.h",
93
+ "include/prism/constant_pool.h",
51
94
  "include/prism/diagnostic.h",
52
- "include/prism/encoding.h",
95
+ "include/prism/errors_format.h",
96
+ "include/prism/excludes.h",
97
+ "include/prism/integer.h",
98
+ "include/prism/json.h",
99
+ "include/prism/line_offset_list.h",
100
+ "include/prism/magic_comments.h",
53
101
  "include/prism/node.h",
54
102
  "include/prism/options.h",
55
- "include/prism/pack.h",
56
103
  "include/prism/parser.h",
57
104
  "include/prism/prettyprint.h",
58
- "include/prism/regexp.h",
59
- "include/prism/static_literals.h",
60
- "include/prism/util/pm_buffer.h",
61
- "include/prism/util/pm_char.h",
62
- "include/prism/util/pm_constant_pool.h",
63
- "include/prism/util/pm_integer.h",
64
- "include/prism/util/pm_list.h",
65
- "include/prism/util/pm_memchr.h",
66
- "include/prism/util/pm_newline_list.h",
67
- "include/prism/util/pm_strncasecmp.h",
68
- "include/prism/util/pm_string.h",
69
- "include/prism/util/pm_strpbrk.h",
105
+ "include/prism/serialize.h",
106
+ "include/prism/source.h",
107
+ "include/prism/stream.h",
108
+ "include/prism/string_query.h",
109
+ "include/prism/stringy.h",
70
110
  "include/prism/version.h",
71
111
  "lib/prism.rb",
72
112
  "lib/prism/compiler.rb",
@@ -77,13 +117,11 @@ Gem::Specification.new do |spec|
77
117
  "lib/prism/ffi.rb",
78
118
  "lib/prism/inspect_visitor.rb",
79
119
  "lib/prism/lex_compat.rb",
80
- "lib/prism/lex_ripper.rb",
81
120
  "lib/prism/mutation_compiler.rb",
82
121
  "lib/prism/node_ext.rb",
122
+ "lib/prism/node_find.rb",
83
123
  "lib/prism/node.rb",
84
- "lib/prism/pack.rb",
85
124
  "lib/prism/parse_result.rb",
86
- "lib/prism/parse_result/comments.rb",
87
125
  "lib/prism/parse_result/errors.rb",
88
126
  "lib/prism/parse_result/newlines.rb",
89
127
  "lib/prism/pattern.rb",
@@ -104,65 +142,89 @@ Gem::Specification.new do |spec|
104
142
  "lib/prism/translation/parser/compiler.rb",
105
143
  "lib/prism/translation/parser/lexer.rb",
106
144
  "lib/prism/translation/ripper.rb",
145
+ "lib/prism/translation/ripper/filter.rb",
107
146
  "lib/prism/translation/ripper/lexer.rb",
108
147
  "lib/prism/translation/ripper/sexp.rb",
109
148
  "lib/prism/translation/ripper/shim.rb",
110
149
  "lib/prism/translation/ruby_parser.rb",
111
150
  "lib/prism/visitor.rb",
112
151
  "prism.gemspec",
113
- "rbi/prism.rbi",
114
- "rbi/prism/compiler.rbi",
115
- "rbi/prism/dsl.rbi",
116
- "rbi/prism/inspect_visitor.rbi",
117
- "rbi/prism/node_ext.rbi",
118
- "rbi/prism/node.rbi",
119
- "rbi/prism/parse_result.rbi",
120
- "rbi/prism/reflection.rbi",
121
- "rbi/prism/string_query.rbi",
152
+ "rbi/generated/prism.rbi",
153
+ "rbi/generated/prism/compiler.rbi",
154
+ "rbi/generated/prism/desugar_compiler.rbi",
155
+ "rbi/generated/prism/dispatcher.rbi",
156
+ "rbi/generated/prism/dot_visitor.rbi",
157
+ "rbi/generated/prism/dsl.rbi",
158
+ "rbi/generated/prism/inspect_visitor.rbi",
159
+ "rbi/generated/prism/lex_compat.rbi",
160
+ "rbi/generated/prism/mutation_compiler.rbi",
161
+ "rbi/generated/prism/node.rbi",
162
+ "rbi/generated/prism/node_ext.rbi",
163
+ "rbi/generated/prism/node_find.rbi",
164
+ "rbi/generated/prism/parse_result.rbi",
165
+ "rbi/generated/prism/pattern.rbi",
166
+ "rbi/generated/prism/reflection.rbi",
167
+ "rbi/generated/prism/relocation.rbi",
168
+ "rbi/generated/prism/serialize.rbi",
169
+ "rbi/generated/prism/string_query.rbi",
170
+ "rbi/generated/prism/translation.rbi",
171
+ "rbi/generated/prism/visitor.rbi",
172
+ "rbi/generated/prism/parse_result/errors.rbi",
173
+ "rbi/generated/prism/parse_result/newlines.rbi",
122
174
  "rbi/prism/translation/parser.rbi",
123
175
  "rbi/prism/translation/parser_versions.rbi",
124
176
  "rbi/prism/translation/ripper.rbi",
125
- "rbi/prism/visitor.rbi",
126
- "sig/prism.rbs",
127
- "sig/prism/compiler.rbs",
128
- "sig/prism/dispatcher.rbs",
129
- "sig/prism/dot_visitor.rbs",
130
- "sig/prism/dsl.rbs",
131
- "sig/prism/inspect_visitor.rbs",
132
- "sig/prism/lex_compat.rbs",
133
- "sig/prism/mutation_compiler.rbs",
134
- "sig/prism/node_ext.rbs",
135
- "sig/prism/node.rbs",
136
- "sig/prism/pack.rbs",
137
- "sig/prism/parse_result.rbs",
138
- "sig/prism/parse_result/comments.rbs",
139
- "sig/prism/pattern.rbs",
140
- "sig/prism/reflection.rbs",
141
- "sig/prism/relocation.rbs",
142
- "sig/prism/serialize.rbs",
143
- "sig/prism/string_query.rbs",
144
- "sig/prism/visitor.rbs",
177
+ "rbi/rubyvm/node_find.rbi",
178
+ "sig/generated/prism.rbs",
179
+ "sig/generated/prism/compiler.rbs",
180
+ "sig/generated/prism/desugar_compiler.rbs",
181
+ "sig/generated/prism/dispatcher.rbs",
182
+ "sig/generated/prism/dot_visitor.rbs",
183
+ "sig/generated/prism/dsl.rbs",
184
+ "sig/generated/prism/inspect_visitor.rbs",
185
+ "sig/generated/prism/lex_compat.rbs",
186
+ "sig/generated/prism/mutation_compiler.rbs",
187
+ "sig/generated/prism/node.rbs",
188
+ "sig/generated/prism/node_ext.rbs",
189
+ "sig/generated/prism/node_find.rbs",
190
+ "sig/generated/prism/parse_result.rbs",
191
+ "sig/generated/prism/pattern.rbs",
192
+ "sig/generated/prism/reflection.rbs",
193
+ "sig/generated/prism/relocation.rbs",
194
+ "sig/generated/prism/serialize.rbs",
195
+ "sig/generated/prism/string_query.rbs",
196
+ "sig/generated/prism/translation.rbs",
197
+ "sig/generated/prism/visitor.rbs",
198
+ "sig/generated/prism/parse_result/errors.rbs",
199
+ "sig/generated/prism/parse_result/newlines.rbs",
200
+ "sig/manifest.yaml",
201
+ "src/arena.c",
202
+ "src/buffer.c",
203
+ "src/char.c",
204
+ "src/comments.c",
205
+ "src/constant_pool.c",
145
206
  "src/diagnostic.c",
146
207
  "src/encoding.c",
208
+ "src/errors_format.c",
209
+ "src/integer.c",
210
+ "src/json.c",
211
+ "src/line_offset_list.c",
212
+ "src/list.c",
213
+ "src/memchr.c",
147
214
  "src/node.c",
148
215
  "src/options.c",
149
- "src/pack.c",
216
+ "src/parser.c",
150
217
  "src/prettyprint.c",
151
218
  "src/prism.c",
152
219
  "src/regexp.c",
153
220
  "src/serialize.c",
221
+ "src/source.c",
154
222
  "src/static_literals.c",
155
- "src/token_type.c",
156
- "src/util/pm_buffer.c",
157
- "src/util/pm_char.c",
158
- "src/util/pm_constant_pool.c",
159
- "src/util/pm_integer.c",
160
- "src/util/pm_list.c",
161
- "src/util/pm_memchr.c",
162
- "src/util/pm_newline_list.c",
163
- "src/util/pm_string.c",
164
- "src/util/pm_strncasecmp.c",
165
- "src/util/pm_strpbrk.c"
223
+ "src/string_query.c",
224
+ "src/stringy.c",
225
+ "src/strncasecmp.c",
226
+ "src/strpbrk.c",
227
+ "src/tokens.c"
166
228
  ]
167
229
 
168
230
  spec.extensions = ["ext/prism/extconf.rb"]