prism 1.9.0 → 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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +84 -0
  3. data/Makefile +41 -12
  4. data/README.md +35 -97
  5. data/config.yml +174 -161
  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/serialization.md +21 -24
  15. data/docs/testing.md +46 -29
  16. data/ext/prism/api_node.c +1461 -1401
  17. data/ext/prism/extconf.rb +3 -4
  18. data/ext/prism/extension.c +778 -422
  19. data/ext/prism/extension.h +3 -3
  20. data/include/prism/arena.h +37 -0
  21. data/include/prism/ast.h +2727 -610
  22. data/include/prism/buffer.h +52 -0
  23. data/include/prism/comments.h +55 -0
  24. data/include/prism/compiler/accel.h +24 -0
  25. data/include/prism/compiler/align.h +36 -0
  26. data/include/prism/compiler/assume.h +25 -0
  27. data/include/prism/compiler/exported.h +24 -0
  28. data/include/prism/compiler/fallthrough.h +22 -0
  29. data/include/prism/compiler/filesystem.h +32 -0
  30. data/include/prism/compiler/flex_array.h +19 -0
  31. data/include/prism/compiler/force_inline.h +21 -0
  32. data/include/prism/compiler/format.h +25 -0
  33. data/include/prism/compiler/inline.h +17 -0
  34. data/include/prism/compiler/nodiscard.h +22 -0
  35. data/include/prism/compiler/nonnull.h +18 -0
  36. data/include/prism/compiler/unused.h +18 -0
  37. data/include/prism/constant_pool.h +81 -0
  38. data/include/prism/diagnostic.h +38 -403
  39. data/include/prism/errors_format.h +53 -0
  40. data/include/prism/excludes.h +29 -0
  41. data/include/prism/integer.h +41 -0
  42. data/include/prism/internal/allocator.h +68 -0
  43. data/include/prism/internal/allocator_debug.h +88 -0
  44. data/include/prism/internal/arena.h +108 -0
  45. data/include/prism/internal/bit.h +42 -0
  46. data/include/prism/internal/buffer.h +91 -0
  47. data/include/prism/internal/char.h +145 -0
  48. data/include/prism/internal/comments.h +53 -0
  49. data/include/prism/internal/constant_pool.h +152 -0
  50. data/include/prism/internal/diagnostic.h +389 -0
  51. data/include/prism/{encoding.h → internal/encoding.h} +27 -68
  52. data/include/prism/internal/integer.h +68 -0
  53. data/include/prism/internal/isinf.h +16 -0
  54. data/include/prism/internal/line_offset_list.h +34 -0
  55. data/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  56. data/include/prism/internal/magic_comments.h +23 -0
  57. data/include/prism/internal/memchr.h +15 -0
  58. data/include/prism/internal/node.h +38 -0
  59. data/include/prism/internal/options.h +232 -0
  60. data/include/prism/internal/parser.h +984 -0
  61. data/include/prism/internal/regexp.h +26 -0
  62. data/include/prism/internal/serialize.h +39 -0
  63. data/include/prism/internal/source.h +72 -0
  64. data/include/prism/{static_literals.h → internal/static_literals.h} +26 -47
  65. data/include/prism/internal/stringy.h +35 -0
  66. data/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  67. data/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  68. data/include/prism/internal/tokens.h +11 -0
  69. data/include/prism/json.h +32 -0
  70. data/include/prism/line_offset_list.h +61 -0
  71. data/include/prism/magic_comments.h +35 -0
  72. data/include/prism/node.h +18 -53
  73. data/include/prism/options.h +146 -280
  74. data/include/prism/parser.h +336 -868
  75. data/include/prism/prettyprint.h +6 -9
  76. data/include/prism/serialize.h +115 -0
  77. data/include/prism/source.h +155 -0
  78. data/include/prism/stream.h +28 -0
  79. data/include/prism/string_query.h +63 -0
  80. data/include/prism/stringy.h +72 -0
  81. data/include/prism/version.h +12 -3
  82. data/include/prism.h +43 -320
  83. data/lib/prism/compiler.rb +319 -305
  84. data/lib/prism/desugar_compiler.rb +105 -34
  85. data/lib/prism/dispatcher.rb +646 -473
  86. data/lib/prism/dot_visitor.rb +592 -511
  87. data/lib/prism/dsl.rb +391 -25
  88. data/lib/prism/ffi.rb +252 -90
  89. data/lib/prism/inspect_visitor.rb +357 -325
  90. data/lib/prism/lex_compat.rb +254 -212
  91. data/lib/prism/mutation_compiler.rb +313 -305
  92. data/lib/prism/node.rb +20268 -7030
  93. data/lib/prism/node_ext.rb +180 -187
  94. data/lib/prism/node_find.rb +215 -0
  95. data/lib/prism/parse_result/errors.rb +7 -1
  96. data/lib/prism/parse_result/newlines.rb +276 -8
  97. data/lib/prism/parse_result.rb +453 -139
  98. data/lib/prism/pattern.rb +65 -20
  99. data/lib/prism/reflection.rb +23 -12
  100. data/lib/prism/relocation.rb +149 -87
  101. data/lib/prism/serialize.rb +3443 -535
  102. data/lib/prism/string_query.rb +16 -1
  103. data/lib/prism/translation/parser/builder.rb +10 -2
  104. data/lib/prism/translation/parser/compiler.rb +44 -52
  105. data/lib/prism/translation/parser/lexer.rb +41 -92
  106. data/lib/prism/translation/parser.rb +1 -1
  107. data/lib/prism/translation/parser_current.rb +1 -1
  108. data/lib/prism/translation/ripper/lexer.rb +8 -10
  109. data/lib/prism/translation/ripper/sexp.rb +2 -10
  110. data/lib/prism/translation/ripper/shim.rb +2 -0
  111. data/lib/prism/translation/ripper.rb +967 -209
  112. data/lib/prism/translation/ruby_parser.rb +73 -316
  113. data/lib/prism/translation.rb +2 -0
  114. data/lib/prism/visitor.rb +632 -5
  115. data/lib/prism.rb +79 -9
  116. data/prism.gemspec +122 -60
  117. data/rbi/generated/prism/compiler.rbi +489 -0
  118. data/rbi/generated/prism/desugar_compiler.rbi +306 -0
  119. data/rbi/generated/prism/dispatcher.rbi +1138 -0
  120. data/rbi/generated/prism/dot_visitor.rbi +618 -0
  121. data/rbi/generated/prism/dsl.rbi +751 -0
  122. data/rbi/generated/prism/inspect_visitor.rbi +503 -0
  123. data/rbi/generated/prism/lex_compat.rbi +162 -0
  124. data/rbi/generated/prism/mutation_compiler.rbi +464 -0
  125. data/rbi/generated/prism/node.rbi +13681 -0
  126. data/rbi/generated/prism/node_ext.rbi +259 -0
  127. data/rbi/generated/prism/node_find.rbi +79 -0
  128. data/rbi/generated/prism/parse_result/errors.rbi +21 -0
  129. data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
  130. data/rbi/generated/prism/parse_result.rbi +764 -0
  131. data/rbi/generated/prism/pattern.rbi +134 -0
  132. data/rbi/generated/prism/reflection.rbi +89 -0
  133. data/rbi/generated/prism/relocation.rbi +329 -0
  134. data/rbi/generated/prism/serialize.rbi +181 -0
  135. data/rbi/generated/prism/string_query.rbi +36 -0
  136. data/rbi/generated/prism/translation.rbi +7 -0
  137. data/rbi/generated/prism/visitor.rbi +650 -0
  138. data/rbi/generated/prism.rbi +86 -0
  139. data/rbi/prism/translation/parser_versions.rbi +5 -0
  140. data/rbi/rubyvm/node_find.rbi +14 -0
  141. data/sig/generated/prism/compiler.rbs +492 -0
  142. data/sig/generated/prism/desugar_compiler.rbs +305 -0
  143. data/sig/generated/prism/dispatcher.rbs +1292 -0
  144. data/sig/generated/prism/dot_visitor.rbs +635 -0
  145. data/sig/generated/prism/dsl.rbs +928 -0
  146. data/sig/generated/prism/inspect_visitor.rbs +509 -0
  147. data/sig/generated/prism/lex_compat.rbs +166 -0
  148. data/sig/{prism → generated/prism}/mutation_compiler.rbs +309 -4
  149. data/sig/generated/prism/node.rbs +20160 -0
  150. data/sig/generated/prism/node_ext.rbs +290 -0
  151. data/sig/generated/prism/node_find.rbs +90 -0
  152. data/sig/generated/prism/parse_result/errors.rbs +22 -0
  153. data/sig/generated/prism/parse_result/newlines.rbs +223 -0
  154. data/sig/generated/prism/parse_result.rbs +859 -0
  155. data/sig/generated/prism/pattern.rbs +156 -0
  156. data/sig/generated/prism/reflection.rbs +101 -0
  157. data/sig/generated/prism/relocation.rbs +428 -0
  158. data/sig/generated/prism/serialize.rbs +195 -0
  159. data/sig/generated/prism/string_query.rbs +36 -0
  160. data/sig/generated/prism/translation.rbs +8 -0
  161. data/sig/generated/prism/visitor.rbs +1111 -0
  162. data/sig/generated/prism.rbs +84 -0
  163. data/sig/manifest.yaml +2 -0
  164. data/src/arena.c +117 -0
  165. data/src/{util/pm_buffer.c → buffer.c} +44 -21
  166. data/src/{util/pm_char.c → char.c} +28 -57
  167. data/src/comments.c +454 -0
  168. data/src/constant_pool.c +406 -0
  169. data/src/diagnostic.c +97 -65
  170. data/src/encoding.c +8 -3
  171. data/src/errors_format.c +519 -0
  172. data/src/{util/pm_integer.c → integer.c} +33 -22
  173. data/src/json.c +5733 -0
  174. data/src/line_offset_list.c +100 -0
  175. data/src/list.c +24 -0
  176. data/src/{util/pm_memchr.c → memchr.c} +8 -6
  177. data/src/node.c +3504 -7674
  178. data/src/options.c +162 -49
  179. data/src/parser.c +349 -0
  180. data/src/prettyprint.c +421 -354
  181. data/src/prism.c +8030 -6970
  182. data/src/regexp.c +961 -45
  183. data/src/serialize.c +459 -424
  184. data/src/source.c +518 -0
  185. data/src/static_literals.c +111 -43
  186. data/src/string_query.c +166 -0
  187. data/src/stringy.c +91 -0
  188. data/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  189. data/src/strpbrk.c +447 -0
  190. data/src/{token_type.c → tokens.c} +39 -18
  191. metadata +122 -61
  192. data/ext/prism/api_pack.c +0 -276
  193. data/include/prism/defines.h +0 -260
  194. data/include/prism/pack.h +0 -163
  195. data/include/prism/regexp.h +0 -43
  196. data/include/prism/util/pm_buffer.h +0 -236
  197. data/include/prism/util/pm_char.h +0 -204
  198. data/include/prism/util/pm_constant_pool.h +0 -218
  199. data/include/prism/util/pm_integer.h +0 -130
  200. data/include/prism/util/pm_memchr.h +0 -29
  201. data/include/prism/util/pm_newline_list.h +0 -113
  202. data/include/prism/util/pm_string.h +0 -200
  203. data/lib/prism/pack.rb +0 -230
  204. data/lib/prism/parse_result/comments.rb +0 -188
  205. data/rbi/prism/compiler.rbi +0 -12
  206. data/rbi/prism/dsl.rbi +0 -524
  207. data/rbi/prism/inspect_visitor.rbi +0 -12
  208. data/rbi/prism/node.rbi +0 -8750
  209. data/rbi/prism/node_ext.rbi +0 -107
  210. data/rbi/prism/parse_result.rbi +0 -404
  211. data/rbi/prism/reflection.rbi +0 -58
  212. data/rbi/prism/string_query.rbi +0 -12
  213. data/rbi/prism/visitor.rbi +0 -473
  214. data/rbi/prism.rbi +0 -63
  215. data/sig/prism/compiler.rbs +0 -9
  216. data/sig/prism/dispatcher.rbs +0 -19
  217. data/sig/prism/dot_visitor.rbs +0 -6
  218. data/sig/prism/dsl.rbs +0 -351
  219. data/sig/prism/inspect_visitor.rbs +0 -22
  220. data/sig/prism/lex_compat.rbs +0 -10
  221. data/sig/prism/node.rbs +0 -4042
  222. data/sig/prism/node_ext.rbs +0 -149
  223. data/sig/prism/pack.rbs +0 -43
  224. data/sig/prism/parse_result/comments.rbs +0 -38
  225. data/sig/prism/parse_result.rbs +0 -197
  226. data/sig/prism/pattern.rbs +0 -13
  227. data/sig/prism/reflection.rbs +0 -50
  228. data/sig/prism/relocation.rbs +0 -185
  229. data/sig/prism/serialize.rbs +0 -8
  230. data/sig/prism/string_query.rbs +0 -11
  231. data/sig/prism/visitor.rbs +0 -169
  232. data/sig/prism.rbs +0 -272
  233. data/src/pack.c +0 -509
  234. data/src/util/pm_constant_pool.c +0 -342
  235. data/src/util/pm_list.c +0 -49
  236. data/src/util/pm_newline_list.c +0 -125
  237. data/src/util/pm_string.c +0 -381
  238. 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
  #
