diff --git a/lib/chewy/index/witchcraft.rb b/lib/chewy/index/witchcraft.rb index a6b8dc0a7..be6112767 100644 --- a/lib/chewy/index/witchcraft.rb +++ b/lib/chewy/index/witchcraft.rb @@ -1,6 +1,10 @@ begin require 'method_source' - require 'parser/current' + begin + require 'prism' + rescue LoadError + require 'parser/current' + end require 'unparser' rescue LoadError nil @@ -24,7 +28,11 @@ def witchcraft! def check_requirements! messages = [] messages << "MethodSource gem is required for the Witchcraft, please add `gem 'method_source'` to your Gemfile" unless Proc.method_defined?(:source) - messages << "Parser gem is required for the Witchcraft, please add `gem 'parser'` to your Gemfile" unless '::Parser'.safe_constantize + if RUBY_VERSION >= '3.3' + messages << "Prism gem is required for the Witchcraft, please add `gem 'prism'` to your Gemfile" unless '::Prism'.safe_constantize + else + messages << "Parser gem is required for the Witchcraft, please add `gem 'parser'` to your Gemfile" unless '::Parser'.safe_constantize + end messages << "Unparser gem is required for the Witchcraft, please add `gem 'unparser'` to your Gemfile" unless '::Unparser'.safe_constantize messages = messages.join("\n") @@ -164,8 +172,7 @@ def proc_fields_for(parent, nesting) end def source_for(proc, nesting) - ast = Parser::CurrentRuby.parse(proc.source) - lambdas = exctract_lambdas(ast) + lambdas = exctract_lambdas(ast_from_proc(proc)) raise "No lambdas found, try to reformat your code:\n`#{proc.source}`" unless lambdas @@ -192,6 +199,14 @@ def source_for(proc, nesting) Unparser.unparse(source) end + def ast_from_proc(proc) + if defined?(Prism) + Prism::Translation::ParserCurrent.parse(proc.source) + else + Parser::CurrentRuby.parse(proc.source) + end + end + def exctract_lambdas(node) return unless node.is_a?(Parser::AST::Node)