@@ -21,7 +23,7 @@ module Prism
21
23
  autoload :InspectVisitor, "prism/inspect_visitor"
22
24
  autoload :LexCompat, "prism/lex_compat"
23
25
  autoload :MutationCompiler, "prism/mutation_compiler"
24
- autoload :Pack, "prism/pack"
26
+ autoload :NodeFind, "prism/node_find"
25
27
  autoload :Pattern, "prism/pattern"
26
28
  autoload :Reflection, "prism/reflection"
27
29
  autoload :Relocation, "prism/relocation"
@@ -33,19 +35,24 @@ module Prism
33
35
  # Some of these constants are not meant to be exposed, so marking them as
34
36
  # private here.
35
37
 
36
- private_constant :LexCompat
38
+ if RUBY_ENGINE != "jruby"
39
+ private_constant :LexCompat
40
+ private_constant :NodeFind
41
+ end
37
42
 
38
43
  # Raised when requested to parse as the currently running Ruby version but Prism has no support for it.
39
44
  class CurrentVersionError < ArgumentError
40
45
  # Initialize a new exception for the given ruby version string.
46
+ #
47
+ #: (String version) -> void
41
48
  def initialize(version)
42
49
  message = +"invalid version: Requested to parse as `version: 'current'`; "
43
- segments =
50
+ major, minor, =
44
51
  if version.match?(/\A\d+\.\d+.\d+\z/)
45
52
  version.split(".").map(&:to_i)
46
53
  end
47
54
 
48
- if segments && ((segments[0] < 3) || (segments[0] == 3 && segments[1] < 3))
55
+ if major && minor && ((major < 3) || (major == 3 && minor < 3))
49
56
  message << " #{version} is below the minimum supported syntax."
50
57
  else
51
58
  message << " #{version} is unknown. Please update the `prism` gem."
@@ -56,23 +63,63 @@ module Prism
56
63
  end
57
64
 
58
65
  # :call-seq:
59
- # Prism::lex_compat(source, **options) -> LexCompat::Result
66
+ # lex_compat(source, **options) -> LexCompat::Result
60
67
  #
61
68
  # Returns a parse result whose value is an array of tokens that closely
62
- # resembles the return value of Ripper::lex.
69
+ # resembles the return value of Ripper.lex.
70
+ #
71
+ # For supported options, see Prism.parse.
63
72
  #
64
- # For supported options, see Prism::parse.
73
+ #: (String source, **untyped options) -> LexCompat::Result
65
74
  def self.lex_compat(source, **options)
66
75
  LexCompat.new(source, **options).result # steep:ignore
67
76
  end
68
77
 
69
78
  # :call-seq:
70
- # Prism::load(source, serialized, freeze) -> ParseResult
79
+ # load(source, serialized, freeze) -> ParseResult
71
80
  #
72
81
  # Load the serialized AST using the source as a reference into a tree.
82
+ #
83
+ #: (String source, String serialized, ?bool freeze) -> ParseResult
73
84
  def self.load(source, serialized, freeze = false)
74
85
  Serialize.load_parse(source, serialized, freeze)
75
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
76
123
  end
77
124
 
78
125
  require_relative "prism/polyfill/byteindex"
@@ -89,7 +136,30 @@ if RUBY_ENGINE == "ruby" and !ENV["PRISM_FFI_BACKEND"]
89
136
  # The C extension is the default backend on CRuby.
90
137
  Prism::BACKEND = :CEXT
91
138
 
92
- 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
93
163
  else
94
164
  # The FFI backend is used on other Ruby implementations.
95
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.9.0"
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",
@@ -79,10 +119,9 @@ Gem::Specification.new do |spec|
79
119
  "lib/prism/lex_compat.rb",
80
120
  "lib/prism/mutation_compiler.rb",
81
121
  "lib/prism/node_ext.rb",
122
+ "lib/prism/node_find.rb",
82
123
  "lib/prism/node.rb",
83
- "lib/prism/pack.rb",
84
124
  "lib/prism/parse_result.rb",
85
- "lib/prism/parse_result/comments.rb",
86
125
  "lib/prism/parse_result/errors.rb",
87
126
  "lib/prism/parse_result/newlines.rb",
88
127
  "lib/prism/pattern.rb",
@@ -110,59 +149,82 @@ Gem::Specification.new do |spec|
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"]